core/sessionmanager.lua
author Matthew Wild <mwild1@gmail.com>
Mon, 20 Feb 2023 18:10:15 +0000
branch0.12
changeset 12898 0598d822614f
parent 12883 09a53ed8f4d5
child 12884 b56a2731bf00
permissions -rw-r--r--
mod_websocket: Fire pre-session-close event (fixes #1800) This event was added in a7c183bb4e64 and is required to make mod_smacks know that a session was intentionally closed and shouldn't be hibernated (see fcea4d9e7502). Because this was missing from mod_websocket's session.close(), mod_smacks would always attempt to hibernate websocket sessions even if they closed cleanly. That mod_websocket has its own copy of session.close() is something to fix another day (probably not in the stable branch). So for now this commit makes the minimal change to get things working again. Thanks to Damian and the Jitsi team for reporting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1479
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2858
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2858
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 694
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 694
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 429
diff changeset
     7
--
7952
8acc35b5355a core: Allow select core modules to mutate some globals (needs luacheck 1.19)
Kim Alvefur <zash@zash.se>
parents: 7950
diff changeset
     8
-- luacheck: globals prosody.full_sessions prosody.bare_sessions
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 429
diff changeset
     9
4981
95c18750b89e sessionmanager: Clean up some unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 4961
diff changeset
    10
local tostring, setmetatable = tostring, setmetatable;
95c18750b89e sessionmanager: Clean up some unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 4961
diff changeset
    11
local pairs, next= pairs, next;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    12
8720
9ddd0fbbe53a core: Use prosody.hosts instead of _G.hosts for consistency
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    13
local hosts = prosody.hosts;
6554
784fa05cf594 sessionmanager: Access bare_session and full_sessions through 'prosody'
Matthew Wild <mwild1@gmail.com>
parents: 6405
diff changeset
    14
local full_sessions = prosody.full_sessions;
784fa05cf594 sessionmanager: Access bare_session and full_sessions through 'prosody'
Matthew Wild <mwild1@gmail.com>
parents: 6405
diff changeset
    15
local bare_sessions = prosody.bare_sessions;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    16
1684
645e18990211 core.sessionmanager, xmppclient_listener: Move responsibility for setting session.log to the former from the latter, much more sensible
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
    17
local logger = require "util.logger";
645e18990211 core.sessionmanager, xmppclient_listener: Move responsibility for setting session.log to the former from the latter, much more sensible
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
    18
local log = logger.init("sessionmanager");
101
c690fa382743 Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents: 77
diff changeset
    19
local rm_load_roster = require "core.rostermanager".load_roster;
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
    20
local config_get = require "core.configmanager".get;
2832
8c754c61c72e sessionmanager: Added resource prepping, and invalid resource checking to the bind_resource function.
Waqas Hussain <waqas20@gmail.com>
parents: 2816
diff changeset
    21
local resourceprep = require "util.encodings".stringprep.resourceprep;
3236
4727b2b0e069 sessionmanager: Moved nodeprep to sessionmanager.make_authenticated.
Waqas Hussain <waqas20@gmail.com>
parents: 3091
diff changeset
    22
local nodeprep = require "util.encodings".stringprep.nodeprep;
8875
4d7a822e837f sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents: 8720
diff changeset
    23
local generate_identifier = require "util.id".short;
9941
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    24
local sessionlib = require "util.session";
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 49
diff changeset
    25
3145
675241be2935 sessionmanager: Rename filters_initialize->initialize_filters
Matthew Wild <mwild1@gmail.com>
parents: 3143
diff changeset
    26
local initialize_filters = require "util.filters".initialize;
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 565
diff changeset
    27
local gettime = require "socket".gettime;
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 565
diff changeset
    28
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
    29
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8188
diff changeset
    30
-- luacheck: std none
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
    32
local function new_session(conn)
9941
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    33
	local session = sessionlib.new("c2s");
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    34
	sessionlib.set_id(session);
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    35
	sessionlib.set_logger(session);
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    36
	sessionlib.set_conn(session, conn);
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    37
6245ee9494c6 core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents: 9912
diff changeset
    38
	session.conntime = gettime();
3145
675241be2935 sessionmanager: Rename filters_initialize->initialize_filters
Matthew Wild <mwild1@gmail.com>
parents: 3143
diff changeset
    39
	local filter = initialize_filters(session);
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
	local w = conn.write;
9912
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    41
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    42
	function session.rawsend(t)
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    43
		t = filter("bytes/out", tostring(t));
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    44
		if t then
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    45
			local ret, err = w(conn, t);
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    46
			if not ret then
10109
63f87211fcdd core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10047
diff changeset
    47
				session.log("debug", "Error writing to connection: %s", err);
9912
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    48
				return false, err;
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    49
			end
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    50
		end
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    51
		return true;
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    52
	end
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    53
3143
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    54
	session.send = function (t)
9072
22e5f11c778a sessionmanager, mod_s2s: Bring debug line for outgoing stanzas in line with that for incoming
Kim Alvefur <zash@zash.se>
parents: 9069
diff changeset
    55
		session.log("debug", "Sending[%s]: %s", session.type, t.top_tag and t:top_tag() or t:match("^[^>]*>?"));
3143
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    56
		if t.name then
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    57
			t = filter("stanzas/out", t);
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    58
		end
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    59
		if t then
9912
7d12af856238 sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents: 9073
diff changeset
    60
			return session.rawsend(t);
3143
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    61
		end
7498
caee8a32983a sessionmanager: Make session.send() return true unless there really is an error [backported from 0.10]
Kim Alvefur <zash@zash.se>
parents: 6602
diff changeset
    62
		return true;
3143
887a6374f51c sessionmanager: Initialize new sessions for filtering, and add filters for outgoing bytes and stanzas
Matthew Wild <mwild1@gmail.com>
parents: 3091
diff changeset
    63
	end
2103
0e0bc74c64a0 sessionmanager: Use : syntax for calling connection methods
Matthew Wild <mwild1@gmail.com>
parents: 1929
diff changeset
    64
	session.ip = conn:ip();
5306
10bc0e2aa55e s2smanager: Generate session names used for logging the same way everywhere
Kim Alvefur <zash@zash.se>
parents: 5211
diff changeset
    65
	local conn_name = "c2s"..tostring(session):match("[a-f0-9]+$");
1684
645e18990211 core.sessionmanager, xmppclient_listener: Move responsibility for setting session.log to the former from the latter, much more sensible
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
    66
	session.log = logger.init(conn_name);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
    67
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
	return session;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    71
local resting_session = { -- Resting, not dead
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    72
		destroyed = true;
2915
f47bd0f7e2e6 sessionmanager, s2smanager: Add type of ?2s_destroyed to resting sessions (fixes a logging traceback, thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents: 2752
diff changeset
    73
		type = "c2s_destroyed";
2750
4a6f32e6a8e5 sessionmanager: Add close method to resting sessions
Matthew Wild <mwild1@gmail.com>
parents: 2747
diff changeset
    74
		close = function (session)
4a6f32e6a8e5 sessionmanager: Add close method to resting sessions
Matthew Wild <mwild1@gmail.com>
parents: 2747
diff changeset
    75
			session.log("debug", "Attempt to close already-closed session");
4a6f32e6a8e5 sessionmanager: Add close method to resting sessions
Matthew Wild <mwild1@gmail.com>
parents: 2747
diff changeset
    76
		end;
6666
d3023dd07cb6 portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6622
diff changeset
    77
		filter = function (type, data) return data; end; --luacheck: ignore 212/type
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    78
	}; resting_session.__index = resting_session;
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    79
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
    80
local function retire_session(session)
6666
d3023dd07cb6 portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6622
diff changeset
    81
	local log = session.log or log; --luacheck: ignore 431/log
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    82
	for k in pairs(session) do
5447
92b88476873a sessionmanager, s2smanager: Remove open_session tracing
Matthew Wild <mwild1@gmail.com>
parents: 5377
diff changeset
    83
		if k ~= "log" and k ~= "id" then
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    84
			session[k] = nil;
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    85
		end
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    86
	end
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    87
10109
63f87211fcdd core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10047
diff changeset
    88
	function session.send(data) log("debug", "Discarding data sent to resting session: %s", data); return false; end
11522
3f1a865e9419 core.sessionmanager: Add a dummy rawsend() method to resting sessions
Kim Alvefur <zash@zash.se>
parents: 10646
diff changeset
    89
	function session.rawsend(data) log("debug", "Discarding data sent to resting session: %s", data); return false; end
10109
63f87211fcdd core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10047
diff changeset
    90
	function session.data(data) log("debug", "Discarding data received from resting session: %s", data); end
7289
30b9433a9f3e Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 7287
diff changeset
    91
	session.thread = { run = function (_, data) return session.data(data) end };
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    92
	return setmetatable(session, resting_session);
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
    93
end
2857
6036c4b75235 sessionmanager, s2smanager: Give sessions dummy data handlers that log when data is received by a destroyed session
Matthew Wild <mwild1@gmail.com>
parents: 2832
diff changeset
    94
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
    95
local function destroy_session(session, err)
12881
f6cca7cbf3b2 core.sessionmanager: Skip log when (not) destroying destroyed sessions
Kim Alvefur <zash@zash.se>
parents: 11522
diff changeset
    96
	if session.destroyed then return; end
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7787
diff changeset
    97
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
    98
	-- Remove session/resource from user's session list
1225
1e01a913baf5 sessionmanager: Fixed an old FIXME: A problem caused by an error on an authenticated but unbound session
Waqas Hussain <waqas20@gmail.com>
parents: 1224
diff changeset
    99
	if session.full_jid then
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   100
		local host_session = hosts[session.host];
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   101
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   102
		-- Allow plugins to prevent session destruction
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   103
		if host_session.events.fire_event("pre-resource-unbind", {session=session, error=err}) then
12883
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   104
			(session.log or log)("debug", "Resource unbind prevented by module");
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   105
			return;
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   106
		end
12883
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   107
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   108
		(session.log or log)("debug", "Unbinding resource for %s (%s@%s)%s",
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   109
			session.full_jid or "(unknown)", session.username or "(unknown)",
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   110
			session.host or "(unknown)", err and (": "..err) or "");
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   111
12882
0d8bf401fa73 core.sessionmanager: Mark session as destroyed to prevent reentry
Kim Alvefur <zash@zash.se>
parents: 12881
diff changeset
   112
		session.destroyed = true; -- Past this point the session is DOOMED!
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   113
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   114
		host_session.sessions[session.username].sessions[session.resource] = nil;
1226
3b5f9dac2045 sessionmanager: Removed a redundant check
Waqas Hussain <waqas20@gmail.com>
parents: 1225
diff changeset
   115
		full_sessions[session.full_jid] = nil;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   116
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   117
		if not next(host_session.sessions[session.username].sessions) then
1225
1e01a913baf5 sessionmanager: Fixed an old FIXME: A problem caused by an error on an authenticated but unbound session
Waqas Hussain <waqas20@gmail.com>
parents: 1224
diff changeset
   118
			log("debug", "All resources of %s are now offline", session.username);
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   119
			host_session.sessions[session.username] = nil;
1301
d10d84f755b5 sessionmanager: It really is username@host, not host@username :)
Waqas Hussain <waqas20@gmail.com>
parents: 1290
diff changeset
   120
			bare_sessions[session.username..'@'..session.host] = nil;
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 49
diff changeset
   121
		end
2591
d540a75a11db sessionmanager: Fire resource-unbind event after removing session from sessions table
Matthew Wild <mwild1@gmail.com>
parents: 2580
diff changeset
   122
4230
23b68616b6d8 sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to hook and prevent/override session destruction
Matthew Wild <mwild1@gmail.com>
parents: 3459
diff changeset
   123
		host_session.events.fire_event("resource-unbind", {session=session, error=err});
12883
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   124
	else
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   125
		(session.log or log)("debug", "Destroying unbound session for <%s@%s>%s",
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   126
			session.username or "(unknown)", session.host or "(unknown)",
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   127
			err and (": "..err) or "");
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 49
diff changeset
   128
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   129
2746
3b9547fc0bed sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks
Matthew Wild <mwild1@gmail.com>
parents: 2622
diff changeset
   130
	retire_session(session);
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   131
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   132
10646
de90b2f5da8c sessionmanager: Support passing an auth scope to make_authenticated
Matthew Wild <mwild1@gmail.com>
parents: 10382
diff changeset
   133
local function make_authenticated(session, username, scope)
3236
4727b2b0e069 sessionmanager: Moved nodeprep to sessionmanager.make_authenticated.
Waqas Hussain <waqas20@gmail.com>
parents: 3091
diff changeset
   134
	username = nodeprep(username);
3239
5ea90ee96022 sessionmanager: Fixed a traceback on invalid usernames (typo in previous commit).
Waqas Hussain <waqas20@gmail.com>
parents: 3236
diff changeset
   135
	if not username or #username == 0 then return nil, "Invalid username"; end
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   136
	session.username = username;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   137
	if session.type == "c2s_unauthed" then
7787
9f70d35a1602 core.sessionmanager, mod_saslauth: Introduce intermediate session type for authenticated but unbound sessions so that resource binding is not treated as a normal stanza
Kim Alvefur <zash@zash.se>
parents: 7499
diff changeset
   138
		session.type = "c2s_unbound";
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   139
	end
10646
de90b2f5da8c sessionmanager: Support passing an auth scope to make_authenticated
Matthew Wild <mwild1@gmail.com>
parents: 10382
diff changeset
   140
	session.auth_scope = scope;
10047
ce8e18f20693 core/sessionmanager: Remove unnecessary fallback in make_authenticated
Maxime “pep” Buquet <pep@bouah.net>
parents: 9941
diff changeset
   141
	session.log("info", "Authenticated as %s@%s", username, session.host or "(unknown)");
53
14ea0fe6ca86 Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents: 49
diff changeset
   142
	return true;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   143
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   144
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   145
-- returns true, nil on success
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   146
-- returns nil, err_type, err, err_message on failure
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   147
local function bind_resource(session, resource)
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   148
	if not session.username then return nil, "auth", "not-authorized", "Cannot bind resource before authentication"; end
6602
f93e1b2ec327 sessionmanager: Return 'not-allowed' error instead of the non-existent 'already-bound' error when client tries to bind a resource twice on the same stream (thanks Flow) fixes issue #484.
Matthew Wild <mwild1@gmail.com>
parents: 5459
diff changeset
   149
	if session.resource then return nil, "cancel", "not-allowed", "Cannot bind multiple resources on a single connection"; end
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   150
	-- We don't support binding multiple resources
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   151
6564
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   152
	local event_payload = { session = session, resource = resource };
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   153
	if hosts[session.host].events.fire_event("pre-resource-bind", event_payload) == false then
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   154
		local err = event_payload.error;
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   155
		if err then return nil, err.type, err.condition, err.text; end
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   156
		return nil, "cancel", "not-allowed";
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   157
	else
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   158
		-- In case a plugin wants to poke at it
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   159
		resource = event_payload.resource;
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   160
	end
bae84401a02c sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents: 6554
diff changeset
   161
10382
04c4750ff8d2 core.sessionmanager: Require that client-requested resources pass strict resourceprep
Kim Alvefur <zash@zash.se>
parents: 10376
diff changeset
   162
	resource = resourceprep(resource or "", true);
8875
4d7a822e837f sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents: 8720
diff changeset
   163
	resource = resource ~= "" and resource or generate_identifier();
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   164
	--FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   165
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   166
	if not hosts[session.host].sessions[session.username] then
1224
35fa588e43a6 sessionmanager: Add/remove sessions from full_sessions and bare_sessions when binding/unbinding sessions
Waqas Hussain <waqas20@gmail.com>
parents: 1223
diff changeset
   167
		local sessions = { sessions = {} };
35fa588e43a6 sessionmanager: Add/remove sessions from full_sessions and bare_sessions when binding/unbinding sessions
Waqas Hussain <waqas20@gmail.com>
parents: 1223
diff changeset
   168
		hosts[session.host].sessions[session.username] = sessions;
1290
c253905a8a55 sessionmanager: It's username@host, not host@username :)
Matthew Wild <mwild1@gmail.com>
parents: 1226
diff changeset
   169
		bare_sessions[session.username..'@'..session.host] = sessions;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   170
	else
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   171
		local sessions = hosts[session.host].sessions[session.username].sessions;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   172
		if sessions[resource] then
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   173
			-- Resource conflict
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5306
diff changeset
   174
			local policy = config_get(session.host, "conflict_resolve");
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   175
			local increment;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   176
			if policy == "random" then
8875
4d7a822e837f sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents: 8720
diff changeset
   177
				resource = generate_identifier();
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   178
				increment = true;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   179
			elseif policy == "increment" then
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   180
				increment = true; -- TODO ping old resource
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   181
			elseif policy == "kick_new" then
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   182
				return nil, "cancel", "conflict", "Resource already exists";
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   183
			else -- if policy == "kick_old" then
791
a4be1d80775c Fixed: kick_old resource conflict resolution policy could fail with a backtrace
Waqas Hussain <waqas20@gmail.com>
parents: 760
diff changeset
   184
				sessions[resource]:close {
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   185
					condition = "conflict";
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   186
					text = "Replaced by new connection";
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   187
				};
791
a4be1d80775c Fixed: kick_old resource conflict resolution policy could fail with a backtrace
Waqas Hussain <waqas20@gmail.com>
parents: 760
diff changeset
   188
				if not next(sessions) then
a4be1d80775c Fixed: kick_old resource conflict resolution policy could fail with a backtrace
Waqas Hussain <waqas20@gmail.com>
parents: 760
diff changeset
   189
					hosts[session.host].sessions[session.username] = { sessions = sessions };
1471
8b3753b080fc sessionmanager: Reset bare_sessions[user] after resource conflict resolution. Fixes the other stanza gobbling bug \o/
Matthew Wild <mwild1@gmail.com>
parents: 1469
diff changeset
   190
					bare_sessions[session.username.."@"..session.host] = hosts[session.host].sessions[session.username];
791
a4be1d80775c Fixed: kick_old resource conflict resolution policy could fail with a backtrace
Waqas Hussain <waqas20@gmail.com>
parents: 760
diff changeset
   191
				end
429
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   192
			end
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   193
			if increment and sessions[resource] then
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   194
				local count = 1;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   195
				while sessions[resource.."#"..count] do
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   196
					count = count + 1;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   197
				end
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   198
				resource = resource.."#"..count;
b1d86f89fa27 Added options to limit the number of resources and for handling of resource conflicts
Waqas Hussain <waqas20@gmail.com>
parents: 357
diff changeset
   199
			end
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   200
		end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   201
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   202
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   203
	session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   204
	session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   205
	hosts[session.host].sessions[session.username].sessions[resource] = session;
1224
35fa588e43a6 sessionmanager: Add/remove sessions from full_sessions and bare_sessions when binding/unbinding sessions
Waqas Hussain <waqas20@gmail.com>
parents: 1223
diff changeset
   206
	full_sessions[session.full_jid] = session;
7787
9f70d35a1602 core.sessionmanager, mod_saslauth: Introduce intermediate session type for authenticated but unbound sessions so that resource binding is not treated as a normal stanza
Kim Alvefur <zash@zash.se>
parents: 7499
diff changeset
   207
	if session.type == "c2s_unbound" then
9f70d35a1602 core.sessionmanager, mod_saslauth: Introduce intermediate session type for authenticated but unbound sessions so that resource binding is not treated as a normal stanza
Kim Alvefur <zash@zash.se>
parents: 7499
diff changeset
   208
		session.type = "c2s";
9f70d35a1602 core.sessionmanager, mod_saslauth: Introduce intermediate session type for authenticated but unbound sessions so that resource binding is not treated as a normal stanza
Kim Alvefur <zash@zash.se>
parents: 7499
diff changeset
   209
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   210
3088
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   211
	local err;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   212
	session.roster, err = rm_load_roster(session.username, session.host);
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   213
	if err then
8187
dbcae15b4282 sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents: 7952
diff changeset
   214
		-- FIXME: Why is all this rollback down here, instead of just doing the roster test up above?
3088
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   215
		full_sessions[session.full_jid] = nil;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   216
		hosts[session.host].sessions[session.username].sessions[resource] = nil;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   217
		session.full_jid = nil;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   218
		session.resource = nil;
8187
dbcae15b4282 sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents: 7952
diff changeset
   219
		if session.type == "c2s" then
dbcae15b4282 sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents: 7952
diff changeset
   220
			session.type = "c2s_unbound";
dbcae15b4282 sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents: 7952
diff changeset
   221
		end
3091
d6a059af2077 rostermanager: Correctly clear the bare_sessions table on roster load errors during bind.
Waqas Hussain <waqas20@gmail.com>
parents: 3089
diff changeset
   222
		if next(bare_sessions[session.username..'@'..session.host].sessions) == nil then
3088
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   223
			bare_sessions[session.username..'@'..session.host] = nil;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   224
			hosts[session.host].sessions[session.username] = nil;
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   225
		end
5211
80635a6cb126 sessionmanager: Log the actual error message when roster loading fails.
Waqas Hussain <waqas20@gmail.com>
parents: 4995
diff changeset
   226
		session.log("error", "Roster loading failed: %s", err);
3088
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   227
		return nil, "cancel", "internal-server-error", "Error loading roster";
a233aa051125 sessionmanager: If roster loading fails during resource bind, kick the user with an internal-server-error.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   228
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   229
1478
da11f2652ae9 sessionmanager: Replace raw session by an event data table for resource bind/unbind events, allowing extra data
Waqas Hussain <waqas20@gmail.com>
parents: 1471
diff changeset
   230
	hosts[session.host].events.fire_event("resource-bind", {session=session});
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   231
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   232
	return true;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   233
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   234
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   235
local function send_to_available_resources(username, host, stanza)
6622
78d1706982b2 sessionmanager: Rename parameter to avoid varible name conflict
Matthew Wild <mwild1@gmail.com>
parents: 6605
diff changeset
   236
	local jid = username.."@"..host;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   237
	local count = 0;
2140
94b7ba39787d sessionmanager: Fixed and cleaned function send_to_available_resources(). The 'to' attribute for presence subscription stanzas is now preserved.
Waqas Hussain <waqas20@gmail.com>
parents: 1929
diff changeset
   238
	local user = bare_sessions[jid];
94b7ba39787d sessionmanager: Fixed and cleaned function send_to_available_resources(). The 'to' attribute for presence subscription stanzas is now preserved.
Waqas Hussain <waqas20@gmail.com>
parents: 1929
diff changeset
   239
	if user then
6679
a536978e0f01 sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6666
diff changeset
   240
		for _, session in pairs(user.sessions) do
2140
94b7ba39787d sessionmanager: Fixed and cleaned function send_to_available_resources(). The 'to' attribute for presence subscription stanzas is now preserved.
Waqas Hussain <waqas20@gmail.com>
parents: 1929
diff changeset
   241
			if session.presence then
94b7ba39787d sessionmanager: Fixed and cleaned function send_to_available_resources(). The 'to' attribute for presence subscription stanzas is now preserved.
Waqas Hussain <waqas20@gmail.com>
parents: 1929
diff changeset
   242
				session.send(stanza);
94b7ba39787d sessionmanager: Fixed and cleaned function send_to_available_resources(). The 'to' attribute for presence subscription stanzas is now preserved.
Waqas Hussain <waqas20@gmail.com>
parents: 1929
diff changeset
   243
				count = count + 1;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   244
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   245
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   246
	end
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   247
	return count;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   248
end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   249
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   250
local function send_to_interested_resources(username, host, stanza)
6680
1089f45c5e67 sessionmanager: Rename argument to avoid name clash with local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6679
diff changeset
   251
	local jid = username.."@"..host;
2141
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   252
	local count = 0;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   253
	local user = bare_sessions[jid];
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   254
	if user then
6679
a536978e0f01 sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6666
diff changeset
   255
		for _, session in pairs(user.sessions) do
2141
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   256
			if session.interested then
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   257
				session.send(stanza);
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   258
				count = count + 1;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   259
			end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   260
		end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   261
	end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   262
	return count;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   263
end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   264
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   265
return {
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   266
	new_session = new_session;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   267
	retire_session = retire_session;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   268
	destroy_session = destroy_session;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   269
	make_authenticated = make_authenticated;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   270
	bind_resource = bind_resource;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   271
	send_to_available_resources = send_to_available_resources;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   272
	send_to_interested_resources = send_to_interested_resources;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   273
};