core/stanza_router.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 01 Nov 2008 21:10:19 +0000
changeset 192 71c389c6fc2e
parent 191 e64c8a44060f
child 199 eccf66b42bd7
permissions -rw-r--r--
Another fix for s2s (well, let's say it was more for modules)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
-- The code in this file should be self-explanatory, though the logic is horrible
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- for more info on that, see doc/stanza_routing.txt, which attempts to condense
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
-- the rules from the RFCs (mainly 3921)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
require "core.servermanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local log = require "util.logger".init("stanzarouter")
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
    10
local st = require "util.stanza";
187
2e16e5077d8f Was a bit hasty to remove send_s2s() from stanza_router. We still use it, and there is no problem with it.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
    11
local send_s2s = require "core.s2smanager".send_to_host;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    12
local user_exists = require "core.usermanager".user_exists;
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
    13
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
    14
local rostermanager = require "core.rostermanager";
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    15
local sessionmanager = require "core.sessionmanager";
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
    16
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    17
local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
    18
local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
191
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
    19
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
    20
local modules_handle_stanza = require "core.modulemanager".handle_stanza;
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
    21
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    22
local format = string.format;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    23
local tostring = tostring;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    24
105
b099f0f80775 Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents: 83
diff changeset
    25
local jid_split = require "util.jid".split;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    26
local print = print;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
function core_process_stanza(origin, stanza)
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 187
diff changeset
    29
	log("debug", "Received["..origin.type.."]: "..tostring(stanza))
73
937448005121 Added to a comment
Waqas Hussain <waqas20@gmail.com>
parents: 72
diff changeset
    30
	-- TODO verify validity of stanza (as well as JID validity)
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
    31
	if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    32
		if stanza.attr.type == "set" or stanza.attr.type == "get" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    33
			error("Invalid IQ");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
    34
		elseif #stanza.tags > 1 and not(stanza.attr.type == "error" or stanza.attr.type == "result") then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    35
			error("Invalid IQ");
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    36
		end
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
    37
	end
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    38
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    39
	if origin.type == "c2s" and not origin.full_jid
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
    40
		and not(stanza.name == "iq" and stanza.tags[1].name == "bind"
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    41
				and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    42
		error("Client MUST bind resource after auth");
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    43
	end
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    44
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	local to = stanza.attr.to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    46
	-- TODO also, stazas should be returned to their original state before the function ends
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    47
	if origin.type == "c2s" then
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    48
		stanza.attr.from = origin.full_jid; -- quick fix to prevent impersonation (FIXME this would be incorrect when the origin is not c2s)
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    49
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    51
	if not to then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
    52
		core_handle_stanza(origin, stanza);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    53
	elseif origin.type == "c2s" and stanza.name == "presence" and stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    54
		local node, host = jid_split(stanza.attr.to);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    55
		local to_bare = node and (node.."@"..host) or host; -- bare JID
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    56
		local from_node, from_host = jid_split(stanza.attr.from);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    57
		local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    58
		handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    59
	elseif hosts[to] and hosts[to].type == "local" then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    60
		core_handle_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    61
	elseif stanza.name == "iq" and not select(3, jid_split(to)) then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    62
		core_handle_stanza(origin, stanza);
192
71c389c6fc2e Another fix for s2s (well, let's say it was more for modules)
Matthew Wild <mwild1@gmail.com>
parents: 191
diff changeset
    63
	elseif stanza.attr.xmlns and stanza.attr.xmlns ~= "jabber:client" and stanza.attr.xmlns ~= "jabber:server" then
191
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
    64
		modules_handle_stanza(origin, stanza);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
    65
	elseif origin.type == "c2s" or origin.type == "s2sin" then
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    66
		core_route_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    67
	end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    68
end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    69
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
    70
-- This function handles stanzas which are not routed any further,
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
    71
-- that is, they are handled by this server
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    72
function core_handle_stanza(origin, stanza)
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    73
	-- Handlers
191
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
    74
	if modules_handle_stanza(origin, stanza) then return; end
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    75
	if origin.type == "c2s" or origin.type == "c2s_unauthed" then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    76
		local session = origin;
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    77
		
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    78
		if stanza.name == "presence" and origin.roster then
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    79
			if stanza.attr.type == nil or stanza.attr.type == "unavailable" then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    80
				for jid in pairs(origin.roster) do -- broadcast to all interested contacts
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    81
					local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    82
					if subscription == "both" or subscription == "from" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    83
						stanza.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    84
						core_route_stanza(origin, stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    85
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    86
				end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
    87
				local node, host = jid_split(stanza.attr.from);
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    88
				for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    89
					if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    90
						stanza.attr.to = res.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    91
						core_route_stanza(origin, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    92
					end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
    93
				end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    94
				if not origin.presence then -- presence probes on initial presence -- FIXME does unavailable qualify as initial presence?
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    95
					local probe = st.presence({from = origin.full_jid, type = "probe"});
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    96
					for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    97
						local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    98
						if subscription == "both" or subscription == "to" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    99
							probe.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   100
							core_route_stanza(origin, probe);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   101
						end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   102
					end
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   103
					for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all resources
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   104
						if res ~= origin and stanza.attr.type ~= "unavailable" and res.presence then -- FIXME does unavailable qualify as initial presence?
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   105
							res.presence.attr.to = origin.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   106
							core_route_stanza(res, res.presence);
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   107
							res.presence.attr.to = nil;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   108
						end
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   109
					end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   110
					-- TODO resend subscription requests
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   111
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   112
				origin.presence = stanza;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   113
				stanza.attr.to = nil; -- reset it
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   114
			else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   115
				-- TODO error, bad type
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   116
			end
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
   117
		end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   118
	else
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   119
		log("warn", "Unhandled origin: %s", origin.type);
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   120
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   122
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   123
function send_presence_of_available_resources(user, host, jid, recipient_session)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   124
	local h = hosts[host];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   125
	local count = 0;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   126
	if h and h.type == "local" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   127
		local u = h.sessions[user];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   128
		if u then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   129
			for k, session in pairs(u.sessions) do
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   130
				local pres = session.presence;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   131
				if pres then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   132
					pres.attr.to = jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   133
					pres.attr.from = session.full_jid;
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   134
					recipient_session.send(pres);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   135
					pres.attr.to = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   136
					pres.attr.from = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   137
					count = count + 1;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   138
				end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   139
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   140
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   141
	end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   142
	return count;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   143
end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   144
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   145
function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   146
	local node, host = jid_split(from_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   147
	local st_from, st_to = stanza.attr.from, stanza.attr.to;
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   148
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   149
	if stanza.attr.type == "subscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   150
		log("debug", "outbound subscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   151
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   152
		-- 2. roster push (subscription = none, ask = subscribe)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   153
		if rostermanager.set_contact_pending_out(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   154
			rostermanager.roster_push(node, host, to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   155
		end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   156
		core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   157
	elseif stanza.attr.type == "unsubscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   158
		log("debug", "outbound unsubscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   159
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   160
		-- 2. roster push (subscription = none or from)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   161
		if rostermanager.unsubscribe(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   162
			rostermanager.roster_push(node, host, to_bare); -- FIXME do roster push when roster has in fact not changed?
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   163
		end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   164
		core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   165
	elseif stanza.attr.type == "subscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   166
		log("debug", "outbound subscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   167
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   168
		-- 2. roster_push ()
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   169
		-- 3. send_presence_of_available_resources
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   170
		if rostermanager.subscribed(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   171
			rostermanager.roster_push(node, host, to_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   172
			core_route_stanza(origin, stanza);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   173
			send_presence_of_available_resources(node, host, to_bare, origin);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   174
		end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   175
	elseif stanza.attr.type == "unsubscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   176
		log("debug", "outbound unsubscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   177
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   178
		-- 2. roster push (subscription = none or to)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   179
		if rostermanager.unsubscribed(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   180
			rostermanager.roster_push(node, host, to_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   181
			core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   182
		end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   183
	end
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   184
	stanza.attr.from, stanza.attr.to = st_from, st_to;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   185
end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   186
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   187
function handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   188
	local node, host = jid_split(to_bare);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   189
	local st_from, st_to = stanza.attr.from, stanza.attr.to;
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   190
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   191
	if stanza.attr.type == "probe" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   192
		if rostermanager.is_contact_subscribed(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   193
			if 0 == send_presence_of_available_resources(node, host, from_bare, origin) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   194
				-- TODO send last recieved unavailable presence (or we MAY do nothing, which is fine too)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   195
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   196
		else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   197
			core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="unsubscribed"}));
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   198
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   199
	elseif stanza.attr.type == "subscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   200
		log("debug", "inbound subscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   201
		if rostermanager.is_contact_subscribed(node, host, from_bare) then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   202
			core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="subscribed"})); -- already subscribed
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   203
		else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   204
			if not rostermanager.is_contact_pending_in(node, host, from_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   205
				if rostermanager.set_contact_pending_in(node, host, from_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   206
					sessionmanager.send_to_available_resources(node, host, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   207
				end -- TODO else return error, unable to save
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   208
			end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   209
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   210
	elseif stanza.attr.type == "unsubscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   211
		log("debug", "inbound unsubscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   212
		if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   213
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   214
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   215
	elseif stanza.attr.type == "subscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   216
		log("debug", "inbound subscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   217
		if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   218
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   219
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   220
	elseif stanza.attr.type == "unsubscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   221
		log("debug", "inbound unsubscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   222
		if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   223
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   224
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   225
	end -- discard any other type
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   226
	stanza.attr.from, stanza.attr.to = st_from, st_to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   227
end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   228
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   229
function core_route_stanza(origin, stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   230
	-- Hooks
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   231
	--- ...later
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   232
	
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   233
	-- Deliver
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   234
	local to = stanza.attr.to;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   235
	local node, host, resource = jid_split(to);
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   236
	local to_bare = node and (node.."@"..host) or host; -- bare JID
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   237
	local from = stanza.attr.from;
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   238
	local from_node, from_host, from_resource = jid_split(from);
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   239
	local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   240
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   241
	if stanza.name == "presence" and (stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable") then resource = nil; end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   242
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   243
	local host_session = hosts[host]
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   244
	if host_session and host_session.type == "local" then
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   245
		-- Local host
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   246
		local user = host_session.sessions[node];
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   247
		if user then
72
e78db62beebc Code cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 71
diff changeset
   248
			local res = user.sessions[resource];
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   249
			if not res then
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   250
				-- if we get here, resource was not specified or was unavailable
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   251
				if stanza.name == "presence" then
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   252
					if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   253
						handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   254
					else -- sender is available or unavailable
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   255
						for k in pairs(user.sessions) do -- presence broadcast to all user resources. FIXME should this be just for available resources? Do we need to check subscription?
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   256
							if user.sessions[k].full_jid then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   257
								stanza.attr.to = user.sessions[k].full_jid; -- reset at the end of function
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   258
								user.sessions[k].send(stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   259
							end
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   260
						end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   261
					end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   262
				elseif stanza.name == "message" then -- select a resource to recieve message
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   263
					for k in pairs(user.sessions) do
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   264
						if user.sessions[k].full_jid then
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   265
							res = user.sessions[k];
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   266
							break;
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   267
						end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   268
					end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   269
					-- TODO find resource with greatest priority
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   270
					res.send(stanza);
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   271
				else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   272
					-- TODO send IQ error
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   273
				end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   274
			else
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
   275
				-- User + resource is online...
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   276
				stanza.attr.to = res.full_jid; -- reset at the end of function
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   277
				res.send(stanza); -- Yay \o/
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   278
			end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   279
		else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   280
			-- user not online
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   281
			if user_exists(node, host) then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   282
				if stanza.name == "presence" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   283
					if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   284
						handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   285
					else
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   286
						-- TODO send unavailable presence or unsubscribed
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   287
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   288
				elseif stanza.name == "message" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   289
					-- TODO send message error, or store offline messages
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   290
				elseif stanza.name == "iq" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   291
					-- TODO send IQ error
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   292
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   293
			else -- user does not exist
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   294
				-- TODO we would get here for nodeless JIDs too. Do something fun maybe? Echo service? Let plugins use xmpp:server/resource addresses?
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   295
				if stanza.name == "presence" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   296
					if stanza.attr.type == "probe" then
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   297
						origin.send(st.presence({from = to_bare, to = from_bare, type = "unsubscribed"}));
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   298
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   299
					-- else ignore
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   300
				else
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
   301
					origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   302
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   303
			end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   304
		end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   305
	elseif origin.type == "c2s" then
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   306
		-- Remote host
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   307
		local xmlns = stanza.attr.xmlns;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   308
		--stanza.attr.xmlns = "jabber:server";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   309
		stanza.attr.xmlns = nil;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
   310
		log("debug", "sending s2s stanza: %s", tostring(stanza));
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   311
		send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   312
		stanza.attr.xmlns = xmlns; -- reset
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   313
	else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   314
		log("warn", "received stanza from unhandled connection type: %s", origin.type);
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   315
	end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   316
	stanza.attr.to = to; -- reset
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   317
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   318
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   319
function handle_stanza_toremote(stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   320
	log("error", "Stanza bound for remote host, but s2s is not implemented");
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   321
end