Mercurial > prosody-modules
comparison mod_mam/mod_mam.lua @ 2506:5941aac79f06
mod_mam: Add support for XEP-0313 v0.5
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 20 Feb 2017 00:41:13 +0100 |
| parents | 1398f3f76c0f |
| children | d81882aa0e1e |
comparison
equal
deleted
inserted
replaced
| 2505:1398f3f76c0f | 2506:5941aac79f06 |
|---|---|
| 1 -- XEP-0313: Message Archive Management for Prosody | 1 -- XEP-0313: Message Archive Management for Prosody |
| 2 -- Copyright (C) 2011-2016 Kim Alvefur | 2 -- Copyright (C) 2011-2016 Kim Alvefur |
| 3 -- | 3 -- |
| 4 -- This file is MIT/X11 licensed. | 4 -- This file is MIT/X11 licensed. |
| 5 | 5 |
| 6 local xmlns_mam = "urn:xmpp:mam:0"; | 6 local xmlns_mam0 = "urn:xmpp:mam:0"; |
| 7 local xmlns_mam1 = "urn:xmpp:mam:1"; | |
| 7 local xmlns_delay = "urn:xmpp:delay"; | 8 local xmlns_delay = "urn:xmpp:delay"; |
| 8 local xmlns_forward = "urn:xmpp:forward:0"; | 9 local xmlns_forward = "urn:xmpp:forward:0"; |
| 9 | 10 |
| 10 local um = require "core.usermanager"; | 11 local um = require "core.usermanager"; |
| 11 local st = require "util.stanza"; | 12 local st = require "util.stanza"; |
| 52 end | 53 end |
| 53 | 54 |
| 54 local cleanup; | 55 local cleanup; |
| 55 | 56 |
| 56 -- Handle prefs. | 57 -- Handle prefs. |
| 57 module:hook("iq/self/"..xmlns_mam..":prefs", function(event) | 58 local function handle_prefs(event) |
| 58 local origin, stanza = event.origin, event.stanza; | 59 local origin, stanza = event.origin, event.stanza; |
| 60 local xmlns_mam = stanza.tags[1].attr.xmlns; | |
| 59 local user = origin.username; | 61 local user = origin.username; |
| 60 if stanza.attr.type == "get" then | 62 if stanza.attr.type == "get" then |
| 61 local prefs = prefs_to_stanza(get_prefs(user)); | 63 local prefs = prefs_to_stanza(get_prefs(user), xmlns_mam); |
| 62 local reply = st.reply(stanza):add_child(prefs); | 64 local reply = st.reply(stanza):add_child(prefs); |
| 63 origin.send(reply); | 65 origin.send(reply); |
| 64 else -- type == "set" | 66 else -- type == "set" |
| 65 local new_prefs = stanza:get_child("prefs", xmlns_mam); | 67 local new_prefs = stanza:get_child("prefs", xmlns_mam); |
| 66 local prefs = prefs_from_stanza(new_prefs); | 68 local prefs = prefs_from_stanza(new_prefs); |
| 70 else | 72 else |
| 71 origin.send(st.reply(stanza)); | 73 origin.send(st.reply(stanza)); |
| 72 end | 74 end |
| 73 end | 75 end |
| 74 return true; | 76 return true; |
| 75 end); | 77 end |
| 78 | |
| 79 module:hook("iq/self/"..xmlns_mam0..":prefs", handle_prefs); | |
| 80 module:hook("iq/self/"..xmlns_mam1..":prefs", handle_prefs); | |
| 76 | 81 |
| 77 local query_form = dataform { | 82 local query_form = dataform { |
| 78 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; }; | 83 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam0; }; |
| 79 { name = "with"; type = "jid-single"; }; | 84 { name = "with"; type = "jid-single"; }; |
| 80 { name = "start"; type = "text-single" }; | 85 { name = "start"; type = "text-single" }; |
| 81 { name = "end"; type = "text-single"; }; | 86 { name = "end"; type = "text-single"; }; |
| 82 }; | 87 }; |
| 83 | 88 |
| 84 -- Serve form | 89 -- Serve form |
| 85 module:hook("iq-get/self/"..xmlns_mam..":query", function(event) | 90 local function handle_get_form(event) |
| 86 local origin, stanza = event.origin, event.stanza; | 91 local origin, stanza = event.origin, event.stanza; |
| 92 local xmlns_mam = stanza.tags[1].attr.xmlns; | |
| 93 query_form[1].value = xmlns_mam; | |
| 87 origin.send(st.reply(stanza):query(xmlns_mam):add_child(query_form:form())); | 94 origin.send(st.reply(stanza):query(xmlns_mam):add_child(query_form:form())); |
| 88 return true; | 95 return true; |
| 89 end); | 96 end |
| 97 | |
| 98 module:hook("iq-get/self/"..xmlns_mam0..":query", handle_get_form); | |
| 99 module:hook("iq-get/self/"..xmlns_mam1..":query", handle_get_form); | |
| 90 | 100 |
| 91 -- Handle archive queries | 101 -- Handle archive queries |
| 92 module:hook("iq-set/self/"..xmlns_mam..":query", function(event) | 102 local function handle_mam_query(event) |
| 93 local origin, stanza = event.origin, event.stanza; | 103 local origin, stanza = event.origin, event.stanza; |
| 104 local xmlns_mam = stanza.tags[1].attr.xmlns; | |
| 94 local query = stanza.tags[1]; | 105 local query = stanza.tags[1]; |
| 95 local qid = query.attr.queryid; | 106 local qid = query.attr.queryid; |
| 96 | 107 |
| 97 if cleanup then cleanup[origin.username] = true; end | 108 if cleanup then cleanup[origin.username] = true; end |
| 98 | 109 |
| 99 -- Search query parameters | 110 -- Search query parameters |
| 100 local qwith, qstart, qend; | 111 local qwith, qstart, qend; |
| 101 local form = query:get_child("x", "jabber:x:data"); | 112 local form = query:get_child("x", "jabber:x:data"); |
| 102 if form then | 113 if form then |
| 103 local err; | 114 local err; |
| 115 query_form[1].value = xmlns_mam; | |
| 104 form, err = query_form:data(form); | 116 form, err = query_form:data(form); |
| 105 if err then | 117 if err then |
| 106 origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))); | 118 origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))); |
| 107 return true; | 119 return true; |
| 108 end | 120 end |
| 144 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err)); | 156 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", err)); |
| 145 return true; | 157 return true; |
| 146 end | 158 end |
| 147 local total = tonumber(err); | 159 local total = tonumber(err); |
| 148 | 160 |
| 149 origin.send(st.reply(stanza)); | 161 if xmlns_mam == xmlns_mam0 then |
| 162 origin.send(st.reply(stanza)); | |
| 163 end | |
| 150 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; | 164 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; |
| 151 | 165 |
| 152 local results = {}; | 166 local results = {}; |
| 153 | 167 |
| 154 -- Wrap it in stuff and deliver | 168 -- Wrap it in stuff and deliver |
| 190 end | 204 end |
| 191 | 205 |
| 192 -- That's all folks! | 206 -- That's all folks! |
| 193 module:log("debug", "Archive query %s completed", tostring(qid)); | 207 module:log("debug", "Archive query %s completed", tostring(qid)); |
| 194 | 208 |
| 195 origin.send(st.message(msg_reply_attr) | 209 local fin; |
| 196 :tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete }) | 210 if xmlns_mam == xmlns_mam0 then |
| 211 fin = st.message(msg_reply_attr); | |
| 212 else | |
| 213 fin = st.reply(stanza); | |
| 214 end | |
| 215 do | |
| 216 fin:tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete }) | |
| 197 :add_child(rsm.generate { | 217 :add_child(rsm.generate { |
| 198 first = first, last = last, count = total })); | 218 first = first, last = last, count = total }) |
| 219 end | |
| 220 origin.send(fin); | |
| 199 return true; | 221 return true; |
| 200 end); | 222 end |
| 223 module:hook("iq-set/self/"..xmlns_mam0..":query", handle_mam_query); | |
| 224 module:hook("iq-set/self/"..xmlns_mam1..":query", handle_mam_query); | |
| 201 | 225 |
| 202 local function has_in_roster(user, who) | 226 local function has_in_roster(user, who) |
| 203 local roster = rm_load_roster(user, host); | 227 local roster = rm_load_roster(user, host); |
| 204 module:log("debug", "%s has %s in roster? %s", user, who, roster[who] and "yes" or "no"); | 228 module:log("debug", "%s has %s in roster? %s", user, who, roster[who] and "yes" or "no"); |
| 205 return roster[who]; | 229 return roster[who]; |
| 328 module:hook("pre-message/full", c2s_message_handler, 2); | 352 module:hook("pre-message/full", c2s_message_handler, 2); |
| 329 -- Stanszas to local clients | 353 -- Stanszas to local clients |
| 330 module:hook("message/bare", message_handler, 2); | 354 module:hook("message/bare", message_handler, 2); |
| 331 module:hook("message/full", message_handler, 2); | 355 module:hook("message/full", message_handler, 2); |
| 332 | 356 |
| 333 module:add_feature(xmlns_mam); -- COMPAT with XEP-0313 v 0.1 | 357 module:add_feature(xmlns_mam0); -- COMPAT with XEP-0313 v 0.1 |
| 334 | 358 |
| 335 module:hook("account-disco-info", function(event) | 359 module:hook("account-disco-info", function(event) |
| 336 (event.reply or event.stanza):tag("feature", {var=xmlns_mam}):up(); | 360 (event.reply or event.stanza):tag("feature", {var=xmlns_mam0}):up(); |
| 361 (event.reply or event.stanza):tag("feature", {var=xmlns_mam1}):up(); | |
| 337 end); | 362 end); |
| 338 | 363 |
