summaryrefslogtreecommitdiff
path: root/src/rexmpp_sasl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rexmpp_sasl.c')
-rw-r--r--src/rexmpp_sasl.c82
1 files changed, 46 insertions, 36 deletions
diff --git a/src/rexmpp_sasl.c b/src/rexmpp_sasl.c
index 7dd16ba..20c4ba0 100644
--- a/src/rexmpp_sasl.c
+++ b/src/rexmpp_sasl.c
@@ -8,6 +8,7 @@
*/
#include <syslog.h>
+#include <stdlib.h>
#include "config.h"
#include "rexmpp.h"
@@ -31,28 +32,33 @@ int rexmpp_sasl_cb (Gsasl *ctx, Gsasl_session *sctx, Gsasl_property prop) {
}
int rexmpp_sasl_ctx_init (rexmpp_t *s) {
- int err = gsasl_init(&(s->sasl.ctx));
+ s->sasl = malloc(sizeof(struct rexmpp_sasl_ctx));
+ int err = gsasl_init(&(s->sasl->ctx));
if (err != GSASL_OK) {
rexmpp_log(s, LOG_CRIT, "gsasl initialisation error: %s",
gsasl_strerror(err));
return -1;
}
- gsasl_callback_hook_set(s->sasl.ctx, s);
- gsasl_callback_set(s->sasl.ctx, rexmpp_sasl_cb);
+ gsasl_callback_hook_set(s->sasl->ctx, s);
+ gsasl_callback_set(s->sasl->ctx, rexmpp_sasl_cb);
return 0;
}
void rexmpp_sasl_ctx_deinit (rexmpp_t *s) {
- gsasl_done(s->sasl.ctx);
+ gsasl_done(s->sasl->ctx);
+ if (s->sasl != NULL) {
+ free(s->sasl);
+ s->sasl = NULL;
+ }
}
void rexmpp_sasl_ctx_cleanup (rexmpp_t *s) {
- gsasl_finish(s->sasl.session);
- s->sasl.session = NULL;
+ gsasl_finish(s->sasl->session);
+ s->sasl->session = NULL;
}
int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) {
- int sasl_err = gsasl_encode (s->sasl.session, in, in_len, out, out_len);
+ int sasl_err = gsasl_encode (s->sasl->session, in, in_len, out, out_len);
if (sasl_err != GSASL_OK) {
rexmpp_log(s, LOG_ERR, "SASL encoding error: %s", gsasl_strerror(sasl_err));
return -1;
@@ -61,7 +67,7 @@ int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out,
}
int rexmpp_sasl_decode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) {
- int sasl_err = gsasl_decode(s->sasl.session, in, in_len, out, out_len);
+ int sasl_err = gsasl_decode(s->sasl->session, in, in_len, out, out_len);
if (sasl_err != GSASL_OK) {
rexmpp_log(s, LOG_ERR, "SASL decoding error: %s", gsasl_strerror(sasl_err));
return -1;
@@ -70,15 +76,15 @@ int rexmpp_sasl_decode (rexmpp_t *s, const char *in, size_t in_len, char **out,
}
const char *rexmpp_sasl_suggest_mechanism (rexmpp_t *s, const char *mech_list) {
- return gsasl_client_suggest_mechanism(s->sasl.ctx, mech_list);
+ return gsasl_client_suggest_mechanism(s->sasl->ctx, mech_list);
}
void rexmpp_sasl_property_set (rexmpp_t *s, rexmpp_sasl_property prop, const char *data) {
- gsasl_property_set (s->sasl.session, (Gsasl_property)prop, data);
+ gsasl_property_set (s->sasl->session, (Gsasl_property)prop, data);
}
int rexmpp_sasl_start (rexmpp_t *s, const char *mech) {
- int sasl_err = gsasl_client_start(s->sasl.ctx, mech, &(s->sasl.session));
+ int sasl_err = gsasl_client_start(s->sasl->ctx, mech, &(s->sasl->session));
if (sasl_err != GSASL_OK) {
rexmpp_log(s, LOG_CRIT, "Failed to initialise SASL session: %s",
gsasl_strerror(sasl_err));
@@ -88,7 +94,7 @@ int rexmpp_sasl_start (rexmpp_t *s, const char *mech) {
}
int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) {
- int sasl_err = gsasl_step64 (s->sasl.session, b64_in, b64_out);
+ int sasl_err = gsasl_step64 (s->sasl->session, b64_in, b64_out);
if (sasl_err != GSASL_OK) {
if (sasl_err == GSASL_NEEDS_MORE) {
rexmpp_log(s, LOG_DEBUG, "SASL needs more data");
@@ -106,26 +112,30 @@ int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) {
#include <memory.h>
int rexmpp_sasl_ctx_init (rexmpp_t *s) {
- s->sasl.mech = REXMPP_SASL_MECH_UNKNOWN;
- s->sasl.authid = NULL;
- s->sasl.password = NULL;
+ s->sasl = malloc(sizeof(struct rexmpp_sasl_ctx));
+ s->sasl->mech = REXMPP_SASL_MECH_UNKNOWN;
+ s->sasl->authid = NULL;
+ s->sasl->password = NULL;
return 0;
}
void rexmpp_sasl_ctx_cleanup (rexmpp_t *s) {
- s->sasl.mech = REXMPP_SASL_MECH_UNKNOWN;
- if (s->sasl.authid != NULL) {
- free(s->sasl.authid);
- s->sasl.authid = NULL;
+ s->sasl->mech = REXMPP_SASL_MECH_UNKNOWN;
+ if (s->sasl->authid != NULL) {
+ free(s->sasl->authid);
+ s->sasl->authid = NULL;
}
- if (s->sasl.password != NULL) {
- free(s->sasl.password);
- s->sasl.password = NULL;
+ if (s->sasl->password != NULL) {
+ free(s->sasl->password);
+ s->sasl->password = NULL;
}
}
void rexmpp_sasl_ctx_deinit (rexmpp_t *s) {
- (void)s;
+ if (s->sasl != NULL) {
+ free(s->sasl);
+ s->sasl = NULL;
+ }
}
int rexmpp_sasl_encode (rexmpp_t *s, const char *in, size_t in_len, char **out, size_t *out_len) {
@@ -186,7 +196,7 @@ const char *rexmpp_sasl_suggest_mechanism (rexmpp_t *s, const char *mech_list) {
int rexmpp_sasl_start (rexmpp_t *s, const char *mech) {
rexmpp_sasl_mechanism m = rexmpp_sasl_mech_read(mech);
if (m != REXMPP_SASL_MECH_UNKNOWN) {
- s->sasl.mech = m;
+ s->sasl->mech = m;
return 0;
}
return -1;
@@ -194,15 +204,15 @@ int rexmpp_sasl_start (rexmpp_t *s, const char *mech) {
const char *rexmpp_sasl_get_prop (rexmpp_t *s, rexmpp_sasl_property prop) {
if (prop == REXMPP_SASL_PROP_AUTHID) {
- if (s->sasl.authid == NULL) {
+ if (s->sasl->authid == NULL) {
s->sasl_property_cb(s, prop);
}
- return s->sasl.authid;
+ return s->sasl->authid;
} else if (prop == REXMPP_SASL_PROP_PASSWORD) {
- if (s->sasl.password == NULL) {
+ if (s->sasl->password == NULL) {
s->sasl_property_cb(s, prop);
}
- return s->sasl.password;
+ return s->sasl->password;
}
return NULL;
}
@@ -210,7 +220,7 @@ const char *rexmpp_sasl_get_prop (rexmpp_t *s, rexmpp_sasl_property prop) {
int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) {
(void)s;
(void)b64_in;
- if (s->sasl.mech == REXMPP_SASL_MECH_PLAIN) {
+ if (s->sasl->mech == REXMPP_SASL_MECH_PLAIN) {
/* RFC 4616 */
const char *authid = rexmpp_sasl_get_prop(s, REXMPP_SASL_PROP_AUTHID);
const char *password = rexmpp_sasl_get_prop(s, REXMPP_SASL_PROP_PASSWORD);
@@ -226,7 +236,7 @@ int rexmpp_sasl_step64 (rexmpp_t *s, const char *b64_in, char **b64_out) {
free(auth);
return 0;
}
- } else if (s->sasl.mech == REXMPP_SASL_MECH_EXTERNAL) {
+ } else if (s->sasl->mech == REXMPP_SASL_MECH_EXTERNAL) {
*b64_out = strdup("");
return 0;
}
@@ -237,15 +247,15 @@ void rexmpp_sasl_property_set (rexmpp_t *s, rexmpp_sasl_property prop, const cha
(void)s;
(void)data;
if (prop == REXMPP_SASL_PROP_AUTHID) {
- if (s->sasl.authid != NULL) {
- free(s->sasl.authid);
+ if (s->sasl->authid != NULL) {
+ free(s->sasl->authid);
}
- s->sasl.authid = strdup(data);
+ s->sasl->authid = strdup(data);
} else if (prop == REXMPP_SASL_PROP_PASSWORD) {
- if (s->sasl.password != NULL) {
- free(s->sasl.password);
+ if (s->sasl->password != NULL) {
+ free(s->sasl->password);
}
- s->sasl.password = strdup(data);
+ s->sasl->password = strdup(data);
}
}