Wed, 03 Dec 2008 13:06:23 +0000
Fix port number in mod_console instructions
30 | 1 | |
2 | local log = require "util.logger".init("stanzarouter") | |
3 | ||
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
4 | 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
|
5 | 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
|
6 | local user_exists = require "core.usermanager".user_exists; |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
7 | |
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
170
diff
changeset
|
8 | local rostermanager = require "core.rostermanager"; |
175
5f71d290bb44
Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
9 | local sessionmanager = require "core.sessionmanager"; |
249
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
10 | local offlinemanager = require "core.offlinemanager"; |
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
170
diff
changeset
|
11 | |
145 | 12 | local s2s_verify_dialback = require "core.s2smanager".verify_dialback; |
146 | 13 | local s2s_make_authenticated = require "core.s2smanager".make_authenticated; |
191 | 14 | |
15 | local modules_handle_stanza = require "core.modulemanager".handle_stanza; | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
16 | local component_handle_stanza = require "core.componentmanager".handle_stanza; |
191 | 17 | |
321
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
18 | local handle_outbound_presence_subscriptions_and_probes = require "core.presencemanager".handle_outbound_presence_subscriptions_and_probes; |
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
19 | local handle_inbound_presence_subscriptions_and_probes = require "core.presencemanager".handle_inbound_presence_subscriptions_and_probes; |
468
ab49cb6d0e92
Moved incoming c2s presence handling from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
438
diff
changeset
|
20 | local handle_normal_presence = require "core.presencemanager".handle_normal_presence; |
321
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
21 | |
145 | 22 | local format = string.format; |
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; |
200
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
25 | local t_insert = table.insert; |
199
eccf66b42bd7
Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents:
192
diff
changeset
|
26 | local tonumber = tonumber; |
eccf66b42bd7
Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents:
192
diff
changeset
|
27 | local s_find = string.find; |
145 | 28 | |
105
b099f0f80775
Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents:
83
diff
changeset
|
29 | 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
|
30 | local print = print; |
30 | 31 | |
32 | function core_process_stanza(origin, stanza) | |
340
a31715bf08eb
Extra checks before sending error replies to incoming stanzas
Matthew Wild <mwild1@gmail.com>
parents:
321
diff
changeset
|
33 | (origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:pretty_print()) --top_tag()) |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
34 | |
234
7c8313e055fb
Hack to allow s2s stanzas to work until we do proper namespace handling
Waqas Hussain <waqas20@gmail.com>
parents:
223
diff
changeset
|
35 | if not stanza.attr.xmlns then stanza.attr.xmlns = "jabber:client"; end -- FIXME Hack. This should be removed when we fix namespace handling. |
73 | 36 | -- 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
|
37 | 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
|
38 | 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
|
39 | error("Invalid IQ"); |
148 | 40 | 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
|
41 | error("Invalid IQ"); |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
42 | 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
|
43 | end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
44 | |
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
45 | 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
|
46 | 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
|
47 | 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
|
48 | 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
|
49 | end |
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
50 | |
274
9e68a697435d
Fix routing of outbound iq stanzas
Matthew Wild <mwild1@gmail.com>
parents:
264
diff
changeset
|
51 | -- TODO also, stanzas should be returned to their original state before the function ends |
145 | 52 | if origin.type == "c2s" then |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
53 | stanza.attr.from = origin.full_jid; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
54 | end |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
55 | local to = stanza.attr.to; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
56 | local node, host, resource = jid_split(to); |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
57 | local to_bare = node and (node.."@"..host) or host; -- bare JID |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
58 | local from = stanza.attr.from; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
59 | local from_node, from_host, from_resource = jid_split(from); |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
60 | local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
61 | |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
62 | if origin.type == "s2sin" then |
209
e9de0803676d
Part one of internal component support
Matthew Wild <mwild1@gmail.com>
parents:
206
diff
changeset
|
63 | if origin.from_host ~= from_host then -- remote server trying to impersonate some other server? |
e9de0803676d
Part one of internal component support
Matthew Wild <mwild1@gmail.com>
parents:
206
diff
changeset
|
64 | log("warn", "Received a stanza claiming to be from %s, over a conn authed for %s!", from, origin.from_host); |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
65 | return; -- FIXME what should we do here? does this work with subdomains? |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
66 | end |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
67 | end |
213 | 68 | --[[if to and not(hosts[to]) and not(hosts[to_bare]) and (hosts[host] and hosts[host].type ~= "local") then -- not for us? |
69 | log("warn", "stanza recieved for a non-local server"); | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
70 | return; -- FIXME what should we do here? |
213 | 71 | end]] -- FIXME |
206 | 72 | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
73 | -- FIXME do stanzas not of jabber:client get handled by components? |
222
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
74 | if origin.type == "s2sin" or origin.type == "c2s" then |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
75 | if not to then |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
76 | core_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
77 | elseif hosts[to] and hosts[to].type == "local" then -- directed at a local server |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
78 | core_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
79 | elseif stanza.attr.xmlns and stanza.attr.xmlns ~= "jabber:client" and stanza.attr.xmlns ~= "jabber:server" then |
438
193f9dd64f17
Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents:
372
diff
changeset
|
80 | modules_handle_stanza(host or origin.host or origin.to_host, origin, stanza); |
222
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
81 | elseif hosts[to_bare] and hosts[to_bare].type == "component" then -- hack to allow components to handle node@server |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
82 | component_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
83 | elseif hosts[to] and hosts[to].type == "component" then -- hack to allow components to handle node@server/resource and server/resource |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
84 | component_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
85 | elseif hosts[host] and hosts[host].type == "component" then -- directed at a component |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
86 | component_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
87 | elseif origin.type == "c2s" and stanza.name == "presence" and stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then |
321
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
88 | handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); |
274
9e68a697435d
Fix routing of outbound iq stanzas
Matthew Wild <mwild1@gmail.com>
parents:
264
diff
changeset
|
89 | elseif origin.type ~= "c2s" and stanza.name == "iq" and not resource then -- directed at bare JID |
222
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
90 | core_handle_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
91 | else |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
92 | core_route_stanza(origin, stanza); |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
93 | end |
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
94 | else |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
95 | core_handle_stanza(origin, stanza); |
119
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
96 | end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
97 | end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
98 | |
121
74e5919e4737
Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents:
119
diff
changeset
|
99 | -- 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
|
100 | -- 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
|
101 | function core_handle_stanza(origin, stanza) |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
102 | -- Handlers |
438
193f9dd64f17
Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents:
372
diff
changeset
|
103 | if modules_handle_stanza(stanza.attr.to or origin.host, origin, stanza) then return; end |
119
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
104 | 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
|
105 | local session = origin; |
206 | 106 | |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
107 | 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
|
108 | if stanza.attr.type == nil or stanza.attr.type == "unavailable" then |
468
ab49cb6d0e92
Moved incoming c2s presence handling from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
438
diff
changeset
|
109 | handle_normal_presence(origin, stanza, core_route_stanza); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
110 | else |
250
9f66ede8deeb
Added error replies for unhandled stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
249
diff
changeset
|
111 | log("warn", "Unhandled c2s presence: %s", tostring(stanza)); |
340
a31715bf08eb
Extra checks before sending error replies to incoming stanzas
Matthew Wild <mwild1@gmail.com>
parents:
321
diff
changeset
|
112 | if (stanza.attr.xmlns == "jabber:client" or stanza.attr.xmlns == "jabber:server") and stanza.attr.type ~= "error" then |
264
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
113 | origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error? |
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
114 | end |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
115 | end |
250
9f66ede8deeb
Added error replies for unhandled stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
249
diff
changeset
|
116 | else |
9f66ede8deeb
Added error replies for unhandled stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
249
diff
changeset
|
117 | log("warn", "Unhandled c2s stanza: %s", tostring(stanza)); |
340
a31715bf08eb
Extra checks before sending error replies to incoming stanzas
Matthew Wild <mwild1@gmail.com>
parents:
321
diff
changeset
|
118 | if (stanza.attr.xmlns == "jabber:client" or stanza.attr.xmlns == "jabber:server") and stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
264
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
119 | origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error? |
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
120 | end |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
121 | end -- TODO handle other stanzas |
145 | 122 | else |
250
9f66ede8deeb
Added error replies for unhandled stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
249
diff
changeset
|
123 | log("warn", "Unhandled origin: %s", origin.type); |
340
a31715bf08eb
Extra checks before sending error replies to incoming stanzas
Matthew Wild <mwild1@gmail.com>
parents:
321
diff
changeset
|
124 | if (stanza.attr.xmlns == "jabber:client" or stanza.attr.xmlns == "jabber:server") and stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
264
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
125 | -- s2s stanzas can get here |
358
ffb1a720f5ae
Don't error reply to stanzas direct over the s2s stream they came from
Matthew Wild <mwild1@gmail.com>
parents:
340
diff
changeset
|
126 | origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- FIXME correct error? |
264
a296b61baad8
Only reply with errors if the stanza is not an error or a result (don't know how much bandwidth this just cost me :) )
Matthew Wild <mwild1@gmail.com>
parents:
262
diff
changeset
|
127 | end |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
128 | end |
30 | 129 | end |
130 | ||
131 | function core_route_stanza(origin, stanza) | |
132 | -- Hooks | |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
133 | --- ...later |
206 | 134 | |
30 | 135 | -- Deliver |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
136 | local to = stanza.attr.to; |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
137 | local node, host, resource = jid_split(to); |
170 | 138 | local to_bare = node and (node.."@"..host) or host; -- bare JID |
139 | local from = stanza.attr.from; | |
140 | local from_node, from_host, from_resource = jid_split(from); | |
141 | 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
|
142 | |
372
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
143 | -- Auto-detect origin if not specified |
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
144 | origin = origin or hosts[from_host]; |
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
145 | if not origin then return false; end |
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
146 | |
151 | 147 | 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
|
148 | |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
149 | local host_session = hosts[host] |
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
150 | if host_session and host_session.type == "local" then |
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
151 | -- Local host |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
152 | local user = host_session.sessions[node]; |
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
153 | if user then |
72 | 154 | local res = user.sessions[resource]; |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
155 | if not res then |
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
156 | -- 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
|
157 | if stanza.name == "presence" then |
151 | 158 | if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then |
321
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
159 | handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); |
151 | 160 | else -- sender is available or unavailable |
200
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
161 | for _, session in pairs(user.sessions) do -- presence broadcast to all user resources. |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
162 | if session.full_jid then -- FIXME should this be just for available resources? Do we need to check subscription? |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
163 | stanza.attr.to = session.full_jid; -- reset at the end of function |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
164 | session.send(stanza); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
165 | end |
106
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
166 | end |
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
167 | end |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
168 | elseif stanza.name == "message" then -- select a resource to recieve message |
200
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
169 | local priority = 0; |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
170 | local recipients = {}; |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
171 | for _, session in pairs(user.sessions) do -- find resource with greatest priority |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
172 | local p = session.priority; |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
173 | if p > priority then |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
174 | priority = p; |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
175 | recipients = {session}; |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
176 | elseif p == priority then |
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
177 | t_insert(recipients, session); |
106
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
178 | end |
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
179 | end |
249
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
180 | local count = 0; |
237 | 181 | for _, session in pairs(recipients) do |
200
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
182 | session.send(stanza); |
249
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
183 | count = count + 1; |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
184 | end |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
185 | if count == 0 then |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
186 | offlinemanager.store(node, host, stanza); |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
187 | -- TODO deal with storage errors |
200
5e8b3cce798f
Priority based message routing, etc
Waqas Hussain <waqas20@gmail.com>
parents:
199
diff
changeset
|
188 | end |
106
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
189 | else |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
190 | -- TODO send IQ error |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
191 | end |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
192 | else |
121
74e5919e4737
Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents:
119
diff
changeset
|
193 | -- User + resource is online... |
170 | 194 | 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
|
195 | res.send(stanza); -- Yay \o/ |
106
f2a3d204a76a
Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents:
105
diff
changeset
|
196 | end |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
197 | else |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
198 | -- user not online |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
199 | if user_exists(node, host) then |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
200 | if stanza.name == "presence" then |
175
5f71d290bb44
Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
201 | if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then |
321
31fe15ce6fac
Moved presence subscription code from stanza_router to presencemanager
Waqas Hussain <waqas20@gmail.com>
parents:
274
diff
changeset
|
202 | handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
203 | else |
175
5f71d290bb44
Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
204 | -- TODO send unavailable presence or unsubscribed |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
205 | end |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
206 | elseif stanza.name == "message" then |
249
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
207 | if stanza.attr.type == "chat" or stanza.attr.type == "normal" or not stanza.attr.type then |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
208 | offlinemanager.store(node, host, stanza); |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
209 | -- FIXME don't store messages with only chat state notifications |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
210 | end |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
211 | -- TODO allow configuration of offline storage |
1fc47cf5d144
Added basic offline message support
Waqas Hussain <waqas20@gmail.com>
parents:
237
diff
changeset
|
212 | -- TODO send error if not storing offline |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
213 | elseif stanza.name == "iq" then |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
214 | -- TODO send IQ error |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
215 | end |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
216 | else -- user does not exist |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
217 | -- 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
|
218 | if stanza.name == "presence" then |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
219 | 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
|
220 | 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
|
221 | end |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
222 | -- else ignore |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
223 | else |
186
bfa8a30ea488
sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents:
178
diff
changeset
|
224 | 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
|
225 | end |
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
226 | end |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
227 | end |
148 | 228 | elseif origin.type == "c2s" then |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
229 | -- Remote host |
170 | 230 | local xmlns = stanza.attr.xmlns; |
148 | 231 | --stanza.attr.xmlns = "jabber:server"; |
232 | stanza.attr.xmlns = nil; | |
146 | 233 | log("debug", "sending s2s stanza: %s", tostring(stanza)); |
170 | 234 | send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors |
235 | stanza.attr.xmlns = xmlns; -- reset | |
210
e679487e2fa4
Part 2 of internal components. Should have mentioned that the previous commit was from waqas, this one from me.
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
236 | elseif origin.type == "component" or origin.type == "local" then |
e679487e2fa4
Part 2 of internal components. Should have mentioned that the previous commit was from waqas, this one from me.
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
237 | -- Route via s2s for components and modules |
e679487e2fa4
Part 2 of internal components. Should have mentioned that the previous commit was from waqas, this one from me.
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
238 | log("debug", "Routing outgoing stanza for %s to %s", origin.host, host); |
e679487e2fa4
Part 2 of internal components. Should have mentioned that the previous commit was from waqas, this one from me.
Matthew Wild <mwild1@gmail.com>
parents:
209
diff
changeset
|
239 | send_s2s(origin.host, host, stanza); |
148 | 240 | else |
241 | 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
|
242 | end |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
243 | stanza.attr.to = to; -- reset |
30 | 244 | end |