Mercurial > prosody-modules
comparison mod_mam/mod_mam.lua @ 2760:7c2416a1eb94
mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 03 Sep 2017 00:35:31 +0200 |
parents | 210c3a7644cb |
children | b13d07613b80 |
comparison
equal
deleted
inserted
replaced
2759:4bf60727459b | 2760:7c2416a1eb94 |
---|---|
274 local store_user = c2s and origin.username or jid_split(orig_to); | 274 local store_user = c2s and origin.username or jid_split(orig_to); |
275 -- And who are they chatting with? | 275 -- And who are they chatting with? |
276 local with = jid_bare(c2s and orig_to or orig_from); | 276 local with = jid_bare(c2s and orig_to or orig_from); |
277 | 277 |
278 -- Filter out <stanza-id> that claim to be from us | 278 -- Filter out <stanza-id> that claim to be from us |
279 stanza:maptags(function (tag) | 279 if stanza:get_child("stanza-id", xmlns_st_id) then |
280 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then | 280 stanza = st.clone(stanza); |
281 local by_user, by_host, res = jid_prepped_split(tag.attr.by); | 281 stanza:maptags(function (tag) |
282 if not res and by_host == module.host and by_user == store_user then | 282 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then |
283 return nil; | 283 local by_user, by_host, res = jid_prepped_split(tag.attr.by); |
284 if not res and by_host == module.host and by_user == store_user then | |
285 return nil; | |
286 end | |
284 end | 287 end |
285 end | 288 return tag; |
286 return tag; | 289 end); |
287 end); | 290 event.stanza = stanza; |
291 end | |
288 | 292 |
289 -- We store chat messages or normal messages that have a body | 293 -- We store chat messages or normal messages that have a body |
290 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then | 294 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then |
291 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); | 295 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); |
292 return; | 296 return; |
306 log("debug", "Archiving stanza: %s", stanza:top_tag()); | 310 log("debug", "Archiving stanza: %s", stanza:top_tag()); |
307 | 311 |
308 -- And stash it | 312 -- And stash it |
309 local ok = archive:append(store_user, nil, stanza, time_now(), with); | 313 local ok = archive:append(store_user, nil, stanza, time_now(), with); |
310 if ok then | 314 if ok then |
315 local clone_for_other_handlers = st.clone(stanza); | |
311 local id = ok; | 316 local id = ok; |
312 stanza:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); | 317 clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); |
318 event.stanza = clone_for_other_handlers; | |
313 if cleanup then cleanup[store_user] = true; end | 319 if cleanup then cleanup[store_user] = true; end |
314 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id }); | 320 module:fire_event("archive-message-added", { origin = origin, stanza = clone_for_storage, for_user = store_user, id = id }); |
315 end | 321 end |
316 else | 322 else |
317 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); | 323 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); |
318 end | 324 end |
319 end | 325 end |