diff options
-rw-r--r-- | core/stanza_router.lua | 62 |
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; |