diff options
author | Michael Vetter <jubalh@iodoru.org> | 2020-07-23 14:21:27 +0200 |
---|---|---|
committer | Michael Vetter <jubalh@iodoru.org> | 2020-07-23 14:21:27 +0200 |
commit | 8852db03d623f1920814fc8ff2c822a6353dd6e3 (patch) | |
tree | ef8a6a7017e444258302658f6adc2f218f68e419 /src/xmpp/message.c | |
parent | 5db840e0cc35070b9219c166d496a03f44dc6ea8 (diff) | |
download | profani-tty-8852db03d623f1920814fc8ff2c822a6353dd6e3.tar.gz |
Parse stanza-id
Add stable stanza IDs to ProfMessage struct. We parse this for 1:1 messages (MUC needs to be done too). <stanza-id> for live messages <result id="x"> for MAM messages Regards MAM: https://github.com/profanity-im/profanity/issues/660 Regards Stable IDs: https://github.com/profanity-im/profanity/issues/1207
Diffstat (limited to 'src/xmpp/message.c')
-rw-r--r-- | src/xmpp/message.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/xmpp/message.c b/src/xmpp/message.c index f9940204..28b126a6 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -85,7 +85,7 @@ static void _handle_muc_private_message(xmpp_stanza_t* const stanza); static void _handle_conference(xmpp_stanza_t* const stanza); static void _handle_captcha(xmpp_stanza_t* const stanza); static void _handle_receipt_received(xmpp_stanza_t* const stanza); -static void _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon); +static void _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, const char *result_id); static void _handle_ox_chat(xmpp_stanza_t* const stanza, ProfMessage* message, gboolean is_mam); static xmpp_stanza_t* _handle_carbons(xmpp_stanza_t* const stanza); static void _send_message_stanza(xmpp_stanza_t* const stanza); @@ -232,7 +232,7 @@ _message_handler(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* con } if (msg_stanza) { - _handle_chat(msg_stanza, FALSE, is_carbon); + _handle_chat(msg_stanza, FALSE, is_carbon, NULL); } } else { // none of the allowed types @@ -281,6 +281,7 @@ message_init(void) message->to_jid = NULL; message->id = NULL; message->originid = NULL; + message->stanzaid = NULL; message->replace_id = NULL; message->body = NULL; message->encrypted = NULL; @@ -313,6 +314,10 @@ message_free(ProfMessage* message) xmpp_free(ctx, message->originid); } + if (message->stanzaid) { + xmpp_free(ctx, message->stanzaid); + } + if (message->replace_id) { xmpp_free(ctx, message->replace_id); } @@ -1217,7 +1222,7 @@ _handle_carbons(xmpp_stanza_t* const stanza) } static void -_handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon) +_handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, const char *result_id) { // some clients send the mucuser namespace with private messages // if the namespace exists, and the stanza contains a body element, assume its a private message @@ -1280,6 +1285,26 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon) message->id = strdup(id); } + if (is_mam) { + // MAM has XEP-0359 stanza-id as <result id=""> + if (result_id) { + message->stanzaid = strdup(result_id); + } else { + log_warning("MAM received with no result id"); + } + } else { + // live messages use XEP-0359 <stanza-id> + // TODO: add to muc too + char* stanzaid = NULL; + xmpp_stanza_t* stanzaidst = stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_STANZA_ID, STANZA_NS_STABLE_ID); + if (stanzaidst) { + stanzaid = (char*)xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_ID); + if (stanzaid) { + message->stanzaid = strdup(stanzaid); + } + } + } + // replace id for XEP-0308: Last Message Correction xmpp_stanza_t* replace_id_stanza = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_LAST_MESSAGE_CORRECTION); if (replace_id_stanza) { @@ -1379,7 +1404,7 @@ _handle_ox_chat(xmpp_stanza_t* const stanza, ProfMessage* message, gboolean is_m static gboolean _handle_mam(xmpp_stanza_t* const stanza) { - xmpp_stanza_t* result = stanza_get_child_by_name_and_ns(stanza, "result", STANZA_NS_MAM2); + xmpp_stanza_t* result = stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_RESULT, STANZA_NS_MAM2); if (!result) { return FALSE; } @@ -1390,8 +1415,12 @@ _handle_mam(xmpp_stanza_t* const stanza) return FALSE; } + // <result xmlns='urn:xmpp:mam:2' queryid='f27' id='5d398-28273-f7382'> + // same as <stanza-id> from XEP-0359 for live messages + const char* result_id = xmpp_stanza_get_id(result); + xmpp_stanza_t* message_stanza = xmpp_stanza_get_child_by_ns(forwarded, "jabber:client"); - _handle_chat(message_stanza, TRUE, FALSE); + _handle_chat(message_stanza, TRUE, FALSE, result_id); return TRUE; } |