annotate mod_mam/mod_mam.lua @ 2494:d300ae5dba87

mod_smacks: Fix some bugs with smacks-ack-delayed event triggering. The old code had several flaws which are addressed here. First of all this fixes the if statement guarding the event generation There where some timing glitches addressed by this commit as well.
author tmolitor <thilo@eightysoft.de>
date Sun, 12 Feb 2017 21:23:22 +0100
parents 144b74caa5ef
children 1398f3f76c0f
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
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
6 local xmlns_mam = "urn:xmpp:mam:0";
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
7 local xmlns_delay = "urn:xmpp:delay";
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
8 local xmlns_forward = "urn:xmpp:forward:0";
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
9
2293
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
10 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
11 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
12 local rsm = module:require "rsm";
1399
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
13 local get_prefs = module:require"mamprefs".get;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
14 local set_prefs = module:require"mamprefs".set;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
15 local prefs_to_stanza = module:require"mamprefsxml".tostanza;
7fb6b607afd6 mod_mam: Shuffle imports
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
16 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
17 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
18 local jid_split = require "util.jid".split;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
19 local dataform = require "util.dataforms".new;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
20 local host = module.host;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
21
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
22 local rm_load_roster = require "core.rostermanager".load_roster;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
23
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
24 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
25 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
26 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
27 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
28
672
8ae5317ba032 mod_mam: local tostring and some comments
Kim Alvefur <zash@zash.se>
parents: 671
diff changeset
29 local tostring = tostring;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 local time_now = os.time;
707
f987c7b79008 mod_mam: Fix typo
Kim Alvefur <zash@zash.se>
parents: 706
diff changeset
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38
675
da33325453fb mod_mam: Put name of store in a single variable
Kim Alvefur <zash@zash.se>
parents: 674
diff changeset
39 local archive_store = "archive2";
2000
b5adfe72709b mod_mam: Improve error messages when failed to open storage
Kim Alvefur <zash@zash.se>
parents: 1957
diff changeset
40 local archive = assert(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
41
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
42 if archive.name == "null" or 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
43 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
44 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
45 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
46 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
47 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
48 end
2030
66156e4d5274 mod_mam: This was meant to be a debug message
Kim Alvefur <zash@zash.se>
parents: 2025
diff changeset
49 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
50 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
51 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
52 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
53
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
54 local cleanup;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
55
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
56 -- Handle prefs.
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 module:hook("iq/self/"..xmlns_mam..":prefs", function(event)
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 local origin, stanza = event.origin, event.stanza;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
59 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
60 if stanza.attr.type == "get" then
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
61 local prefs = prefs_to_stanza(get_prefs(user));
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
62 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
63 origin.send(reply);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 else -- type == "set"
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
65 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
66 local prefs = prefs_from_stanza(new_prefs);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
67 local ok, err = set_prefs(user, prefs);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
68 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
69 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
70 else
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
71 origin.send(st.reply(stanza));
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
72 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 end
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
74 return true;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end);
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
77 local query_form = dataform {
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
78 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
79 { 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
80 { 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
81 { 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
82 };
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
83
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
84 -- Serve form
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
85 module:hook("iq-get/self/"..xmlns_mam..":query", function(event)
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
86 local origin, stanza = event.origin, event.stanza;
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
87 origin.send(st.reply(stanza):add_child(query_form:form()));
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
88 return true;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
89 end);
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
90
1325
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
91 -- Handle archive queries
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
92 module:hook("iq-set/self/"..xmlns_mam..":query", function(event)
1324
853a382c9bd6 mod_turncredentials: Advertise the XEP-0215 feature (thanks Gryffus)
Kim Alvefur <zash@zash.se>
parents: 1187
diff changeset
93 local origin, stanza = event.origin, event.stanza;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 local query = stanza.tags[1];
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
95 local qid = query.attr.queryid;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
96
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
97 if cleanup then cleanup[origin.username] = true; end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
98
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
99 -- Search query parameters
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
100 local qwith, qstart, qend;
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
101 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
102 if form then
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
103 local err;
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
104 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
105 if err then
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
106 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
107 return true;
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
108 end
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
109 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
110 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
111 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
113 if qstart or qend then -- Validate timestamps
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
114 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
115 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
116 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
117 return true;
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
118 end
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
119 qstart, qend = vstart, vend;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
120 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
121
1484
53a3a19d6093 mod_mam: Update to version 0.3 of XEP-0313
Kim Alvefur <zash@zash.se>
parents: 1403
diff changeset
122 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
123 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
124
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
125 -- 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
126 local qset = rsm.get(query);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
127 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
128 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
129 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
130 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
131
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
132
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
133 -- 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
134 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
135 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
136 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
137 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
138 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
139 reverse = reverse;
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
140 total = true;
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
141 });
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
142
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
143 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
144 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
145 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
146 end
2019
7198c129657c mod_mam: Always convert 'total' to a number
Kim Alvefur <zash@zash.se>
parents: 2018
diff changeset
147 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
148
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
149 origin.send(st.reply(stanza));
1403
6b3db167374a mod_mam: Mirror to and from attributes from iq on result messages
Kim Alvefur <zash@zash.se>
parents: 1400
diff changeset
150 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
151
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
152 local results = {};
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
153
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
154 -- Wrap it in stuff and deliver
1684
838150167871 mod_mam: Move variable into loop scope
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
155 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
156 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
157 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
158 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
159 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
160 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
161 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
162 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
163 end
1684
838150167871 mod_mam: Move variable into loop scope
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
164 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
165 :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
166 :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
167 :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
168
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 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
170 item = st.deserialize(item);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
171 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
172 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
173 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
174
1325
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
175 if not first then first = id; end
b21236b6b8d8 Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents: 1324
diff changeset
176 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
177
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
178 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
179 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
180 else
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
181 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
182 end
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
183 end
2020
37b30f10fbba mod_mam: Bit of spacing between blocks of code
Kim Alvefur <zash@zash.se>
parents: 2019
diff changeset
184
1685
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
185 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
186 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
187 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
188 end
2021
5fb917b86838 mod_mam: Merge identical conditional blocks
Kim Alvefur <zash@zash.se>
parents: 2020
diff changeset
189 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
190 end
cd87a2eba8f2 mod_mam: Reverse the order of reversed queries back to chronological order
Kim Alvefur <zash@zash.se>
parents: 1684
diff changeset
191
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
192 -- That's all folks!
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
193 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
194
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
195 origin.send(st.message(msg_reply_attr)
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
196 :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
197 :add_child(rsm.generate {
1683
cc3fad4198bc mod_mam: Rename variable
Kim Alvefur <zash@zash.se>
parents: 1682
diff changeset
198 first = first, last = last, count = total }));
1681
d20cfc5ba827 mod_mam: Always return true when a stanza event has been handled
Kim Alvefur <zash@zash.se>
parents: 1678
diff changeset
199 return true;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 end);
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
202 local function has_in_roster(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
203 local roster = rm_load_roster(user, host);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
204 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
205 return roster[who];
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
206 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
207
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
208 local function shall_store(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
209 -- TODO Cache this?
2293
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
210 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
211 return false;
144b74caa5ef mod_mam: Check that user exists (#731)
Kim Alvefur <zash@zash.se>
parents: 2270
diff changeset
212 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
213 local prefs = get_prefs(user);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
214 local rule = prefs[who];
1698
55bc42c1d8c5 mod_mam: Semicolons!
Kim Alvefur <zash@zash.se>
parents: 1685
diff changeset
215 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
216 if rule ~= nil then
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
217 return rule;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
218 end
1788
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
219 -- Below could be done by a metatable
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
220 local default = prefs[false];
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
221 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
222 if default == nil then
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
223 default = global_default_policy;
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
224 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
225 end
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
226 if default == "roster" then
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
227 return has_in_roster(user, who);
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
228 end
d2b82b90c413 mod_mam: Unindent 'else' block
Kim Alvefur <zash@zash.se>
parents: 1773
diff changeset
229 return default;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
230 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
231
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
232 -- Handle messages
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 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
234 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
235 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
236 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
237 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
238 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
239 -- 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
240
1790
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
241 -- 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
242 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
243 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
244 return;
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
245 end
1150
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
246 -- or if hints suggest we shouldn't
1790
4c2146f5bf39 mod_mam: Store chat messages and normal messages with a body
Kim Alvefur <zash@zash.se>
parents: 1788
diff changeset
247 if stanza:get_child("no-permanent-storage", "urn:xmpp:hints") -- The XEP needs to decide on "store" or "storage"
1773
fb2b9a2e2316 mod_mam: Support both spellings of XEP-0334 processing hints until XEP is clarified
Kim Alvefur <zash@zash.se>
parents: 1771
diff changeset
248 or stanza:get_child("no-permanent-store", "urn:xmpp:hints")
fb2b9a2e2316 mod_mam: Support both spellings of XEP-0334 processing hints until XEP is clarified
Kim Alvefur <zash@zash.se>
parents: 1771
diff changeset
249 or stanza:get_child("no-storage", "urn:xmpp:hints")
fb2b9a2e2316 mod_mam: Support both spellings of XEP-0334 processing hints until XEP is clarified
Kim Alvefur <zash@zash.se>
parents: 1771
diff changeset
250 or stanza:get_child("no-store", "urn:xmpp:hints") then
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
251 log("debug", "Not archiving stanza: %s (hint)", stanza:top_tag());
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252 return;
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
253 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
254
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
255 -- Whos storage do we put it in?
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
256 local store_user = c2s and origin.username or jid_split(orig_to);
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
257 -- And who are they chatting with?
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
258 local with = jid_bare(c2s and orig_to or orig_from);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
259
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
260 -- 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
261 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
262 log("debug", "Archiving stanza: %s", stanza:top_tag());
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
263
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
264 -- And stash it
2018
13f46d9e526f mod_mam: Fix order of arguments to archive append
Kim Alvefur <zash@zash.se>
parents: 2017
diff changeset
265 local ok, id = 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
266 if ok then
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
267 if cleanup then cleanup[store_user] = true; end
1746
5734a6199938 mod_mam: Fire event on successful storage of message
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
268 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id });
5734a6199938 mod_mam: Fire event on successful storage of message
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
269 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
270 else
2270
9c99200afd17 mod_mam: Log messages from local clients on the clients session
Kim Alvefur <zash@zash.se>
parents: 2049
diff changeset
271 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
272 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 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
276 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
277 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
279 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
280 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
281 if cleanup_after ~= "never" then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
282 local day = 86400;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
283 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
284 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
285 if not n then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
286 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
287 return false;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
288 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
289
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
290 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
291
2042
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
292 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
293
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
294 if not archive.delete then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
295 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
296 return false;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
297 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
298
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
299 cleanup = {};
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
300
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
301 pcall(function ()
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
302 for user in um.users(module.host) do
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
303 cleanup[user] = true;
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
304 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
305 end);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
306
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
307 module:add_timer(math.random(10, 60), function()
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
308 local user = next(cleanup);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
309 if user then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
310 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
311 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
312 if not ok then
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
313 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
314 else
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
315 -- :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
316 pcall(function(stmt)
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
317 module:log("debug", "Removed %d messages", stmt:affected());
752eee154891 mod_mam: Add some debug logging
Kim Alvefur <zash@zash.se>
parents: 2039
diff changeset
318 end, err);
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
319 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
320 cleanup[user] = nil;
2016
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
321 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
322 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
323 end);
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
324 end
279885fd9728 mod_mam: Add support for trimming old archived messages
Kim Alvefur <zash@zash.se>
parents: 2001
diff changeset
325
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
326 -- Stanzas sent by local clients
621
7bdd02056e2b mod_mam: Bumb priority up above carbons, so that archive ids are included
Kim Alvefur <zash@zash.se>
parents: 620
diff changeset
327 module:hook("pre-message/bare", c2s_message_handler, 2);
7bdd02056e2b mod_mam: Bumb priority up above carbons, so that archive ids are included
Kim Alvefur <zash@zash.se>
parents: 620
diff changeset
328 module:hook("pre-message/full", c2s_message_handler, 2);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329 -- Stanszas to local clients
621
7bdd02056e2b mod_mam: Bumb priority up above carbons, so that archive ids are included
Kim Alvefur <zash@zash.se>
parents: 620
diff changeset
330 module:hook("message/bare", message_handler, 2);
7bdd02056e2b mod_mam: Bumb priority up above carbons, so that archive ids are included
Kim Alvefur <zash@zash.se>
parents: 620
diff changeset
331 module:hook("message/full", message_handler, 2);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332
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
333 module:add_feature(xmlns_mam); -- COMPAT with XEP-0313 v 0.1
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
334
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
335 module:hook("account-disco-info", function(event)
2033
acf86edeb1cc mod_mam: Compensate for small change in mod_disco between 0.9 and 0.10
Kim Alvefur <zash@zash.se>
parents: 2030
diff changeset
336 (event.reply or event.stanza):tag("feature", {var=xmlns_mam}):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
337 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
338