core/stanza_router.lua
author Waqas Hussain <waqas20@gmail.com>
Sun, 26 Oct 2008 00:22:18 +0500
changeset 177 606c433955e7
parent 176 e5cd2a03891d
child 178 8315cf03f304
permissions -rw-r--r--
Bug fixes and checks for presence subscriptions, etc
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";
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    11
local _send = require "core.sessionmanager".send_to_session;
144
ed78c1a0401e No need to comment out s2s in this branch
Matthew Wild <mwild1@gmail.com>
parents: 127
diff changeset
    12
local send_s2s = require "core.s2smanager".send_to_host;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    13
function send(session, stanza)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    14
	if session.type == "c2s" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    15
		_send(session, stanza);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    16
	else
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    17
		local xmlns = stanza.attr.xmlns;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    18
		--stanza.attr.xmlns = "jabber:server";
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    19
		stanza.attr.xmlns = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    20
		log("debug", "sending s2s stanza: %s", tostring(stanza));
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    21
		send_s2s(session.host, host, stanza); -- TODO handle remote routing errors
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    22
		stanza.attr.xmlns = xmlns; -- reset
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    23
	end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    24
end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    25
local user_exists = require "core.usermanager".user_exists;
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
    26
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
    27
local rostermanager = require "core.rostermanager";
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
    28
local sessionmanager = require "core.sessionmanager";
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
    29
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    30
local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
    31
local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    32
local format = string.format;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    33
local tostring = tostring;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    34
105
b099f0f80775 Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents: 83
diff changeset
    35
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
    36
local print = print;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
function core_process_stanza(origin, stanza)
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 31
diff changeset
    39
	log("debug", "Received: "..tostring(stanza))
73
937448005121 Added to a comment
Waqas Hussain <waqas20@gmail.com>
parents: 72
diff changeset
    40
	-- 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
    41
	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
    42
		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
    43
			error("Invalid IQ");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
    44
		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
    45
			error("Invalid IQ");
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    46
		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
    47
	end
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    48
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    49
	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
    50
		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
    51
				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
    52
		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
    53
	end
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    54
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
	local to = stanza.attr.to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    56
	-- 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
    57
	if origin.type == "c2s" then
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
    58
		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
    59
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
	
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    61
	if not to then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
    62
		core_handle_stanza(origin, stanza);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
    63
	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
    64
		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
    65
		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
    66
		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
    67
		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
    68
		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
    69
	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
    70
		core_handle_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    71
	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
    72
		core_handle_stanza(origin, stanza);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
    73
	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
    74
		core_route_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    75
	end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    76
end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    77
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
    78
-- 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
    79
-- 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
    80
function core_handle_stanza(origin, stanza)
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    81
	-- Handlers
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    82
	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
    83
		local session = origin;
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
    84
		
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    85
		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
    86
			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
    87
				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
    88
					local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    89
					if subscription == "both" or subscription == "from" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    90
						stanza.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    91
						core_route_stanza(origin, stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    92
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    93
				end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
    94
				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
    95
				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
    96
					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
    97
						stanza.attr.to = res.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
    98
						core_route_stanza(origin, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    99
					end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   100
				end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   101
				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
   102
					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
   103
					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
   104
						local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   105
						if subscription == "both" or subscription == "to" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   106
							probe.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   107
							core_route_stanza(origin, probe);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   108
						end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   109
					end
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   110
					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
   111
						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
   112
							res.presence.attr.to = origin.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   113
							core_route_stanza(res, res.presence);
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   114
							res.presence.attr.to = nil;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   115
						end
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
   116
					end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   117
					-- TODO resend subscription requests
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   118
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   119
				origin.presence = stanza;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   120
				stanza.attr.to = nil; -- reset it
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   121
			else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   122
				-- TODO error, bad type
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   123
			end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   124
		else
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
   125
			log("debug", "Routing stanza to local");
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
   126
			handle_stanza(session, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   127
		end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   128
	elseif origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   129
		if stanza.attr.xmlns == "jabber:server:dialback" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   130
			if stanza.name == "verify" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   131
				-- We are being asked to verify the key, to ensure it was generated by us
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   132
				log("debug", "verifying dialback key...");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   133
				local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   134
				print(tostring(attr.to), tostring(attr.from))
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   135
				print(tostring(origin.to_host), tostring(origin.from_host))
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   136
				-- FIXME: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   137
				--if attr.from ~= origin.to_host then error("invalid-from"); end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   138
				local type = "invalid";
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   139
				if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   140
					type = "valid"
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   141
				end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   142
				origin.send(format("<db:verify from='%s' to='%s' id='%s' type='%s'>%s</db:verify>", attr.to, attr.from, attr.id, type, stanza[1]));
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   143
			elseif stanza.name == "result" and origin.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   144
				-- he wants to be identified through dialback
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   145
				-- We need to check the key with the Authoritative server
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   146
				local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   147
				origin.from_host = attr.from;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   148
				origin.to_host = attr.to;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   149
				origin.dialback_key = stanza[1];
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   150
				log("debug", "asking %s if key %s belongs to them", attr.from, stanza[1]);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   151
				send_s2s(attr.to, attr.from, format("<db:verify from='%s' to='%s' id='%s'>%s</db:verify>", attr.to, attr.from, origin.streamid, stanza[1]));
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   152
				hosts[attr.from].dialback_verifying = origin;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   153
			end
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   154
		end
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   155
	elseif origin.type == "s2sout_unauthed" or origin.type == "s2sout" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   156
		if stanza.attr.xmlns == "jabber:server:dialback" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   157
			if stanza.name == "result" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   158
				if stanza.attr.type == "valid" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   159
					s2s_make_authenticated(origin);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   160
				else
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   161
					-- FIXME
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   162
					error("dialback failed!");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   163
				end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   164
			elseif stanza.name == "verify" and origin.dialback_verifying then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   165
				local valid;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   166
				local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   167
				if attr.type == "valid" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   168
					s2s_make_authenticated(origin.dialback_verifying);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   169
					valid = "valid";
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   170
				else
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   171
					-- Warn the original connection that is was not verified successfully
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   172
					log("warn", "dialback for "..(origin.dialback_verifying.from_host or "(unknown)").." failed");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   173
					valid = "invalid";
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   174
				end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
   175
				origin.dialback_verifying.send(format("<db:result from='%s' to='%s' id='%s' type='%s'>%s</db:result>", attr.from, attr.to, attr.id, valid, origin.dialback_verifying.dialback_key));
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
   176
			end
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
   177
		end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   178
	else
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   179
		log("warn", "Unhandled origin: %s", origin.type);
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   180
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   183
function send_presence_of_available_resources(user, host, jid, recipient_session)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   184
	local h = hosts[host];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   185
	local count = 0;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   186
	if h and h.type == "local" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   187
		local u = h.sessions[user];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   188
		if u then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   189
			for k, session in pairs(u.sessions) do
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   190
				local pres = session.presence;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   191
				if pres then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   192
					pres.attr.to = jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   193
					pres.attr.from = session.full_jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   194
					send(recipient_session, pres);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   195
					pres.attr.to = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   196
					pres.attr.from = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   197
					count = count + 1;
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
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   200
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   201
	end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   202
	return count;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   203
end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   204
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   205
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
   206
	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
   207
	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
   208
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   209
	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
   210
		log("debug", "outbound subscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   211
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   212
		-- 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
   213
		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
   214
			rostermanager.roster_push(node, host, to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   215
		end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   216
		core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   217
	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
   218
		log("debug", "outbound unsubscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   219
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   220
		-- 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
   221
		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
   222
			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
   223
		end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   224
		core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   225
	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
   226
		log("debug", "outbound subscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   227
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   228
		-- 2. roster_push ()
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   229
		-- 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
   230
		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
   231
			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
   232
			core_route_stanza(origin, stanza);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   233
			send_presence_of_available_resources(node, host, to_bare, origin);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   234
		end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   235
	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
   236
		log("debug", "outbound unsubscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   237
		-- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   238
		-- 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
   239
		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
   240
			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
   241
			core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   242
		end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   243
	end
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   244
	stanza.attr.from, stanza.attr.to = st_from, st_to;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   245
end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   246
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   247
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
   248
	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
   249
	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
   250
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   251
	if stanza.attr.type == "probe" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   252
		if rostermanager.is_contact_subscribed(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   253
			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
   254
				-- 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
   255
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   256
		else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   257
			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
   258
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   259
	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
   260
		log("debug", "inbound subscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   261
		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
   262
			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
   263
		else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   264
			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
   265
				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
   266
					sessionmanager.send_to_available_resources(node, host, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   267
				end -- TODO else return error, unable to save
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   268
			end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   269
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   270
	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
   271
		log("debug", "inbound unsubscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   272
		if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   273
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   274
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   275
	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
   276
		log("debug", "inbound subscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   277
		if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   278
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   279
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   280
	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
   281
		log("debug", "inbound unsubscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   282
		if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   283
			rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   284
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   285
	end -- discard any other type
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   286
	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
   287
end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   288
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   289
function core_route_stanza(origin, stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   290
	-- Hooks
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   291
	--- ...later
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   292
	
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   293
	-- Deliver
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   294
	local to = stanza.attr.to;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   295
	local node, host, resource = jid_split(to);
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   296
	local to_bare = node and (node.."@"..host) or host; -- bare JID
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   297
	local from = stanza.attr.from;
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   298
	local from_node, from_host, from_resource = jid_split(from);
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   299
	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
   300
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   301
	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
   302
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   303
	local host_session = hosts[host]
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   304
	if host_session and host_session.type == "local" then
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   305
		-- Local host
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   306
		local user = host_session.sessions[node];
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   307
		if user then
72
e78db62beebc Code cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 71
diff changeset
   308
			local res = user.sessions[resource];
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   309
			if not res then
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   310
				-- 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
   311
				if stanza.name == "presence" then
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
   312
					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
   313
						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
   314
					else -- sender is available or unavailable
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   315
						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
   316
							if user.sessions[k].full_jid then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   317
								stanza.attr.to = user.sessions[k].full_jid; -- reset at the end of function
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   318
								send(user.sessions[k], stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   319
							end
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   320
						end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   321
					end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   322
				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
   323
					for k in pairs(user.sessions) do
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   324
						if user.sessions[k].full_jid then
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   325
							res = user.sessions[k];
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   326
							break;
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   327
						end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   328
					end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   329
					-- TODO find resource with greatest priority
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   330
					send(res, stanza);
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   331
				else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   332
					-- TODO send IQ error
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   333
				end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   334
			else
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
   335
				-- User + resource is online...
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   336
				stanza.attr.to = res.full_jid; -- reset at the end of function
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   337
				send(res, stanza); -- Yay \o/
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
   338
			end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   339
		else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   340
			-- user not online
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   341
			if user_exists(node, host) then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   342
				if stanza.name == "presence" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   343
					if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   344
						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
   345
					else
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
   346
						-- TODO send unavailable presence or unsubscribed
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   347
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   348
				elseif stanza.name == "message" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   349
					-- 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
   350
				elseif stanza.name == "iq" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   351
					-- TODO send IQ error
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   352
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   353
			else -- user does not exist
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   354
				-- 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
   355
				if stanza.name == "presence" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   356
					if stanza.attr.type == "probe" then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   357
						send(origin, 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
   358
					end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   359
					-- else ignore
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   360
				else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   361
					send(origin, st.error_reply(stanza, "cancel", "service-unavailable"));
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   362
				end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   363
			end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   364
		end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   365
	elseif origin.type == "c2s" then
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   366
		-- Remote host
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   367
		local xmlns = stanza.attr.xmlns;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   368
		--stanza.attr.xmlns = "jabber:server";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   369
		stanza.attr.xmlns = nil;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
   370
		log("debug", "sending s2s stanza: %s", tostring(stanza));
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   371
		send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
   372
		stanza.attr.xmlns = xmlns; -- reset
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   373
	else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
   374
		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
   375
	end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   376
	stanza.attr.to = to; -- reset
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   377
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   378
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   379
function handle_stanza_toremote(stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   380
	log("error", "Stanza bound for remote host, but s2s is not implemented");
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   381
end