Changeset

153:8310bfddaba8

Merge from waqas
author Matthew Wild <mwild1@gmail.com>
date Fri, 24 Oct 2008 07:57:06 +0100
parents 150:d09b8a1ab046 (current diff) 152:6b8e2bd82ac5 (diff)
children 154:1fee9396ca2f
files core/stanza_router.lua
diffstat 1 files changed, 40 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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;