# HG changeset patch # User Matthew Wild # Date 1224831426 -3600 # Node ID 8310bfddaba88cf39c79a041c86b84e30faf5402 # Parent d09b8a1ab04672bc37bc11a188dd754529f5f740# Parent 6b8e2bd82ac5e9a432b0de575a50d09be2fdc4d9 Merge from waqas diff -r d09b8a1ab046 -r 8310bfddaba8 core/stanza_router.lua --- a/core/stanza_router.lua Fri Oct 24 07:36:48 2008 +0100 +++ b/core/stanza_router.lua Fri Oct 24 07:57:06 2008 +0100 @@ -62,7 +62,7 @@ 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 @@ 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 @@ 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 @@ 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;