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 2011/06/22 17:43:02 UTC
svn commit: r1138511 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/ItemSaveOperation.java
test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java
Author: angela
Date: Wed Jun 22 15:43:02 2011
New Revision: 1138511
URL: http://svn.apache.org/viewvc?rev=1138511&view=rev
Log:
JCR-2999 - Access control evaluation does not properly cope with XA transactions
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java?rev=1138511&r1=1138510&r2=1138511&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java Wed Jun 22 15:43:02 2011
@@ -776,7 +776,7 @@ class ItemSaveOperation implements Sessi
nodeState);
if (nt.includesNodeType(NameConstants.MIX_VERSIONABLE)) {
if (!nodeState.hasPropertyName(NameConstants.JCR_VERSIONHISTORY)) {
- NodeImpl node = (NodeImpl) itemMgr.getItem(itemState.getId());
+ NodeImpl node = (NodeImpl) itemMgr.getItem(itemState.getId(), false);
InternalVersionManager vMgr = session.getInternalVersionManager();
/**
* check if there's already a version history for that
@@ -812,7 +812,7 @@ class ItemSaveOperation implements Sessi
vMgr.getVersionHistory(session, nodeState, null);
// create isCheckedOutProperty if not already exists
- NodeImpl node = (NodeImpl) itemMgr.getItem(itemState.getId());
+ NodeImpl node = (NodeImpl) itemMgr.getItem(itemState.getId(), false);
if (!nodeState.hasPropertyName(NameConstants.JCR_ISCHECKEDOUT)) {
node.internalSetProperty(
NameConstants.JCR_ISCHECKEDOUT,
@@ -833,7 +833,7 @@ class ItemSaveOperation implements Sessi
throws RepositoryException {
for (ItemState state : states) {
// persist state of transient item
- itemMgr.getItem(state.getId()).makePersistent();
+ itemMgr.getItem(state.getId(), false).makePersistent();
}
}
@@ -860,7 +860,7 @@ class ItemSaveOperation implements Sessi
itemState.setStatus(ItemState.STATUS_NEW);
} else {
try {
- item = itemMgr.getItem(id);
+ item = itemMgr.getItem(id, false);
} catch (ItemNotFoundException infe) {
// itemState probably represents a 'new' item and the
// ItemImpl instance wrapping it has already been gc'ed;
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java?rev=1138511&r1=1138510&r2=1138511&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractWriteTest.java Wed Jun 22 15:43:02 2011
@@ -20,6 +20,7 @@ import org.apache.jackrabbit.api.Jackrab
import org.apache.jackrabbit.api.JackrabbitWorkspace;
import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.core.UserTransactionImpl;
import org.apache.jackrabbit.test.JUnitTest;
import org.apache.jackrabbit.test.NotExecutableException;
import org.apache.jackrabbit.test.api.observation.EventResult;
@@ -40,6 +41,7 @@ import javax.jcr.observation.Observation
import javax.jcr.security.AccessControlManager;
import javax.jcr.security.AccessControlPolicy;
import javax.jcr.security.Privilege;
+import javax.transaction.UserTransaction;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
@@ -1255,6 +1257,51 @@ public abstract class AbstractWriteTest
assertFalse(testSession.hasPermission(childNPath2, Session.ACTION_SET_PROPERTY));
}
+ /**
+ * Tests if it is possible to create/read nodes with a non-admin session
+ * within a transaction.
+ *
+ * @throws Exception
+ * @see <a href="https://issues.apache.org/jira/browse/JCR-2999">JCR-2999</a>
+ */
+ public void testTransaction() throws Exception {
+
+ // make sure testUser has all privileges
+ Privilege[] privileges = privilegesFromName(Privilege.JCR_ALL);
+ givePrivileges(path, privileges, getRestrictions(superuser, path));
+
+ // create new node and lock it
+ Session s = getTestSession();
+ UserTransaction utx = new UserTransactionImpl(s);
+ utx.begin();
+
+ // add node and save it
+ Node n = s.getNode(childNPath);
+ if (n.hasNode(nodeName1)) {
+ Node c = n.getNode(nodeName1);
+ c.remove();
+ s.save();
+ }
+
+ // create node and save
+ Node n2 = n.addNode(nodeName1);
+ s.save(); // -> node is NEW -> no failure
+
+ // create child node
+ Node n3 = n2.addNode(nodeName2);
+ s.save(); // -> used to fail because n2 was saved (EXISTING) but not committed.
+
+ n3.remove();
+ n2.remove();
+
+ // recreate n2 // -> another area where ItemManager#getItem is called in the ItemSaveOperation
+ n2 = n.addNode(nodeName1);
+ s.save();
+
+ // commit
+ utx.commit();
+ }
+
private static Node findPolicyNode(Node start) throws RepositoryException {
Node policyNode = null;
if (start.isNodeType("rep:Policy")) {