Wed, 07 Apr 2010 21:00:20 +0100
util.timer: When using libevent hold onto the event handle to stop it being collected (and the timer stopping). Fixes BOSH ghosts, thanks Flo, niekie, waqas.
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1521
diff
changeset
|
1 | -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2876
diff
changeset
|
2 | -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2876
diff
changeset
|
3 | -- Copyright (C) 2008-2010 Waqas Hussain |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
468
diff
changeset
|
4 | -- |
758 | 5 | -- This project is MIT/X11 licensed. Please see the |
6 | -- COPYING file in the source package for more information. | |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
468
diff
changeset
|
7 | -- |
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
468
diff
changeset
|
8 | |
30 | 9 | local log = require "util.logger".init("stanzarouter") |
10 | ||
1971
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
11 | local hosts = _G.prosody.hosts; |
1413
b7e17efe433e
stanza_router: Remove unused variables and code
Waqas Hussain <waqas20@gmail.com>
parents:
1412
diff
changeset
|
12 | local tostring = tostring; |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
13 | 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
|
14 | local send_s2s = require "core.s2smanager".send_to_host; |
191 | 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; |
105
b099f0f80775
Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents:
83
diff
changeset
|
17 | local jid_split = require "util.jid".split; |
718 | 18 | local jid_prepped_split = require "util.jid".prepped_split; |
30 | 19 | |
1971
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
20 | local full_sessions = _G.prosody.full_sessions; |
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
21 | local bare_sessions = _G.prosody.bare_sessions; |
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
22 | |
30 | 23 | function core_process_stanza(origin, stanza) |
726
68a776711ba9
stanza_router: That'll teach me to not commit at this time of night. Or not.
Matthew Wild <mwild1@gmail.com>
parents:
725
diff
changeset
|
24 | (origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag()) |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
25 | |
73 | 26 | -- TODO verify validity of stanza (as well as JID validity) |
1152
4d95e8078405
stanza_router: Fixed an invalid stanza check
Waqas Hussain <waqas20@gmail.com>
parents:
1149
diff
changeset
|
27 | if stanza.attr.type == "error" and #stanza.tags == 0 then return; end -- TODO invalid stanza, log |
924
db022135aed4
Fixed: stanza_router: Respond with correct stanza error on malformed stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
898
diff
changeset
|
28 | if stanza.name == "iq" then |
1985
9b352c8a32e6
stanza_router: Added a compatibility workaround for missing 'id' attribute in <iq/> elements.
Waqas Hussain <waqas20@gmail.com>
parents:
1971
diff
changeset
|
29 | if not stanza.attr.id then stanza.attr.id = ""; end -- COMPAT Jabiru doesn't send the id attribute on roster requests |
9b352c8a32e6
stanza_router: Added a compatibility workaround for missing 'id' attribute in <iq/> elements.
Waqas Hussain <waqas20@gmail.com>
parents:
1971
diff
changeset
|
30 | if (stanza.attr.type == "set" or stanza.attr.type == "get") and (#stanza.tags ~= 1) then |
924
db022135aed4
Fixed: stanza_router: Respond with correct stanza error on malformed stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
898
diff
changeset
|
31 | origin.send(st.error_reply(stanza, "modify", "bad-request")); |
db022135aed4
Fixed: stanza_router: Respond with correct stanza error on malformed stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
898
diff
changeset
|
32 | return; |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
33 | 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
|
34 | end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
35 | |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
36 | if origin.type == "c2s" and not stanza.attr.xmlns then |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
37 | if not origin.full_jid |
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
38 | and not(stanza.name == "iq" and stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "bind" |
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
39 | and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then |
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
40 | -- authenticated client isn't bound and current stanza is not a bind request |
2876
fa84451e9b35
stanza_router: Don't send error replies for stanzas of type 'error' and 'result' on unbound authenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents:
2875
diff
changeset
|
41 | if stanza.attr.type ~= "result" and stanza.attr.type ~= "error" then |
fa84451e9b35
stanza_router: Don't send error replies for stanzas of type 'error' and 'result' on unbound authenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents:
2875
diff
changeset
|
42 | origin.send(st.error_reply(stanza, "auth", "not-authorized")); -- FIXME maybe allow stanzas to account or server |
fa84451e9b35
stanza_router: Don't send error replies for stanzas of type 'error' and 'result' on unbound authenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents:
2875
diff
changeset
|
43 | end |
1368
0cb70958b8fb
stanza_router: Fixed a corner case where processing could continue after an error reply
Waqas Hussain <waqas20@gmail.com>
parents:
1367
diff
changeset
|
44 | return; |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
45 | end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
46 | |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
47 | -- TODO also, stanzas should be returned to their original state before the function ends |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
48 | stanza.attr.from = origin.full_jid; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
49 | end |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
50 | local to, xmlns = stanza.attr.to, stanza.attr.xmlns; |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
51 | local from = stanza.attr.from; |
718 | 52 | local node, host, resource; |
53 | local from_node, from_host, from_resource; | |
54 | local to_bare, from_bare; | |
55 | if to then | |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
56 | if full_sessions[to] or bare_sessions[to] or hosts[to] then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
57 | node, host = jid_split(to); -- TODO only the host is needed, optimize |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
58 | else |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
59 | node, host, resource = jid_prepped_split(to); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
60 | if not host then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
61 | log("warn", "Received stanza with invalid destination JID: %s", to); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
62 | if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
63 | origin.send(st.error_reply(stanza, "modify", "jid-malformed", "The destination address is invalid: "..to)); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
64 | end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
65 | return; |
1270
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
66 | end |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
67 | to_bare = node and (node.."@"..host) or host; -- bare JID |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
68 | if resource then to = to_bare.."/"..resource; else to = to_bare; end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
69 | stanza.attr.to = to; |
718 | 70 | end |
71 | end | |
1369
633e032a3b4b
stanza_router: Skip prepping 'from' on c2s origins - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1368
diff
changeset
|
72 | if from and not origin.full_jid then |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
73 | -- We only stamp the 'from' on c2s stanzas, so we still need to check validity |
718 | 74 | from_node, from_host, from_resource = jid_prepped_split(from); |
75 | if not from_host then | |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
76 | log("warn", "Received stanza with invalid source JID: %s", from); |
1270
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
77 | if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
78 | origin.send(st.error_reply(stanza, "modify", "jid-malformed", "The source address is invalid: "..from)); |
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
79 | end |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
80 | return; |
718 | 81 | end |
82 | from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | |
83 | if from_resource then from = from_bare.."/"..from_resource; else from = from_bare; end | |
84 | stanza.attr.from = from; | |
85 | end | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
86 | |
213 | 87 | --[[if to and not(hosts[to]) and not(hosts[to_bare]) and (hosts[host] and hosts[host].type ~= "local") then -- not for us? |
88 | log("warn", "stanza recieved for a non-local server"); | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
206
diff
changeset
|
89 | return; -- FIXME what should we do here? |
213 | 90 | end]] -- FIXME |
206 | 91 | |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
92 | if (origin.type == "s2sin" or origin.type == "c2s" or origin.type == "component") and xmlns == nil then |
631
6957fe7b0313
Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents:
621
diff
changeset
|
93 | if origin.type == "s2sin" and not origin.dummy then |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
94 | local host_status = origin.hosts[from_host]; |
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
95 | if not host_status or not host_status.authed then -- remote server trying to impersonate some other server? |
1179
503d68e7e18a
stanza_router: s/conn/stream/ in log message
Matthew Wild <mwild1@gmail.com>
parents:
1178
diff
changeset
|
96 | log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host); |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
97 | return; -- FIXME what should we do here? does this work with subdomains? |
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
98 | end |
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
99 | end |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
100 | core_post_stanza(origin, stanza, origin.full_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
|
101 | else |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
102 | local h = hosts[stanza.attr.to or origin.host or origin.to_host]; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
103 | if h then |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
104 | local event; |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
105 | if xmlns == nil then |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
106 | if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get") then |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
107 | event = "stanza/iq/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
108 | else |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
109 | event = "stanza/"..stanza.name; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
110 | end |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
111 | else |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
112 | event = "stanza/"..xmlns..":"..stanza.name; |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
113 | end |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
114 | if h.events.fire_event(event, {origin = origin, stanza = stanza}) then return; end |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
115 | end |
1887
e3c790060c03
stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents:
1609
diff
changeset
|
116 | if host and not hosts[host] then host = nil; end -- COMPAT: workaround for a Pidgin bug which sets 'to' to the SRV result |
1167
5620ea24be94
stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1165
diff
changeset
|
117 | modules_handle_stanza(host or origin.host or origin.to_host, origin, stanza); |
119
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
118 | end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
119 | end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
120 | |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
121 | function core_post_stanza(origin, stanza, preevents) |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
122 | local to = stanza.attr.to; |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
123 | local node, host, resource = jid_split(to); |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
124 | local to_bare = node and (node.."@"..host) or host; -- bare JID |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
125 | |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
126 | local to_type, to_self; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
127 | if node then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
128 | if resource then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
129 | to_type = '/full'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
130 | else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
131 | to_type = '/bare'; |
1292
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
132 | if node == origin.username and host == origin.host then |
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
133 | stanza.attr.to = nil; |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
134 | to_self = true; |
1292
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
135 | end |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
136 | end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
137 | else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
138 | if host then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
139 | to_type = '/host'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
140 | else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
141 | to_type = '/bare'; |
2687
f9bc95aadc26
stanza_router: Make sure /self events are fired when the 'to' attribute is missing.
Waqas Hussain <waqas20@gmail.com>
parents:
2624
diff
changeset
|
142 | to_self = true; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
143 | end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
144 | end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
145 | |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
146 | local event_data = {origin=origin, stanza=stanza}; |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
147 | if preevents then -- c2s connection |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
148 | if hosts[origin.host].events.fire_event('pre-'..stanza.name..to_type, event_data) then return; end -- do preprocessing |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
149 | end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
150 | local h = hosts[to_bare] or hosts[host or origin.host]; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
151 | if h then |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
152 | if h.events.fire_event(stanza.name..to_type, event_data) then return; end -- do processing |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
153 | if to_self and h.events.fire_event(stanza.name..'/self', event_data) then return; end -- do processing |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
154 | |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
155 | if h.type == "component" then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
156 | component_handle_stanza(origin, stanza); |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
157 | return; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
158 | end |
1609
95d3bcd82334
Fixed: Possible duplicate error replies for unhandled stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
159 | modules_handle_stanza(h.host, origin, stanza); |
145 | 160 | else |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
161 | core_route_stanza(origin, stanza); |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
162 | end |
30 | 163 | end |
164 | ||
165 | function core_route_stanza(origin, stanza) | |
1411
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
166 | local node, host, resource = jid_split(stanza.attr.to); |
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
167 | local from_node, from_host, from_resource = jid_split(stanza.attr.from); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
168 | |
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
|
169 | -- 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
|
170 | 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
|
171 | 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
|
172 | |
1412
6cfcab7cd4e7
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1411
diff
changeset
|
173 | if hosts[host] then |
1406
83c6fb3d9e73
stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1370
diff
changeset
|
174 | -- old stanza routing code removed |
1408
9b745496b953
stanza_router: Call core_post_stanza from core_route_stanza in place of old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1407
diff
changeset
|
175 | core_post_stanza(origin, stanza); |
148 | 176 | elseif origin.type == "c2s" then |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
177 | -- Remote host |
1521
cee81a5ae949
stanza_router: Catch and log an error case which I don't think should happen (but sometimes seems to)
Matthew Wild <mwild1@gmail.com>
parents:
1466
diff
changeset
|
178 | if not hosts[from_host] then |
cee81a5ae949
stanza_router: Catch and log an error case which I don't think should happen (but sometimes seems to)
Matthew Wild <mwild1@gmail.com>
parents:
1466
diff
changeset
|
179 | log("error", "No hosts[from_host] (please report): %s", tostring(stanza)); |
cee81a5ae949
stanza_router: Catch and log an error case which I don't think should happen (but sometimes seems to)
Matthew Wild <mwild1@gmail.com>
parents:
1466
diff
changeset
|
180 | end |
cee81a5ae949
stanza_router: Catch and log an error case which I don't think should happen (but sometimes seems to)
Matthew Wild <mwild1@gmail.com>
parents:
1466
diff
changeset
|
181 | if (not hosts[from_host]) or (not hosts[from_host].disallow_s2s) then |
1466
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
182 | local xmlns = stanza.attr.xmlns; |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
183 | --stanza.attr.xmlns = "jabber:server"; |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
184 | stanza.attr.xmlns = nil; |
2132
20a52cfda988
stanza_router: Don't log full stanzas destined for s2s
Matthew Wild <mwild1@gmail.com>
parents:
1985
diff
changeset
|
185 | log("debug", "sending s2s stanza: %s", tostring(stanza.top_tag and stanza:top_tag()) or stanza); |
1466
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
186 | send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
187 | stanza.attr.xmlns = xmlns; -- reset |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
188 | else |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
189 | core_route_stanza(hosts[from_host], st.error_reply(stanza, "cancel", "not-allowed", "Communication with remote servers is not allowed")); |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
190 | end |
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
|
191 | 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
|
192 | -- Route via s2s for components and modules |
1348
ffa70c0df850
stanza_router: Use stanza.attr.from's host instead of origin.host when routing stanzas to remote hosts (fixes problem with sending from node@host components)
Waqas Hussain <waqas20@gmail.com>
parents:
1307
diff
changeset
|
193 | log("debug", "Routing outgoing stanza for %s to %s", from_host, host); |
ffa70c0df850
stanza_router: Use stanza.attr.from's host instead of origin.host when routing stanzas to remote hosts (fixes problem with sending from node@host components)
Waqas Hussain <waqas20@gmail.com>
parents:
1307
diff
changeset
|
194 | send_s2s(from_host, host, stanza); |
148 | 195 | else |
2833
a82bd02d5918
stanza_router: Log the name of unhandled stanzas (thanks bear)
Matthew Wild <mwild1@gmail.com>
parents:
1985
diff
changeset
|
196 | log("warn", "received %s stanza from unhandled connection type: %s", tostring(stanza.name), tostring(origin.type)); |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
197 | end |
30 | 198 | end |