diff options
-rw-r--r-- | src/omemo/omemo.c | 1 | ||||
-rw-r--r-- | src/xmpp/omemo.c | 59 |
2 files changed, 39 insertions, 21 deletions
diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index 343f2f60..572508ca 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -98,7 +98,6 @@ struct omemo_context_t { GHashTable *pre_key_store; GHashTable *signed_pre_key_store; identity_key_store_t identity_key_store; - GHashTable *device_ids; GString *identity_filename; GKeyFile *identity_keyfile; GString *trust_filename; diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c index eb4f0fbc..2021816a 100644 --- a/src/xmpp/omemo.c +++ b/src/xmpp/omemo.c @@ -441,29 +441,48 @@ _omemo_receive_devicelist(xmpp_stanza_t *const stanza, void *const userdata) return 1; } - xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(items, "item"); - if (item) { - if (g_strcmp0(xmpp_stanza_get_id(item), "current") == 0 ) { - xmpp_stanza_t *list = xmpp_stanza_get_child_by_ns(item, STANZA_NS_OMEMO); - if (!list) { - return 1; - } - xmpp_stanza_t *device; - for (device = xmpp_stanza_get_children(list); device != NULL; device = xmpp_stanza_get_next(device)) { - if (g_strcmp0(xmpp_stanza_get_name(device), "device") != 0) { - continue; - } - - const char *id = xmpp_stanza_get_id(device); - if (id != NULL) { - device_list = g_list_append(device_list, GINT_TO_POINTER(strtoul(id, NULL, 10))); - } else { - log_error("OMEMO: received device without ID"); - } + // Looking for "current" item - if there is no current, take the first item. + xmpp_stanza_t* first = NULL; + xmpp_stanza_t* current = NULL; + + xmpp_stanza_t *item = xmpp_stanza_get_children(items); + while ( item ) { + if (g_strcmp0(xmpp_stanza_get_name(item), "item") == 0) { + first = item; + if (g_strcmp0(xmpp_stanza_get_id(item), "current") == 0 ) { + current = item; + break; } + } + item = xmpp_stanza_get_next(item); + } + + if(current) { + item = current; + } else if( first ) { + log_warning("OMEMO: User %s has a non 'current' device item list: %s.", from, xmpp_stanza_get_id(first)); + item = first; + } else { + return 1; + } + + xmpp_stanza_t *list = xmpp_stanza_get_child_by_ns(item, STANZA_NS_OMEMO); + if (!list) { + return 1; + } + + xmpp_stanza_t *device; + for (device = xmpp_stanza_get_children(list); device != NULL; device = xmpp_stanza_get_next(device)) { + if (g_strcmp0(xmpp_stanza_get_name(device), "device") != 0) { + continue; + } + + const char *id = xmpp_stanza_get_id(device); + if (id != NULL) { + device_list = g_list_append(device_list, GINT_TO_POINTER(strtoul(id, NULL, 10))); } else { - log_warning("OMEMO: User %s has a non 'current' device item list: %s.", from, xmpp_stanza_get_id(item)); + log_error("OMEMO: received device without ID"); } } |