# HG changeset patch # User Kim Alvefur # Date 1408117403 -7200 # Node ID 53a3a19d60930f138219210073df32d0b8f78bf7 # Parent 90fe03e65d2c553c41fb3723d5b871a64ed8ddaa mod_mam: Update to version 0.3 of XEP-0313 diff -r 90fe03e65d2c -r 53a3a19d6093 mod_mam/mod_mam.lua --- a/mod_mam/mod_mam.lua Fri Aug 15 16:34:10 2014 +0100 +++ b/mod_mam/mod_mam.lua Fri Aug 15 17:43:23 2014 +0200 @@ -3,7 +3,7 @@ -- -- This file is MIT/X11 licensed. -local xmlns_mam = "urn:xmpp:mam:tmp"; +local xmlns_mam = "urn:xmpp:mam:0"; local xmlns_delay = "urn:xmpp:delay"; local xmlns_forward = "urn:xmpp:forward:0"; @@ -15,7 +15,7 @@ local prefs_from_stanza = module:require"mamprefsxml".fromstanza; local jid_bare = require "util.jid".bare; local jid_split = require "util.jid".split; -local jid_prep = require "util.jid".prep; +local dataform = require "util.dataforms".new; local host = module.host; local rm_load_roster = require "core.rostermanager".load_roster; @@ -61,18 +61,37 @@ end end); +local query_form = dataform { + { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; }; + { 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 origin, stanza = event.origin, event.stanza; + return origin.send(st.reply(stanza):add_child(query_form:form())); +end); + -- Handle archive queries -module:hook("iq-get/self/"..xmlns_mam..":query", function(event) +module:hook("iq-set/self/"..xmlns_mam..":query", function(event) local origin, stanza = event.origin, event.stanza; local query = stanza.tags[1]; local qid = query.attr.queryid; -- Search query parameters - local qwith = query:get_child_text("with"); - local qstart = query:get_child_text("start"); - local qend = query:get_child_text("end"); - module:log("debug", "Archive query, id %s with %s from %s until %s)", - tostring(qid), qwith or "anyone", qstart or "the dawn of time", qend or "now"); + local qwith, qstart, qend; + local form = query:get_child("x", "jabber:x:data"); + if form then + local err; + form, err = query_form:data(form); + if err then + return origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))) + end + qwith, qstart, qend = form["with"], form["start"], form["end"]; + qwith = qwith and jid_bare(qwith); -- dataforms does jidprep + end if qstart or qend then -- Validate timestamps local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend)) @@ -83,14 +102,8 @@ qstart, qend = vstart, vend; end - if qwith then -- Validate the 'with' jid - local pwith = qwith and jid_prep(qwith); - if pwith and not qwith then -- it failed prepping - origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid JID")) - return true - end - qwith = jid_bare(pwith); - end + module:log("debug", "Archive query, id %s with %s from %s until %s)", + tostring(qid), qwith or "anyone", qstart or "the dawn of time", qend or "now"); -- RSM stuff local qset = rsm.get(query); @@ -115,6 +128,7 @@ end local count = err; + origin.send(st.reply(stanza)) local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; -- Wrap it in stuff and deliver @@ -140,9 +154,10 @@ module:log("debug", "Archive query %s completed", tostring(qid)); if reverse then first, last = last, first; end - return origin.send(st.reply(stanza) - :query(xmlns_mam):add_child(rsm.generate { - first = first, last = last, count = count })); + return origin.send(st.message(msg_reply_attr) + :tag("fin", { xmlns = xmlns_mam, queryid = qid }) + :add_child(rsm.generate { + first = first, last = last, count = count })); end); local function has_in_roster(user, who) @@ -203,10 +218,7 @@ module:log("debug", "Archiving stanza: %s", stanza:top_tag()); -- And stash it - local ok, id = archive:append(store_user, time_now(), with, stanza); - if ok then - stanza:tag("archived", { xmlns = xmlns_mam, by = store_user.."@"..host, id = id }):up(); - end + local ok, id = archive:append(store_user, nil, time_now(), with, stanza); else module:log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); end @@ -223,16 +235,5 @@ module:hook("message/bare", message_handler, 2); module:hook("message/full", message_handler, 2); -local function post_carbons_handler(event) - event.stanza:maptags(function(tag) - if not ( tag.attr.xmlns == xmlns_mam and tag.name == "archived" ) then - return tag; - end - end); -end - -module:hook("pre-message/bare", post_carbons_handler, 0.9); -module:hook("pre-message/full", post_carbons_handler, 0.9); - module:add_feature(xmlns_mam);