# HG changeset patch # User Kim Alvefur # Date 1504391731 -7200 # Node ID 7c2416a1eb94e58f499828065fa6a5bf1025fe2e # Parent 4bf60727459b9d12f373b4d0931aeb3eca085e67 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961) diff -r 4bf60727459b -r 7c2416a1eb94 mod_mam/mod_mam.lua --- a/mod_mam/mod_mam.lua Wed Aug 30 08:20:41 2017 +0200 +++ b/mod_mam/mod_mam.lua Sun Sep 03 00:35:31 2017 +0200 @@ -276,15 +276,19 @@ local with = jid_bare(c2s and orig_to or orig_from); -- Filter out that claim to be from us - stanza:maptags(function (tag) - if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then - local by_user, by_host, res = jid_prepped_split(tag.attr.by); - if not res and by_host == module.host and by_user == store_user then - return nil; + if stanza:get_child("stanza-id", xmlns_st_id) then + stanza = st.clone(stanza); + stanza:maptags(function (tag) + if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then + local by_user, by_host, res = jid_prepped_split(tag.attr.by); + if not res and by_host == module.host and by_user == store_user then + return nil; + end end - end - return tag; - end); + return tag; + end); + event.stanza = stanza; + end -- We store chat messages or normal messages that have a body if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then @@ -308,10 +312,12 @@ -- And stash it local ok = archive:append(store_user, nil, stanza, time_now(), with); if ok then + local clone_for_other_handlers = st.clone(stanza); local id = ok; - stanza:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); + clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); + event.stanza = clone_for_other_handlers; if cleanup then cleanup[store_user] = true; end - module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id }); + module:fire_event("archive-message-added", { origin = origin, stanza = clone_for_storage, for_user = store_user, id = id }); end else log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag());