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();
+
+ }
}
Show replies by date