Software /
code /
prosody
Comparison
plugins/mod_mam/mod_mam.lua @ 8208:b69b40a828fd
Merge 0.10->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 04 Sep 2017 10:08:04 +0200 |
parent | 8207:8ea0484871e8 |
child | 8230:154852646095 |
comparison
equal
deleted
inserted
replaced
8203:a7863f4aae65 | 8208:b69b40a828fd |
---|---|
226 return has_in_roster(user, who); | 226 return has_in_roster(user, who); |
227 end | 227 end |
228 return default; | 228 return default; |
229 end | 229 end |
230 | 230 |
231 local function strip_stanza_id(stanza, user) | |
232 if stanza:get_child("stanza-id", xmlns_st_id) then | |
233 stanza = st.clone(stanza); | |
234 stanza:maptags(function (tag) | |
235 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then | |
236 local by_user, by_host, res = jid_prepped_split(tag.attr.by); | |
237 if not res and by_host == host and by_user == user then | |
238 return nil; | |
239 end | |
240 end | |
241 return tag; | |
242 end); | |
243 end | |
244 return stanza; | |
245 end | |
246 | |
231 -- Handle messages | 247 -- Handle messages |
232 local function message_handler(event, c2s) | 248 local function message_handler(event, c2s) |
233 local origin, stanza = event.origin, event.stanza; | 249 local origin, stanza = event.origin, event.stanza; |
234 local log = c2s and origin.log or module._log; | 250 local log = c2s and origin.log or module._log; |
235 local orig_type = stanza.attr.type or "normal"; | 251 local orig_type = stanza.attr.type or "normal"; |
241 local store_user = c2s and origin.username or jid_split(orig_to); | 257 local store_user = c2s and origin.username or jid_split(orig_to); |
242 -- And who are they chatting with? | 258 -- And who are they chatting with? |
243 local with = jid_bare(c2s and orig_to or orig_from); | 259 local with = jid_bare(c2s and orig_to or orig_from); |
244 | 260 |
245 -- Filter out <stanza-id> that claim to be from us | 261 -- Filter out <stanza-id> that claim to be from us |
246 if stanza:get_child("stanza-id", xmlns_st_id) then | 262 event.stanza = strip_stanza_id(stanza, store_user); |
247 stanza = st.clone(stanza); | |
248 stanza:maptags(function (tag) | |
249 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then | |
250 local by_user, by_host, res = jid_prepped_split(tag.attr.by); | |
251 if not res and by_host == module.host and by_user == store_user then | |
252 return nil; | |
253 end | |
254 end | |
255 return tag; | |
256 end); | |
257 event.stanza = stanza; | |
258 end | |
259 | 263 |
260 -- We store chat messages or normal messages that have a body | 264 -- We store chat messages or normal messages that have a body |
261 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then | 265 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then |
262 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); | 266 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag()); |
263 return; | 267 return; |
310 | 314 |
311 local function c2s_message_handler(event) | 315 local function c2s_message_handler(event) |
312 return message_handler(event, true); | 316 return message_handler(event, true); |
313 end | 317 end |
314 | 318 |
315 local function strip_stanza_id(event) | 319 -- Filter out <stanza-id> before the message leaves the server to prevent privacy leak. |
316 local strip_by = jid_bare(event.origin.full_jid); | 320 local function strip_stanza_id_after_other_events(event) |
317 event.stanza:maptags(function(tag) | 321 event.stanza = strip_stanza_id(event.stanza, event.origin.username); |
318 if not ( tag.attr.xmlns == xmlns_st_id and tag.attr.by == strip_by ) then | 322 end |
319 return tag; | 323 |
320 end | 324 module:hook("pre-message/bare", strip_stanza_id_after_other_events, -1); |
321 end); | 325 module:hook("pre-message/full", strip_stanza_id_after_other_events, -1); |
322 end | |
323 | |
324 module:hook("pre-message/bare", strip_stanza_id, -1); | |
325 module:hook("pre-message/full", strip_stanza_id, -1); | |
326 | 326 |
327 local cleanup_after = module:get_option_string("archive_expires_after", "1w"); | 327 local cleanup_after = module:get_option_string("archive_expires_after", "1w"); |
328 local cleanup_interval = module:get_option_number("archive_cleanup_interval", 4 * 60 * 60); | 328 local cleanup_interval = module:get_option_number("archive_cleanup_interval", 4 * 60 * 60); |
329 if cleanup_after ~= "never" then | 329 if cleanup_after ~= "never" then |
330 local day = 86400; | 330 local day = 86400; |