aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/stanza_router.lua62
1 files changed, 40 insertions, 22 deletions
diff --git a/core/stanza_router.lua b/core/stanza_router.lua
index 5062bc23..2dcd612f 100644
--- a/core/stanza_router.lua
+++ b/core/stanza_router.lua
@@ -62,7 +62,7 @@ function core_handle_stanza(origin, stanza)
local session = origin;
if stanza.name == "presence" and origin.roster then
- if stanza.attr.type == nil or stanza.attr.type == "available" or stanza.attr.type == "unavailable" then
+ if stanza.attr.type == nil or stanza.attr.type == "unavailable" then
for jid in pairs(origin.roster) do -- broadcast to all interested contacts
local subscription = origin.roster[jid].subscription;
if subscription == "both" or subscription == "from" then
@@ -70,22 +70,30 @@ function core_handle_stanza(origin, stanza)
core_route_stanza(origin, stanza);
end
end
- --[[local node, host = jid_split(stanza.attr.from);
+ local node, host = jid_split(stanza.attr.from);
for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources
- if res.full_jid then
- res = user.sessions[k];
- break;
+ if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence
+ stanza.attr.to = res.full_jid;
+ core_route_stanza(origin, stanza);
end
- end]]
+ end
if not origin.presence then -- presence probes on initial presence
local probe = st.presence({from = origin.full_jid, type = "probe"});
- for jid in pairs(origin.roster) do
+ for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to
local subscription = origin.roster[jid].subscription;
if subscription == "both" or subscription == "to" then
probe.attr.to = jid;
core_route_stanza(origin, probe);
end
end
+ for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all resources
+ if res ~= origin and stanza.attr.type ~= "unavailable" and res.presence then -- FIXME does unavailable qualify as initial presence?
+ res.presence.attr.to = origin.full_jid;
+ core_route_stanza(res, res.presence);
+ res.presence.attr.to = nil;
+ end
+ end
+ -- TODO resend subscription requests
end
origin.presence = stanza;
stanza.attr.to = nil; -- reset it
@@ -165,7 +173,7 @@ function core_route_stanza(origin, stanza)
local to = stanza.attr.to;
local node, host, resource = jid_split(to);
- if stanza.name == "presence" and stanza.attr.type == "probe" then resource = nil; end
+ if stanza.name == "presence" and (stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable") then resource = nil; end
local host_session = hosts[host]
if host_session and host_session.type == "local" then
@@ -176,22 +184,32 @@ function core_route_stanza(origin, stanza)
if not res then
-- if we get here, resource was not specified or was unavailable
if stanza.name == "presence" then
- if stanza.attr.type == "probe" then
- if is_authorized_to_see_presence(origin, node, host) then
- for k in pairs(user.sessions) do -- return presence for all resources
- if user.sessions[k].presence then
- local pres = user.sessions[k].presence;
- pres.attr.to = origin.full_jid;
- pres.attr.from = user.sessions[k].full_jid;
- send(origin, pres);
- pres.attr.to = nil;
- pres.attr.from = nil;
+ if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
+ if stanza.attr.type == "probe" then
+ if is_authorized_to_see_presence(origin, node, host) then
+ for k in pairs(user.sessions) do -- return presence for all resources
+ if user.sessions[k].presence then
+ local pres = user.sessions[k].presence;
+ pres.attr.to = origin.full_jid;
+ pres.attr.from = user.sessions[k].full_jid;
+ send(origin, pres);
+ pres.attr.to = nil;
+ pres.attr.from = nil;
+ end
end
+ else
+ send(origin, st.presence({from=user.."@"..host, to=origin.username.."@"..origin.host, type="unsubscribed"}));
end
- else
- send(origin, st.presence({from = user.."@"..host, to = origin.username.."@"..origin.host, type = "unsubscribed"}));
- end
- else
+ elseif stanza.attr.type == "subscribe" then
+ -- TODO
+ elseif stanza.attr.type == "unsubscribe" then
+ -- TODO
+ elseif stanza.attr.type == "subscribed" then
+ -- TODO
+ elseif stanza.attr.type == "unsubscribed" then
+ -- TODO
+ end -- discard any other type
+ else -- sender is available or unavailable
for k in pairs(user.sessions) do -- presence broadcast to all user resources
if user.sessions[k].full_jid then
stanza.attr.to = user.sessions[k].full_jid;