core/sessionmanager.lua
author Kim Alvefur <zash@zash.se>
Wed, 27 Mar 2024 19:33:11 +0100
changeset 13471 c2a476f4712a
parent 13099 1693bd4de283
permissions -rw-r--r--
util.startup: Fix exiting on pidfile trouble prosody.shutdown() relies on prosody.main_thread, which has not been set yet at this point. Doing a clean shutdown might actually be harmful in case it tears down things set up by the conflicting Prosody, such as the very pidfile we were looking at. Thanks again SigmaTel71 for noticing
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
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    13
local prosody, hosts = prosody, 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
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    17
local logger = require "prosody.util.logger";
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
    18
local log = logger.init("sessionmanager");
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    19
local rm_load_roster = require "prosody.core.rostermanager".load_roster;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    20
local config_get = require "prosody.core.configmanager".get;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    21
local resourceprep = require "prosody.util.encodings".stringprep.resourceprep;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    22
local nodeprep = require "prosody.util.encodings".stringprep.nodeprep;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    23
local generate_identifier = require "prosody.util.id".short;
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    24
local sessionlib = require "prosody.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
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12884
diff changeset
    26
local initialize_filters = require "prosody.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
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    95
-- Update a session with a new one (transplanting connection, filters, etc.)
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    96
-- new_session should be discarded after this call returns
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    97
local function update_session(to_session, from_session)
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    98
	to_session.log("debug", "Updating with parameters from session %s", from_session.id);
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
    99
	from_session.log("debug", "Session absorbed into %s", to_session.id);
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   100
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   101
	local replaced_conn = to_session.conn;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   102
	if replaced_conn then
13099
1693bd4de283 core.sessionmanager: Delay closing a replaced connection after replacement
Kim Alvefur <zash@zash.se>
parents: 13012
diff changeset
   103
		to_session.conn = nil;
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   104
	end
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   105
13012
7b952553bd60 sessionmanager: Preserve 'since' property of original session after resumption
Matthew Wild <mwild1@gmail.com>
parents: 12976
diff changeset
   106
	to_session.since = from_session.since;
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   107
	to_session.ip = from_session.ip;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   108
	to_session.conn = from_session.conn;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   109
	to_session.rawsend = from_session.rawsend;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   110
	to_session.rawsend.session = to_session;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   111
	to_session.rawsend.conn = to_session.conn;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   112
	to_session.send = from_session.send;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   113
	to_session.send.session = to_session;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   114
	to_session.close = from_session.close;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   115
	to_session.filter = from_session.filter;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   116
	to_session.filter.session = to_session;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   117
	to_session.filters = from_session.filters;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   118
	to_session.send.filter = to_session.filter;
12824
b95771171439 sessionmanager: Pluck sasl_handler from old session when resuming (fixes #1785)
Matthew Wild <mwild1@gmail.com>
parents: 12681
diff changeset
   119
	to_session.sasl_handler = from_session.sasl_handler;
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   120
	to_session.stream = from_session.stream;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   121
	to_session.secure = from_session.secure;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   122
	to_session.hibernating = nil;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   123
	to_session.resumption_counter = (to_session.resumption_counter or 0) + 1;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   124
	from_session.log = to_session.log;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   125
	from_session.type = to_session.type;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   126
	-- Inform xmppstream of the new session (passed to its callbacks)
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   127
	to_session.stream:set_session(to_session);
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   128
12825
a4ac16e5b655 sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents: 12824
diff changeset
   129
	-- Notify modules, allowing them to copy further fields or update state
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   130
	prosody.events.fire_event("c2s-session-updated", {
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   131
		session = to_session;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   132
		from_session = from_session;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   133
		replaced_conn = replaced_conn;
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   134
	});
12825
a4ac16e5b655 sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents: 12824
diff changeset
   135
a4ac16e5b655 sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents: 12824
diff changeset
   136
	-- Retire the session we've pulled from, to avoid two sessions on the same connection
a4ac16e5b655 sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents: 12824
diff changeset
   137
	retire_session(from_session);
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   138
end
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   139
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   140
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
   141
	if session.destroyed then return; end
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7787
diff changeset
   142
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
   143
	-- 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
   144
	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
   145
		local host_session = hosts[session.host];
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   146
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
   147
		-- 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
   148
		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
   149
			(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
   150
			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
   151
		end
12883
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   152
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   153
		(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
   154
			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
   155
			session.host or "(unknown)", err and (": "..err) or "");
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   156
12882
0d8bf401fa73 core.sessionmanager: Mark session as destroyed to prevent reentry
Kim Alvefur <zash@zash.se>
parents: 12881
diff changeset
   157
		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
   158
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
   159
		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
   160
		full_sessions[session.full_jid] = nil;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   161
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
   162
		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
   163
			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
   164
			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
   165
			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
   166
		end
2591
d540a75a11db sessionmanager: Fire resource-unbind event after removing session from sessions table
Matthew Wild <mwild1@gmail.com>
parents: 2580
diff changeset
   167
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
   168
		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
   169
	else
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   170
		(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
   171
			session.username or "(unknown)", session.host or "(unknown)",
09a53ed8f4d5 sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents: 12882
diff changeset
   172
			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
   173
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   174
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
   175
	retire_session(session);
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   176
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   177
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   178
local function make_authenticated(session, username, role_name)
3236
4727b2b0e069 sessionmanager: Moved nodeprep to sessionmanager.make_authenticated.
Waqas Hussain <waqas20@gmail.com>
parents: 3091
diff changeset
   179
	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
   180
	if not username or #username == 0 then return nil, "Invalid username"; end
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   181
	session.username = username;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   182
	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
   183
		session.type = "c2s_unbound";
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   184
	end
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   185
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   186
	local role;
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   187
	if role_name then
12652
f299e570a0fe mod_authz_internal: Use util.roles, some API changes and config support
Matthew Wild <mwild1@gmail.com>
parents: 12646
diff changeset
   188
		role = hosts[session.host].authz.get_role_by_name(role_name);
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   189
	else
12666
07424992d7fc mod_authz_internal, and more: New iteration of role API
Matthew Wild <mwild1@gmail.com>
parents: 12652
diff changeset
   190
		role = hosts[session.host].authz.get_user_role(username);
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   191
	end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   192
	if role then
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   193
		sessionlib.set_role(session, role);
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   194
	end
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
   195
	session.log("info", "Authenticated as %s@%s [%s]", username, session.host or "(unknown)", role and role.name or "no role");
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
   196
	return true;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   197
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   198
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   199
-- returns true, nil on success
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   200
-- 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
   201
local function bind_resource(session, resource)
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   202
	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
   203
	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
   204
	-- We don't support binding multiple resources
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
   205
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
   206
	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
   207
	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
   208
		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
   209
		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
   210
		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
   211
	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
   212
		-- 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
   213
		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
   214
	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
   215
10382
04c4750ff8d2 core.sessionmanager: Require that client-requested resources pass strict resourceprep
Kim Alvefur <zash@zash.se>
parents: 10376
diff changeset
   216
	resource = resourceprep(resource or "", true);
8875
4d7a822e837f sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents: 8720
diff changeset
   217
	resource = resource ~= "" and resource or generate_identifier();
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   218
	--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
   219
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   220
	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
   221
		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
   222
		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
   223
		bare_sessions[session.username..'@'..session.host] = sessions;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   224
	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
   225
		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
   226
		if sessions[resource] then
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   227
			-- 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
   228
			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
   229
			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
   230
			if policy == "random" then
8875
4d7a822e837f sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents: 8720
diff changeset
   231
				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
   232
				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
   233
			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
   234
				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
   235
			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
   236
				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
   237
			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
   238
				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
   239
					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
   240
					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
   241
				};
791
a4be1d80775c Fixed: kick_old resource conflict resolution policy could fail with a backtrace
Waqas Hussain <waqas20@gmail.com>
parents: 760
diff changeset
   242
				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
   243
					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
   244
					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
   245
				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
   246
			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
   247
			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
   248
				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
   249
				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
   250
					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
   251
				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
   252
				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
   253
			end
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   254
		end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   255
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   256
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   257
	session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   258
	session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   259
	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
   260
	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
   261
	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
   262
		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
   263
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   264
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
   265
	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
   266
	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
   267
	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
   268
		-- 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
   269
		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
   270
		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
   271
		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
   272
		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
   273
		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
   274
			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
   275
		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
   276
		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
   277
			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
   278
			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
   279
		end
5211
80635a6cb126 sessionmanager: Log the actual error message when roster loading fails.
Waqas Hussain <waqas20@gmail.com>
parents: 4995
diff changeset
   280
		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
   281
		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
   282
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5459
diff changeset
   283
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
   284
	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
   285
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   286
	return true;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   287
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
   288
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   289
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
   290
	local jid = username.."@"..host;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   291
	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
   292
	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
   293
	if user then
6679
a536978e0f01 sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6666
diff changeset
   294
		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
   295
			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
   296
				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
   297
				count = count + 1;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   298
			end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   299
		end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   300
	end
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
   301
	return count;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   302
end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
   303
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   304
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
   305
	local jid = username.."@"..host;
2141
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   306
	local count = 0;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   307
	local user = bare_sessions[jid];
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   308
	if user then
6679
a536978e0f01 sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6666
diff changeset
   309
		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
   310
			if session.interested then
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   311
				session.send(stanza);
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   312
				count = count + 1;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   313
			end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   314
		end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   315
	end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   316
	return count;
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   317
end
f544729f9228 sessionmanager: Added function send_to_interested_resources().
Waqas Hussain <waqas20@gmail.com>
parents: 2140
diff changeset
   318
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   319
return {
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   320
	new_session = new_session;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   321
	retire_session = retire_session;
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12666
diff changeset
   322
	update_session = update_session;
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   323
	destroy_session = destroy_session;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   324
	make_authenticated = make_authenticated;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   325
	bind_resource = bind_resource;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   326
	send_to_available_resources = send_to_available_resources;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   327
	send_to_interested_resources = send_to_interested_resources;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6680
diff changeset
   328
};