Annotate

mod_mam/mod_mam.lua @ 3965:2b10e51d85a6

mod_muc_limits: Add config option to limit to join stanzas only This is a bit more limited in pre-0.11 MUC modules, because it just detects stanzas sent to full JIDs (which would include all presence and nick changes). This option is useful for setups where users are typically unaffiliated, but trusted (e.g. if access to the room is gated through some other means such as password/token auth).
author Matthew Wild <mwild1@gmail.com>
date Fri, 03 Apr 2020 12:26:56 +0100
parent 3694:e45a3d04367b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
635
30be50d2537f mod_mam: Update header
Kim Alvefur <zash@zash.se>
parents: 634
diff changeset
1 -- XEP-0313: Message Archive Management for Prosody
2000
b5adfe72709b mod_mam: Improve error messages when failed to open storage
Kim Alvefur <zash@zash.se>
parents: 1957
diff changeset
2 -- Copyright (C) 2011-2016 Kim Alvefur
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 --
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- This file is MIT/X11 licensed.
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
6 local xmlns_mam0 = "urn:xmpp:mam:0";
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
7 local xmlns_mam1 = "urn:xmpp:mam:1";
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
8 local xmlns_mam2 = "urn:xmpp:mam:2";
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
9 local xmlns_delay = "urn:xmpp:delay";
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
10 local xmlns_forward = "urn:xmpp:forward:0";
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
11 local xmlns_st_id = "urn:xmpp:sid:0";
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
12
2293
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
13 local um = require "core.usermanager";
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local st = require "util.stanza";
701
cc5805f83583 mod_mam: Implement support for Result Set Management in queries.
Kim Alvefur <zash@zash.se>
parents: 675
diff changeset
15 local rsm = module:require "rsm";
1399
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
16 local get_prefs = module:require"mamprefs".get;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
17 local set_prefs = module:require"mamprefs".set;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
18 local prefs_to_stanza = module:require"mamprefsxml".tostanza;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
19 local prefs_from_stanza = module:require"mamprefsxml".fromstanza;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local jid_bare = require "util.jid".bare;
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 local jid_split = require "util.jid".split;
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
22 local jid_prepped_split = require "util.jid".prepped_split;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
23 local dataform = require "util.dataforms".new;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
24 local host = module.host;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
25
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
26 local rm_load_roster = require "core.rostermanager".load_roster;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
27
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
28 local getmetatable = getmetatable;
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
29 local function is_stanza(x)
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
30 return getmetatable(x) == st.stanza_mt;
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
31 end
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
32
672
8ae5317ba032 mod_mam: local tostring and some comments
Kim Alvefur <zash@zash.se>
parents: 671
diff changeset
33 local tostring = tostring;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 local time_now = os.time;
707
f987c7b79008 mod_mam: Fix typo
Kim Alvefur <zash@zash.se>
parents: 706
diff changeset
35 local m_min = math.min;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse;
706
5c2b96c4dde6 mod_mam: Enforce a max number of items returned, with a default.
Kim Alvefur <zash@zash.se>
parents: 705
diff changeset
37 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50);
2017
d44ac0756c46 mod_mam: Enable archiving by default, less of a privacy issue if messages expire
Kim Alvefur <zash@zash.se>
parents: 2016
diff changeset
38 local global_default_policy = module:get_option("default_archive_policy", true);
1587
3ac2b835c7b3 mod_mam: Make sure default_archive_policy is a boolean or "roster" (thanks souliane)
Kim Alvefur <zash@zash.se>
parents: 1484
diff changeset
39 if global_default_policy ~= "roster" then
3ac2b835c7b3 mod_mam: Make sure default_archive_policy is a boolean or "roster" (thanks souliane)
Kim Alvefur <zash@zash.se>
parents: 1484
diff changeset
40 global_default_policy = module:get_option_boolean("default_archive_policy", global_default_policy);
3ac2b835c7b3 mod_mam: Make sure default_archive_policy is a boolean or "roster" (thanks souliane)
Kim Alvefur <zash@zash.se>
parents: 1484
diff changeset
41 end
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
42
2510
d81882aa0e1e mod_mam: Make the store configurable to ease move to 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2506
diff changeset
43 local archive_store = module:get_option_string("archive_store", "archive2");
2662
2d5e0e2938d1 mod_mam: Remove extraneous assert when opening the store
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2644
diff changeset
44 local archive = module:open_store(archive_store, "archive");
2020
37b30f10fbba mod_mam: Bit of spacing between blocks of code
Kim Alvefur <zash@zash.se>
parents: 2019
diff changeset
45
2024
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
46 if archive.name == "null" or not archive.find then
2644
0f44d04d0d18 mod_mam: Ignore long log lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2516
diff changeset
47 -- luacheck: ignore 631
2024
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
48 if not archive.find then
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
49 module:log("debug", "Attempt to open archive storage returned a valid driver but it does not seem to implement the storage API");
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
50 module:log("debug", "mod_%s does not support archiving", archive._provided_by or archive.name and "storage_"..archive.name.."(?)" or "<unknown>");
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
51 else
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
52 module:log("debug", "Attempt to open archive storage returned null driver");
6f4dcc723a60 mod_mam: Use the fallback driver if either the null driver or a driver that does not implement the archive api is returned
Kim Alvefur <zash@zash.se>
parents: 2023
diff changeset
53 end
2030
66156e4d5274 mod_mam: This was meant to be a debug message
Kim Alvefur <zash@zash.se>
parents: 2025
diff changeset
54 module:log("debug", "See https://prosody.im/doc/storage and https://prosody.im/doc/archiving for more information");
2023
98b4794b72e4 mod_mam: Include an in-memory fallback driver
Kim Alvefur <zash@zash.se>
parents: 2022
diff changeset
55 module:log("info", "Using in-memory fallback archive driver");
98b4794b72e4 mod_mam: Include an in-memory fallback driver
Kim Alvefur <zash@zash.se>
parents: 2022
diff changeset
56 archive = module:require "fallback_archive";
1185
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
57 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
58
2724
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
59 local use_total = true;
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
60
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
61 local cleanup;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
62
2764
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
63 local function schedule_cleanup(username)
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
64 if cleanup and not cleanup[username] then
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
65 table.insert(cleanup, username);
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
66 cleanup[username] = true;
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
67 end
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
68 end
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
69
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
70 -- Handle prefs.
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
71 local function handle_prefs(event)
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 local origin, stanza = event.origin, event.stanza;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
73 local xmlns_mam = stanza.tags[1].attr.xmlns;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
74 local user = origin.username;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 if stanza.attr.type == "get" then
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
76 local prefs = prefs_to_stanza(get_prefs(user), xmlns_mam);
1135
0d6ab5e4bc30 mod_mam: Break out routines for converting prefs between XML and our internal representation into a library
Kim Alvefur <zash@zash.se>
parents: 1116
diff changeset
77 local reply = st.reply(stanza):add_child(prefs);
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
78 origin.send(reply);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 else -- type == "set"
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
80 local new_prefs = stanza:get_child("prefs", xmlns_mam);
1135
0d6ab5e4bc30 mod_mam: Break out routines for converting prefs between XML and our internal representation into a library
Kim Alvefur <zash@zash.se>
parents: 1116
diff changeset
81 local prefs = prefs_from_stanza(new_prefs);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
82 local ok, err = set_prefs(user, prefs);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
83 if not ok then
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
84 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
85 else
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
86 origin.send(st.reply(stanza));
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
87 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 end
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
89 return true;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
90 end
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
91
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
92 module:hook("iq/self/"..xmlns_mam0..":prefs", handle_prefs);
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
93 module:hook("iq/self/"..xmlns_mam1..":prefs", handle_prefs);
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
94 module:hook("iq/self/"..xmlns_mam2..":prefs", handle_prefs);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
96 local query_form = dataform {
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
97 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam0; };
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
98 { name = "with"; type = "jid-single"; };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
99 { name = "start"; type = "text-single" };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
100 { name = "end"; type = "text-single"; };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
101 };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
102
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
103 -- Serve form
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
104 local function handle_get_form(event)
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
105 local origin, stanza = event.origin, event.stanza;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
106 local xmlns_mam = stanza.tags[1].attr.xmlns;
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
107 query_form[1].value = xmlns_mam;
2505
1398f3f76c0f mod_mam: Add missing wrapping <query> element when returning the query form
Kim Alvefur <zash@zash.se>
parents: 2293
diff changeset
108 origin.send(st.reply(stanza):query(xmlns_mam):add_child(query_form:form()));
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
109 return true;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
110 end
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
111
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
112 module:hook("iq-get/self/"..xmlns_mam0..":query", handle_get_form);
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
113 module:hook("iq-get/self/"..xmlns_mam1..":query", handle_get_form);
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
114 module:hook("iq-get/self/"..xmlns_mam2..":query", handle_get_form);
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
115
1325
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
116 -- Handle archive queries
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
117 local function handle_mam_query(event)
1324
853a382c9bd6 mod_turncredentials: Advertise the XEP-0215 feature (thanks Gryffus)
Kim Alvefur <zash@zash.se>
parents: 1187
diff changeset
118 local origin, stanza = event.origin, event.stanza;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
119 local xmlns_mam = stanza.tags[1].attr.xmlns;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 local query = stanza.tags[1];
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
121 local qid = query.attr.queryid;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
122
3694
e45a3d04367b mod_mam: Add flag to session when it performs a MAM query
Matthew Wild <mwild1@gmail.com>
parents: 2914
diff changeset
123 origin.mam_requested = true;
e45a3d04367b mod_mam: Add flag to session when it performs a MAM query
Matthew Wild <mwild1@gmail.com>
parents: 2914
diff changeset
124
2764
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
125 schedule_cleanup(origin.username);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
126
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
127 -- Search query parameters
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
128 local qwith, qstart, qend;
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
129 local form = query:get_child("x", "jabber:x:data");
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
130 if form then
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
131 local err;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
132 query_form[1].value = xmlns_mam;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
133 form, err = query_form:data(form);
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
134 if err then
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
135 origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err))));
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
136 return true;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
137 end
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
138 qwith, qstart, qend = form["with"], form["start"], form["end"];
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
139 qwith = qwith and jid_bare(qwith); -- dataforms does jidprep
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
140 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
142 if qstart or qend then -- Validate timestamps
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
143 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend));
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
144 if (qstart and not vstart) or (qend and not vend) then
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
145 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
146 return true;
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
147 end
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
148 qstart, qend = vstart, vend;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
149 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
150
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
151 module:log("debug", "Archive query, id %s with %s from %s until %s)",
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
152 tostring(qid), qwith or "anyone", qstart or "the dawn of time", qend or "now");
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
154 -- RSM stuff
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
155 local qset = rsm.get(query);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
156 local qmax = m_min(qset and qset.max or default_max_items, max_max_items);
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
157 local reverse = qset and qset.before or false;
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
158 local before, after = qset and qset.before, qset and qset.after;
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
159 if type(before) ~= "string" then before = nil; end
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
160
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
161 -- Load all the data!
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
162 local data, err = archive:find(origin.username, {
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
163 start = qstart; ["end"] = qend; -- Time range
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
164 with = qwith;
1682
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
165 limit = qmax + 1;
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
166 before = before; after = after;
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
167 reverse = reverse;
2725
210c3a7644cb mod_mam: Use correct variable
Kim Alvefur <zash@zash.se>
parents: 2724
diff changeset
168 total = use_total;
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
169 });
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
170
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
171 if not data then
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
172 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
173 return true;
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
174 end
2019
7198c129657c mod_mam: Always convert 'total' to a number
Kim Alvefur <zash@zash.se>
parents: 2018
diff changeset
175 local total = tonumber(err);
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
176
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
177 if xmlns_mam == xmlns_mam0 then
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
178 origin.send(st.reply(stanza));
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
179 end
1403
6b3db167374a mod_mam: Mirror to and from attributes from iq on result messages
Kim Alvefur <zash@zash.se>
parents: 1400
diff changeset
180 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to };
6b3db167374a mod_mam: Mirror to and from attributes from iq on result messages
Kim Alvefur <zash@zash.se>
parents: 1400
diff changeset
181
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
182 local results = {};
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
183
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
184 -- Wrap it in stuff and deliver
1684
838150167871 mod_mam: Move variable into loop scope
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
185 local first, last;
1682
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
186 local count = 0;
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
187 local complete = "true";
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
188 for id, item, when in data do
1682
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
189 count = count + 1;
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
190 if count > qmax then
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
191 complete = nil;
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
192 break;
6b2122630b92 mod_mam: Support the mandatory 'complete' attribute by requesting one extra item from storage
Kim Alvefur <zash@zash.se>
parents: 1681
diff changeset
193 end
1684
838150167871 mod_mam: Move variable into loop scope
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
194 local fwd_st = st.message(msg_reply_attr)
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
195 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id })
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
196 :tag("forwarded", { xmlns = xmlns_forward })
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
197 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up();
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
198
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
199 if not is_stanza(item) then
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
200 item = st.deserialize(item);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
201 end
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
202 item.attr.xmlns = "jabber:client";
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
203 fwd_st:add_child(item);
701
cc5805f83583 mod_mam: Implement support for Result Set Management in queries.
Kim Alvefur <zash@zash.se>
parents: 675
diff changeset
204
1325
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
205 if not first then first = id; end
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
206 last = id;
1116
2345a30dd8b4 mod_mam: Update to use 'archive' storage type. Note: this breaks support with 0.9 and older.
Kim Alvefur <zash@zash.se>
parents: 1114
diff changeset
207
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
208 if reverse then
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
209 results[count] = fwd_st;
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
210 else
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
211 origin.send(fwd_st);
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
212 end
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
213 end
2020
37b30f10fbba mod_mam: Bit of spacing between blocks of code
Kim Alvefur <zash@zash.se>
parents: 2019
diff changeset
214
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
215 if reverse then
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
216 for i = #results, 1, -1 do
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
217 origin.send(results[i]);
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
218 end
2021
5fb917b86838 mod_mam: Merge identical conditional blocks
Kim Alvefur <zash@zash.se>
parents: 2020
diff changeset
219 first, last = last, first;
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
220 end
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
221
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
222 -- That's all folks!
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
223 module:log("debug", "Archive query %s completed", tostring(qid));
705
c9d0ba39a33b mod_mam: Move RSM pointer to last message into a MAM-namespaced child
Kim Alvefur <zash@zash.se>
parents: 702
diff changeset
224
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
225 local fin;
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
226 if xmlns_mam == xmlns_mam0 then
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
227 fin = st.message(msg_reply_attr);
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
228 else
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
229 fin = st.reply(stanza);
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
230 end
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
231 do
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
232 fin:tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete })
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
233 :add_child(rsm.generate {
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
234 first = first, last = last, count = total })
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
235 end
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
236 origin.send(fin);
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
237 return true;
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
238 end
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
239 module:hook("iq-set/self/"..xmlns_mam0..":query", handle_mam_query);
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
240 module:hook("iq-set/self/"..xmlns_mam1..":query", handle_mam_query);
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
241 module:hook("iq-set/self/"..xmlns_mam2..":query", handle_mam_query);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
242
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
243 local function has_in_roster(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
244 local roster = rm_load_roster(user, host);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
245 module:log("debug", "%s has %s in roster? %s", user, who, roster[who] and "yes" or "no");
798
2b8ceb4d1a73 mod_mam: remove useless check
Kim Alvefur <zash@zash.se>
parents: 751
diff changeset
246 return roster[who];
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
247 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
248
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
249 local function shall_store(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
250 -- TODO Cache this?
2293
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
251 if not um.user_exists(user, host) then
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
252 return false;
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
253 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
254 local prefs = get_prefs(user);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
255 local rule = prefs[who];
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
256 module:log("debug", "%s's rule for %s is %s", user, who, tostring(rule));
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
257 if rule ~= nil then
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
258 return rule;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
259 end
1788
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
260 -- Below could be done by a metatable
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
261 local default = prefs[false];
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
262 module:log("debug", "%s's default rule is %s", user, tostring(default));
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
263 if default == nil then
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
264 default = global_default_policy;
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
265 module:log("debug", "Using global default rule, %s", tostring(default));
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
266 end
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
267 if default == "roster" then
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
268 return has_in_roster(user, who);
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
269 end
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
270 return default;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
271 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
272
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
273 -- Handle messages
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 local function message_handler(event, c2s)
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 local origin, stanza = event.origin, event.stanza;
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
276 local log = c2s and origin.log or module._log;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
277 local orig_type = stanza.attr.type or "normal";
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 local orig_from = stanza.attr.from;
1149
d055c44a7f61 mod_mam: Clean up and explain the code that determines who's archive we put the message in
Kim Alvefur <zash@zash.se>
parents: 1135
diff changeset
279 local orig_to = stanza.attr.to or orig_from;
d055c44a7f61 mod_mam: Clean up and explain the code that determines who's archive we put the message in
Kim Alvefur <zash@zash.se>
parents: 1135
diff changeset
280 -- Stanza without 'to' are treated as if it was to their own bare jid
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
281
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
282 -- Whos storage do we put it in?
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
283 local store_user = c2s and origin.username or jid_split(orig_to);
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
284 -- And who are they chatting with?
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
285 local with = jid_bare(c2s and orig_to or orig_from);
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
286
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
287 -- Filter out <stanza-id> that claim to be from us
2760
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
288 if stanza:get_child("stanza-id", xmlns_st_id) then
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
289 stanza = st.clone(stanza);
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
290 stanza:maptags(function (tag)
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
291 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id then
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
292 local by_user, by_host, res = jid_prepped_split(tag.attr.by);
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
293 if not res and by_host == module.host and by_user == store_user then
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
294 return nil;
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
295 end
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
296 end
2760
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
297 return tag;
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
298 end);
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
299 event.stanza = stanza;
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
300 end
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
301
1790
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
302 -- We store chat messages or normal messages that have a body
1957
ca33cca2e028 mod_mam: Clarify condition presendence
Kim Alvefur <zash@zash.se>
parents: 1790
diff changeset
303 if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body")) ) then
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
304 log("debug", "Not archiving stanza: %s (type)", stanza:top_tag());
1790
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
305 return;
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
306 end
2512
bc7539ccbde1 mod_mam: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 2511
diff changeset
307
1150
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
308 -- or if hints suggest we shouldn't
2511
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
309 if not stanza:get_child("store", "urn:xmpp:hints") then -- No hint telling us we should store
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
310 if stanza:get_child("no-permanent-store", "urn:xmpp:hints")
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
311 or stanza:get_child("no-store", "urn:xmpp:hints") then -- Hint telling us we should NOT store
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
312 log("debug", "Not archiving stanza: %s (hint)", stanza:top_tag());
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
313 return;
34a6ba5dfe4f mod_mam: Bring hints processing in line with 0.10 version
Kim Alvefur <zash@zash.se>
parents: 2510
diff changeset
314 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316
1149
d055c44a7f61 mod_mam: Clean up and explain the code that determines who's archive we put the message in
Kim Alvefur <zash@zash.se>
parents: 1135
diff changeset
317 -- Check with the users preferences
d055c44a7f61 mod_mam: Clean up and explain the code that determines who's archive we put the message in
Kim Alvefur <zash@zash.se>
parents: 1135
diff changeset
318 if shall_store(store_user, with) then
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
319 log("debug", "Archiving stanza: %s", stanza:top_tag());
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
320
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
321 -- And stash it
2515
4cb549622862 mod_mam: Fix to expect archive id as first return value from archive:append
Kim Alvefur <zash@zash.se>
parents: 2513
diff changeset
322 local ok = archive:append(store_user, nil, stanza, time_now(), with);
1746
5734a6199938 mod_mam: Fire event on successful storage of message
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
323 if ok then
2760
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
324 local clone_for_other_handlers = st.clone(stanza);
2515
4cb549622862 mod_mam: Fix to expect archive id as first return value from archive:append
Kim Alvefur <zash@zash.se>
parents: 2513
diff changeset
325 local id = ok;
2760
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
326 clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up();
7c2416a1eb94 mod_mam: Clone stanzas before mutating (thanks waqas) (fixes #961)
Kim Alvefur <zash@zash.se>
parents: 2725
diff changeset
327 event.stanza = clone_for_other_handlers;
2764
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
328 schedule_cleanup(store_user);
2762
f2096c03428b mod_mam: Fix traceback due to borked transplant from 0.10
Kim Alvefur <zash@zash.se>
parents: 2761
diff changeset
329 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id });
1746
5734a6199938 mod_mam: Fire event on successful storage of message
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
330 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
331 else
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
332 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag());
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
333 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 local function c2s_message_handler(event)
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337 return message_handler(event, true);
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
340 local function strip_stanza_id(event)
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
341 local strip_by = jid_bare(event.origin.full_jid);
2761
b13d07613b80 mod_mam: Clone stanza before stripping stanza id after carbons
Kim Alvefur <zash@zash.se>
parents: 2760
diff changeset
342 event.stanza = st.clone(event.stanza);
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
343 event.stanza:maptags(function(tag)
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
344 if not ( tag.attr.xmlns == xmlns_st_id and tag.attr.by == strip_by ) then
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
345 return tag;
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
346 end
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
347 end);
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
348 end
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
349
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
350 module:hook("pre-message/bare", strip_stanza_id, 0.01);
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
351 module:hook("pre-message/full", strip_stanza_id, 0.01);
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
352
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
353 local cleanup_after = module:get_option_string("archive_expires_after", "1w");
2022
77b9c7e5fd63 mod_mam: Allow interval between archive cleanup to be changed
Kim Alvefur <zash@zash.se>
parents: 2021
diff changeset
354 local cleanup_interval = module:get_option_number("archive_cleanup_interval", 4 * 60 * 60);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
355 if cleanup_after ~= "never" then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
356 local day = 86400;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
357 local multipliers = { d = day, w = day * 7, m = 31 * day, y = 365.2425 * day };
2049
50c188cf0ae3 mod_mam: Include 'w' (week) in pattern for "archive_expires_after" option (fixes #627)
Kim Alvefur <zash@zash.se>
parents: 2042
diff changeset
358 local n, m = cleanup_after:lower():match("(%d+)%s*([dwmy]?)");
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
359 if not n then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
360 module:log("error", "Could not parse archive_expires_after string %q", cleanup_after);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
361 return false;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
362 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
363
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
364 cleanup_after = tonumber(n) * ( multipliers[m] or 1 );
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
365
2042
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
366 module:log("debug", "archive_expires_after = %d -- in seconds", cleanup_after);
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
367
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
368 if not archive.delete then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
369 module:log("error", "archive_expires_after set but mod_%s does not support deleting", archive._provided_by);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
370 return false;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
371 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
372
2513
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
373 -- Set of known users to do message expiry for
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
374 -- Populated either below or when new messages are added
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
375 cleanup = {};
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
376
2513
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
377 -- Iterating over users is not supported by all authentication modules
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
378 -- Catch and ignore error if not supported
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
379 pcall(function ()
2513
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
380 -- If this works, then we schedule cleanup for all known users on startup
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
381 for user in um.users(module.host) do
2764
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
382 schedule_cleanup(user);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
383 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
384 end);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
385
2513
66a61f48e376 mod_mam: Add comments
Kim Alvefur <zash@zash.se>
parents: 2512
diff changeset
386 -- At odd intervals, delete old messages for one user
2039
464edd03099a mod_mam: Add a bit of randomness to cleanup intervals to keep some time between multiple instances
Kim Alvefur <zash@zash.se>
parents: 2033
diff changeset
387 module:add_timer(math.random(10, 60), function()
2764
1872a9129c2f mod_mam: Use a FIFO queue for scheduling archive expiry
Kim Alvefur <zash@zash.se>
parents: 2762
diff changeset
388 local user = table.remove(cleanup, 1);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
389 if user then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
390 module:log("debug", "Removing old messages for user %q", user);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
391 local ok, err = archive:delete(user, { ["end"] = os.time() - cleanup_after; })
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
392 if not ok then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
393 module:log("warn", "Could not expire archives for user %s: %s", user, err);
2042
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
394 else
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
395 -- :affected() is a recent addition for eg SQLite3 in LuaDBI
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
396 pcall(function(stmt)
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
397 module:log("debug", "Removed %d messages", stmt:affected());
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
398 end, err);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
399 end
2025
ae98bb884110 mod_mam: Fix Top Level Error from string[table] = nil instead of table[string] = nil
Kim Alvefur <zash@zash.se>
parents: 2024
diff changeset
400 cleanup[user] = nil;
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
401 end
2039
464edd03099a mod_mam: Add a bit of randomness to cleanup intervals to keep some time between multiple instances
Kim Alvefur <zash@zash.se>
parents: 2033
diff changeset
402 return math.random(cleanup_interval, cleanup_interval * 2);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
403 end);
2724
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
404 else
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
405 -- Don't ask the backend to count the potentially unbounded number of items,
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
406 -- it'll get slow.
9f17d0f28d77 mod_mam: Don't ask the storage backend to count all items when expiry is disabled
Kim Alvefur <zash@zash.se>
parents: 2711
diff changeset
407 use_total = false;
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
408 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
409
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
410 -- Stanzas sent by local clients
2914
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
411 local priority = 0.075
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
412 assert(priority < 0.1, "priority must be after mod_firewall");
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
413 assert(priority > 0.05, "priority must be before mod_carbons");
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
414 assert(priority > 0.01, "priority must be before strip_stanza_id");
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
415 module:hook("pre-message/bare", c2s_message_handler, priority);
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
416 module:hook("pre-message/full", c2s_message_handler, priority);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
417 -- Stanszas to local clients
2914
0d2d4d5bb5f5 [mod_mam] Fix hook priority for local clients, too (see also commit 2af42a3af131)
tmolitor <thilo@eightysoft.de>
parents: 2768
diff changeset
418 priority = 0.075
2768
2af42a3af131 mod_mam: Squeeze in hooks with priority between sevral other modules (fixes #996)
Kim Alvefur <zash@zash.se>
parents: 2764
diff changeset
419 assert(priority > 0, "priority must be before mod_message");
2af42a3af131 mod_mam: Squeeze in hooks with priority between sevral other modules (fixes #996)
Kim Alvefur <zash@zash.se>
parents: 2764
diff changeset
420 assert(priority < 0.1, "priority must be after mod_firewall");
2af42a3af131 mod_mam: Squeeze in hooks with priority between sevral other modules (fixes #996)
Kim Alvefur <zash@zash.se>
parents: 2764
diff changeset
421 assert(priority > 0.05, "priority must be before mod_carbons");
2af42a3af131 mod_mam: Squeeze in hooks with priority between sevral other modules (fixes #996)
Kim Alvefur <zash@zash.se>
parents: 2764
diff changeset
422 module:hook("message/bare", message_handler, priority);
2af42a3af131 mod_mam: Squeeze in hooks with priority between sevral other modules (fixes #996)
Kim Alvefur <zash@zash.se>
parents: 2764
diff changeset
423 module:hook("message/full", message_handler, priority);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
425 module:add_feature(xmlns_mam0); -- COMPAT with XEP-0313 v 0.1
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
426
1678
9ee56cc1be2c mod_mam: Advertise feature in disco#info for account as per XEP-0313 >= 0.2
Kim Alvefur <zash@zash.se>
parents: 1587
diff changeset
427 module:hook("account-disco-info", function(event)
2506
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
428 (event.reply or event.stanza):tag("feature", {var=xmlns_mam0}):up();
5941aac79f06 mod_mam: Add support for XEP-0313 v0.5
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
429 (event.reply or event.stanza):tag("feature", {var=xmlns_mam1}):up();
2516
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
430 (event.reply or event.stanza):tag("feature", {var=xmlns_mam2}):up();
248054199d0f mod_mam: Add support for XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 2515
diff changeset
431 (event.reply or event.stanza):tag("feature", {var=xmlns_st_id}):up();
1678
9ee56cc1be2c mod_mam: Advertise feature in disco#info for account as per XEP-0313 >= 0.2
Kim Alvefur <zash@zash.se>
parents: 1587
diff changeset
432 end);
9ee56cc1be2c mod_mam: Advertise feature in disco#info for account as per XEP-0313 >= 0.2
Kim Alvefur <zash@zash.se>
parents: 1587
diff changeset
433