From 7b445486a0173b2d2b96e5639de02d81fc10a0f8 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Mon, 8 Mar 2010 02:13:41 +0000 Subject: sessionmanager, s2smanager: Destroyed sessions are now simply resting (not dead) until they are collected - prevents a whole class of tracebacks --- core/sessionmanager.lua | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 29adcfbb..a2c6ed95 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -8,7 +8,7 @@ -local tonumber, tostring = tonumber, tostring; +local tonumber, tostring, setmetatable = tonumber, tostring, setmetatable; local ipairs, pairs, print, next= ipairs, pairs, print, next; local format = import("string", "format"); @@ -66,7 +66,22 @@ function new_session(conn) return session; end -local function null_data_handler(conn, data) log("debug", "Discarding data from destroyed c2s session: %s", data); end +local resting_session = { -- Resting, not dead + destroyed = true; + }; resting_session.__index = resting_session; + +function retire_session(session) + local log = session.log or log; + for k in pairs(session) do + if k ~= "trace" and k ~= "log" and k ~= "id" then + session[k] = nil; + end + end + + function session.send(data) log("debug", "Discarding data sent to resting session: %s", tostring(data)); end + function session.data(data) log("debug", "Discarding data received from resting session: %s", tostring(data)); end + return setmetatable(session, resting_session); +end function destroy_session(session, err) (session.log or log)("info", "Destroying session for %s (%s@%s)", session.full_jid or "(unknown)", session.username or "(unknown)", session.host or "(unknown)"); @@ -85,12 +100,7 @@ function destroy_session(session, err) hosts[session.host].events.fire_event("resource-unbind", {session=session, error=err}); end - for k in pairs(session) do - if k ~= "trace" then - session[k] = nil; - end - end - session.data = null_data_handler; + retire_session(session); end function make_authenticated(session, username) -- cgit v1.2.3 From 8e4f70c4a2db2fd6e2a35ebefd63a9177b44fc31 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 11 Mar 2010 01:04:19 +0000 Subject: sessionmanager, s2smanager: Close session on --- core/sessionmanager.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index a2c6ed95..b65e866f 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -211,8 +211,8 @@ function streamopened(session, attr) end function streamclosed(session) - session.send(""); - session.notopen = true; + session.log("debug", "Received "); + session:close(); end function send_to_available_resources(user, host, stanza) -- cgit v1.2.3 From 8b94f4df2504444121a345c430538b0a409e059d Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 14 Mar 2010 02:58:11 +0000 Subject: sessionmanager: Add close method to resting sessions --- core/sessionmanager.lua | 3 +++ 1 file changed, 3 insertions(+) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index b65e866f..5c40f756 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -68,6 +68,9 @@ end local resting_session = { -- Resting, not dead destroyed = true; + close = function (session) + session.log("debug", "Attempt to close already-closed session"); + end; }; resting_session.__index = resting_session; function retire_session(session) -- cgit v1.2.3 From c42dd4c96236f0b83654d83613d7d3cf5dffef84 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 14 Mar 2010 02:59:16 +0000 Subject: sessionmanager: Return stream error when incoming stream header is missing 'to' attribute --- core/sessionmanager.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 5c40f756..264c296b 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -181,7 +181,12 @@ end function streamopened(session, attr) local send = session.send; - session.host = attr.to or error("Client failed to specify destination hostname"); + session.host = attr.to; + if not session.host then + session:close{ condition = "improper-addressing", + text = "A 'to' attribute is required on stream headers" }; + return; + end session.host = nameprep(session.host); session.version = tonumber(attr.version) or 0; session.streamid = uuid_generate(); -- cgit v1.2.3 From 415ac76d286a0488bf65ae07b43f4d1b2c27aa75 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 14 Mar 2010 02:59:41 +0000 Subject: sessionmanager: Don't re-destroy destroyed sessions --- core/sessionmanager.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 264c296b..5fa757d6 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -88,6 +88,7 @@ end function destroy_session(session, err) (session.log or log)("info", "Destroying session for %s (%s@%s)", session.full_jid or "(unknown)", session.username or "(unknown)", session.host or "(unknown)"); + if session.destroyed then return; end -- Remove session/resource from user's session list if session.full_jid then -- cgit v1.2.3