X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=core%2Fsessionmanager.lua;h=68493d87cb506e6cf90d6e2dad0839801ada87b6;hb=34215744d79b2fcf146b69a59007d104085dff4a;hp=a597e724ba90c13871f947e62b170b891395713f;hpb=087bc8fd635ce8cc42fb5952b1ab5c2043244738;p=prosody.git diff --git a/core/sessionmanager.lua b/core/sessionmanager.lua index a597e724..68493d87 100644 --- a/core/sessionmanager.lua +++ b/core/sessionmanager.lua @@ -1,20 +1,9 @@ --- Prosody IM v0.1 --- 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 program is free software; you can redistribute it and/or --- modify it under the terms of the GNU General Public License --- as published by the Free Software Foundation; either version 2 --- of the License, or (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. -- @@ -34,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; @@ -55,21 +45,22 @@ 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(); return session; 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); - session.stanza_dispatch(pres); + pres:tag("status"):text("Disconnected: "..err):up(); + session:dispatch_stanza(pres); end -- Remove session/resource from user's session list @@ -103,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 @@ -113,8 +105,6 @@ function bind_resource(session, resource) if session.resource then return nil, "cancel", "already-bound", "Cannot bind multiple resources on a single connection"; end -- We don't support binding multiple resources - session.conntimetotal = gettime()-session.conntime; - resource = resource or uuid_generate(); --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing @@ -138,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; @@ -163,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) @@ -209,4 +206,4 @@ function send_to_available_resources(user, host, stanza) return count; end -return _M; \ No newline at end of file +return _M;