mod_mix_pam: Replace "state" tracking with promises

This commit is contained in:
PapaTutuWawa 2021-05-28 16:25:35 +02:00
parent 5f973c19d0
commit 3d66be6a9f

View File

@ -70,26 +70,6 @@ function module.load()
end end
end end
local client_state_tracker = {}; -- [stanza ID] -> resource
local function add_state(id, resource)
client_state_tracker[id] = resource;
module:log("debug", "Adding a resource %s for id %s", resource, id);
end
local function has_state(id)
return client_state_tracker[id] ~= nil;
end
local function pop_state(id)
module:log("debug", "Popping a resource for stanza id %s", id);
if has_state(id) then
local resource = client_state_tracker[id];
client_state_tracker[id] = nil;
return resource;
end
return nil;
end
local function handle_client_join(event) local function handle_client_join(event)
-- Client requests to join -- Client requests to join
module:log("debug", "client-join received"); module:log("debug", "client-join received");
@ -115,9 +95,17 @@ local function handle_client_join(event)
}); });
join_iq:add_child(join); join_iq:add_child(join);
add_state(stanza.attr.id, origin); module:send_iq(join_iq)
:next(function(resp)
module:send(join_iq); -- Success
handle_mix_join(resp, origin);
end, function(resp)
-- Error
-- TODO
local error_stanza = resp.stanza;
error_stanza.attr.to = origin.full_jid;
module:send(error_stanza);
end);
return true; return true;
end end
@ -146,9 +134,16 @@ local function handle_client_leave(event)
}); });
leave_iq:add_child(leave); leave_iq:add_child(leave);
add_state(stanza.attr.id, origin); module:send_iq(leave_iq)
:next(function(resp)
module:send(leave_iq); handle_mix_leave(resp, origin);
end, function(resp)
-- Error
-- TODO
local error_stanza = resp.stanza;
error_stanza.attr.to = origin.full_jid;
module:send(error_stanza);
end);
return true; return true;
end end
@ -163,20 +158,14 @@ module:hook("iq/self", function(event)
end end
end); end);
local function handle_mix_join(event) local function handle_mix_join(event, origin)
-- The MIX server responded -- The MIX server responded
module:log("debug", "Received MIX-JOIN result"); module:log("debug", "Received MIX-JOIN result");
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;
local channel_jid = spid.."#"..stanza.attr.from; local channel_jid = spid.."#"..stanza.attr.from;
local origin = pop_state(stanza.attr.id);
local resource = origin.resource; local resource = origin.resource;
if resource == nil then
module:log("error", "Got a MIX join result for a not-requested id %s", stanza.attr.id);
module:log("error", "Maybe the server changed the stanza ID?");
return false;
end
local client_join = st.iq({ local client_join = st.iq({
type = "result"; type = "result";
@ -200,18 +189,12 @@ local function handle_mix_join(event)
return true; return true;
end end
local function handle_mix_leave(event) local function handle_mix_leave(event, origin)
-- The MIX server responded -- The MIX server responded
module:log("debug", "Received MIX-LEAVE result"); module:log("debug", "Received MIX-LEAVE result");
local stanza = event.stanza; local stanza = event.stanza;
local origin = pop_state(stanza.attr.id);
local resource = origin.resource; local resource = origin.resource;
if resource == nil then
module:log("error", "Got a MIX leave result for a not-requested id %s", stanza.attr.id);
module:log("error", "Maybe the MIX server changed the stanza ID?");
return false;
end
local client_leave = st.iq({ local client_leave = st.iq({
type = "result"; type = "result";
@ -232,23 +215,6 @@ local function handle_mix_leave(event)
return true; return true;
end end
module:hook("iq/bare", function(event)
-- We handle the MIX results here since IQ stanzas against bare JIDs
-- don't make a lot of sense. We first have to translate them into
-- full JIDs based on our stanza ID -> resource mapping
if event.stanza:get_child("leave", "urn:xmpp:mix:core:1") ~= nil then
return handle_mix_leave(event);
elseif event.stanza:get_child("join", "urn:xmpp:mix:core:1") ~= nil then
return handle_mix_join(event);
elseif has_state(event.stanza.attr.id) then
local tmp = st.clone(event.stanza);
local origin = pop_state(tmp.attr.id);
tmp.attr.to = tmp.attr.to.."/"..origin.resource;
module:send(tmp);
return true;
end
end);
module:hook("roster-get", function(event) module:hook("roster-get", function(event)
-- NOTE: Currently this requires a patch to make mod_roster emit -- NOTE: Currently this requires a patch to make mod_roster emit
-- the roster-get event -- the roster-get event