From 61a5de6ab99675d724505596d47969d71d320046 Mon Sep 17 00:00:00 2001 From: "jabber.developer2" Date: Tue, 21 Jul 2026 09:14:59 +0300 Subject: [PATCH] fix(omemo): bootstrap device list on prosody-class servers Two gaps kept /omemo gen from ever publishing on a fresh account: - _omemo_receive_devicelist() only recognised the legacy code='404' error attribute as "node does not exist". Prosody sends the RFC 6120 condition instead, so the empty-list bootstrap never ran. Accept the defined condition too, and log the expected bootstrap case at debug instead of error. - connection_request_features() disco'd only the server domain, but XEP-0163 PEP services (including pubsub#publish-options) announce their features on the account's bare JID. Query the bare JID as well, registering it in the feature table, so connection_supports() sees PEP features. Fixes #169 --- src/xmpp/connection.c | 9 +++++++++ src/xmpp/omemo.c | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c index b0a8c7f4..d258aef0 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -658,6 +658,15 @@ connection_request_features(void) /* We don't record it as a requested feature to avoid triggering th * sv_ev_connection_features_received too soon */ iq_disco_info_request_onconnect(conn.domain); + + const char* barejid = connection_get_barejid(); + if (barejid && g_strcmp0(barejid, conn.domain) != 0) { + if (!g_hash_table_contains(conn.features_by_jid, barejid)) { + g_hash_table_insert(conn.features_by_jid, strdup(barejid), + g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL)); + } + iq_disco_info_request_onconnect(barejid); // XEP-0163: PEP services announce features on the account's bare JID + } } void diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c index 840deba5..409815af 100644 --- a/src/xmpp/omemo.c +++ b/src/xmpp/omemo.c @@ -446,18 +446,21 @@ _omemo_receive_devicelist(xmpp_stanza_t* const stanza, void* const userdata) GList* device_list = NULL; if (g_strcmp0(type, STANZA_TYPE_ERROR) == 0) { - log_error("[OMEMO] can't get OMEMO device list"); xmpp_stanza_t* error = xmpp_stanza_get_child_by_name(stanza, "error"); if (!error) { log_error("[OMEMO] missing error element in device list response"); return 1; } + // a missing node is signalled via legacy code='404' or the RFC 6120 condition const char* code = xmpp_stanza_get_attribute(error, "code"); - if (g_strcmp0(code, "404") == 0) { + if (g_strcmp0(code, "404") == 0 + || xmpp_stanza_get_child_by_name_and_ns(error, STANZA_NAME_ITEM_NOT_FOUND, STANZA_NS_STANZAS)) { + log_debug("[OMEMO] no devicelist node for %s, bootstrapping an empty one", from); omemo_set_device_list(from, NULL); return 1; } + log_error("[OMEMO] can't get OMEMO device list"); } xmpp_stanza_t* root = NULL;