[exo-jcr-commits] exo-jcr SVN: r3475 - in jcr/branches/1.12.x/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/core/version and 2 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Nov 17 10:40:06 EST 2010
Author: tolusha
Date: 2010-11-17 10:40:05 -0500 (Wed, 17 Nov 2010)
New Revision: 3475
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/TransientNodeData.java
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java
Log:
JCR-1509: fix issue with ACL inconsistence when node have been put to version storage
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java 2010-11-17 15:29:19 UTC (rev 3474)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java 2010-11-17 15:40:05 UTC (rev 3475)
@@ -21,6 +21,7 @@
import org.exoplatform.services.jcr.access.AccessControlEntry;
import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.access.AccessControlPolicy;
+import org.exoplatform.services.jcr.access.PermissionType;
import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
@@ -326,16 +327,49 @@
}
// init version storage
+ AccessControlList acl = new AccessControlList();
+ acl.removePermissions(SystemIdentity.ANY);
+ acl.addPermissions(SystemIdentity.ANY, new String[]{PermissionType.READ});
+
+ for (AccessControlEntry entry : jcrSystem.getACL().getPermissionEntries())
+ {
+ String identity = entry.getIdentity();
+ String permission = entry.getPermission();
+
+ if (!identity.equals(SystemIdentity.ANY) || !permission.equals(PermissionType.READ))
+ {
+ acl.addPermissions(identity, new String[]{permission});
+ }
+ }
+
TransientNodeData versionStorageNodeData =
TransientNodeData.createNodeData(jcrSystem, Constants.JCR_VERSIONSTORAGE, Constants.EXO_VERSIONSTORAGE,
- Constants.VERSIONSTORAGE_UUID);
+ Constants.VERSIONSTORAGE_UUID, acl);
TransientPropertyData vsPrimaryType =
TransientPropertyData.createPropertyData(versionStorageNodeData, Constants.JCR_PRIMARYTYPE, PropertyType.NAME,
false, new TransientValueData(versionStorageNodeData.getPrimaryTypeName()));
- changesLog.add(ItemState.createAddedState(versionStorageNodeData)).add(ItemState.createAddedState(vsPrimaryType));
+ TransientPropertyData exoMixinTypes =
+ TransientPropertyData.createPropertyData(versionStorageNodeData, Constants.JCR_MIXINTYPES, PropertyType.NAME,
+ true, new TransientValueData(Constants.EXO_PRIVILEGEABLE));
+ List<ValueData> permsValues = new ArrayList<ValueData>();
+ for (int i = 0; i < acl.getPermissionEntries().size(); i++)
+ {
+ AccessControlEntry entry = acl.getPermissionEntries().get(i);
+ permsValues.add(new TransientValueData(entry));
+ }
+ TransientPropertyData exoPerms =
+ TransientPropertyData.createPropertyData(versionStorageNodeData, Constants.EXO_PERMISSIONS,
+ ExtendedPropertyType.PERMISSION, true, permsValues);
+
+ changesLog.add(ItemState.createAddedState(versionStorageNodeData));
+ changesLog.add(ItemState.createAddedState(vsPrimaryType));
+ changesLog.add(ItemState.createAddedState(exoMixinTypes));
+ changesLog.add(ItemState.createAddedState(exoPerms));
+ changesLog.add(new ItemState(versionStorageNodeData, ItemState.MIXIN_CHANGED, false, null));
+
dataManager.save(new TransactionChangesLog(changesLog));
return jcrSystem;
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java 2010-11-17 15:29:19 UTC (rev 3474)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java 2010-11-17 15:40:05 UTC (rev 3475)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.services.jcr.impl.core.version;
+import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
@@ -249,12 +250,15 @@
}
else if (action == OnParentVersionAction.COPY)
{
+ AccessControlList acl =
+ ntManager.isNodeType(Constants.EXO_PRIVILEGEABLE, node.getPrimaryTypeName(), node.getMixinTypeNames())
+ ? node.getACL() : currentNode().getACL();
QPath frozenPath = QPath.makeChildPath(currentNode().getQPath(), qname, node.getQPath().getIndex());
frozenNode =
new TransientNodeData(frozenPath, IdGenerator.generate(), node.getPersistedVersion(), node
.getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(), currentNode().getIdentifier(), // parent
- node.getACL());
+ acl);
contextNodes.push(frozenNode);
changesLog.add(ItemState.createAddedState(frozenNode));
@@ -286,12 +290,16 @@
}
else
{ // behaviour of COPY
+ AccessControlList acl =
+ ntManager.isNodeType(Constants.EXO_PRIVILEGEABLE, node.getPrimaryTypeName(), node.getMixinTypeNames())
+ ? node.getACL() : currentNode().getACL();
+
QPath frozenPath = QPath.makeChildPath(currentNode().getQPath(), qname, node.getQPath().getIndex());
frozenNode =
new TransientNodeData(frozenPath, IdGenerator.generate(), node.getPersistedVersion(), node
.getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
currentNode().getIdentifier(), // parent
- node.getACL());
+ acl);
contextNodes.push(frozenNode);
changesLog.add(ItemState.createAddedState(frozenNode));
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/TransientNodeData.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/TransientNodeData.java 2010-11-17 15:29:19 UTC (rev 3474)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/TransientNodeData.java 2010-11-17 15:40:05 UTC (rev 3475)
@@ -239,6 +239,27 @@
return nodeData;
}
+ /**
+ * Factory method
+ *
+ * @param parent NodeData
+ * @param name InternalQName
+ * @param primaryTypeName InternalQName
+ * @param identifier String
+ * @param acl AccessControlList
+ * @return
+ */
+ public static TransientNodeData createNodeData(NodeData parent, InternalQName name, InternalQName primaryTypeName,
+ String identifier, AccessControlList acl)
+ {
+ TransientNodeData nodeData = null;
+ QPath path = QPath.makeChildPath(parent.getQPath(), name);
+ nodeData =
+ new TransientNodeData(path, identifier, -1, primaryTypeName, new InternalQName[0], 0, parent.getIdentifier(),
+ acl);
+ return nodeData;
+ }
+
// ------------- Comparable /////
public int compareTo(Object obj)
@@ -254,6 +275,7 @@
this.acl = new AccessControlList();
}
+ @Override
public void writeExternal(ObjectOutput out) throws IOException
{
super.writeExternal(out);
@@ -277,6 +299,7 @@
acl.writeExternal(out);
}
+ @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
super.readExternal(in);
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java 2010-11-17 15:29:19 UTC (rev 3474)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java 2010-11-17 15:40:05 UTC (rev 3475)
@@ -90,6 +90,17 @@
@Override
public void tearDown() throws Exception
{
+ if (sessionWS1.getRootNode().hasNode("MARY-ReadOnly"))
+ {
+ sessionWS1.getRootNode().getNode("MARY-ReadOnly").remove();
+ }
+
+ if (sessionWS1.getRootNode().hasNode("MARY-ReadWrite"))
+ {
+ sessionWS1.getRootNode().getNode("MARY-ReadWrite").remove();
+ }
+ sessionWS1.save();
+
sessionMaryWS.logout();
sessionMaryWS1.logout();
sessionWS.logout();
@@ -247,4 +258,42 @@
{
}
}
+
+ public void testAccessPermission() throws Exception
+ {
+ // At creation time
+ NodeImpl node = (NodeImpl)sessionWS1.getRootNode().addNode("testAccessPermission");
+ node.addMixin("mix:versionable");
+ sessionWS1.save();
+ node.addMixin("exo:privilegeable");
+ node.getSession().save();
+ node.setPermission("admin", new String[]{"read", "add_node", "set_property", "remove"});
+ node.removePermission(SystemIdentity.ANY);
+ NodeImpl subNode = (NodeImpl)node.addNode("subNode");
+ node.getSession().save();
+ node.checkin();
+ node.setPermission(SystemIdentity.ANY, new String[]{"read"});
+ node.getSession().save();
+ SessionImpl sessionJohnWS1 = null;
+
+ try
+ {
+ Credentials credentials = new CredentialsImpl("john", "exo".toCharArray());
+ sessionJohnWS1 = (SessionImpl)repositoryService.getRepository("db2").login(credentials, "ws1");
+ Node vNode = sessionJohnWS1.getRootNode().getNode("testAccessPermission");
+ assertNotNull(vNode);
+ vNode = vNode.getVersionHistory().getVersion("1");
+ assertNotNull(vNode);
+ vNode = vNode.getNode("jcr:frozenNode");
+ assertNotNull(vNode);
+ assertNotNull(vNode.getNode("subNode"));
+ }
+ finally
+ {
+ if (sessionJohnWS1 != null)
+ {
+ sessionJohnWS1.logout();
+ }
+ }
+ }
}
More information about the exo-jcr-commits
mailing list