# HG changeset patch # User Kim Alvefur # Date 1487547673 -3600 # Node ID 5941aac79f069a6f974e4530813c400d54f42a08 # Parent 1398f3f76c0fb7acdf2fbb72f099a8c375ad7aef mod_mam: Add support for XEP-0313 v0.5 diff -r 1398f3f76c0f -r 5941aac79f06 mod_mam/mamprefsxml.lib.lua --- a/mod_mam/mamprefsxml.lib.lua Mon Feb 20 00:44:27 2017 +0100 +++ b/mod_mam/mamprefsxml.lib.lua Mon Feb 20 00:41:13 2017 +0100 @@ -4,7 +4,6 @@ -- This file is MIT/X11 licensed. local st = require"util.stanza"; -local xmlns_mam = "urn:xmpp:mam:0"; local default_attrs = { always = true, [true] = "always", @@ -12,7 +11,7 @@ roster = "roster", } -local function tostanza(prefs) +local function tostanza(prefs, xmlns_mam) local default = prefs[false]; default = default_attrs[default]; local prefstanza = st.stanza("prefs", { xmlns = xmlns_mam, default = default }); diff -r 1398f3f76c0f -r 5941aac79f06 mod_mam/mod_mam.lua --- a/mod_mam/mod_mam.lua Mon Feb 20 00:44:27 2017 +0100 +++ b/mod_mam/mod_mam.lua Mon Feb 20 00:41:13 2017 +0100 @@ -3,7 +3,8 @@ -- -- This file is MIT/X11 licensed. -local xmlns_mam = "urn:xmpp:mam:0"; +local xmlns_mam0 = "urn:xmpp:mam:0"; +local xmlns_mam1 = "urn:xmpp:mam:1"; local xmlns_delay = "urn:xmpp:delay"; local xmlns_forward = "urn:xmpp:forward:0"; @@ -54,11 +55,12 @@ local cleanup; -- Handle prefs. -module:hook("iq/self/"..xmlns_mam..":prefs", function(event) +local function handle_prefs(event) local origin, stanza = event.origin, event.stanza; + local xmlns_mam = stanza.tags[1].attr.xmlns; local user = origin.username; if stanza.attr.type == "get" then - local prefs = prefs_to_stanza(get_prefs(user)); + local prefs = prefs_to_stanza(get_prefs(user), xmlns_mam); local reply = st.reply(stanza):add_child(prefs); origin.send(reply); else -- type == "set" @@ -72,25 +74,34 @@ end end return true; -end); +end + +module:hook("iq/self/"..xmlns_mam0..":prefs", handle_prefs); +module:hook("iq/self/"..xmlns_mam1..":prefs", handle_prefs); local query_form = dataform { - { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; }; + { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam0; }; { name = "with"; type = "jid-single"; }; { name = "start"; type = "text-single" }; { name = "end"; type = "text-single"; }; }; -- Serve form -module:hook("iq-get/self/"..xmlns_mam..":query", function(event) +local function handle_get_form(event) local origin, stanza = event.origin, event.stanza; + local xmlns_mam = stanza.tags[1].attr.xmlns; + query_form[1].value = xmlns_mam; origin.send(st.reply(stanza):query(xmlns_mam):add_child(query_form:form())); return true; -end); +end + +module:hook("iq-get/self/"..xmlns_mam0..":query", handle_get_form); +module:hook("iq-get/self/"..xmlns_mam1..":query", handle_get_form); -- Handle archive queries -module:hook("iq-set/self/"..xmlns_mam..":query", function(event) +local function handle_mam_query(event) local origin, stanza = event.origin, event.stanza; + local xmlns_mam = stanza.tags[1].attr.xmlns; local query = stanza.tags[1]; local qid = query.attr.queryid; @@ -101,6 +112,7 @@ local form = query:get_child("x", "jabber:x:data"); if form then local err; + query_form[1].value = xmlns_mam; form, err = query_form:data(form); if err then origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))); @@ -146,7 +158,9 @@ end local total = tonumber(err); - origin.send(st.reply(stanza)); + if xmlns_mam == xmlns_mam0 then + origin.send(st.reply(stanza)); + end local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; local results = {}; @@ -192,12 +206,22 @@ -- That's all folks! module:log("debug", "Archive query %s completed", tostring(qid)); - origin.send(st.message(msg_reply_attr) - :tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete }) + local fin; + if xmlns_mam == xmlns_mam0 then + fin = st.message(msg_reply_attr); + else + fin = st.reply(stanza); + end + do + fin:tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete }) :add_child(rsm.generate { - first = first, last = last, count = total })); + first = first, last = last, count = total }) + end + origin.send(fin); return true; -end); +end +module:hook("iq-set/self/"..xmlns_mam0..":query", handle_mam_query); +module:hook("iq-set/self/"..xmlns_mam1..":query", handle_mam_query); local function has_in_roster(user, who) local roster = rm_load_roster(user, host); @@ -330,9 +354,10 @@ module:hook("message/bare", message_handler, 2); module:hook("message/full", message_handler, 2); -module:add_feature(xmlns_mam); -- COMPAT with XEP-0313 v 0.1 +module:add_feature(xmlns_mam0); -- COMPAT with XEP-0313 v 0.1 module:hook("account-disco-info", function(event) - (event.reply or event.stanza):tag("feature", {var=xmlns_mam}):up(); + (event.reply or event.stanza):tag("feature", {var=xmlns_mam0}):up(); + (event.reply or event.stanza):tag("feature", {var=xmlns_mam1}):up(); end);