Software /
code /
prosody
Annotate
core/sessionmanager.lua @ 13233:37d67b5f9768
mod_muc: Use enum config API for 'restrict_room_creation'
This communicates the accepted values in case the config diverges from
them. Note that older documentation used an "admin" value behaving like
an alias to true, but this is no longer handled. Should it?
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 21 Jul 2023 22:49:01 +0200 |
parent | 13095:1693bd4de283 |
rev | line source |
---|---|
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 | 5 -- This project is MIT/X11 licensed. Please see the |
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 -- |
7949
8acc35b5355a
core: Allow select core modules to mutate some globals (needs luacheck 1.19)
Kim Alvefur <zash@zash.se>
parents:
7947
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 | 12 |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
13 local prosody, hosts = prosody, prosody.hosts; |
6551
784fa05cf594
sessionmanager: Access bare_session and full_sessions through 'prosody'
Matthew Wild <mwild1@gmail.com>
parents:
6404
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:
6404
diff
changeset
|
15 local bare_sessions = prosody.bare_sessions; |
38 | 16 |
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12880
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"); |
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12880
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:
12880
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:
12880
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:
12880
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:
12880
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:
12880
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 |
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12880
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 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
29 local _ENV = nil; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8185
diff
changeset
|
30 -- luacheck: std none |
30 | 31 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
32 local function new_session(conn) |
9937
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
diff
changeset
|
33 local session = sessionlib.new("c2s"); |
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
diff
changeset
|
34 sessionlib.set_id(session); |
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
diff
changeset
|
35 sessionlib.set_logger(session); |
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
diff
changeset
|
36 sessionlib.set_conn(session, conn); |
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
diff
changeset
|
37 |
6245ee9494c6
core.sessionmanager: Use util.session to create sessions
Kim Alvefur <zash@zash.se>
parents:
9908
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 | 40 local w = conn.write; |
9908
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
41 |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
42 function session.rawsend(t) |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
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:
9070
diff
changeset
|
44 if t then |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
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:
9070
diff
changeset
|
46 if not ret then |
10105
63f87211fcdd
core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
10043
diff
changeset
|
47 session.log("debug", "Error writing to connection: %s", err); |
9908
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
48 return false, err; |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
49 end |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
50 end |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
51 return true; |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
diff
changeset
|
52 end |
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
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) |
9069
22e5f11c778a
sessionmanager, mod_s2s: Bring debug line for outgoing stanzas in line with that for incoming
Kim Alvefur <zash@zash.se>
parents:
9066
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 |
9908
7d12af856238
sessionmanager: Split byte-level sending into separate session.rawsend
Kim Alvefur <zash@zash.se>
parents:
9070
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 |
7495
caee8a32983a
sessionmanager: Make session.send() return true unless there really is an error [backported from 0.10]
Kim Alvefur <zash@zash.se>
parents:
6599
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 | 68 return session; |
69 end | |
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; |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6619
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 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
80 local function retire_session(session) |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6619
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 |
10105
63f87211fcdd
core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
10043
diff
changeset
|
88 function session.send(data) log("debug", "Discarding data sent to resting session: %s", data); return false; end |
11518
3f1a865e9419
core.sessionmanager: Add a dummy rawsend() method to resting sessions
Kim Alvefur <zash@zash.se>
parents:
10642
diff
changeset
|
89 function session.rawsend(data) log("debug", "Discarding data sent to resting session: %s", data); return false; end |
10105
63f87211fcdd
core.sessionmanager: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
10043
diff
changeset
|
90 function session.data(data) log("debug", "Discarding data received from resting session: %s", data); end |
7286 | 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 |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
diff
changeset
|
100 |
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
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:
12662
diff
changeset
|
102 if replaced_conn then |
13095
1693bd4de283
core.sessionmanager: Delay closing a replaced connection after replacement
Kim Alvefur <zash@zash.se>
parents:
13008
diff
changeset
|
103 to_session.conn = nil; |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
104 end |
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
105 |
13008
7b952553bd60
sessionmanager: Preserve 'since' property of original session after resumption
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
106 to_session.since = from_session.since; |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
diff
changeset
|
118 to_session.send.filter = to_session.filter; |
12820
b95771171439
sessionmanager: Pluck sasl_handler from old session when resuming (fixes #1785)
Matthew Wild <mwild1@gmail.com>
parents:
12677
diff
changeset
|
119 to_session.sasl_handler = from_session.sasl_handler; |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
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:
12662
diff
changeset
|
128 |
12821
a4ac16e5b655
sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents:
12820
diff
changeset
|
129 -- Notify modules, allowing them to copy further fields or update state |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
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:
12662
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:
12662
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:
12662
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:
12662
diff
changeset
|
134 }); |
12821
a4ac16e5b655
sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents:
12820
diff
changeset
|
135 |
a4ac16e5b655
sessionmanager: Fire event before retiring old session
Matthew Wild <mwild1@gmail.com>
parents:
12820
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:
12820
diff
changeset
|
137 retire_session(from_session); |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
138 end |
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
139 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
140 local function destroy_session(session, err) |
12877
f6cca7cbf3b2
core.sessionmanager: Skip log when (not) destroying destroyed sessions
Kim Alvefur <zash@zash.se>
parents:
11518
diff
changeset
|
141 if session.destroyed then return; end |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7784
diff
changeset
|
142 |
331 | 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 |
12879
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
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 |
12879
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
diff
changeset
|
152 |
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
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:
12878
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:
12878
diff
changeset
|
155 session.host or "(unknown)", err and (": "..err) or ""); |
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
diff
changeset
|
156 |
12878
0d8bf401fa73
core.sessionmanager: Mark session as destroyed to prevent reentry
Kim Alvefur <zash@zash.se>
parents:
12877
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}); |
12879
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
diff
changeset
|
169 else |
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
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:
12878
diff
changeset
|
171 session.username or "(unknown)", session.host or "(unknown)", |
09a53ed8f4d5
sessionmanager: Improve logging around session destruction
Matthew Wild <mwild1@gmail.com>
parents:
12878
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 | 176 end |
177 | |
12642
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
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 | 181 session.username = username; |
182 if session.type == "c2s_unauthed" then | |
7784
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:
7496
diff
changeset
|
183 session.type = "c2s_unbound"; |
38 | 184 end |
12642
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
185 |
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
186 local role; |
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
187 if role_name then |
12648
f299e570a0fe
mod_authz_internal: Use util.roles, some API changes and config support
Matthew Wild <mwild1@gmail.com>
parents:
12642
diff
changeset
|
188 role = hosts[session.host].authz.get_role_by_name(role_name); |
12642
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
189 else |
12662
07424992d7fc
mod_authz_internal, and more: New iteration of role API
Matthew Wild <mwild1@gmail.com>
parents:
12648
diff
changeset
|
190 role = hosts[session.host].authz.get_user_role(username); |
12642
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
191 end |
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
diff
changeset
|
192 if role then |
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
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:
11518
diff
changeset
|
194 end |
9061f9621330
Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents:
11518
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 | 197 end |
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 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
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 |
6599
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 |
6561
bae84401a02c
sessionmanager: Add pre-resource-bind event that would let plugins have a say in resource binding
Kim Alvefur <zash@zash.se>
parents:
6551
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:
6551
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:
6551
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:
6551
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:
6551
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:
6551
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:
6551
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:
6551
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:
6551
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:
6551
diff
changeset
|
215 |
10378
04c4750ff8d2
core.sessionmanager: Require that client-requested resources pass strict resourceprep
Kim Alvefur <zash@zash.se>
parents:
10372
diff
changeset
|
216 resource = resourceprep(resource or "", true); |
8872
4d7a822e837f
sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents:
8717
diff
changeset
|
217 resource = resource ~= "" and resource or generate_identifier(); |
38 | 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 | 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 | 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 | 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 |
8872
4d7a822e837f
sessionmanager: Generate shorter random resoures
Kim Alvefur <zash@zash.se>
parents:
8717
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 | 254 end |
255 end | |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5459
diff
changeset
|
256 |
38 | 257 session.resource = resource; |
258 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource; | |
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; |
7784
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:
7496
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:
7496
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:
7496
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 |
8184
dbcae15b4282
sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents:
7949
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; |
8184
dbcae15b4282
sessionmanager: Revert session.type if binding fails due to roster load error
Matthew Wild <mwild1@gmail.com>
parents:
7949
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:
7949
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:
7949
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 | 286 return true; |
287 end | |
288 | |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
289 local function send_to_available_resources(username, host, stanza) |
6619
78d1706982b2
sessionmanager: Rename parameter to avoid varible name conflict
Matthew Wild <mwild1@gmail.com>
parents:
6602
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 |
6676
a536978e0f01
sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6663
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 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
304 local function send_to_interested_resources(username, host, stanza) |
6677
1089f45c5e67
sessionmanager: Rename argument to avoid name clash with local variable [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6676
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 |
6676
a536978e0f01
sessionmanager: Rename unused loop variables to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6663
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 |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
319 return { |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
320 new_session = new_session; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
321 retire_session = retire_session; |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12662
diff
changeset
|
322 update_session = update_session; |
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
323 destroy_session = destroy_session; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
324 make_authenticated = make_authenticated; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
325 bind_resource = bind_resource; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
326 send_to_available_resources = send_to_available_resources; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
327 send_to_interested_resources = send_to_interested_resources; |
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6677
diff
changeset
|
328 }; |