X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=core%2Fsessionmanager.lua;h=68493d87cb506e6cf90d6e2dad0839801ada87b6;hb=34215744d79b2fcf146b69a59007d104085dff4a;hp=64f6df9732aef0b437614f9f3bc1eabdfca2bbc2;hpb=489e8504301004d44240e4b9cb7194340d869a0a;p=prosody.git diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index 64f6df97..68493d87 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -1,6 +1,6 @@ --- Prosody IM v0.2 --- Copyright (C) 2008 Matthew Wild --- Copyright (C) 2008 Waqas Hussain +-- Prosody IM v0.4 +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. @@ -23,6 +23,7 @@ local error = error; local uuid_generate = require "util.uuid".generate; local rm_load_roster = require "core.rostermanager".load_roster; local config_get = require "core.configmanager".get; +local nameprep = require "util.encodings".stringprep.nameprep; local fire_event = require "core.eventmanager".fire_event; @@ -44,7 +45,7 @@ function new_session(conn) getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; end; end open_sessions = open_sessions + 1; - log("info", "open sessions now: ".. open_sessions); + log("debug", "open sessions now: ".. open_sessions); local w = conn.write; session.send = function (t) w(tostring(t)); end session.ip = conn.ip(); @@ -52,13 +53,13 @@ function new_session(conn) end function destroy_session(session, err) - (session.log or log)("info", "Destroying session"); + (session.log or log)("info", "Destroying session for %s (%s@%s)", session.full_jid or "(unknown)", session.username or "(unknown)", session.host or "(unknown)"); -- Send unavailable presence if session.presence then local pres = st.presence{ type = "unavailable" }; if (not err) or err == "closed" then err = "connection closed"; end - pres:tag("status"):text("Disconnected: "..err); + pres:tag("status"):text("Disconnected: "..err):up(); session:dispatch_stanza(pres); end @@ -93,6 +94,7 @@ function make_authenticated(session, username) if session.type == "c2s_unauthed" then session.type = "c2s"; end + session.log("info", "Authenticated as %s@%s", username or "(unknown)", session.host or "(unknown)"); return true; end @@ -126,10 +128,13 @@ function bind_resource(session, resource) elseif policy == "kick_new" then return nil, "cancel", "conflict", "Resource already exists"; else -- if policy == "kick_old" then - hosts[session.host].sessions[session.username].sessions[resource]:close { + sessions[resource]:close { condition = "conflict"; text = "Replaced by new connection"; }; + if not next(sessions) then + hosts[session.host].sessions[session.username] = { sessions = sessions }; + end end if increment and sessions[resource] then local count = 1; @@ -151,30 +156,34 @@ function bind_resource(session, resource) end function streamopened(session, attr) - local send = session.send; - 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); - (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:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; - return; - end - - - local features = st.stanza("stream:features"); - fire_event("stream-features", session, features); - - send(features); + local send = session.send; + session.host = attr.to or error("Client failed to specify destination hostname"); + session.host = nameprep(session.host); + session.version = tonumber(attr.version) or 0; + session.streamid = m_random(1000000, 99999999); + (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:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; + return; + end - (session.log or log)("info", "Sent reply to client"); - session.notopen = nil; + local features = st.stanza("stream:features"); + fire_event("stream-features", session, features); + + send(features); + + (session.log or log)("debug", "Sent reply to client"); + session.notopen = nil; +end + +function streamclosed(session) + session.send(""); + session.notopen = true; end function send_to_available_resources(user, host, stanza)