core/sessionmanager.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:39:03 +0000
changeset 13470 5d9ec2e55d74
parent 13099 1693bd4de283
permissions -rw-r--r--
Merge 0.12->trunk
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
};