Implement binding a specific resource if one has been indicated.
This commit is contained in:
30
src/auth.c
30
src/auth.c
@@ -489,7 +489,8 @@ static int _handle_features_sasl(xmpp_conn_t * const conn,
|
|||||||
xmpp_stanza_t * const stanza,
|
xmpp_stanza_t * const stanza,
|
||||||
void * const userdata)
|
void * const userdata)
|
||||||
{
|
{
|
||||||
xmpp_stanza_t *bind, *iq;
|
xmpp_stanza_t *bind, *iq, *res, *text;
|
||||||
|
char *resource;
|
||||||
|
|
||||||
/* remove missing features handler */
|
/* remove missing features handler */
|
||||||
xmpp_timed_handler_delete(conn, _handle_missing_features_sasl);
|
xmpp_timed_handler_delete(conn, _handle_missing_features_sasl);
|
||||||
@@ -523,6 +524,33 @@ static int _handle_features_sasl(xmpp_conn_t * const conn,
|
|||||||
disconnect_mem_error(conn);
|
disconnect_mem_error(conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* request a specific resource if we have one */
|
||||||
|
resource = xmpp_jid_resource(conn->ctx, conn->jid);
|
||||||
|
if (strlen(resource) == 0) {
|
||||||
|
/* j2 doesn't handle an empty resource */
|
||||||
|
xmpp_free(conn->ctx, resource);
|
||||||
|
resource = NULL;
|
||||||
|
}
|
||||||
|
if (resource) {
|
||||||
|
/* request a specific resource */
|
||||||
|
res = xmpp_stanza_new(conn->ctx);
|
||||||
|
if (!res) {
|
||||||
|
disconnect_mem_error(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
xmpp_stanza_set_name(res, "resource");
|
||||||
|
text = xmpp_stanza_new(conn->ctx);
|
||||||
|
if (!text) {
|
||||||
|
disconnect_mem_error(conn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
xmpp_stanza_set_text(text, resource);
|
||||||
|
xmpp_stanza_add_child(res, text);
|
||||||
|
xmpp_stanza_add_child(bind, res);
|
||||||
|
xmpp_free(conn->ctx, resource);
|
||||||
|
}
|
||||||
|
|
||||||
xmpp_stanza_add_child(iq, bind);
|
xmpp_stanza_add_child(iq, bind);
|
||||||
xmpp_stanza_release(bind);
|
xmpp_stanza_release(bind);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user