mod_mix_pam: Replace "state" tracking with promises
This commit is contained in:
parent
5f973c19d0
commit
3d66be6a9f
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user