core/stanza_router.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 12976 ead41e25ebc0
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5012
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
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12685
diff changeset
     9
local log = require "prosody.util.logger".init("stanzarouter")
30
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;
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12685
diff changeset
    13
local st = require "prosody.util.stanza";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12685
diff changeset
    14
local jid_split = require "prosody.util.jid".split;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12685
diff changeset
    15
local jid_host = require "prosody.util.jid".host;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12685
diff changeset
    16
local jid_prepped_split = require "prosody.util.jid".prepped_split;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
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
    18
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
    19
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
    20
5012
d59c842fe38e stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents: 4919
diff changeset
    21
local core_post_stanza, core_process_stanza, core_route_stanza;
d59c842fe38e stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents: 4919
diff changeset
    22
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    23
local valid_stanzas = { message = true, presence = true, iq = true };
6666
d3023dd07cb6 portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6562
diff changeset
    24
local function handle_unhandled_stanza(host, origin, stanza) --luacheck: ignore 212/host
3539
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    25
	local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns or "jabber:client", origin.type;
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    26
	if xmlns == "jabber:client" and valid_stanzas[name] then
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    27
		-- A normal stanza
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    28
		local st_type = stanza.attr.type;
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    29
		if st_type == "error" or (name == "iq" and st_type == "result") then
7651
d91ef1e6afc2 stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents: 7451
diff changeset
    30
			if st_type == "error" then
10533
854586ac7c96 core.stanza_router: Silence warning about unused err_message [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10532
diff changeset
    31
				local err_type, err_condition, err_message = stanza:get_error(); -- luacheck: ignore 211/err_message
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
    32
				log("debug", "Discarding unhandled error %s (%s, %s) from %s: %s",
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
    33
					name, err_type, err_condition or "unknown condition", origin_type, stanza:top_tag());
7651
d91ef1e6afc2 stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents: 7451
diff changeset
    34
			else
d91ef1e6afc2 stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents: 7451
diff changeset
    35
				log("debug", "Discarding %s from %s of type: %s", name, origin_type, st_type or '<nil>');
d91ef1e6afc2 stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents: 7451
diff changeset
    36
			end
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    37
			return;
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    38
		end
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    39
		if name == "iq" and (st_type == "get" or st_type == "set") and stanza.tags[1] then
3539
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    40
			xmlns = stanza.tags[1].attr.xmlns or "jabber:client";
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    41
		end
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    42
		log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin_type, name, xmlns);
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    43
		if origin.send then
3539
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    44
			origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    45
		end
6404
166d1bd8fc38 core.stanza_router, mod_s2s: Move handling of S2S features to mod_s2s from stanza_router
Kim Alvefur <zash@zash.se>
parents: 6403
diff changeset
    46
	else
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
    47
		log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s",
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
    48
			origin_type, name, xmlns, tostring(stanza)); -- we didn't handle it
3539
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    49
		origin:close("unsupported-stanza-type");
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    50
	end
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    51
end
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    52
4130
c3508071af47 stanza_router: Return a <bad-request/> error on invalid IQ type.
Waqas Hussain <waqas20@gmail.com>
parents: 3586
diff changeset
    53
local iq_types = { set=true, get=true, result=true, error=true };
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
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
    55
	(origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag())
212
9d6da9ed9063 Internal component support
Waqas Hussain <waqas20@gmail.com>
parents: 207
diff changeset
    56
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    57
	if origin.type == "c2s" and not stanza.attr.xmlns then
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    58
		local name, st_type = stanza.name, stanza.attr.type;
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    59
		if st_type == "error" and #stanza.tags == 0 then
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    60
			return handle_unhandled_stanza(origin.host, origin, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
    61
		end
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    62
		if name == "iq" then
7743
26a7186a40c6 core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents: 7742
diff changeset
    63
			if not iq_types[st_type] then
26a7186a40c6 core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents: 7742
diff changeset
    64
				origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid IQ type"));
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    65
				return;
7742
0356216c474c core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents: 7651
diff changeset
    66
			elseif not stanza.attr.id then
0356216c474c core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents: 7651
diff changeset
    67
				origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing required 'id' attribute"));
0356216c474c core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents: 7651
diff changeset
    68
				return;
7743
26a7186a40c6 core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents: 7742
diff changeset
    69
			elseif (st_type == "set" or st_type == "get") and (#stanza.tags ~= 1) then
7805
802dc0691177 stanza_router: Fix typo
Kim Alvefur <zash@zash.se>
parents: 7788
diff changeset
    70
				origin.send(st.error_reply(stanza, "modify", "bad-request", "Incorrect number of children for IQ stanza"));
7743
26a7186a40c6 core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents: 7742
diff changeset
    71
				return;
6402
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    72
			end
e3de64f7c44d core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents: 5012
diff changeset
    73
		end
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
    74
1367
e4d660e58dfc stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents: 1358
diff changeset
    75
		-- 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: 207
diff changeset
    76
		stanza.attr.from = origin.full_jid;
9d6da9ed9063 Internal component support
Waqas Hussain <waqas20@gmail.com>
parents: 207
diff changeset
    77
	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
    78
	local to, xmlns = stanza.attr.to, stanza.attr.xmlns;
212
9d6da9ed9063 Internal component support
Waqas Hussain <waqas20@gmail.com>
parents: 207
diff changeset
    79
	local from = stanza.attr.from;
718
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    80
	local node, host, resource;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    81
	local from_node, from_host, from_resource;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    82
	local to_bare, from_bare;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    83
	if to then
1370
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    84
		if full_sessions[to] or bare_sessions[to] or hosts[to] then
10532
48300484a124 core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10366
diff changeset
    85
			host = jid_host(to);
1370
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    86
		else
10366
c05444119e9e Backed out changeset 64ddcbc9a328 as it would prevent communicating with valid remote JIDs that aren't valid under STRINGPREP / Unicode 3.2
Kim Alvefur <zash@zash.se>
parents: 10364
diff changeset
    87
			node, host, resource = jid_prepped_split(to);
1370
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    88
			if not host then
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    89
				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
    90
				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
    91
					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
    92
				end
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    93
				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
    94
			end
1370
3a467e6885f0 stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1369
diff changeset
    95
			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
    96
			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
    97
			stanza.attr.to = to;
718
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    98
		end
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
    99
	end
1369
633e032a3b4b stanza_router: Skip prepping 'from' on c2s origins - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1368
diff changeset
   100
	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
   101
		-- 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
   102
		from_node, from_host, from_resource = jid_prepped_split(from);
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
   103
		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
   104
			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
   105
			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
   106
				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
   107
			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
   108
			return;
718
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
   109
		end
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
   110
		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
   111
		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
   112
		stanza.attr.from = from;
aa78dfb26593 Stringprep!
Waqas Hussain <waqas20@gmail.com>
parents: 715
diff changeset
   113
	end
212
9d6da9ed9063 Internal component support
Waqas Hussain <waqas20@gmail.com>
parents: 207
diff changeset
   114
10249
88efdfb0a126 core.stanza_router: Handle s2s in more direction-agnostic way
Kim Alvefur <zash@zash.se>
parents: 10108
diff changeset
   115
	if (origin.type == "s2sin" or origin.type == "s2sout" or origin.type == "c2s" or origin.type == "component") and xmlns == nil then
88efdfb0a126 core.stanza_router: Handle s2s in more direction-agnostic way
Kim Alvefur <zash@zash.se>
parents: 10108
diff changeset
   116
		if (origin.type == "s2sin" or origin.type == "s2sout") 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
   117
			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
   118
			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
   119
				log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host);
4863
8974a9b7363f stanza_router: Remove FIXME comment and close stream with not-authorized for s2s stanzas from unauthed domains
Matthew Wild <mwild1@gmail.com>
parents: 4862
diff changeset
   120
				origin:close("not-authorized");
8974a9b7363f stanza_router: Remove FIXME comment and close stream with not-authorized for s2s stanzas from unauthed domains
Matthew Wild <mwild1@gmail.com>
parents: 4862
diff changeset
   121
				return;
4867
b4219d987d05 stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents: 4864
diff changeset
   122
			elseif not hosts[host] then
b4219d987d05 stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents: 4864
diff changeset
   123
				log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, host);
4862
d1cfdb137b03 stanza_router: Catch s2s stanzas to hosts we don't serve earlier, and close with host-unknown (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 4817
diff changeset
   124
				origin:close("host-unknown");
d1cfdb137b03 stanza_router: Catch s2s stanzas to hosts we don't serve earlier, and close with host-unknown (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 4817
diff changeset
   125
				return;
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
   126
			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
   127
		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
   128
		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
   129
	else
12685
16ea01745dbe mod_s2s: Simplify conditionals since all sessions should have .host now
Kim Alvefur <zash@zash.se>
parents: 11633
diff changeset
   130
		local h = hosts[stanza.attr.to or origin.host];
1254
c199be608546 stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1244
diff changeset
   131
		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
   132
			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
   133
			if xmlns == nil then
8350
c72db8047440 core.stanza_router: Verify that xmlns exists for firing stanza/iq/xmlns/name events (fixes #1022) (thanks SamWhited)
Kim Alvefur <zash@zash.se>
parents: 7950
diff changeset
   134
				if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get")
c72db8047440 core.stanza_router: Verify that xmlns exists for firing stanza/iq/xmlns/name events (fixes #1022) (thanks SamWhited)
Kim Alvefur <zash@zash.se>
parents: 7950
diff changeset
   135
					and stanza.tags[1] and stanza.tags[1].attr.xmlns then
1254
c199be608546 stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1244
diff changeset
   136
					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
   137
				else
c199be608546 stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1244
diff changeset
   138
					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
   139
				end
c199be608546 stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1244
diff changeset
   140
			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
   141
				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
   142
			end
1262
0d94c57555d9 Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents: 1256
diff changeset
   143
			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
   144
		end
1887
e3c790060c03 stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents: 1609
diff changeset
   145
		if host and not hosts[host] then host = nil; end -- COMPAT: workaround for a Pidgin bug which sets 'to' to the SRV result
12685
16ea01745dbe mod_s2s: Simplify conditionals since all sessions should have .host now
Kim Alvefur <zash@zash.se>
parents: 11633
diff changeset
   146
		handle_unhandled_stanza(host or origin.host, origin, stanza);
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
   147
	end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
   148
end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
   149
2842
298d0ed3f40d stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents: 2833
diff changeset
   150
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
   151
	local to = stanza.attr.to;
490ff24d0ac5 stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1169
diff changeset
   152
	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
   153
	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
   154
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
   155
	local to_type, to_self;
1228
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   156
	if node then
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   157
		if resource then
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   158
			to_type = '/full';
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   159
		else
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   160
			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
   161
			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
   162
				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
   163
				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
   164
			end
1228
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   165
		end
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   166
	else
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   167
		if host then
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   168
			to_type = '/host';
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   169
		else
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   170
			to_type = '/bare';
2685
f9bc95aadc26 stanza_router: Make sure /self events are fired when the 'to' attribute is missing.
Waqas Hussain <waqas20@gmail.com>
parents: 2624
diff changeset
   171
			to_self = true;
1228
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   172
		end
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   173
	end
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   174
10643
08e3063eb1ac stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents: 10533
diff changeset
   175
	local event_data = {origin=origin, stanza=stanza, to_self=to_self};
08e3063eb1ac stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents: 10533
diff changeset
   176
10649
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   177
	if preevents then -- c2s connection
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   178
		local result = hosts[origin.host].events.fire_event("pre-stanza", event_data);
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   179
		if result ~= nil then
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   180
			log("debug", "Stanza rejected by pre-stanza handler: %s", event_data.reason or "unknown reason");
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   181
			return;
067ada779ea5 stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents: 10643
diff changeset
   182
		end
10643
08e3063eb1ac stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents: 10533
diff changeset
   183
1262
0d94c57555d9 Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents: 1256
diff changeset
   184
		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
   185
	end
853d3d76ba94 stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents: 1212
diff changeset
   186
	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
   187
	if h then
1419
1ac8bcc63a9d stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents: 1413
diff changeset
   188
		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
   189
		if to_self and h.events.fire_event(stanza.name..'/self', event_data) then return; end -- do processing
3539
8bbd965267b2 modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
   190
		handle_unhandled_stanza(h.host, origin, stanza);
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
   191
	else
1172
490ff24d0ac5 stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1169
diff changeset
   192
		core_route_stanza(origin, stanza);
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
   193
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   194
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   195
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   196
function core_route_stanza(origin, stanza)
11633
e6e56e2dd996 core.stanza_router: Rename variable to be more specific
Kim Alvefur <zash@zash.se>
parents: 10649
diff changeset
   197
	local to_host = jid_host(stanza.attr.to);
10532
48300484a124 core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10366
diff changeset
   198
	local from_host = jid_host(stanza.attr.from);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
   199
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
   200
	-- 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
   201
	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
   202
	if not origin then return false; end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5012
diff changeset
   203
11633
e6e56e2dd996 core.stanza_router: Rename variable to be more specific
Kim Alvefur <zash@zash.se>
parents: 10649
diff changeset
   204
	if hosts[to_host] then
1406
83c6fb3d9e73 stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents: 1370
diff changeset
   205
		-- 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
   206
		core_post_stanza(origin, stanza);
4554
6ceabde7af91 stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents: 4553
diff changeset
   207
	else
4817
9cc1d3e49f19 stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents: 4816
diff changeset
   208
		local host_session = hosts[from_host];
9cc1d3e49f19 stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents: 4816
diff changeset
   209
		if not host_session then
10108
3965081809ba core.stanza_router: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9530
diff changeset
   210
			log("error", "No hosts[from_host] (please report): %s", stanza);
4554
6ceabde7af91 stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents: 4553
diff changeset
   211
		else
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
   212
			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
   213
			stanza.attr.xmlns = nil;
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
   214
			local routed = host_session.events.fire_event("route/remote", {
11633
e6e56e2dd996 core.stanza_router: Rename variable to be more specific
Kim Alvefur <zash@zash.se>
parents: 10649
diff changeset
   215
				origin = origin, stanza = stanza, from_host = from_host, to_host = to_host });
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
   216
			stanza.attr.xmlns = xmlns; -- reset
4816
897ec7dcdaa6 stanza_router: Allow route/remote handlers to return false to block a stanza
Matthew Wild <mwild1@gmail.com>
parents: 4554
diff changeset
   217
			if not routed then
9070
89e1bf37ff64 core.stanza_router: Reduce logging of common routing (#776)
Kim Alvefur <zash@zash.se>
parents: 8350
diff changeset
   218
				log("debug", "Could not route stanza to remote");
4919
6cbc35cdefaf stanza_router: Also don't bounce <iq type='result'>
Matthew Wild <mwild1@gmail.com>
parents: 4918
diff changeset
   219
				if stanza.attr.type == "error" or (stanza.name == "iq" and stanza.attr.type == "result") then return; end
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
   220
				core_route_stanza(host_session, st.error_reply(stanza, "cancel", "not-allowed",
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7805
diff changeset
   221
					"Communication with remote domains is not enabled"));
4554
6ceabde7af91 stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents: 4553
diff changeset
   222
			end
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
   223
		end
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
   224
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   225
end
6666
d3023dd07cb6 portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6562
diff changeset
   226
d3023dd07cb6 portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6562
diff changeset
   227
--luacheck: ignore 122/prosody
4877
6f5b53cb3565 prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents: 4867
diff changeset
   228
prosody.core_process_stanza = core_process_stanza;
6f5b53cb3565 prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents: 4867
diff changeset
   229
prosody.core_post_stanza = core_post_stanza;
6f5b53cb3565 prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents: 4867
diff changeset
   230
prosody.core_route_stanza = core_route_stanza;