aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_smacks.lua
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-12-02 13:56:50 +0100
committerKim Alvefur <zash@zash.se>2021-12-02 13:56:50 +0100
commitf5b06065141a929407c1c3d6def8f4b2a9355234 (patch)
tree858dd5739f48c26912b8049482b0c8f9258c61fb /plugins/mod_smacks.lua
parent89b37d4e0a219f6a9311f4887a46d39aaecbf84e (diff)
downloadprosody-f5b06065141a929407c1c3d6def8f4b2a9355234.tar.gz
prosody-f5b06065141a929407c1c3d6def8f4b2a9355234.zip
mod_smacks: Avoid duplicated queueing using flag on session instead of stanza
Mutating the stanza like this is Really Bad Practice.
Diffstat (limited to 'plugins/mod_smacks.lua')
-rw-r--r--plugins/mod_smacks.lua6
1 files changed, 4 insertions, 2 deletions
diff --git a/plugins/mod_smacks.lua b/plugins/mod_smacks.lua
index 13fec24d..35390781 100644
--- a/plugins/mod_smacks.lua
+++ b/plugins/mod_smacks.lua
@@ -198,14 +198,14 @@ local function outgoing_stanza_filter(stanza, session)
-- supposed to be nil.
-- However, when using mod_smacks with mod_websocket, then mod_websocket's
-- stanzas/out filter can get called before this one and adds the xmlns.
+ if session.resending_unacked then return stanza end
local is_stanza = st.is_stanza(stanza) and
(not stanza.attr.xmlns or stanza.attr.xmlns == 'jabber:client')
and not stanza.name:find":";
- if is_stanza and not stanza._cached then
+ if is_stanza then
local queue = session.outgoing_stanza_queue;
local cached_stanza = st.clone(stanza);
- cached_stanza._cached = true;
if cached_stanza.name ~= "iq" and cached_stanza:get_child("delay", xmlns_delay) == nil then
cached_stanza = cached_stanza:tag("delay", {
@@ -611,9 +611,11 @@ function handle_resume(session, stanza, xmlns_sm)
-- to the outgoing queue again
local queue = original_session.outgoing_stanza_queue;
session.log("debug", "resending all unacked stanzas that are still queued after resume, #queue = %d", #queue);
+ session.resending_unacked = true;
for i=1,#queue do
session.send(queue[i]);
end
+ session.resending_unacked = nil;
session.log("debug", "all stanzas resent, now disabling send() in this migrated session, #queue = %d", #queue);
function session.send(stanza) -- luacheck: ignore 432
migrated_session_log("error", "Tried to send stanza on old session migrated by smacks resume (maybe there is a bug?): %s", tostring(stanza));