From ffc626a276c369dbd34baa19efe4ea44fc864ed5 Mon Sep 17 00:00:00 2001 From: "jabber.developer2" Date: Sat, 16 May 2026 12:42:08 +0300 Subject: [PATCH] fix(review): drop checks overlapping with PR #105 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After review of PR #105 (upstream-full merge) it became clear the validation for MUC and 1:1 chat is already added there via upstream profanity. Keeping both versions would conflict on merge. Removed from this PR: - _handle_groupchat check (identical to PR #105) - _handle_chat check (PR #105 uses equals_our_barejid(by) instead — defer to upstream) - STANZA_ATTR_BY define (no longer referenced) Kept (PR #105 does NOT touch these): - XEP-0203 §4 validation in _handle_groupchat, _handle_chat, _handle_muc_private_message - stanza_get_oldest_delay_from() helper + NULL-tmp guard bug fix in stanza_get_oldest_delay() Also applied review fixes: - Add g_date_time_new_now_local() fallback in _handle_muc_private_message so timestamp is never NULL - Change stanza_get_delay_from signature to const char* const from, eliminating (gchar*) casts at call sites --- src/xmpp/message.c | 37 +++++++++++++++---------------------- src/xmpp/stanza.c | 2 +- src/xmpp/stanza.h | 3 +-- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 14776136..813cb792 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -1090,16 +1090,12 @@ _handle_groupchat(xmpp_stanza_t* const stanza) message->id = strdup(id); } - // XEP-0359 §5: only accept whose 'by' matches the MUC room char* stanzaid = NULL; xmpp_stanza_t* stanzaidst = xmpp_stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_STANZA_ID, STANZA_NS_STABLE_ID); if (stanzaidst) { - const char* by = xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_BY); - if (by && g_strcmp0(by, from_jid->barejid) == 0) { - stanzaid = (char*)xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_ID); - if (stanzaid) { - message->stanzaid = strdup(stanzaid); - } + stanzaid = (char*)xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_ID); + if (stanzaid) { + message->stanzaid = strdup(stanzaid); } } @@ -1288,12 +1284,13 @@ _handle_muc_private_message(xmpp_stanza_t* const stanza) #endif // XEP-0203 §4: only trust from a server domain. - { - const char* my_domain = connection_get_domain(); - message->timestamp = stanza_get_delay_from(stanza, (gchar*)my_domain); - if (!message->timestamp && message->from_jid->domainpart) { - message->timestamp = stanza_get_delay_from(stanza, message->from_jid->domainpart); - } + const char* my_domain = connection_get_domain(); + message->timestamp = stanza_get_delay_from(stanza, my_domain); + if (!message->timestamp && message->from_jid->domainpart) { + message->timestamp = stanza_get_delay_from(stanza, message->from_jid->domainpart); + } + if (!message->timestamp) { + message->timestamp = g_date_time_new_now_local(); } message->body = xmpp_message_get_body(stanza); @@ -1418,17 +1415,13 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c log_warning("MAM received with no result id"); } } else { - // XEP-0359 §5: only accept whose 'by' matches our server + // live messages use XEP-0359 char* stanzaid = NULL; xmpp_stanza_t* stanzaidst = xmpp_stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_STANZA_ID, STANZA_NS_STABLE_ID); if (stanzaidst) { - const char* by = xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_BY); - const char* my_domain = connection_get_domain(); - if (by && my_domain && g_strcmp0(by, my_domain) == 0) { - stanzaid = (char*)xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_ID); - if (stanzaid) { - message->stanzaid = strdup(stanzaid); - } + stanzaid = (char*)xmpp_stanza_get_attribute(stanzaidst, STANZA_ATTR_ID); + if (stanzaid) { + message->stanzaid = strdup(stanzaid); } } } @@ -1449,7 +1442,7 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c // XEP-0203 §4: only trust from a server domain, not from // the remote client which could forge an arbitrary timestamp. const char* my_domain = connection_get_domain(); - message->timestamp = stanza_get_delay_from(stanza, (gchar*)my_domain); + message->timestamp = stanza_get_delay_from(stanza, my_domain); if (!message->timestamp && jid->domainpart) { message->timestamp = stanza_get_delay_from(stanza, jid->domainpart); } diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index 8a07cc75..5df9d37c 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -1183,7 +1183,7 @@ _stanza_get_delay_timestamp_xep0091(xmpp_stanza_t* const x_stanza) } GDateTime* -stanza_get_delay_from(xmpp_stanza_t* const stanza, gchar* from) +stanza_get_delay_from(xmpp_stanza_t* const stanza, const char* const from) { xmpp_stanza_t* delay = NULL; diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h index f20a7733..fc6c890c 100644 --- a/src/xmpp/stanza.h +++ b/src/xmpp/stanza.h @@ -196,7 +196,6 @@ #define STANZA_ATTR_FILENAME "filename" #define STANZA_ATTR_SIZE "size" #define STANZA_ATTR_CONTENTTYPE "content-type" -#define STANZA_ATTR_BY "by" #define STANZA_ATTR_LABEL "label" #define STANZA_TEXT_AWAY "away" @@ -330,7 +329,7 @@ xmpp_stanza_t* stanza_create_mediated_invite(xmpp_ctx_t* ctx, const char* const gboolean stanza_contains_chat_state(xmpp_stanza_t* stanza); GDateTime* stanza_get_delay(xmpp_stanza_t* const stanza); -GDateTime* stanza_get_delay_from(xmpp_stanza_t* const stanza, gchar* from); +GDateTime* stanza_get_delay_from(xmpp_stanza_t* const stanza, const char* const from); GDateTime* stanza_get_oldest_delay(xmpp_stanza_t* const stanza); GDateTime* stanza_get_oldest_delay_from(xmpp_stanza_t* const stanza, const char* const from);