mod_mix_pam: Remove SPID tracking
This commit is contained in:
parent
c251502799
commit
dc9d388ec3
@ -10,13 +10,13 @@ local st = require("util.stanza");
|
|||||||
local rm_remove_from_roster = require("core.rostermanager").remove_from_roster;
|
local rm_remove_from_roster = require("core.rostermanager").remove_from_roster;
|
||||||
local rm_add_to_roster = require("core.rostermanager").add_to_roster;
|
local rm_add_to_roster = require("core.rostermanager").add_to_roster;
|
||||||
local rm_roster_push = require("core.rostermanager").roster_push;
|
local rm_roster_push = require("core.rostermanager").roster_push;
|
||||||
|
local rm_load_roster = require("core.rostermanager").load_roster;
|
||||||
|
|
||||||
-- Persistent storage
|
-- Persistent storage
|
||||||
local mix_pam = module:open_store("mix_pam", "keyval");
|
local mix_pam = module:open_store("mix_pam", "keyval");
|
||||||
|
|
||||||
-- Runtime data
|
-- Runtime data
|
||||||
local mix_hosts = {};
|
local mix_hosts = {}; -- MIX host's JID -> Reference Counter
|
||||||
local mix_spids = {}; -- user -> channel -> spid
|
|
||||||
|
|
||||||
-- Namespaceing
|
-- Namespaceing
|
||||||
local mix_pam_xmlns = "urn:xmpp:mix:pam:2";
|
local mix_pam_xmlns = "urn:xmpp:mix:pam:2";
|
||||||
@ -26,33 +26,6 @@ module:add_feature(mix_pam_xmlns);
|
|||||||
-- NOTE: To show that we archive messages
|
-- NOTE: To show that we archive messages
|
||||||
-- module:add_feature(mix_pam_xmlns.."#archive");
|
-- module:add_feature(mix_pam_xmlns.."#archive");
|
||||||
|
|
||||||
local function contains_key(table, key)
|
|
||||||
-- Returns true if table contains the key key. Returns false
|
|
||||||
-- otherwise.
|
|
||||||
return table[key] ~= nil;
|
|
||||||
end
|
|
||||||
|
|
||||||
local function set_mix_spid(user, channel, spid)
|
|
||||||
if mix_spids[user] ~= nil then
|
|
||||||
mix_spids[user][channel] = spid;
|
|
||||||
else
|
|
||||||
mix_spids[user] = { [channel] = spid };
|
|
||||||
end
|
|
||||||
|
|
||||||
mix_pam:set("spids", mix_spids);
|
|
||||||
end
|
|
||||||
local function get_mix_spid(user, channel)
|
|
||||||
return mix_spids[user][channel];
|
|
||||||
end;
|
|
||||||
local function remove_mix_spid(user, channel)
|
|
||||||
mix_spids[user][channel] = nil;
|
|
||||||
if mix_spids[user][channel] == {} then
|
|
||||||
mix_spids[user][channel] = nil;
|
|
||||||
end
|
|
||||||
|
|
||||||
mix_pam:set("spids", mix_spids);
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_mix_host(host)
|
local function add_mix_host(host)
|
||||||
if mix_hosts[host] ~= nil then
|
if mix_hosts[host] ~= nil then
|
||||||
mix_hosts[host] = mix_hosts[host] + 1;
|
mix_hosts[host] = mix_hosts[host] + 1;
|
||||||
@ -99,24 +72,6 @@ function module.load()
|
|||||||
for host, _ in pairs(mix_hosts) do
|
for host, _ in pairs(mix_hosts) do
|
||||||
module:log("debug", "Known host: %s", host);
|
module:log("debug", "Known host: %s", host);
|
||||||
end
|
end
|
||||||
|
|
||||||
mix_spids = mix_pam:get("spids");
|
|
||||||
module:log("info", "Loaded known MIX SPIDs");
|
|
||||||
|
|
||||||
if mix_spids == nil then
|
|
||||||
module:log("info", "No known MIX SPIDs loaded");
|
|
||||||
mix_spids = {};
|
|
||||||
end
|
|
||||||
for user, channel_map in pairs(mix_spids) do
|
|
||||||
module:log("debug", "-- %s", user);
|
|
||||||
if channel_map[user] then
|
|
||||||
for channel, spid in pairs(channel_map[user]) do
|
|
||||||
module:log("debug", "%s -> %s", channel, spid);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
module:log("warn", "User mapping empty");
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local client_state_tracker = {}; -- [stanza ID] -> resource
|
local client_state_tracker = {}; -- [stanza ID] -> resource
|
||||||
@ -217,9 +172,6 @@ end);
|
|||||||
local function handle_mix_join(event)
|
local function handle_mix_join(event)
|
||||||
-- The MIX server responded
|
-- The MIX server responded
|
||||||
module:log("debug", "Received MIX-JOIN result");
|
module:log("debug", "Received MIX-JOIN result");
|
||||||
module:log("debug", "Adding %s as a new MIX host", jid.host(event.stanza.attr.from));
|
|
||||||
add_mix_host(jid.host(event.stanza.attr.from));
|
|
||||||
mix_pam:set("hosts", mix_hosts);
|
|
||||||
|
|
||||||
local stanza = event.stanza;
|
local stanza = event.stanza;
|
||||||
local spid = stanza:get_child("join", "urn:xmpp:mix:core:1").attr.id;
|
local spid = stanza:get_child("join", "urn:xmpp:mix:core:1").attr.id;
|
||||||
@ -232,9 +184,6 @@ local function handle_mix_join(event)
|
|||||||
return false;
|
return false;
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Keep track of the SPID
|
|
||||||
set_mix_spid(stanza.attr.to, stanza.attr.from, spid);
|
|
||||||
|
|
||||||
local client_join = st.iq({
|
local client_join = st.iq({
|
||||||
type = "result";
|
type = "result";
|
||||||
id = stanza.attr.id;
|
id = stanza.attr.id;
|
||||||
@ -249,8 +198,10 @@ local function handle_mix_join(event)
|
|||||||
rm_add_to_roster(origin, stanza.attr.from, {
|
rm_add_to_roster(origin, stanza.attr.from, {
|
||||||
subscription = "both",
|
subscription = "both",
|
||||||
groups = {},
|
groups = {},
|
||||||
|
mix_spid = spid,
|
||||||
});
|
});
|
||||||
rm_roster_push(jid.node(stanza.attr.to), module_host, stanza.attr.from);
|
rm_roster_push(jid.node(stanza.attr.to), module_host, stanza.attr.from);
|
||||||
|
add_mix_host(jid.bare(stanza.attr.from));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
end
|
end
|
||||||
@ -258,8 +209,6 @@ end
|
|||||||
local function handle_mix_leave(event)
|
local function handle_mix_leave(event)
|
||||||
-- The MIX server responded
|
-- The MIX server responded
|
||||||
module:log("debug", "Received MIX-LEAVE result");
|
module:log("debug", "Received MIX-LEAVE result");
|
||||||
remove_mix_host(jid.host(event.stanza.attr.from));
|
|
||||||
mix_pam:set("hosts", mix_hosts);
|
|
||||||
|
|
||||||
local stanza = event.stanza;
|
local stanza = event.stanza;
|
||||||
local origin = pop_state(stanza.attr.id);
|
local origin = pop_state(stanza.attr.id);
|
||||||
@ -270,9 +219,6 @@ local function handle_mix_leave(event)
|
|||||||
return false;
|
return false;
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Keep track of the SPID
|
|
||||||
set_mix_spid(stanza.attr.to, jid.bare(stanza.attr.from));
|
|
||||||
|
|
||||||
local client_leave = st.iq({
|
local client_leave = st.iq({
|
||||||
type = "result";
|
type = "result";
|
||||||
id = stanza.attr.id;
|
id = stanza.attr.id;
|
||||||
@ -287,6 +233,7 @@ local function handle_mix_leave(event)
|
|||||||
-- TODO: Error handling
|
-- TODO: Error handling
|
||||||
rm_remove_from_roster(origin, jid.bare(stanza.attr.from));
|
rm_remove_from_roster(origin, jid.bare(stanza.attr.from));
|
||||||
rm_roster_push(jid.node(stanza.attr.to), module_host, jid.bare(stanza.attr.from));
|
rm_roster_push(jid.node(stanza.attr.to), module_host, jid.bare(stanza.attr.from));
|
||||||
|
remove_mix_host(jid.bare(stanza.attr.from));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
end
|
end
|
||||||
@ -348,13 +295,19 @@ module:hook("roster-get", function(event)
|
|||||||
module:log("debug", "Annotated roster request received");
|
module:log("debug", "Annotated roster request received");
|
||||||
|
|
||||||
-- User requested the roster with an <annotate/>
|
-- User requested the roster with an <annotate/>
|
||||||
for item in event.reply:get_child("query", "jabber:iq:roster"):children() do
|
local roster = rm_load_roster(jid.bare(stanza.attr.from));
|
||||||
if contains_key(mix_hosts, jid.host(item.attr.jid)) then
|
local query = event.reply:get_child("query", "jabber:iq:roster");
|
||||||
local spid = get_mix_spid(jid.bare(stanza.attr.from), item.attr.jid);
|
for contact, roster_item in pairs(roster) do
|
||||||
|
if roster_item["mix_spid"] ~= nil then
|
||||||
|
for _, item in ipairs(query:childtags("item")) do
|
||||||
|
if item.attr.jid == contact then
|
||||||
item:tag("channel", {
|
item:tag("channel", {
|
||||||
xmlns = mix_roster_xmlns,
|
xmlns = mix_roster_xmlns,
|
||||||
["participant-id"] = spid,
|
["participant-id"] = roster_item["mix_spid"],
|
||||||
});
|
});
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end);
|
end);
|
||||||
|
Loading…
Reference in New Issue
Block a user