annotate mod_mam_archive/mod_mam_archive.lua @ 5461:06640647d193

mod_http_oauth2: Fix use of arbitrary ports in loopback redirect URIs Per draft-ietf-oauth-v2-1-08#section-8.4.2 > The authorization server MUST allow any port to be specified at the > time of the request for loopback IP redirect URIs, to accommodate > clients that obtain an available ephemeral port from the operating > system at the time of the request. Uncertain if it should normalize the host part, but it also seems harmless to treat IPv6 and IPv4 the same here. One thing is that "localhost" is NOT RECOMMENDED because it can sometimes be pointed to non-loopback interfaces via DNS or hosts file.
author Kim Alvefur <zash@zash.se>
date Wed, 17 May 2023 13:51:30 +0200
parents 3e97dae28215
children 8ff308fad9fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
1 -- Prosody IM
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
2 --
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
3 -- This project is MIT/X11 licensed. Please see the
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
4 -- COPYING file in the source package for more information.
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
5 --
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
6 local get_prefs = module:require"mod_mam/mamprefs".get;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
7 local set_prefs = module:require"mod_mam/mamprefs".set;
2706
3e97dae28215 mod_mam_archive: Use util.rsm (fixes #877, depends on recent 0.10+)
Dennis Schridde <devurandom@gmx.net>
parents: 1586
diff changeset
8 local rsm = require "util.rsm";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
9 local jid_bare = require "util.jid".bare;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
10 local jid_prep = require "util.jid".prep;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
11 local date_parse = require "util.datetime".parse;
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
12 local date_format = require "util.datetime".datetime;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
13
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
14 local st = require "util.stanza";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
15 local archive_store = "archive2";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
16 local archive = module:open_store(archive_store, "archive");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
17 local global_default_policy = module:get_option("default_archive_policy", false);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
18 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50);
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
19 local conversation_interval = tonumber(module:get_option_number("archive_conversation_interval", 86400));
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
20 local resolve_relative_path = require "core.configmanager".resolve_relative_path;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
21
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
22 -- Feature discovery
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
23 local xmlns_archive = "urn:xmpp:archive"
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
24 local feature_archive = st.stanza("feature", {xmlns=xmlns_archive}):tag("optional");
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
25 if(global_default_policy) then
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
26 feature_archive:tag("default");
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
27 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
28 module:add_extension(feature_archive);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
29 module:add_feature("urn:xmpp:archive:auto");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
30 module:add_feature("urn:xmpp:archive:manage");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
31 module:add_feature("urn:xmpp:archive:pref");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
32 module:add_feature("http://jabber.org/protocol/rsm");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
33 -- --------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
34
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
35 local function prefs_to_stanza(prefs)
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
36 local prefstanza = st.stanza("pref", { xmlns="urn:xmpp:archive" });
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
37 local default = prefs[false] ~= nil and prefs[false] or global_default_policy;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
38
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
39 prefstanza:tag("default", {otr="oppose", save=default and "true" or "false"}):up();
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
40 prefstanza:tag("method", {type="auto", use="concede"}):up();
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
41 prefstanza:tag("method", {type="local", use="concede"}):up();
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
42 prefstanza:tag("method", {type="manual", use="concede"}):up();
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
43
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
44 for jid, choice in pairs(prefs) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
45 if jid then
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
46 prefstanza:tag("item", {jid=jid, otr="prefer", save=choice and "message" or "false" }):up()
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
47 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
48 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
49
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
50 return prefstanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
51 end
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
52 local function prefs_from_stanza(stanza, username)
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
53 local current_prefs = get_prefs(username);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
54
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
55 -- "default" | "item" | "session" | "method"
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
56 for elem in stanza:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
57 if elem.name == "default" then
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
58 current_prefs[false] = elem.attr["save"] == "true";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
59 elseif elem.name == "item" then
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
60 current_prefs[elem.attr["jid"]] = not elem.attr["save"] == "false";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
61 elseif elem.name == "session" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
62 module:log("info", "element is not supported: " .. tostring(elem));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
63 -- local found = false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
64 -- for child in data:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
65 -- if child.name == elem.name and child.attr["thread"] == elem.attr["thread"] then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
66 -- for k, v in pairs(elem.attr) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
67 -- child.attr[k] = v;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
68 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
69 -- found = true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
70 -- break;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
71 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
72 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
73 -- if not found then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
74 -- data:tag(elem.name, elem.attr):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
75 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
76 elseif elem.name == "method" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
77 module:log("info", "element is not supported: " .. tostring(elem));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
78 -- local newpref = stanza.tags[1]; -- iq:pref
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
79 -- for _, e in ipairs(newpref.tags) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
80 -- -- if e.name ~= "method" then continue end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
81 -- local found = false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
82 -- for child in data:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
83 -- if child.name == "method" and child.attr["type"] == e.attr["type"] then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
84 -- child.attr["use"] = e.attr["use"];
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
85 -- found = true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
86 -- break;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
87 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
88 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
89 -- if not found then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
90 -- data:tag(e.name, e.attr):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
91 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
92 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
93 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
94 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
95 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
96
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
97 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
98 -- Preferences
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
99 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
100 local function preferences_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
101 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
102 local user = origin.username;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
103 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
104
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
105 if stanza.attr.type == "get" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
106 reply:add_child(prefs_to_stanza(get_prefs(user)));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
107 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
108 if stanza.attr.type == "set" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
109 local new_prefs = stanza:get_child("pref", xmlns_archive);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
110 if not new_prefs then return false; end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
111
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
112 local prefs = prefs_from_stanza(stanza, origin.username);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
113 local ok, err = set_prefs(user, prefs);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
114
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
115 if not ok then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
116 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
117 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
118 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
119 return origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
120 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
121 local function auto_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
122 local origin, stanza = event.origin, event.stanza;
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
123 if not stanza.attr["type"] == "set" then return false; end
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
124
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
125 local user = origin.username;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
126 local prefs = get_prefs(user);
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
127 local auto = stanza:get_child("auto", xmlns_archive);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
128
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
129 prefs[false] = auto.attr["save"] ~= nil and auto.attr["save"] == "true" or false;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
130 set_prefs(user, prefs);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
131
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
132 return origin.send(st.reply(stanza));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
133 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
134
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
135 -- excerpt from mod_storage_sql2
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
136 local function get_db()
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
137 local mod_sql = module:require("sql");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
138 local params = module:get_option("sql");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
139 local engine;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
140
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
141 params = params or { driver = "SQLite3" };
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
142 if params.driver == "SQLite3" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
143 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
144 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
145
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
146 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
147 engine = mod_sql:create_engine(params);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
148 engine:set_encoding();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
149
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
150 return engine;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
151 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
152
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
153 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
154 -- Collections. In our case there is one conversation with each contact for the whole day for simplicity
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
155 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
156 local function list_stanza_to_query(origin, list_el)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
157 local sql = "SELECT `with`, `when` / ".. conversation_interval .." as `day`, COUNT(0) FROM `prosodyarchive` WHERE `host`=? AND `user`=? AND `store`=? ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
158 local args = {origin.host, origin.username, archive_store};
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
159
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
160 local with = list_el.attr["with"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
161 if with ~= nil then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
162 sql = sql .. "AND `with` = ? ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
163 table.insert(args, jid_bare(with));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
164 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
165
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
166 local after = list_el.attr["start"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
167 if after ~= nil then
1586
b51e596c5a02 mod_mam_archive: Fixing SQL concatenation bug
syn@syn.im
parents: 1523
diff changeset
168 sql = sql .. "AND `when` >= ? ";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
169 table.insert(args, date_parse(after));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
170 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
171
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
172 local before = list_el.attr["end"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
173 if before ~= nil then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
174 sql = sql .. "AND `when` <= ? ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
175 table.insert(args, date_parse(before));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
176 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
177
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
178 sql = sql .. "GROUP BY `with`, `when` / ".. conversation_interval .." ORDER BY `when` / ".. conversation_interval .." ASC ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
179
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
180 local qset = rsm.get(list_el);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
181 local limit = math.min(qset and qset.max or default_max_items, max_max_items);
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
182 sql = sql.."LIMIT ?";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
183 table.insert(args, limit);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
184
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
185 table.insert(args, 1, sql);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
186 return args;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
187 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
188 local function list_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
189 local db = get_db();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
190 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
191 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
192
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
193 local query = list_stanza_to_query(origin, stanza.tags[1]);
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
194 local list = reply:tag("list", {xmlns=xmlns_archive});
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
195
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
196 for row in db:select(unpack(query)) do
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
197 list:tag("chat", {
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
198 xmlns=xmlns_archive,
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
199 with=row[1],
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
200 start=date_format(row[2] * conversation_interval),
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
201 version=row[3]
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
202 }):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
203 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
204
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
205 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
206 return true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
207 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
208
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
209 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
210 -- Message archive retrieval
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
211 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
212
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
213 local function retrieve_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
214 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
215 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
216
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
217 local retrieve = stanza:get_child("retrieve", xmlns_archive);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
218
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
219 local qwith = retrieve.attr["with"];
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
220 local qstart = retrieve.attr["start"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
221
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
222 module:log("debug", "Archive query, with %s from %s)",
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
223 qwith or "anyone", qstart or "the dawn of time");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
224
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
225 if qstart then -- Validate timestamps
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
226 local vstart = (qstart and date_parse(qstart));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
227 if (qstart and not vstart) then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
228 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
229 return true
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
230 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
231 qstart = vstart;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
232 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
233
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
234 if qwith then -- Validate the "with" jid
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
235 local pwith = qwith and jid_prep(qwith);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
236 if pwith and not qwith then -- it failed prepping
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
237 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID"))
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
238 return true
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
239 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
240 qwith = jid_bare(pwith);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
241 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
242
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
243 -- RSM stuff
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
244 local qset = rsm.get(retrieve);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
245 local qmax = math.min(qset and qset.max or default_max_items, max_max_items);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
246 local reverse = qset and qset.before or false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
247 local before, after = qset and qset.before, qset and qset.after;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
248 if type(before) ~= "string" then before = nil; end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
249
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
250 -- Load all the data!
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
251 local data, err = archive:find(origin.username, {
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
252 start = qstart; ["end"] = qstart + conversation_interval;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
253 with = qwith;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
254 limit = qmax;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
255 before = before; after = after;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
256 reverse = reverse;
1523
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
257 total = true;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
258 });
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
259
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
260 if not data then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
261 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
262 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
263 local count = err;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
264
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
265 local chat = reply:tag("chat", {xmlns=xmlns_archive, with=qwith, start=date_format(qstart), version=count});
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
266 local first, last;
1523
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
267
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
268 module:log("debug", "Count "..count);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
269 for id, item, when in data do
1477
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
270 if not getmetatable(item) == st.stanza_mt then
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
271 item = st.deserialize(item);
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
272 end
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
273 module:log("debug", tostring(item));
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
274
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
275 local tag = jid_bare(item.attr["from"]) == jid_bare(origin.full_jid) and "to" or "from";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
276 tag = chat:tag(tag, {secs = when - qstart});
1477
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
277 tag:add_child(item:get_child("body")):up();
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
278 if not first then first = id; end
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
279 last = id;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
280 end
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
281 reply:add_child(rsm.generate{ first = first, last = last, count = count })
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
282
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
283 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
284 return true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
285 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
286
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
287 local function not_implemented(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
288 local origin, stanza = event.origin, event.stanza;
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
289 local reply = st.reply(stanza):tag("error", {type="cancel"});
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
290 reply:tag("feature-not-implemented", {xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"}):up();
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
291 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
292 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
293
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
294 -- Preferences
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
295 module:hook("iq/self/urn:xmpp:archive:pref", preferences_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
296 module:hook("iq/self/urn:xmpp:archive:auto", auto_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
297 module:hook("iq/self/urn:xmpp:archive:itemremove", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
298 module:hook("iq/self/urn:xmpp:archive:sessionremove", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
299
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
300 -- Message Archive Management
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
301 module:hook("iq/self/urn:xmpp:archive:list", list_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
302 module:hook("iq/self/urn:xmpp:archive:retrieve", retrieve_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
303 module:hook("iq/self/urn:xmpp:archive:remove", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
304
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
305 -- manual archiving
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
306 module:hook("iq/self/urn:xmpp:archive:save", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
307 -- replication
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
308 module:hook("iq/self/urn:xmpp:archive:modified", not_implemented);