diff options
Diffstat (limited to 'src/rexmpp_sasl.c')
-rw-r--r-- | src/rexmpp_sasl.c | 82 |
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); } } |