You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2009/03/26 15:12:10 UTC

svn commit: r758654 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/core/security/user/ test/java/org/apache/jackrabbit/core/security/user/

Author: angela
Date: Thu Mar 26 14:11:57 2009
New Revision: 758654

URL: http://svn.apache.org/viewvc?rev=758654&view=rev
Log:
JCR-1588: Access Control

- dispose user manager upon session.logout

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/DefaultSecurityManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/UserManagerImpl.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/DefaultSecurityManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/DefaultSecurityManager.java?rev=758654&r1=758653&r2=758654&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/DefaultSecurityManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/DefaultSecurityManager.java Thu Mar 26 14:11:57 2009
@@ -322,8 +322,15 @@
             String workspaceName = securitySession.getWorkspace().getName();
             try {
                 SessionImpl sImpl = (SessionImpl) session;
-                SessionImpl s = (SessionImpl) sImpl.createSession(workspaceName);
-                return new UserManagerImpl(s, adminId);
+                UserManagerImpl uMgr;
+                if (workspaceName.equals(sImpl.getWorkspace().getName())) {
+                    uMgr = new UserManagerImpl(sImpl, adminId);
+                } else {
+                    SessionImpl s = (SessionImpl) sImpl.createSession(workspaceName);
+                    uMgr = new UserManagerImpl(s, adminId);
+                    sImpl.addListener(uMgr);
+                }
+                return uMgr;
             } catch (NoSuchWorkspaceException e) {
                 throw new AccessControlException("Cannot build UserManager for " + session.getUserID(), e);
             }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/UserManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/UserManagerImpl.java?rev=758654&r1=758653&r2=758654&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/UserManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/UserManagerImpl.java Thu Mar 26 14:11:57 2009
@@ -25,6 +25,7 @@
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.ProtectedItemModifier;
 import org.apache.jackrabbit.core.SessionImpl;
+import org.apache.jackrabbit.core.SessionListener;
 import org.apache.jackrabbit.core.security.principal.ItemBasedPrincipal;
 import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
 import org.apache.jackrabbit.spi.Name;
@@ -54,7 +55,7 @@
 /**
  * UserManagerImpl
  */
-public class UserManagerImpl extends ProtectedItemModifier implements UserManager, UserConstants {
+public class UserManagerImpl extends ProtectedItemModifier implements UserManager, UserConstants, SessionListener {
 
     private static final Logger log = LoggerFactory.getLogger(UserManagerImpl.class);
 
@@ -511,6 +512,26 @@
         return parent;
     }
 
+    //----------------------------------------------------< SessionListener >---
+    /**
+     * @see SessionListener#loggingOut(org.apache.jackrabbit.core.SessionImpl)
+     */
+    public void loggingOut(SessionImpl session) {
+        // nothing to do.
+    }
+
+    /**
+     * @see SessionListener#loggedOut(org.apache.jackrabbit.core.SessionImpl) 
+     */
+    public void loggedOut(SessionImpl session) {
+        // clear the map
+        idPathMap.clear();
+        // and logout the session unless it is the loggedout session itself.
+        if (session != this.session) {
+            this.session.logout();
+        }
+    }
+
     //--------------------------------------------------------------------------
     /**
      * Inner class

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java?rev=758654&r1=758653&r2=758654&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java Thu Mar 26 14:11:57 2009
@@ -388,4 +388,52 @@
             // ok.
         }
     }
+
+    public void testCleanup() throws RepositoryException, NotExecutableException {
+        Session s = helper.getSuperuserSession();
+        try {
+            UserManager umgr = getUserManager(s);
+            s.logout();
+
+            // after logging out the session, the user manager must have been
+            // released as well and it's underlying session must not be available
+            // any more -> accessing users must fail.
+            try {
+                umgr.getAuthorizable("any userid");
+                fail("After having logged out the original session, the user manager must not be live any more.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        } finally {
+            if (s.isLive()) {
+                s.logout();
+            }
+        }
+    }
+
+    public void testCleanupForAllWorkspaces() throws RepositoryException, NotExecutableException {
+        String[] workspaceNames = superuser.getWorkspace().getAccessibleWorkspaceNames();
+
+        for (int i = 0; i < workspaceNames.length; i++) {
+            Session s = helper.getSuperuserSession(workspaceNames[i]);
+            try {
+                UserManager umgr = getUserManager(s);
+                s.logout();
+
+                // after logging out the session, the user manager must have been
+                // released as well and it's underlying session must not be available
+                // any more -> accessing users must fail.
+                try {
+                    umgr.getAuthorizable("any userid");
+                    fail("After having logged out the original session, the user manager must not be live any more.");
+                } catch (RepositoryException e) {
+                    // success
+                }
+            } finally {
+                if (s.isLive()) {
+                    s.logout();
+                }
+            }
+        }
+    }
 }
\ No newline at end of file