annotate mod_mam/mod_mam.lua @ 1268:854a3933cfcd

mod_muc_log_http: URL-encode room names. This allows special characters in room names to work. Ideally this escaping shouldn’t be done in the user visible content, but the module’s template system doesn’t currently allow that.
author Waqas Hussain <waqas20@gmail.com>
date Sat, 04 Jan 2014 16:50:57 -0500
parents d677d1807bb0
children 853a382c9bd6
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
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2011-2012 Kim Alvefur
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
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
6 local xmlns_mam = "urn:xmpp:mam:tmp";
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
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 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
11 local rsm = module:require "rsm";
1111
bdbf76730f49 mod_mam: Split out preference functions into a lib for easy reuse
Kim Alvefur <zash@zash.se>
parents: 1094
diff changeset
12 local prefs = module:require"mamprefs";
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
13 local prefsxml = module:require"mamprefsxml";
1111
bdbf76730f49 mod_mam: Split out preference functions into a lib for easy reuse
Kim Alvefur <zash@zash.se>
parents: 1094
diff changeset
14 local set_prefs, get_prefs = prefs.set, prefs.get;
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
15 local prefs_to_stanza, prefs_from_stanza = prefsxml.tostanza, prefsxml.fromstanza;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 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
17 local jid_split = require "util.jid".split;
751
3c37445f26ac mod_mam: Stricter validation, reject invalid timestamps, jids.
Kim Alvefur <zash@zash.se>
parents: 711
diff changeset
18 local jid_prep = require "util.jid".prep;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
19 local host = module.host;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
20
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
21 local rm_load_roster = require "core.rostermanager".load_roster;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
22
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
23 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
24 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
25 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
26 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
27
672
8ae5317ba032 mod_mam: local tostring and some comments
Kim Alvefur <zash@zash.se>
parents: 671
diff changeset
28 local tostring = tostring;
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local time_now = os.time;
707
f987c7b79008 mod_mam: Fix typo
Kim Alvefur <zash@zash.se>
parents: 706
diff changeset
30 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
31 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
32 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
33 local global_default_policy = module:get_option("default_archive_policy", 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
34
675
da33325453fb mod_mam: Put name of store in a single variable
Kim Alvefur <zash@zash.se>
parents: 674
diff changeset
35 local archive_store = "archive2";
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
36 local archive = module:open_store(archive_store, "archive");
1185
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
37 if not archive then
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
38 module:log("error", "Could not open archive storage");
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
39 return
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
40 elseif not archive.find then
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
41 module:log("error", "mod_%s does not support archiving, switch to mod_storage_sql2", archive._provided_by);
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
42 return
30b681898c2d mod_mam: Log error message if unable to open archive storage
Kim Alvefur <zash@zash.se>
parents: 1152
diff changeset
43 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
44
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
45 -- Handle prefs.
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 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
47 local origin, stanza = event.origin, event.stanza;
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
48 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
49 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
50 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
51 local reply = st.reply(stanza):add_child(prefs);
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
52 return origin.send(reply);
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 else -- type == "set"
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
54 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
55 local prefs = prefs_from_stanza(new_prefs);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
56 local ok, err = set_prefs(user, prefs);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
57 if not ok 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
58 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
59 end
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
60 return origin.send(st.reply(stanza));
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end);
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
64 -- Handle archive queries
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
65 module:hook("iq-get/self/"..xmlns_mam..":query", function(event)
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 local origin, stanza = event.origin, event.stanza;
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 local query = stanza.tags[1];
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
68 local qid = query.attr.queryid;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
69
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
70 -- Search query parameters
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
71 local qwith = query:get_child_text("with");
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
72 local qstart = query:get_child_text("start");
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
73 local qend = query:get_child_text("end");
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
74 module:log("debug", "Archive query, id %s with %s from %s until %s)",
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
75 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
76
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
77 if qstart or qend then -- Validate timestamps
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
78 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend))
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
79 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
80 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
81 return true
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
82 end
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
83 qstart, qend = vstart, vend;
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
84 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
85
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
86 if qwith then -- Validate the 'with' jid
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
87 local pwith = qwith and jid_prep(qwith);
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
88 if pwith and not qwith then -- it failed prepping
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
89 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID"))
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
90 return true
751
3c37445f26ac mod_mam: Stricter validation, reject invalid timestamps, jids.
Kim Alvefur <zash@zash.se>
parents: 711
diff changeset
91 end
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
92 qwith = jid_bare(pwith);
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
93 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
95 -- 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
96 local qset = rsm.get(query);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
97 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
98 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
99 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
100 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
101
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
102
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
103 -- 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
104 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
105 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
106 with = qwith;
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
107 limit = qmax;
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
108 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
109 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
110 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
111 });
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
112
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
113 if not data then
1186
a172e7389cf6 mod_mam: Include textual error if archive query failed
Kim Alvefur <zash@zash.se>
parents: 1185
diff changeset
114 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", 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
115 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
116 local count = err;
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
117
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
118 -- Wrap it in stuff and deliver
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
119 local first, last;
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
120 for id, item, when in data do
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
121 local fwd_st = st.message{ to = origin.full_jid }
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
122 :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
123 :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
124 :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
125
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 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
127 item = st.deserialize(item);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
128 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
129 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
130 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
131
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
132 if not first then first = id; 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
133 last = 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
134
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 origin.send(fwd_st);
1112
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
136 end
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
137 -- That's all folks!
1dc07833355e mod_mam: Use more specific hook
Kim Alvefur <zash@zash.se>
parents: 1111
diff changeset
138 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
139
1114
6c0e1f9926f6 mod_mam: Swap first and last first for a simpler argument to RSM in reverse queries
Kim Alvefur <zash@zash.se>
parents: 1113
diff changeset
140 if reverse then first, last = last, first; end
1113
f1f0c87cffdd mod_mam: Neater reply building
Kim Alvefur <zash@zash.se>
parents: 1112
diff changeset
141 return origin.send(st.reply(stanza)
f1f0c87cffdd mod_mam: Neater reply building
Kim Alvefur <zash@zash.se>
parents: 1112
diff changeset
142 :query(xmlns_mam):add_child(rsm.generate {
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 first = first, last = last, count = count }));
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 end);
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
146 local function has_in_roster(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
147 local roster = rm_load_roster(user, host);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
148 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
149 return roster[who];
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
150 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
151
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
152 local function shall_store(user, who)
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
153 -- TODO Cache this?
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
154 local prefs = get_prefs(user);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
155 local rule = prefs[who];
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
156 module:log("debug", "%s's rule for %s is %s", user, who, tostring(rule))
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
157 if rule ~= nil then
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
158 return rule;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
159 else -- Below could be done by a metatable
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
160 local default = prefs[false];
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
161 module:log("debug", "%s's default rule is %s", user, tostring(default))
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
162 if default == nil then
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
163 default = global_default_policy;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
164 module:log("debug", "Using global default rule, %s", tostring(default))
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
165 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
166 if default == "roster" then
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
167 return has_in_roster(user, who);
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
168 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
169 return default;
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
170 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
171 end
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
172
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
173 -- Handle messages
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
174 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
175 local origin, stanza = event.origin, event.stanza;
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176 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
177 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
178 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
179 -- 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
180
1150
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
181 -- We don't store messages of these types
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 if orig_type == "error"
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 or orig_type == "headline"
671
74efb2db00a6 mod_mam: From the spec: servers SHOULD NOT archive messages that do not have a <body/> child tag.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 666
diff changeset
184 or orig_type == "groupchat"
1150
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
185 -- or that don't have a <body/>
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
186 or not stanza:get_child("body")
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
187 -- or if hints suggest we shouldn't
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
188 or stanza:get_child("no-permanent-store", "urn:xmpp:hints")
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
189 or stanza:get_child("no-store", "urn:xmpp:hints") then
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
190 module:log("debug", "Not archiving stanza: %s (content)", stanza:top_tag());
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 return;
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193
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
194 -- 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
195 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
196 -- 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
197 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
198
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
199 -- 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
200 if shall_store(store_user, with) then
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
201 module:log("debug", "Archiving stanza: %s", stanza:top_tag());
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
202
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
203 -- And stash it
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
204 local ok, id = archive:append(store_user, time_now(), with, stanza);
1187
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
205 if ok then
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
206 stanza:tag("archived", { xmlns = xmlns_mam, by = store_user.."@"..host, id = id }):up();
672
8ae5317ba032 mod_mam: local tostring and some comments
Kim Alvefur <zash@zash.se>
parents: 671
diff changeset
207 end
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
208 else
1150
296820f18ba6 mod_mam: Add support for XEP-0334: Message Processing Hints
Kim Alvefur <zash@zash.se>
parents: 1149
diff changeset
209 module: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
210 end
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 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
214 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
215 end
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 -- 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
218 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
219 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
220 -- 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
221 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
222 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
223
1187
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
224 local function post_carbons_handler(event)
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
225 event.stanza:maptags(function(tag)
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
226 if not ( tag.attr.xmlns == xmlns_mam and tag.name == "archived" ) then
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
227 return tag;
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
228 end
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
229 end);
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
230 end
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
231
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
232 module:hook("pre-message/bare", post_carbons_handler, 0.9);
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
233 module:hook("pre-message/full", post_carbons_handler, 0.9);
d677d1807bb0 mod_mam: Stamp outgoing messages with <archived> as well, but remove it after they should have passed through mod_carbons
Kim Alvefur <zash@zash.se>
parents: 1186
diff changeset
234
523
eff140d53b83 mod_mam: Add experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 module:add_feature(xmlns_mam);
558
66de25ffc8d9 mod_mam: Implement archiving preferences.
Kim Alvefur <zash@zash.se>
parents: 523
diff changeset
236