From f21f55bb1e757f27cf9d2263469eb9ae6c63b91e Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Tue, 18 Nov 2008 05:13:29 +0000 Subject: Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm) --- core/sessionmanager.lua | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 0d65f6d6..33157567 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -96,13 +96,23 @@ function streamopened(session, attr) session.host = attr.to or error("Client failed to specify destination hostname"); session.version = tonumber(attr.version) or 0; session.streamid = m_random(1000000, 99999999); - print(session, session.host, "Client opened stream"); - send(""); + (session.log or session)("debug", "Client sent opening to %s", session.host); + + + send(""); send(format("", session.streamid, session.host)); + if not hosts[session.host] then + -- We don't serve this host... + session:disconnect{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; + return; + end + + local features = {}; modulemanager.fire_event("stream-features", session, features); + -- FIXME: Need to send() this all at once send(""); for _, feature in ipairs(features) do -- cgit v1.2.3 From 01c770997f61259d6e5b8ae5018aab1ef6ac0ef8 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Tue, 18 Nov 2008 17:52:33 +0000 Subject: Quite some changes, to: - Small logging fix for s2smanager - Send a stream error if an incoming s2s connection is to an unrecognised hostname (fixes #11) - init_xmlhandlers now takes a table of callbacks (includes changes to net/xmpp*_listener for this) - Move sending of unavailable presence to where it should be, sessionmanager.destroy_session - Fix sending of stream errors to wrong connection --- core/sessionmanager.lua | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 33157567..fbfb7964 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -35,6 +35,16 @@ end function destroy_session(session) (session.log or log)("info", "Destroying session"); + + -- Send unavailable presence + if session.presence and session.presence.attr.type ~= "unavailable" then + local pres = st.presence{ type = "unavailable" }; + if err == "closed" then err = "connection closed"; end + pres:tag("status"):text("Disconnected: "..err); + session.stanza_dispatch(pres); + end + + -- Remove session/resource from user's session list if session.host and session.username then if session.resource then hosts[session.host].sessions[session.username].sessions[session.resource] = nil; @@ -46,8 +56,7 @@ function destroy_session(session) end end end - session.conn = nil; - session.disconnect = nil; + for k in pairs(session) do if k ~= "trace" then session[k] = nil; -- cgit v1.2.3 From 64e57b5001ecac19c1d7ffb2236ee3f7b71c3b1c Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Tue, 18 Nov 2008 19:40:04 +0000 Subject: Remove useless check for unavailable presence (which never exists) --- core/sessionmanager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index fbfb7964..76461b8a 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -37,7 +37,7 @@ function destroy_session(session) (session.log or log)("info", "Destroying session"); -- Send unavailable presence - if session.presence and session.presence.attr.type ~= "unavailable" then + if session.presence then local pres = st.presence{ type = "unavailable" }; if err == "closed" then err = "connection closed"; end pres:tag("status"):text("Disconnected: "..err); -- cgit v1.2.3 From 99b617b8b6839a496ee26033b1b613a9f11e8f62 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Tue, 18 Nov 2008 19:44:54 +0000 Subject: session:disconnect() -> session:close() for consistency with other Lua APIs --- core/sessionmanager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 76461b8a..74edb86c 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -113,7 +113,7 @@ function streamopened(session, attr) if not hosts[session.host] then -- We don't serve this host... - session:disconnect{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; + session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; return; end -- cgit v1.2.3 From 8b041f3cdbc219dc78f884e6418c83d03b867a5a Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 19 Nov 2008 05:07:52 +0000 Subject: Fix sending of unavailable presence on disconnect --- core/sessionmanager.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 74edb86c..7a0d6a49 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -14,6 +14,8 @@ local error = error; local uuid_generate = require "util.uuid".generate; local rm_load_roster = require "core.rostermanager".load_roster; +local st = require "util.stanza"; + local newproxy = newproxy; local getmetatable = getmetatable; @@ -33,13 +35,13 @@ function new_session(conn) return session; end -function destroy_session(session) +function destroy_session(session, err) (session.log or log)("info", "Destroying session"); -- Send unavailable presence if session.presence then local pres = st.presence{ type = "unavailable" }; - if err == "closed" then err = "connection closed"; end + if (not err) or err == "closed" then err = "connection closed"; end pres:tag("status"):text("Disconnected: "..err); session.stanza_dispatch(pres); end -- cgit v1.2.3 From 6a333d94d6779850451ca74249906ebf53c5f369 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 20 Nov 2008 01:32:24 +0000 Subject: Log number of open sessions on session creation --- 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 7a0d6a49..8be7bdec 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -30,6 +30,7 @@ function new_session(conn) getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; print("Session got collected, now "..open_sessions.." sessions are allocated") end; end open_sessions = open_sessions + 1; + log("info", "open sessions now: ".. open_sessions); local w = conn.write; session.send = function (t) w(tostring(t)); end return session; -- cgit v1.2.3 From 5c7ec634b1765f8edcc8b59aff2b2b899180dc65 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 20 Nov 2008 01:33:25 +0000 Subject: Use a stanza for c2s stream features instead of an array of strings. Removes a FIXME. --- core/sessionmanager.lua | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'core/sessionmanager.lua') diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 8be7bdec..e83b7c23 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -121,18 +121,12 @@ function streamopened(session, attr) end - local features = {}; + local features = st.stanza("stream:features"); modulemanager.fire_event("stream-features", session, features); - -- FIXME: Need to send() this all at once - send(""); + send(features); - for _, feature in ipairs(features) do - send(tostring(feature)); - end - - send(""); - log("info", "Stream opened successfully"); + (session.log or log)("info", "Sent reply to client"); session.notopen = nil; end -- cgit v1.2.3