Skip to content

Commit d772a3c

Browse files
committed
Slightly re-factor _make_sasl_auth()
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent 9fa7897 commit d772a3c

1 file changed

Lines changed: 75 additions & 84 deletions

File tree

src/auth.c

Lines changed: 75 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -682,106 +682,97 @@ static xmpp_stanza_t *_make_starttls(xmpp_conn_t *conn)
682682
return starttls;
683683
}
684684

685+
static int _add_sasl2_child(xmpp_ctx_t *ctx,
686+
xmpp_stanza_t *dst,
687+
const char *name,
688+
const char *data)
689+
{
690+
xmpp_stanza_t *element = xmpp_stanza_new(ctx);
691+
if (!element)
692+
return 1;
693+
xmpp_stanza_t *sub = xmpp_stanza_new(ctx);
694+
if (!sub) {
695+
xmpp_stanza_release(element);
696+
return 1;
697+
}
698+
699+
xmpp_stanza_set_name(element, name);
700+
xmpp_stanza_set_ns(element, XMPP_NS_SASL2);
701+
xmpp_stanza_set_text(sub, data);
702+
xmpp_stanza_add_child_ex(element, sub, 0);
703+
xmpp_stanza_add_child_ex(dst, element, 0);
704+
705+
return 0;
706+
}
707+
685708
static xmpp_stanza_t *_make_sasl_auth(xmpp_conn_t *conn,
686709
const char *mechanism,
687710
const char *initial_data)
688711
{
689-
xmpp_stanza_t *auth, *init, *user_agent;
690-
xmpp_stanza_t *inittxt = NULL;
712+
xmpp_stanza_t *auth = NULL, *user_agent = NULL;
691713

692714
/* build auth stanza */
693-
if (initial_data) {
694-
inittxt = xmpp_stanza_new(conn->ctx);
695-
if (!inittxt)
696-
return NULL;
697-
}
698715
auth = xmpp_stanza_new(conn->ctx);
699-
if (auth) {
700-
if (conn->sasl_support & SASL_MASK_SASL2) {
701-
xmpp_stanza_set_name(auth, "authenticate");
702-
xmpp_stanza_set_ns(auth, XMPP_NS_SASL2);
703-
if (initial_data) {
704-
init = xmpp_stanza_new(conn->ctx);
705-
if (!init) {
706-
xmpp_stanza_release(auth);
707-
return NULL;
708-
}
709-
xmpp_stanza_set_name(init, "initial-response");
710-
xmpp_stanza_set_ns(init, XMPP_NS_SASL2);
711-
xmpp_stanza_set_text(inittxt, initial_data);
712-
xmpp_stanza_add_child_ex(init, inittxt, 0);
713-
xmpp_stanza_add_child_ex(auth, init, 0);
716+
if (auth == NULL)
717+
return NULL;
718+
719+
if (conn->sasl_support & SASL_MASK_SASL2) {
720+
xmpp_stanza_set_name(auth, "authenticate");
721+
xmpp_stanza_set_ns(auth, XMPP_NS_SASL2);
722+
if (initial_data) {
723+
if (_add_sasl2_child(conn->ctx, auth, "initial-response",
724+
initial_data)) {
725+
goto error_out;
714726
}
715-
if (conn->user_agent_id || conn->user_agent_software ||
716-
conn->user_agent_device) {
717-
user_agent = xmpp_stanza_new(conn->ctx);
718-
if (!user_agent) {
719-
xmpp_stanza_release(auth);
720-
return NULL;
721-
}
722-
xmpp_stanza_set_name(user_agent, "user-agent");
723-
xmpp_stanza_set_ns(user_agent, XMPP_NS_SASL2);
724-
if (conn->user_agent_id) {
725-
xmpp_stanza_set_attribute(user_agent, "id",
726-
conn->user_agent_id);
727-
}
728-
if (conn->user_agent_software) {
729-
xmpp_stanza_t *software = xmpp_stanza_new(conn->ctx);
730-
if (!software) {
731-
xmpp_stanza_release(user_agent);
732-
xmpp_stanza_release(auth);
733-
return NULL;
734-
}
735-
xmpp_stanza_set_name(software, "software");
736-
xmpp_stanza_set_ns(software, XMPP_NS_SASL2);
737-
xmpp_stanza_t *txt = xmpp_stanza_new(conn->ctx);
738-
if (!txt) {
739-
xmpp_stanza_release(software);
740-
xmpp_stanza_release(user_agent);
741-
xmpp_stanza_release(auth);
742-
return NULL;
743-
}
744-
xmpp_stanza_set_text(txt, conn->user_agent_software);
745-
xmpp_stanza_add_child_ex(software, txt, 0);
746-
xmpp_stanza_add_child_ex(user_agent, software, 0);
747-
}
748-
if (conn->user_agent_device) {
749-
xmpp_stanza_t *device = xmpp_stanza_new(conn->ctx);
750-
if (!device) {
751-
xmpp_stanza_release(user_agent);
752-
xmpp_stanza_release(auth);
753-
return NULL;
754-
}
755-
xmpp_stanza_set_name(device, "device");
756-
xmpp_stanza_set_ns(device, XMPP_NS_SASL2);
757-
xmpp_stanza_t *txt = xmpp_stanza_new(conn->ctx);
758-
if (!txt) {
759-
xmpp_stanza_release(device);
760-
xmpp_stanza_release(user_agent);
761-
xmpp_stanza_release(auth);
762-
return NULL;
763-
}
764-
xmpp_stanza_set_text(txt, conn->user_agent_device);
765-
xmpp_stanza_add_child_ex(device, txt, 0);
766-
xmpp_stanza_add_child_ex(user_agent, device, 0);
727+
}
728+
if (conn->user_agent_id || conn->user_agent_software ||
729+
conn->user_agent_device) {
730+
user_agent = xmpp_stanza_new(conn->ctx);
731+
if (!user_agent) {
732+
goto error_out;
733+
}
734+
xmpp_stanza_set_name(user_agent, "user-agent");
735+
xmpp_stanza_set_ns(user_agent, XMPP_NS_SASL2);
736+
if (conn->user_agent_id) {
737+
xmpp_stanza_set_attribute(user_agent, "id",
738+
conn->user_agent_id);
739+
}
740+
if (conn->user_agent_software) {
741+
if (_add_sasl2_child(conn->ctx, user_agent, "software",
742+
conn->user_agent_software)) {
743+
goto error_out;
767744
}
768-
xmpp_stanza_add_child_ex(auth, user_agent, 0);
769745
}
770-
} else {
771-
xmpp_stanza_set_name(auth, "auth");
772-
xmpp_stanza_set_ns(auth, XMPP_NS_SASL);
773-
if (initial_data) {
774-
xmpp_stanza_set_text(inittxt, initial_data);
775-
xmpp_stanza_add_child_ex(auth, inittxt, 0);
746+
if (conn->user_agent_device) {
747+
if (_add_sasl2_child(conn->ctx, user_agent, "device",
748+
conn->user_agent_device)) {
749+
goto error_out;
750+
}
776751
}
752+
xmpp_stanza_add_child_ex(auth, user_agent, 0);
777753
}
778-
xmpp_stanza_set_attribute(auth, "mechanism", mechanism);
779754
} else {
780-
if (inittxt)
781-
xmpp_stanza_release(inittxt);
755+
xmpp_stanza_set_name(auth, "auth");
756+
xmpp_stanza_set_ns(auth, XMPP_NS_SASL);
757+
if (initial_data) {
758+
xmpp_stanza_t *inittxt = xmpp_stanza_new(conn->ctx);
759+
if (!inittxt) {
760+
goto error_out;
761+
}
762+
xmpp_stanza_set_text(inittxt, initial_data);
763+
xmpp_stanza_add_child_ex(auth, inittxt, 0);
764+
}
782765
}
766+
xmpp_stanza_set_attribute(auth, "mechanism", mechanism);
783767

784768
return auth;
769+
770+
error_out:
771+
if (user_agent)
772+
xmpp_stanza_release(user_agent);
773+
if (auth)
774+
xmpp_stanza_release(auth);
775+
return NULL;
785776
}
786777

787778
/* authenticate the connection

0 commit comments

Comments
 (0)