summaryrefslogtreecommitdiff
path: root/src/rexmpp_sasl.c
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2023-06-14 08:26:57 +0300
committerdefanor <defanor@uberspace.net>2023-06-14 08:26:57 +0300
commit931847c9c0d170410ec210ab558f3bbf6902355b (patch)
tree4d7bf90b30dc985edfbc09a5d0007b4aac8da533 /src/rexmpp_sasl.c
parent2d4110996bea53a9568b750d00d4dcdcc3907bc6 (diff)
Use more pointers to other structures from struct rexmpp
Instead of including them. Those structures can vary depending on configuration options, while for bindings it is easier if they stay the same, and are mere pointers. Besides, some of them may refer to opaque Rust-only structures in the future.
Diffstat (limited to 'src/rexmpp_sasl.c')
-rw-r--r--src/rexmpp_sasl.c81
1 files changed, 45 insertions, 36 deletions
diff --git a/src/rexmpp_sasl.c b/src/rexmpp_sasl.c
index 7dd16ba..cf5d1fe 100644
--- a/src/rexmpp_sasl.c
+++ b/src/rexmpp_sasl.c
@@ -31,28 +31,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 +66,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 +75,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 +93,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 +111,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 +195,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 +203,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 +219,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 +235,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 +246,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);
}
}