--- 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);