Annotate

core/stanza_router.lua @ 199:eccf66b42bd7

Added resource priority handling, etc
author Waqas Hussain <waqas20@gmail.com>
date Sun, 02 Nov 2008 06:36:42 +0500
parent 192:71c389c6fc2e
child 200:5e8b3cce798f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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;
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
24 local t_concat = table.concat;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
25 local tonumber = tonumber;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
26 local s_find = string.find;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
27
105
b099f0f80775 Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents: 83
diff changeset
28 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
29 local print = print;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 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
32 log("debug", "Received["..origin.type.."]: "..tostring(stanza))
73
937448005121 Added to a comment
Waqas Hussain <waqas20@gmail.com>
parents: 72
diff changeset
33 -- 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
34 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
35 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
36 error("Invalid IQ");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
37 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
38 error("Invalid IQ");
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
39 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
40 end
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
41
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
42 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
43 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
44 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
45 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
46 end
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
47
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 local to = stanza.attr.to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
49 -- 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
50 if origin.type == "c2s" then
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
51 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
52 end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
54 if not to then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
55 core_handle_stanza(origin, stanza);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
56 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
57 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
58 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
59 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
60 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
61 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
62 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
63 core_handle_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
64 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
65 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
66 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
67 modules_handle_stanza(origin, stanza);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
68 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
69 core_route_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
70 end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
71 end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
72
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
73 -- 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
74 -- 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
75 function core_handle_stanza(origin, stanza)
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
76 -- Handlers
191
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
77 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
78 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
79 local session = origin;
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
80
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
81 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
82 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
83 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
84 local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
85 if subscription == "both" or subscription == "from" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
86 stanza.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
87 core_route_stanza(origin, stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
88 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
89 end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
90 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
91 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
92 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
93 stanza.attr.to = res.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
94 core_route_stanza(origin, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
95 end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
96 end
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
97 if stanza.attr.type == nil and not origin.presence then -- initial presence
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
98 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
99 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
100 local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
101 if subscription == "both" or subscription == "to" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
102 probe.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
103 core_route_stanza(origin, probe);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
104 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
105 end
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
106 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all available resources
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
107 if res ~= origin and res.presence then
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
108 res.presence.attr.to = origin.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
109 core_route_stanza(res, res.presence);
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
110 res.presence.attr.to = nil;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
111 end
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
112 end
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
113 if origin.roster.pending then -- resend incoming subscription requests
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
114 for jid in pairs(origin.roster.pending) do
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
115 origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original?
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
116 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
117 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
118 local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host});
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
119 for jid, item in pairs(origin.roster) do -- resend outgoing subscription requests
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
120 if item.ask then
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
121 request.attr.to = jid;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
122 core_route_stanza(origin, request);
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
123 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
124 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
125 end
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
126 origin.priority = 0;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
127 if stanza.attr.type == "unavailable" then
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
128 origin.presence = nil;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
129 else
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
130 origin.presence = stanza;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
131 local priority = stanza:child_with_name("priority");
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
132 if priority and #priority > 0 then
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
133 priority = t_concat(priority);
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
134 if s_find(priority, "^[+-]?[0-9]+$") then
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
135 priority = tonumber(priority);
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
136 if priority < -128 then priority = -128 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
137 if priority > 127 then priority = 127 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
138 origin.priority = priority;
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
139 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
140 end
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 192
diff changeset
141 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
142 stanza.attr.to = nil; -- reset it
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
143 else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
144 -- TODO error, bad type
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
145 end
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
146 end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
147 else
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
148 log("warn", "Unhandled origin: %s", origin.type);
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
149 end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
152 function send_presence_of_available_resources(user, host, jid, recipient_session)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
153 local h = hosts[host];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
154 local count = 0;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
155 if h and h.type == "local" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
156 local u = h.sessions[user];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
157 if u then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
158 for k, session in pairs(u.sessions) do
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
159 local pres = session.presence;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
160 if pres then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
161 pres.attr.to = jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
162 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
163 recipient_session.send(pres);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
164 pres.attr.to = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
165 pres.attr.from = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
166 count = count + 1;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
167 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
168 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
169 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
170 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
171 return count;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
172 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
173
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
174 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
175 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
176 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
177 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
178 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
179 log("debug", "outbound subscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
180 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
181 -- 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
182 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
183 rostermanager.roster_push(node, host, to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
184 end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
185 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
186 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
187 log("debug", "outbound unsubscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
188 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
189 -- 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
190 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
191 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
192 end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
193 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
194 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
195 log("debug", "outbound subscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
196 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
197 -- 2. roster_push ()
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
198 -- 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
199 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
200 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
201 core_route_stanza(origin, stanza);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
202 send_presence_of_available_resources(node, host, to_bare, origin);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
203 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
204 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
205 log("debug", "outbound unsubscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
206 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
207 -- 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
208 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
209 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
210 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
211 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
212 end
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
213 stanza.attr.from, stanza.attr.to = st_from, st_to;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
214 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
215
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
216 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
217 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
218 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
219 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
220 if stanza.attr.type == "probe" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
221 if rostermanager.is_contact_subscribed(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
222 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
223 -- 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
224 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
225 else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
226 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
227 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
228 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
229 log("debug", "inbound subscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
230 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
231 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
232 else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
233 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
234 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
235 sessionmanager.send_to_available_resources(node, host, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
236 end -- TODO else return error, unable to save
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
237 end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
238 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
239 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
240 log("debug", "inbound unsubscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
241 if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
242 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
243 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
244 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
245 log("debug", "inbound subscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
246 if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
247 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
248 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
249 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
250 log("debug", "inbound unsubscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
251 if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
252 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
253 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
254 end -- discard any other type
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
255 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
256 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
257
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 function core_route_stanza(origin, stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 -- Hooks
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
260 --- ...later
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
261
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 -- Deliver
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
263 local to = stanza.attr.to;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
264 local node, host, resource = jid_split(to);
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
265 local to_bare = node and (node.."@"..host) or host; -- bare JID
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
266 local from = stanza.attr.from;
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
267 local from_node, from_host, from_resource = jid_split(from);
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
268 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
269
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
270 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
271
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
272 local host_session = hosts[host]
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
273 if host_session and host_session.type == "local" then
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
274 -- Local host
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
275 local user = host_session.sessions[node];
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
276 if user then
72
e78db62beebc Code cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 71
diff changeset
277 local res = user.sessions[resource];
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
278 if not res then
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
279 -- 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
280 if stanza.name == "presence" then
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
281 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
282 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
283 else -- sender is available or unavailable
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
284 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
285 if user.sessions[k].full_jid then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
286 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
287 user.sessions[k].send(stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
288 end
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
289 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
290 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
291 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
292 for k in pairs(user.sessions) do
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
293 if user.sessions[k].full_jid then
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
294 res = user.sessions[k];
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
295 break;
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
296 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
297 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
298 -- 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
299 res.send(stanza);
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
300 else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
301 -- TODO send IQ error
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
302 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
303 else
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
304 -- User + resource is online...
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
305 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
306 res.send(stanza); -- Yay \o/
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
307 end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
308 else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
309 -- user not online
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
310 if user_exists(node, host) then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
311 if stanza.name == "presence" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
312 if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
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);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
314 else
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
315 -- TODO send unavailable presence or unsubscribed
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
316 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
317 elseif stanza.name == "message" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
318 -- 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
319 elseif stanza.name == "iq" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
320 -- TODO send IQ error
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
321 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
322 else -- user does not exist
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
323 -- 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
324 if stanza.name == "presence" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
325 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
326 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
327 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
328 -- else ignore
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
329 else
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 178
diff changeset
330 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
331 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
332 end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
333 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
334 elseif origin.type == "c2s" then
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
335 -- Remote host
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
336 local xmlns = stanza.attr.xmlns;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
337 --stanza.attr.xmlns = "jabber:server";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
338 stanza.attr.xmlns = nil;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
339 log("debug", "sending s2s stanza: %s", tostring(stanza));
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
340 send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
341 stanza.attr.xmlns = xmlns; -- reset
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
342 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
343 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
344 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
345 stanza.attr.to = to; -- reset
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 function handle_stanza_toremote(stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 log("error", "Stanza bound for remote host, but s2s is not implemented");
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 end