sessionmanager: Fire pre-resource-unbind to allow plugins (such as mod_smacks) to...
authorMatthew Wild <mwild1@gmail.com>
Tue, 29 Mar 2011 13:10:00 +0000 (14:10 +0100)
committerMatthew Wild <mwild1@gmail.com>
Tue, 29 Mar 2011 13:10:00 +0000 (14:10 +0100)
core/sessionmanager.lua

index d36591bfb34c2218c01c84388796409dbda57a88..426763f51b575a06fa922a097d63cf1b36aeb134 100644 (file)
@@ -108,16 +108,23 @@ function destroy_session(session, err)
        
        -- Remove session/resource from user's session list
        if session.full_jid then
-               hosts[session.host].sessions[session.username].sessions[session.resource] = nil;
+               local host_session = hosts[session.host];
+               
+               -- Allow plugins to prevent session destruction
+               if host_session.events.fire_event("pre-resource-unbind", {session=session, error=err}) then
+                       return;
+               end
+               
+               host_session.sessions[session.username].sessions[session.resource] = nil;
                full_sessions[session.full_jid] = nil;
                
-               if not next(hosts[session.host].sessions[session.username].sessions) then
+               if not next(host_session.sessions[session.username].sessions) then
                        log("debug", "All resources of %s are now offline", session.username);
-                       hosts[session.host].sessions[session.username] = nil;
+                       host_session.sessions[session.username] = nil;
                        bare_sessions[session.username..'@'..session.host] = nil;
                end
 
-               hosts[session.host].events.fire_event("resource-unbind", {session=session, error=err});
+               host_session.events.fire_event("resource-unbind", {session=session, error=err});
        end
        
        retire_session(session);