core/stanza_router.lua

Wed, 07 Apr 2010 21:00:20 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 07 Apr 2010 21:00:20 +0100
changeset 2964
49b5c87d2fa0
parent 2951
294c359a05f5
child 3539
8bbd965267b2
permissions
-rw-r--r--

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
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 726
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 726
diff changeset
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
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local log = require "util.logger".init("stanzarouter")
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
e64c8a44060f Fix s2s once and for all
Matthew Wild <mwild1@gmail.com>
parents: 190
diff changeset
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
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
18 local jid_prepped_split = require "util.jid".prepped_split;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
937448005121 Added to a comment
Waqas Hussain <waqas20@gmail.com>
parents: 72
diff changeset
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
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
52 local node, host, resource;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
53 local from_node, from_host, from_resource;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
54 local to_bare, from_bare;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
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
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
70 end
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
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
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
74 from_node, from_host, from_resource = jid_prepped_split(from);
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
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
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
81 end
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
82 from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
83 if from_resource then from = from_bare.."/"..from_resource; else from = from_bare; end
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
84 stanza.attr.from = from;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
85 end
212
9d6da9ed9063 Internal component support
Waqas Hussain <waqas20@gmail.com>
parents: 206
diff changeset
86
213
181f5cc6215b Commented a buggy check
Waqas Hussain <waqas20@gmail.com>
parents: 212
diff changeset
87 --[[if to and not(hosts[to]) and not(hosts[to_bare]) and (hosts[host] and hosts[host].type ~= "local") then -- not for us?
181f5cc6215b Commented a buggy check
Waqas Hussain <waqas20@gmail.com>
parents: 212
diff changeset
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
181f5cc6215b Commented a buggy check
Waqas Hussain <waqas20@gmail.com>
parents: 212
diff changeset
90 end]] -- FIXME
206
90c387884234 A little whitespace fix
Waqas Hussain <waqas20@gmail.com>
parents: 200
diff changeset
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
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
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
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
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
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
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
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 end

mercurial