diff --git a/Makefile.am b/Makefile.am index 8bfffd7a..d5e92bce 100644 --- a/Makefile.am +++ b/Makefile.am @@ -171,7 +171,8 @@ otr4_sources = \ src/otr/otrlib.h src/otr/otrlibv4.c src/otr/otr.h src/otr/otr.c omemo_sources = \ - src/omemo/omemo.h src/omemo/omemo.c src/omemo/crypto.h src/omemo/crypto.c + src/omemo/omemo.h src/omemo/omemo.c src/omemo/crypto.h src/omemo/crypto.c \ + src/xmpp/omemo.h src/xmpp/omemo.c if BUILD_PYTHON_API core_sources += $(python_sources) diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c new file mode 100644 index 00000000..42b18c6b --- /dev/null +++ b/src/xmpp/omemo.c @@ -0,0 +1,15 @@ +#include "xmpp/connection.h" +#include "xmpp/iq.h" +#include "xmpp/stanza.h" + +void +omemo_devicelist_publish(void) +{ + xmpp_ctx_t * const ctx = connection_get_ctx(); + char *barejid = xmpp_jid_bare(ctx, session_get_account_name()); + xmpp_stanza_t *iq = stanza_create_omemo_devicelist_subscription(ctx, barejid); + iq_send_stanza(iq); + xmpp_stanza_release(iq); + + free(barejid); +} diff --git a/src/xmpp/omemo.h b/src/xmpp/omemo.h new file mode 100644 index 00000000..413aa563 --- /dev/null +++ b/src/xmpp/omemo.h @@ -0,0 +1 @@ +void omemo_devicelist_publish(void); diff --git a/src/xmpp/session.c b/src/xmpp/session.c index de7fb7ac..ee836090 100644 --- a/src/xmpp/session.c +++ b/src/xmpp/session.c @@ -60,6 +60,10 @@ #include "xmpp/chat_session.h" #include "xmpp/jid.h" +#ifdef HAVE_OMEMO +#include "xmpp/omemo.h" +#endif + // for auto reconnect static struct { char *name; @@ -313,6 +317,9 @@ session_login_success(gboolean secured) roster_request(); bookmark_request(); blocking_request(); +#ifdef HAVE_OMEMO + omemo_devicelist_publish(); +#endif // items discovery char *domain = connection_get_domain(); diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index 534ee06b..ffd0c053 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -2092,6 +2092,31 @@ stanza_create_command_config_submit_iq(xmpp_ctx_t *ctx, const char *const room, return iq; } +xmpp_stanza_t* +stanza_create_omemo_devicelist_pubsub_subscription(xmpp_ctx_t *ctx, const char *const jid) +{ + char *id = connection_create_stanza_id("omemo_devicelist_subscribe"); + xmpp_stanza_t *iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id); + free(id); + + xmpp_stanza_t *pubsub = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB); + xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB); + + xmpp_stanza_t *subscribe = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(subscribe, "subscribe"); + xmpp_stanza_set_attribute(subscribe, "node", "eu.siacs.conversations.axolotl.devicelist"); + xmpp_stanza_set_attribute(subscribe, "jid", jid); + + xmpp_stanza_add_child(pubsub, subscribe); + xmpp_stanza_add_child(iq, pubsub); + + xmpp_stanza_release(subscribe); + xmpp_stanza_release(pubsub); + + return iq; +} + static void _stanza_add_unique_id(xmpp_stanza_t *stanza, char *prefix) { diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h index d3c3c9dc..ce655a93 100644 --- a/src/xmpp/stanza.h +++ b/src/xmpp/stanza.h @@ -284,6 +284,8 @@ xmpp_stanza_t* stanza_create_room_kick_iq(xmpp_ctx_t *const ctx, const char *con xmpp_stanza_t* stanza_create_command_exec_iq(xmpp_ctx_t *ctx, const char *const target, const char *const node); xmpp_stanza_t* stanza_create_command_config_submit_iq(xmpp_ctx_t *ctx, const char *const room, const char *const node, const char *const sessionid, DataForm *form); +xmpp_stanza_t* stanza_create_omemo_devicelist_pubsub_subscription(xmpp_ctx_t *ctx, const char *const jid); + int stanza_get_idle_time(xmpp_stanza_t *const stanza); void stanza_attach_priority(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence, const int pri);