moduleapi: Import util.stanza required for module:broadcast()
[prosody.git] / core / sessionmanager.lua
index 09920b7dc1a78eaa115af8e2bdfd05f5d39f7369..d833dbe50f409538d0592beca373a238f2e2345a 100644 (file)
@@ -114,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
@@ -183,8 +193,8 @@ 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