portmanager: Add luacheck annotations
[prosody.git] / core / sessionmanager.lua
index 5f7f688eb90ce61e712b5b0c2074f03df3370529..33cc3d21f6ec4c11d55e8e2198288f78e43fcdb4 100644 (file)
@@ -10,8 +10,8 @@ local tostring, setmetatable = tostring, setmetatable;
 local pairs, next= pairs, next;
 
 local hosts = hosts;
-local full_sessions = full_sessions;
-local bare_sessions = bare_sessions;
+local full_sessions = prosody.full_sessions;
+local bare_sessions = prosody.bare_sessions;
 
 local logger = require "util.logger";
 local log = logger.init("sessionmanager");
@@ -54,11 +54,11 @@ local resting_session = { -- Resting, not dead
                close = function (session)
                        session.log("debug", "Attempt to close already-closed session");
                end;
-               filter = function (type, data) return data; end;
+               filter = function (type, data) return data; end; --luacheck: ignore 212/type
        }; resting_session.__index = resting_session;
 
 function retire_session(session)
-       local log = session.log or log;
+       local log = session.log or log; --luacheck: ignore 431/log
        for k in pairs(session) do
                if k ~= "log" and k ~= "id" then
                        session[k] = nil;
@@ -67,6 +67,7 @@ function retire_session(session)
 
        function session.send(data) log("debug", "Discarding data sent to resting session: %s", tostring(data)); return false; end
        function session.data(data) log("debug", "Discarding data received from resting session: %s", tostring(data)); end
+       session.thread = { run = function (_, data) return session.data(data) end };
        return setmetatable(session, resting_session);
 end
 
@@ -113,9 +114,19 @@ end
 -- returns nil, err_type, err, err_message on failure
 function bind_resource(session, resource)
        if not session.username then return nil, "auth", "not-authorized", "Cannot bind resource before authentication"; end
-       if session.resource then return nil, "cancel", "already-bound", "Cannot bind multiple resources on a single connection"; end
+       if session.resource then return nil, "cancel", "not-allowed", "Cannot bind multiple resources on a single connection"; end
        -- We don't support binding multiple resources
 
+       local event_payload = { session = session, resource = resource };
+       if hosts[session.host].events.fire_event("pre-resource-bind", event_payload) == false then
+               local err = event_payload.error;
+               if err then return nil, err.type, err.condition, err.text; end
+               return nil, "cancel", "not-allowed";
+       else
+               -- In case a plugin wants to poke at it
+               resource = event_payload.resource;
+       end
+
        resource = resourceprep(resource);
        resource = resource ~= "" and resource or uuid_generate();
        --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
@@ -182,12 +193,12 @@ function bind_resource(session, resource)
        return true;
 end
 
-function send_to_available_resources(user, host, stanza)
-       local jid = user.."@"..host;
+function send_to_available_resources(username, host, stanza)
+       local jid = username.."@"..host;
        local count = 0;
        local user = bare_sessions[jid];
        if user then
-               for k, session in pairs(user.sessions) do
+               for _, session in pairs(user.sessions) do
                        if session.presence then
                                session.send(stanza);
                                count = count + 1;
@@ -197,12 +208,12 @@ function send_to_available_resources(user, host, stanza)
        return count;
 end
 
-function send_to_interested_resources(user, host, stanza)
-       local jid = user.."@"..host;
+function send_to_interested_resources(username, host, stanza)
+       local jid = username.."@"..host;
        local count = 0;
        local user = bare_sessions[jid];
        if user then
-               for k, session in pairs(user.sessions) do
+               for _, session in pairs(user.sessions) do
                        if session.interested then
                                session.send(stanza);
                                count = count + 1;