Mercurial > prosody-modules
comparison mod_mam_muc/mod_mam_muc.lua @ 2721:391c508e0b75
mod_mam_muc: Store and return original JID, role and affiliation (fixes #903)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 23 Jun 2017 14:19:55 +0200 |
parents | 454d038df9b4 |
children | e32bf5e19acd |
comparison
equal
deleted
inserted
replaced
2720:454d038df9b4 | 2721:391c508e0b75 |
---|---|
10 | 10 |
11 local xmlns_mam = "urn:xmpp:mam:2"; | 11 local xmlns_mam = "urn:xmpp:mam:2"; |
12 local xmlns_delay = "urn:xmpp:delay"; | 12 local xmlns_delay = "urn:xmpp:delay"; |
13 local xmlns_forward = "urn:xmpp:forward:0"; | 13 local xmlns_forward = "urn:xmpp:forward:0"; |
14 local xmlns_st_id = "urn:xmpp:sid:0"; | 14 local xmlns_st_id = "urn:xmpp:sid:0"; |
15 local xmlns_muc_user = "http://jabber.org/protocol/muc#user"; | |
15 local muc_form_enable = "muc#roomconfig_enablearchiving" | 16 local muc_form_enable = "muc#roomconfig_enablearchiving" |
16 | 17 |
17 local st = require "util.stanza"; | 18 local st = require "util.stanza"; |
18 local rsm = require "util.rsm"; | 19 local rsm = require "util.rsm"; |
19 local jid_bare = require "util.jid".bare; | 20 local jid_bare = require "util.jid".bare; |
247 local fwd_st = st.message(msg_reply_attr) | 248 local fwd_st = st.message(msg_reply_attr) |
248 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }) | 249 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }) |
249 :tag("forwarded", { xmlns = xmlns_forward }) | 250 :tag("forwarded", { xmlns = xmlns_forward }) |
250 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); | 251 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); |
251 | 252 |
253 if room:get_whois() ~= "anyone" then | |
254 item:maptags(function (tag) | |
255 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then | |
256 return nil; | |
257 end | |
258 return tag; | |
259 end); | |
260 end | |
252 if not is_stanza(item) then | 261 if not is_stanza(item) then |
253 item = st.deserialize(item); | 262 item = st.deserialize(item); |
254 end | 263 end |
255 item.attr.xmlns = "jabber:client"; | 264 item.attr.xmlns = "jabber:client"; |
256 fwd_st:add_child(item); | 265 fwd_st:add_child(item); |
309 | 318 |
310 for id, item, when in data do | 319 for id, item, when in data do |
311 item.attr.to = to; | 320 item.attr.to = to; |
312 item:tag("delay", { xmlns = "urn:xmpp:delay", from = room_jid, stamp = timestamp(when) }):up(); -- XEP-0203 | 321 item:tag("delay", { xmlns = "urn:xmpp:delay", from = room_jid, stamp = timestamp(when) }):up(); -- XEP-0203 |
313 item:tag("stanza-id", { xmlns = xmlns_st_id, by = room_jid, id = id }):up(); | 322 item:tag("stanza-id", { xmlns = xmlns_st_id, by = room_jid, id = id }):up(); |
323 if room:get_whois() ~= "anyone" then | |
324 item:maptags(function (tag) | |
325 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then | |
326 return nil; | |
327 end | |
328 return tag; | |
329 end); | |
330 end | |
314 if maxchars then | 331 if maxchars then |
315 local chars = #tostring(item); | 332 local chars = #tostring(item); |
316 if maxchars - chars < 0 then | 333 if maxchars - chars < 0 then |
317 break | 334 break |
318 end | 335 end |
368 stanza:maptags(function (tag) | 385 stanza:maptags(function (tag) |
369 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id | 386 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id |
370 and jid_prep(tag.attr.by) == self.jid then | 387 and jid_prep(tag.attr.by) == self.jid then |
371 return nil; | 388 return nil; |
372 end | 389 end |
390 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then | |
391 return nil; | |
392 end | |
373 return tag; | 393 return tag; |
374 end); | 394 end); |
395 | |
396 local stored_stanza = stanza; | |
397 | |
398 if self:get_whois() == "anyone" then | |
399 stored_stanza = st.clone(stanza); | |
400 local actor = jid_bare(self._occupants[stanza.attr.from].jid); | |
401 local affiliation = self:get_affiliation(actor) or "none"; | |
402 local role = self:get_role(actor) or self:get_default_role(affiliation); | |
403 stored_stanza:add_direct_child(st.stanza("x", { xmlns = xmlns_muc_user }) | |
404 :tag("item", { affiliation = affiliation; role = role; jid = actor })); | |
405 end | |
375 | 406 |
376 -- Policy check | 407 -- Policy check |
377 if not archiving_enabled(self) then return end -- Don't log | 408 if not archiving_enabled(self) then return end -- Don't log |
378 | 409 |
379 -- And stash it | 410 -- And stash it |
380 local with = stanza.name | 411 local with = stanza.name |
381 if stanza.attr.type then | 412 if stanza.attr.type then |
382 with = with .. "<" .. stanza.attr.type | 413 with = with .. "<" .. stanza.attr.type |
383 end | 414 end |
384 | 415 |
385 local id = archive:append(room_node, nil, stanza, time_now(), with); | 416 local id = archive:append(room_node, nil, stored_stanza, time_now(), with); |
386 | 417 |
387 if id then | 418 if id then |
388 stanza:add_direct_child(st.stanza("stanza-id", { xmlns = xmlns_st_id, by = self.jid, id = id })); | 419 stanza:add_direct_child(st.stanza("stanza-id", { xmlns = xmlns_st_id, by = self.jid, id = id })); |
389 end | 420 end |
390 end | 421 end |