annotate mod_mam_archive/mod_mam_archive.lua @ 6319:04c3273cb81f

mod_auth_cyrus: Add empty 'profile' table to SASL handler objects This is for compatibility with Prosody's built-in util.sasl objects. A SASL profile table usually includes methods supported by the backend, which can be used by SASL mechanism handlers to perform operations (such as testing the password). It also optionally contains a 'cb' field with channel binding method handlers. The Cyrus backend doesn't support channel binding, and doesn't have the same concept of auth backend methods (it handles all that internally, and Prosody has no insight or control over it). Thus, we create an empty profile which informs Prosody that the SASL handler does not support any of the auth or channel binding methods. Some features will not work, but they didn't work anyway. This just makes it explicit. This fixes a traceback in mod_sasl2_fast, which expected SASL handlers to always contain a 'profile' field.
author Matthew Wild <mwild1@gmail.com>
date Thu, 04 Sep 2025 10:14:46 +0100
parents 8ff308fad9fd
children
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 module:add_feature("urn:xmpp:archive:auto");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
24 module:add_feature("urn:xmpp:archive:manage");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
25 module:add_feature("urn:xmpp:archive:pref");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
26 module:add_feature("http://jabber.org/protocol/rsm");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
27 -- --------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
28
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
29 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
30 local prefstanza = st.stanza("pref", { xmlns="urn:xmpp:archive" });
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
31 local default = prefs[false] ~= nil and prefs[false] or global_default_policy;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
32
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
33 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
34 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
35 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
36 prefstanza:tag("method", {type="manual", use="concede"}):up();
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
37
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
38 for jid, choice in pairs(prefs) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
39 if jid then
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
40 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
41 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
42 end
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 return prefstanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
45 end
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
46 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
47 local current_prefs = get_prefs(username);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
48
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
49 -- "default" | "item" | "session" | "method"
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
50 for elem in stanza:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
51 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
52 current_prefs[false] = elem.attr["save"] == "true";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
53 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
54 current_prefs[elem.attr["jid"]] = not elem.attr["save"] == "false";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
55 elseif elem.name == "session" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
56 module:log("info", "element is not supported: " .. tostring(elem));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
57 -- local found = false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
58 -- for child in data:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
59 -- 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
60 -- for k, v in pairs(elem.attr) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
61 -- child.attr[k] = v;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
62 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
63 -- found = true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
64 -- break;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
65 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
66 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
67 -- if not found then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
68 -- data:tag(elem.name, elem.attr):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
69 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
70 elseif elem.name == "method" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
71 module:log("info", "element is not supported: " .. tostring(elem));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
72 -- local newpref = stanza.tags[1]; -- iq:pref
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
73 -- for _, e in ipairs(newpref.tags) do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
74 -- -- if e.name ~= "method" then continue end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
75 -- local found = false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
76 -- for child in data:children() do
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
77 -- if child.name == "method" and child.attr["type"] == e.attr["type"] then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
78 -- child.attr["use"] = e.attr["use"];
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
79 -- found = true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
80 -- break;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
81 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
82 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
83 -- if not found then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
84 -- data:tag(e.name, e.attr):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
85 -- end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
86 -- end
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 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
90
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
91 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
92 -- Preferences
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
93 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
94 local function preferences_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
95 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
96 local user = origin.username;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
97 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
98
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
99 if stanza.attr.type == "get" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
100 reply:add_child(prefs_to_stanza(get_prefs(user)));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
101 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
102 if stanza.attr.type == "set" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
103 local new_prefs = stanza:get_child("pref", xmlns_archive);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
104 if not new_prefs then return false; end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
105
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
106 local prefs = prefs_from_stanza(stanza, origin.username);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
107 local ok, err = set_prefs(user, prefs);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
108
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
109 if not ok then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
110 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
111 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
112 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
113 return origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
114 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
115 local function auto_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
116 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
117 if not stanza.attr["type"] == "set" then return false; end
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
118
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
119 local user = origin.username;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
120 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
121 local auto = stanza:get_child("auto", xmlns_archive);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
122
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
123 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
124 set_prefs(user, prefs);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
125
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
126 return origin.send(st.reply(stanza));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
127 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
128
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
129 -- excerpt from mod_storage_sql2
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
130 local function get_db()
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
131 local mod_sql = module:require("sql");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
132 local params = module:get_option("sql");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
133 local engine;
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 params = params or { driver = "SQLite3" };
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
136 if params.driver == "SQLite3" then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
137 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
138 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
139
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
140 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
141 engine = mod_sql:create_engine(params);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
142 engine:set_encoding();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
143
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
144 return engine;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
145 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
146
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
147 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
148 -- 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
149 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
150 local function list_stanza_to_query(origin, list_el)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
151 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
152 local args = {origin.host, origin.username, archive_store};
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
153
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
154 local with = list_el.attr["with"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
155 if with ~= nil then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
156 sql = sql .. "AND `with` = ? ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
157 table.insert(args, jid_bare(with));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
158 end
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 after = list_el.attr["start"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
161 if after ~= nil then
1586
b51e596c5a02 mod_mam_archive: Fixing SQL concatenation bug
syn@syn.im
parents: 1523
diff changeset
162 sql = sql .. "AND `when` >= ? ";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
163 table.insert(args, date_parse(after));
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 before = list_el.attr["end"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
167 if before ~= nil then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
168 sql = sql .. "AND `when` <= ? ";
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
169 table.insert(args, date_parse(before));
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
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
172 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
173
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
174 local qset = rsm.get(list_el);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
175 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
176 sql = sql.."LIMIT ?";
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
177 table.insert(args, limit);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
178
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
179 table.insert(args, 1, sql);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
180 return args;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
181 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
182 local function list_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
183 local db = get_db();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
184 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
185 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
186
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
187 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
188 local list = reply:tag("list", {xmlns=xmlns_archive});
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
189
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
190 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
191 list:tag("chat", {
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
192 xmlns=xmlns_archive,
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
193 with=row[1],
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
194 start=date_format(row[2] * conversation_interval),
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
195 version=row[3]
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
196 }):up();
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
197 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
198
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
199 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
200 return true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
201 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
202
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
203 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
204 -- Message archive retrieval
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
205 ------------------------------------------------------------
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
206
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
207 local function retrieve_handler(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
208 local origin, stanza = event.origin, event.stanza;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
209 local reply = st.reply(stanza);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
210
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
211 local retrieve = stanza:get_child("retrieve", xmlns_archive);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
212
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
213 local qwith = retrieve.attr["with"];
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
214 local qstart = retrieve.attr["start"];
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
215
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
216 module:log("debug", "Archive query, with %s from %s)",
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
217 qwith or "anyone", qstart or "the dawn of time");
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
218
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
219 if qstart then -- Validate timestamps
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
220 local vstart = (qstart and date_parse(qstart));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
221 if (qstart and not vstart) then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
222 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
223 return true
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
224 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
225 qstart = vstart;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
226 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
227
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
228 if qwith then -- Validate the "with" jid
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
229 local pwith = qwith and jid_prep(qwith);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
230 if pwith and not qwith then -- it failed prepping
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
231 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID"))
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
232 return true
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
233 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
234 qwith = jid_bare(pwith);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
235 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
236
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
237 -- RSM stuff
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
238 local qset = rsm.get(retrieve);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
239 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
240 local reverse = qset and qset.before or false;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
241 local before, after = qset and qset.before, qset and qset.after;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
242 if type(before) ~= "string" then before = nil; end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
243
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
244 -- Load all the data!
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
245 local data, err = archive:find(origin.username, {
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
246 start = qstart; ["end"] = qstart + conversation_interval;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
247 with = qwith;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
248 limit = qmax;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
249 before = before; after = after;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
250 reverse = reverse;
1523
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
251 total = true;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
252 });
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
253
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
254 if not data then
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
255 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err));
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
256 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
257 local count = err;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
258
1476
08ca6dd36e39 mod_mam_archive: Fixing issues noted in code review for 153df603f73d3b69c434f2790cff0270de14bb75
syn@syn.im
parents: 1471
diff changeset
259 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
260 local first, last;
1523
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
261
54f6158a4915 Backed out changeset 71af9c272d72
syn@syn.im
parents: 1521
diff changeset
262 module:log("debug", "Count "..count);
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
263 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
264 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
265 item = st.deserialize(item);
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
266 end
db870913e1cf mod_mam_archive: Doing stanza deserialization after mod_storage the right way
syn@syn.im
parents: 1476
diff changeset
267 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
268
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
269 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
270 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
271 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
272 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
273 last = id;
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
274 end
1498
e82592ed744b mod_mam_archive: Applying @vstakhov 's patch (https://gist.github.com/vstakhov/306ea813a38021dcf3d4).
syn@syn.im
parents: 1477
diff changeset
275 reply:add_child(rsm.generate{ first = first, last = last, count = count })
1471
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
276
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
277 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
278 return true;
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
279 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
280
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
281 local function not_implemented(event)
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
282 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
283 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
284 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
285 origin.send(reply);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
286 end
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
287
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
288 -- Preferences
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
289 module:hook("iq/self/urn:xmpp:archive:pref", preferences_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
290 module:hook("iq/self/urn:xmpp:archive:auto", auto_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
291 module:hook("iq/self/urn:xmpp:archive:itemremove", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
292 module:hook("iq/self/urn:xmpp:archive:sessionremove", not_implemented);
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 -- Message Archive Management
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
295 module:hook("iq/self/urn:xmpp:archive:list", list_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
296 module:hook("iq/self/urn:xmpp:archive:retrieve", retrieve_handler);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
297 module:hook("iq/self/urn:xmpp:archive:remove", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
298
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
299 -- manual archiving
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
300 module:hook("iq/self/urn:xmpp:archive:save", not_implemented);
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
301 -- replication
153df603f73d mod_mam_archive: Initial commit
syn@syn.im
parents:
diff changeset
302 module:hook("iq/self/urn:xmpp:archive:modified", not_implemented);