mod_http_xep227: Add support for import via APIs rather than direct store manipulation
In particular this transitions PEP nodes and data to be imported via mod_pep's
APIs, fixing issues with importing at runtime while PEP data may already be
live in RAM.
Next obvious candidate for this approach is rosters, so clients get immediate
roster pushes and other special handling (such as emitting subscribes to reach
the desired subscription state).
local st = require"util.stanza";
local jid_split = require "util.jid".split;
local jid_bare = require "util.jid".bare;
local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
local uuid_generate = require "util.uuid".generate;
local set = require "util.set";
local recently_queried = set.new();
local version_id = uuid_generate();
local disco_id = uuid_generate();
module:hook("iq-result/host/" .. version_id, function (event)
module:log("info", "Stranger " .. event.stanza.attr.from .. " version: " .. tostring(event.stanza));
return true;
end);
module:hook("iq-result/host/" .. disco_id, function (event)
module:log("info", "Stranger " .. event.stanza.attr.from .. " disco: " .. tostring(event.stanza));
return true;
end);
function check_subscribed(event)
local stanza = event.stanza;
local local_user_jid = stanza.attr.to;
local to_user, to_host, to_resource = jid_split(local_user_jid);
local stranger_jid = stanza.attr.from;
if recently_queried:contains(stranger_jid) then
module:log("debug", "Not re-poking " .. stranger_jid);
return nil;
end
local from_jid = jid_bare(stranger_jid);
if to_user and not is_contact_subscribed(to_user, to_host, from_jid) then
if to_resource and stanza.attr.type == "groupchat" then
return nil;
end
recently_queried:add(stranger_jid);
module:send(st.iq({ type = "get", to = stranger_jid, from = to_host, id = version_id }):query("jabber:iq:version"));
module:send(st.iq({ type = "get", to = stranger_jid, from = to_host, id = disco_id }):query("http://jabber.org/protocol/disco#info"));
end
return nil;
end
module:hook("message/bare", check_subscribed, 225);
module:hook("message/full", check_subscribed, 225);
-- Not hooking iqs, as that could turn into infinite loops!