diff --git a/src/auth.c b/src/auth.c index 181c110..bb3ef69 100644 --- a/src/auth.c +++ b/src/auth.c @@ -833,9 +833,17 @@ static int _handle_bind(xmpp_conn_t * const conn, xmpp_error(conn->ctx, "xmpp", "Binding failed."); xmpp_disconnect(conn); } else if (type && strcmp(type, "result") == 0) { - /* TODO: extract resource if present */ + xmpp_stanza_t *binding = xmpp_stanza_get_child_by_name(stanza, "bind"); xmpp_debug(conn->ctx, "xmpp", "Bind successful."); + if (binding) { + xmpp_stanza_t *jid_stanza = xmpp_stanza_get_child_by_name(binding, + "jid"); + if (jid_stanza) { + conn->bound_jid = xmpp_stanza_get_text(jid_stanza); + } + } + /* establish a session if required */ if (conn->session_required) { /* setup response handlers */ diff --git a/src/common.h b/src/common.h index cca18f1..cafcbd4 100644 --- a/src/common.h +++ b/src/common.h @@ -178,6 +178,7 @@ struct _xmpp_conn_t { char *connectport; char *jid; char *pass; + char *bound_jid; char *stream_id; /* send queue and parameters */ diff --git a/src/conn.c b/src/conn.c index fcbe5b2..4d8163b 100644 --- a/src/conn.c +++ b/src/conn.c @@ -105,6 +105,7 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx) conn->jid = NULL; conn->pass = NULL; conn->stream_id = NULL; + conn->bound_jid = NULL; conn->tls_support = 0; conn->tls_failed = 0; @@ -267,6 +268,7 @@ int xmpp_conn_release(xmpp_conn_t * const conn) if (conn->domain) xmpp_free(ctx, conn->domain); if (conn->jid) xmpp_free(ctx, conn->jid); + if (conn->bound_jid) xmpp_free(ctx, conn->bound_jid); if (conn->pass) xmpp_free(ctx, conn->pass); if (conn->stream_id) xmpp_free(ctx, conn->stream_id); if (conn->lang) xmpp_free(ctx, conn->lang); @@ -290,6 +292,24 @@ const char *xmpp_conn_get_jid(const xmpp_conn_t * const conn) return conn->jid; } +/** + * Get the JID discovered during binding time. + * + * This JID will contain the resource used by the current connection. + * This is useful in the case where a resource was not specified for + * binding. + * + * @param conn a Strophe connection object. + * + * @return a string containing the full JID or NULL if it's not been discovered + * + * @ingroup Connections + */ +const char *xmpp_conn_get_bound_jid(const xmpp_conn_t * const conn) +{ + return conn->bound_jid; +} + /** Set the JID of the user that will be bound to the connection. * If any JID was previously set, it will be discarded. This should not be * be used after a connection is created. The function will make a copy of diff --git a/strophe.h b/strophe.h index 7079241..347ff7d 100644 --- a/strophe.h +++ b/strophe.h @@ -212,6 +212,7 @@ xmpp_conn_t * xmpp_conn_clone(xmpp_conn_t * const conn); int xmpp_conn_release(xmpp_conn_t * const conn); const char *xmpp_conn_get_jid(const xmpp_conn_t * const conn); +const char *xmpp_conn_get_bound_jid(const xmpp_conn_t * const conn); void xmpp_conn_set_jid(xmpp_conn_t * const conn, const char * const jid); const char *xmpp_conn_get_pass(const xmpp_conn_t * const conn); void xmpp_conn_set_pass(xmpp_conn_t * const conn, const char * const pass);