[dna-commits] DNA SVN: r1411 - in trunk/dna-jcr/src: test/java/org/jboss/dna/jcr and 1 other directory.

dna-commits at lists.jboss.org dna-commits at lists.jboss.org
Sat Dec 5 20:00:08 EST 2009


Author: bcarothers
Date: 2009-12-05 20:00:08 -0500 (Sat, 05 Dec 2009)
New Revision: 1411

Modified:
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
   trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
   trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
Log:
DNA-541 Locking Implementation Does Not Support Timeouts

Applied patch that adds a new permission (granted to anyone with the admin role) that allows them to break any locks. This will at least give DNA administrators an ability to manually clean up any dangling locks.

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-12-06 00:54:08 UTC (rev 1410)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java	2009-12-06 01:00:08 UTC (rev 1411)
@@ -24,6 +24,7 @@
 package org.jboss.dna.jcr;
 
 import java.io.InputStream;
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
@@ -1399,8 +1400,13 @@
             throw new LockException(JcrI18n.notLocked.text(this.location));
         }
 
-        if (!cache.session().lockTokens().contains(lock.getLockToken())) {
-            throw new LockException(JcrI18n.lockTokenNotHeld.text(this.location));
+        if (!session().lockTokens().contains(lock.getLockToken())) {
+            try {
+                // See if the user has the permission to break someone else's lock
+                session().checkPermission(cache.workspaceName(), null, JcrSession.DNA_UNLOCK_ANY_PERMISSION);
+            } catch (AccessControlException iae) {
+                throw new LockException(JcrI18n.lockTokenNotHeld.text(this.location));
+            }
         }
 
         session().workspace().lockManager().unlock(session(), lock);
@@ -1651,8 +1657,8 @@
         if (destChildRelPath != null) {
             Path destPath = pathFactory.create(destChildRelPath);
             if (destPath.isAbsolute() || destPath.size() != 1) {
-                throw new ItemNotFoundException(JcrI18n.pathNotFound.text(destPath.getString(cache.context()
-                                                                                                  .getNamespaceRegistry()),
+                throw new ItemNotFoundException(
+                                                JcrI18n.pathNotFound.text(destPath.getString(cache.context().getNamespaceRegistry()),
                                                                           cache.session().workspace().getName()));
             }
 

Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-12-06 00:54:08 UTC (rev 1410)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java	2009-12-06 01:00:08 UTC (rev 1411)
@@ -92,6 +92,7 @@
 
     public static final String DNA_REGISTER_NAMESPACE_PERMISSION = "register_namespace";
     public static final String DNA_REGISTER_TYPE_PERMISSION = "register_type";
+    public static final String DNA_UNLOCK_ANY_PERMISSION = "unlock_any";
 
     public static final String JCR_ADD_NODE_PERMISSION = "add_node";
     public static final String JCR_SET_PROPERTY_PERMISSION = "set_property";
@@ -389,7 +390,8 @@
             if (JCR_READ_PERMISSION.equals(action)) {
                 hasPermission &= hasRole(DNA_READ_PERMISSION, workspaceName) || hasRole(DNA_WRITE_PERMISSION, workspaceName)
                                  || hasRole(DNA_ADMIN_PERMISSION, workspaceName);
-            } else if (DNA_REGISTER_NAMESPACE_PERMISSION.equals(action) || DNA_REGISTER_TYPE_PERMISSION.equals(action)) {
+            } else if (DNA_REGISTER_NAMESPACE_PERMISSION.equals(action) || DNA_REGISTER_TYPE_PERMISSION.equals(action)
+                       || DNA_UNLOCK_ANY_PERMISSION.equals(action)) {
                 hasPermission &= hasRole(DNA_ADMIN_PERMISSION, workspaceName);
             } else {
                 hasPermission &= hasRole(DNA_ADMIN_PERMISSION, workspaceName) || hasRole(DNA_WRITE_PERMISSION, workspaceName);

Modified: trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java
===================================================================
--- trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-12-06 00:54:08 UTC (rev 1410)
+++ trunk/dna-jcr/src/test/java/org/jboss/dna/jcr/DnaTckTest.java	2009-12-06 01:00:08 UTC (rev 1411)
@@ -432,4 +432,26 @@
         }
 
     }
+
+    public void testAdminUserCanBreakOthersLocks() throws Exception {
+        String lockNodeName = "lockTestNode";
+        session = helper.getReadWriteSession();
+        Node root = session.getRootNode();
+        Node lockNode = root.addNode(lockNodeName);
+        lockNode.addMixin("mix:lockable");
+        session.save();
+
+        lockNode.lock(false, false);
+        assertThat(lockNode.isLocked(), is(true));
+
+        Session superuser = helper.getSuperuserSession();
+        root = superuser.getRootNode();
+        lockNode = root.getNode(lockNodeName);
+
+        assertThat(lockNode.isLocked(), is(true));
+        lockNode.unlock();
+        assertThat(lockNode.isLocked(), is(false));
+        superuser.logout();
+
+    }
 }



More information about the dna-commits mailing list