mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-09-10 14:11:58 +00:00
Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3ebeac2eb4 | ||
|
d91a552925 | ||
|
8c91145b39 | ||
|
86fcf67016 | ||
|
48c85ec24f | ||
|
f446031069 | ||
|
a9dabb0e99 | ||
|
bdc95019ae | ||
|
ace87c9c3b | ||
|
af8b556bf8 | ||
|
5990fadb3b | ||
|
08b62afb10 | ||
|
d4bae73b86 |
@@ -177,6 +177,11 @@ jobs:
|
|||||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||||
|
|
||||||
|
- name: "Repository - Messaging tests"
|
||||||
|
before_script:
|
||||||
|
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||||
|
script: travis_wait 20 mvn -B test -pl repository -Dtest=CamelRoutesTest,CamelComponentsTest
|
||||||
|
|
||||||
- name: "Remote-api - AppContext01TestSuite"
|
- name: "Remote-api - AppContext01TestSuite"
|
||||||
before_script:
|
before_script:
|
||||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.1 postgres -c 'max_connections=300'
|
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.1 postgres -c 'max_connections=300'
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
@@ -9,6 +9,6 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
</project>
|
</project>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
6
pom.xml
6
pom.xml
@@ -2,7 +2,7 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>Alfresco Community Repo Parent</name>
|
<name>Alfresco Community Repo Parent</name>
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<acs.version.major>7</acs.version.major>
|
<acs.version.major>7</acs.version.major>
|
||||||
<acs.version.minor>0</acs.version.minor>
|
<acs.version.minor>0</acs.version.minor>
|
||||||
<acs.version.revision>0</acs.version.revision>
|
<acs.version.revision>1</acs.version.revision>
|
||||||
<acs.version.label />
|
<acs.version.label />
|
||||||
|
|
||||||
<version.edition>Community</version.edition>
|
<version.edition>Community</version.edition>
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
<connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
|
<connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
|
||||||
<developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
|
<developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
|
||||||
<url>https://github.com/Alfresco/alfresco-community-repo</url>
|
<url>https://github.com/Alfresco/alfresco-community-repo</url>
|
||||||
<tag>HEAD</tag>
|
<tag>9.3</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-community-repo</artifactId>
|
<artifactId>alfresco-community-repo</artifactId>
|
||||||
<version>8.424-SNAPSHOT</version>
|
<version>9.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@@ -1483,7 +1483,17 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
|
|||||||
|
|
||||||
// Update ACLs for moved tree
|
// Update ACLs for moved tree
|
||||||
Long newParentAclId = newParentNode.getAclId();
|
Long newParentAclId = newParentNode.getAclId();
|
||||||
accessControlListDAO.updateInheritance(newChildNodeId, oldParentAclId, newParentAclId);
|
|
||||||
|
// Verify if parent has aspect applied and ACL's are pending
|
||||||
|
if (hasNodeAspect(oldParentNodeId, ContentModel.ASPECT_PENDING_FIX_ACL))
|
||||||
|
{
|
||||||
|
Long oldParentSharedAclId = (Long) this.getNodeProperty(oldParentNodeId, ContentModel.PROP_SHARED_ACL_TO_REPLACE);
|
||||||
|
accessControlListDAO.updateInheritance(newChildNodeId, oldParentSharedAclId, newParentAclId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
accessControlListDAO.updateInheritance(newChildNodeId, oldParentAclId, newParentAclId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
|
@@ -337,6 +337,13 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
setFixedAcls(getNodeIdNotNull(parent), inheritFrom, null, sharedAclToReplace, changes, false, asyncCall, true);
|
setFixedAcls(getNodeIdNotNull(parent), inheritFrom, null, sharedAclToReplace, changes, false, asyncCall, true);
|
||||||
return changes;
|
return changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<AclChange> setInheritanceForChildren(NodeRef parent, Long inheritFrom, Long sharedAclToReplace, boolean asyncCall, boolean forceSharedACL)
|
||||||
|
{
|
||||||
|
List<AclChange> changes = new ArrayList<AclChange>();
|
||||||
|
setFixedAcls(getNodeIdNotNull(parent), inheritFrom, null, sharedAclToReplace, changes, false, asyncCall, true, forceSharedACL);
|
||||||
|
return changes;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateChangedAcls(NodeRef startingPoint, List<AclChange> changes)
|
public void updateChangedAcls(NodeRef startingPoint, List<AclChange> changes)
|
||||||
{
|
{
|
||||||
@@ -362,6 +369,29 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
setFixedAcls(nodeId, inheritFrom, mergeFrom, sharedAclToReplace, changes, set, false, true);
|
setFixedAcls(nodeId, inheritFrom, mergeFrom, sharedAclToReplace, changes, set, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Support to set a shared ACL on a node and all of its children
|
||||||
|
*
|
||||||
|
* @param nodeId
|
||||||
|
* the parent node
|
||||||
|
* @param inheritFrom
|
||||||
|
* the parent node's ACL
|
||||||
|
* @param mergeFrom
|
||||||
|
* the shared ACL, if already known. If <code>null</code>, will be retrieved / created lazily
|
||||||
|
* @param changes
|
||||||
|
* the list in which to record changes
|
||||||
|
* @param set
|
||||||
|
* set the shared ACL on the parent ?
|
||||||
|
* @param asyncCall
|
||||||
|
* function may require asynchronous call depending the execution time; if time exceeds configured <code>fixedAclMaxTransactionTime</code> value,
|
||||||
|
* recursion is stopped using propagateOnChildren parameter(set on false) and those nodes for which the method execution was not finished
|
||||||
|
* in the classical way, will have ASPECT_PENDING_FIX_ACL, which will be used in {@link FixedAclUpdater} for later processing
|
||||||
|
*/
|
||||||
|
public void setFixedAcls(Long nodeId, Long inheritFrom, Long mergeFrom, Long sharedAclToReplace, List<AclChange> changes, boolean set, boolean asyncCall, boolean propagateOnChildren)
|
||||||
|
{
|
||||||
|
setFixedAcls(nodeId, inheritFrom, mergeFrom, sharedAclToReplace, changes, set, false, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Support to set a shared ACL on a node and all of its children
|
* Support to set a shared ACL on a node and all of its children
|
||||||
*
|
*
|
||||||
@@ -379,8 +409,10 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
* function may require asynchronous call depending the execution time; if time exceeds configured <code>fixedAclMaxTransactionTime</code> value,
|
* function may require asynchronous call depending the execution time; if time exceeds configured <code>fixedAclMaxTransactionTime</code> value,
|
||||||
* recursion is stopped using propagateOnChildren parameter(set on false) and those nodes for which the method execution was not finished
|
* recursion is stopped using propagateOnChildren parameter(set on false) and those nodes for which the method execution was not finished
|
||||||
* in the classical way, will have ASPECT_PENDING_FIX_ACL, which will be used in {@link FixedAclUpdater} for later processing
|
* in the classical way, will have ASPECT_PENDING_FIX_ACL, which will be used in {@link FixedAclUpdater} for later processing
|
||||||
|
* @param forceSharedACL
|
||||||
|
* When a child node has an unexpected ACL, force it to assume the new shared ACL instead of throwing a concurrency exception.
|
||||||
*/
|
*/
|
||||||
public void setFixedAcls(Long nodeId, Long inheritFrom, Long mergeFrom, Long sharedAclToReplace, List<AclChange> changes, boolean set, boolean asyncCall, boolean propagateOnChildren)
|
public void setFixedAcls(Long nodeId, Long inheritFrom, Long mergeFrom, Long sharedAclToReplace, List<AclChange> changes, boolean set, boolean asyncCall, boolean propagateOnChildren, boolean forceSharedACL)
|
||||||
{
|
{
|
||||||
if (log.isDebugEnabled())
|
if (log.isDebugEnabled())
|
||||||
{
|
{
|
||||||
@@ -431,14 +463,14 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
|
|
||||||
if (acl == null)
|
if (acl == null)
|
||||||
{
|
{
|
||||||
propagateOnChildren = setFixAclPending(child.getId(), inheritFrom, mergeFrom, sharedAclToReplace, changes, false, asyncCall, propagateOnChildren);
|
propagateOnChildren = setFixAclPending(child.getId(), inheritFrom, mergeFrom, sharedAclToReplace, changes, false, asyncCall, propagateOnChildren, forceSharedACL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Still has old shared ACL or already replaced
|
// Still has old shared ACL or already replaced
|
||||||
if(acl.equals(sharedAclToReplace) || acl.equals(mergeFrom) || acl.equals(currentAcl))
|
if(acl.equals(sharedAclToReplace) || acl.equals(mergeFrom) || acl.equals(currentAcl))
|
||||||
{
|
{
|
||||||
propagateOnChildren = setFixAclPending(child.getId(), inheritFrom, mergeFrom, sharedAclToReplace, changes, false, asyncCall, propagateOnChildren);
|
propagateOnChildren = setFixAclPending(child.getId(), inheritFrom, mergeFrom, sharedAclToReplace, changes, false, asyncCall, propagateOnChildren, forceSharedACL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -457,7 +489,20 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
}
|
}
|
||||||
else if (dbAcl.getAclType() == ACLType.SHARED)
|
else if (dbAcl.getAclType() == ACLType.SHARED)
|
||||||
{
|
{
|
||||||
throw new ConcurrencyFailureException("setFixedAcls: unexpected shared acl: "+dbAcl);
|
if (forceSharedACL)
|
||||||
|
{
|
||||||
|
log.warn("Forcing shared ACL on node: " + child.getId() + " ( "
|
||||||
|
+ nodeDAO.getNodePair(child.getId()).getSecond() + ") - " + dbAcl);
|
||||||
|
sharedAclToReplace = acl;
|
||||||
|
propagateOnChildren = setFixAclPending(child.getId(), inheritFrom, mergeFrom, sharedAclToReplace,
|
||||||
|
changes, false, asyncCall, propagateOnChildren, forceSharedACL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ConcurrencyFailureException(
|
||||||
|
"setFixedAcls: unexpected shared acl: " + dbAcl + " on node " + child.getId() + " ( "
|
||||||
|
+ nodeDAO.getNodePair(child.getId()).getSecond() + ")");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -506,7 +551,7 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private boolean setFixAclPending(Long nodeId, Long inheritFrom, Long mergeFrom, Long sharedAclToReplace,
|
private boolean setFixAclPending(Long nodeId, Long inheritFrom, Long mergeFrom, Long sharedAclToReplace,
|
||||||
List<AclChange> changes, boolean set, boolean asyncCall, boolean propagateOnChildren)
|
List<AclChange> changes, boolean set, boolean asyncCall, boolean propagateOnChildren, boolean forceSharedACL)
|
||||||
{
|
{
|
||||||
// check transaction time
|
// check transaction time
|
||||||
long transactionStartTime = AlfrescoTransactionSupport.getTransactionStartTime();
|
long transactionStartTime = AlfrescoTransactionSupport.getTransactionStartTime();
|
||||||
@@ -514,7 +559,7 @@ public class ADMAccessControlListDAO implements AccessControlListDAO
|
|||||||
if (transactionTime < fixedAclMaxTransactionTime)
|
if (transactionTime < fixedAclMaxTransactionTime)
|
||||||
{
|
{
|
||||||
// make regular method call if time is under max transaction configured time
|
// make regular method call if time is under max transaction configured time
|
||||||
setFixedAcls(nodeId, inheritFrom, mergeFrom, sharedAclToReplace, changes, set, asyncCall, propagateOnChildren);
|
setFixedAcls(nodeId, inheritFrom, mergeFrom, sharedAclToReplace, changes, set, asyncCall, propagateOnChildren, forceSharedACL);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -91,6 +91,11 @@ public interface AccessControlListDAO
|
|||||||
*/
|
*/
|
||||||
public List<AclChange> setInheritanceForChildren(NodeRef parent, Long inheritFrom, Long sharedAclToReplace, boolean asyncCall);
|
public List<AclChange> setInheritanceForChildren(NodeRef parent, Long inheritFrom, Long sharedAclToReplace, boolean asyncCall);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the inheritance on a given node and it's children. If an unexpected ACL occurs in a child, it can be overriden by setting forceSharedACL
|
||||||
|
*/
|
||||||
|
public List<AclChange> setInheritanceForChildren(NodeRef parent, Long inheritFrom, Long sharedAclToReplace, boolean asyncCall, boolean forceSharedACL);
|
||||||
|
|
||||||
public Long getIndirectAcl(NodeRef nodeRef);
|
public Long getIndirectAcl(NodeRef nodeRef);
|
||||||
|
|
||||||
public Long getInheritedAcl(NodeRef nodeRef);
|
public Long getInheritedAcl(NodeRef nodeRef);
|
||||||
|
@@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.batch.BatchProcessWorkProvider;
|
import org.alfresco.repo.batch.BatchProcessWorkProvider;
|
||||||
import org.alfresco.repo.batch.BatchProcessor;
|
import org.alfresco.repo.batch.BatchProcessor;
|
||||||
|
import org.alfresco.repo.batch.BatchProcessor.BatchProcessWorker;
|
||||||
import org.alfresco.repo.domain.node.NodeDAO;
|
import org.alfresco.repo.domain.node.NodeDAO;
|
||||||
import org.alfresco.repo.domain.node.NodeDAO.NodeRefQueryCallback;
|
import org.alfresco.repo.domain.node.NodeDAO.NodeRefQueryCallback;
|
||||||
import org.alfresco.repo.lock.JobLockService;
|
import org.alfresco.repo.lock.JobLockService;
|
||||||
@@ -50,6 +51,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
|||||||
import org.alfresco.repo.security.permissions.PermissionServicePolicies;
|
import org.alfresco.repo.security.permissions.PermissionServicePolicies;
|
||||||
import org.alfresco.repo.security.permissions.PermissionServicePolicies.OnInheritPermissionsDisabled;
|
import org.alfresco.repo.security.permissions.PermissionServicePolicies.OnInheritPermissionsDisabled;
|
||||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.repo.transaction.TransactionListenerAdapter;
|
import org.alfresco.repo.transaction.TransactionListenerAdapter;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
@@ -64,6 +66,8 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
|
import org.springframework.dao.ConcurrencyFailureException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds nodes with ASPECT_PENDING_FIX_ACL aspect and sets fixed ACLs for them
|
* Finds nodes with ASPECT_PENDING_FIX_ACL aspect and sets fixed ACLs for them
|
||||||
@@ -91,6 +95,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
|
|
||||||
private int maxItemBatchSize = 100;
|
private int maxItemBatchSize = 100;
|
||||||
private int numThreads = 4;
|
private int numThreads = 4;
|
||||||
|
private boolean forceSharedACL = false;
|
||||||
|
|
||||||
private ClassPolicyDelegate<OnInheritPermissionsDisabled> onInheritPermissionsDisabledDelegate;
|
private ClassPolicyDelegate<OnInheritPermissionsDisabled> onInheritPermissionsDisabledDelegate;
|
||||||
private PolicyComponent policyComponent;
|
private PolicyComponent policyComponent;
|
||||||
@@ -132,6 +137,11 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
this.maxItemBatchSize = maxItemBatchSize;
|
this.maxItemBatchSize = maxItemBatchSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setForceSharedACL(boolean forceSharedACL)
|
||||||
|
{
|
||||||
|
this.forceSharedACL = forceSharedACL;
|
||||||
|
}
|
||||||
|
|
||||||
public void setLockTimeToLive(long lockTimeToLive)
|
public void setLockTimeToLive(long lockTimeToLive)
|
||||||
{
|
{
|
||||||
this.lockTimeToLive = lockTimeToLive;
|
this.lockTimeToLive = lockTimeToLive;
|
||||||
@@ -253,7 +263,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void process(final NodeRef nodeRef) throws Throwable
|
public void process(final NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
RunAsWork<Void> findAndUpdateAclRunAsWork = new RunAsWork<Void>()
|
RunAsWork<Void> findAndUpdateAclRunAsWork = new RunAsWork<Void>()
|
||||||
{
|
{
|
||||||
@@ -265,34 +275,44 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
log.debug(String.format("Processing node %s", nodeRef));
|
log.debug(String.format("Processing node %s", nodeRef));
|
||||||
}
|
}
|
||||||
|
|
||||||
final Long nodeId = nodeDAO.getNodePair(nodeRef).getFirst();
|
try
|
||||||
|
|
||||||
// MNT-22009 - If node was deleted and in archive store, remove the aspect and properties and do not
|
|
||||||
// process
|
|
||||||
if (nodeRef.getStoreRef().equals(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE))
|
|
||||||
{
|
{
|
||||||
|
final Long nodeId = nodeDAO.getNodePair(nodeRef).getFirst();
|
||||||
|
|
||||||
|
// MNT-22009 - If node was deleted and in archive store, remove the aspect and properties and do
|
||||||
|
// not
|
||||||
|
// process
|
||||||
|
if (nodeRef.getStoreRef().equals(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE))
|
||||||
|
{
|
||||||
|
accessControlListDAO.removePendingAclAspect(nodeId);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve acl properties from node
|
||||||
|
Long inheritFrom = (Long) nodeDAO.getNodeProperty(nodeId, ContentModel.PROP_INHERIT_FROM_ACL);
|
||||||
|
Long sharedAclToReplace = (Long) nodeDAO.getNodeProperty(nodeId, ContentModel.PROP_SHARED_ACL_TO_REPLACE);
|
||||||
|
|
||||||
|
// set inheritance using retrieved prop
|
||||||
|
accessControlListDAO.setInheritanceForChildren(nodeRef, inheritFrom, sharedAclToReplace, true,
|
||||||
|
forceSharedACL);
|
||||||
|
|
||||||
|
// Remove aspect
|
||||||
accessControlListDAO.removePendingAclAspect(nodeId);
|
accessControlListDAO.removePendingAclAspect(nodeId);
|
||||||
return null;
|
|
||||||
|
if (!policyIgnoreUtil.ignorePolicy(nodeRef))
|
||||||
|
{
|
||||||
|
boolean transformedToAsyncOperation = toBoolean((Boolean) AlfrescoTransactionSupport
|
||||||
|
.getResource(FixedAclUpdater.FIXED_ACL_ASYNC_REQUIRED_KEY));
|
||||||
|
|
||||||
|
OnInheritPermissionsDisabled onInheritPermissionsDisabledPolicy = onInheritPermissionsDisabledDelegate
|
||||||
|
.get(ContentModel.TYPE_BASE);
|
||||||
|
onInheritPermissionsDisabledPolicy.onInheritPermissionsDisabled(nodeRef, transformedToAsyncOperation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
// retrieve acl properties from node
|
|
||||||
Long inheritFrom = (Long) nodeDAO.getNodeProperty(nodeId, ContentModel.PROP_INHERIT_FROM_ACL);
|
|
||||||
Long sharedAclToReplace = (Long) nodeDAO.getNodeProperty(nodeId, ContentModel.PROP_SHARED_ACL_TO_REPLACE);
|
|
||||||
|
|
||||||
// set inheritance using retrieved prop
|
|
||||||
accessControlListDAO.setInheritanceForChildren(nodeRef, inheritFrom, sharedAclToReplace, true);
|
|
||||||
|
|
||||||
// Remove aspect
|
|
||||||
accessControlListDAO.removePendingAclAspect(nodeId);
|
|
||||||
|
|
||||||
if (!policyIgnoreUtil.ignorePolicy(nodeRef))
|
|
||||||
{
|
{
|
||||||
boolean transformedToAsyncOperation = toBoolean(
|
log.error("Job could not process pending ACL node " + nodeRef + ": " + e);
|
||||||
(Boolean) AlfrescoTransactionSupport.getResource(FixedAclUpdater.FIXED_ACL_ASYNC_REQUIRED_KEY));
|
e.printStackTrace();
|
||||||
|
|
||||||
OnInheritPermissionsDisabled onInheritPermissionsDisabledPolicy = onInheritPermissionsDisabledDelegate
|
|
||||||
.get(ContentModel.TYPE_BASE);
|
|
||||||
onInheritPermissionsDisabledPolicy.onInheritPermissionsDisabled(nodeRef, transformedToAsyncOperation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log.isDebugEnabled())
|
if (log.isDebugEnabled())
|
||||||
@@ -308,6 +328,7 @@ public class FixedAclUpdater extends TransactionListenerAdapter implements Appli
|
|||||||
AuthenticationUtil.runAs(findAndUpdateAclRunAsWork, AuthenticationUtil.getSystemUserName());
|
AuthenticationUtil.runAs(findAndUpdateAclRunAsWork, AuthenticationUtil.getSystemUserName());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private class GetNodesWithAspectCallback implements NodeRefQueryCallback
|
private class GetNodesWithAspectCallback implements NodeRefQueryCallback
|
||||||
{
|
{
|
||||||
|
@@ -117,6 +117,7 @@
|
|||||||
<property name="nodeDAO" ref="nodeDAO"/>
|
<property name="nodeDAO" ref="nodeDAO"/>
|
||||||
<property name="maxItemBatchSize" value="${system.fixedACLsUpdater.maxItemBatchSize}"/>
|
<property name="maxItemBatchSize" value="${system.fixedACLsUpdater.maxItemBatchSize}"/>
|
||||||
<property name="numThreads" value="${system.fixedACLsUpdater.numThreads}"/>
|
<property name="numThreads" value="${system.fixedACLsUpdater.numThreads}"/>
|
||||||
|
<property name="forceSharedACL" value="${system.fixedACLsUpdater.forceSharedACL}"/>
|
||||||
<property name="lockTimeToLive" value="${system.fixedACLsUpdater.lockTTL}"/>
|
<property name="lockTimeToLive" value="${system.fixedACLsUpdater.lockTTL}"/>
|
||||||
<property name="policyComponent" ref="policyComponent"/>
|
<property name="policyComponent" ref="policyComponent"/>
|
||||||
<property name="policyIgnoreUtil" ref="policyIgnoreUtil"/>
|
<property name="policyIgnoreUtil" ref="policyIgnoreUtil"/>
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
repository.name=Main Repository
|
repository.name=Main Repository
|
||||||
|
|
||||||
# Schema number
|
# Schema number
|
||||||
version.schema=14002
|
version.schema=14100
|
||||||
|
|
||||||
# Directory configuration
|
# Directory configuration
|
||||||
|
|
||||||
@@ -1082,6 +1082,8 @@ system.fixedACLsUpdater.lockTTL=10000
|
|||||||
system.fixedACLsUpdater.maxItemBatchSize=100
|
system.fixedACLsUpdater.maxItemBatchSize=100
|
||||||
# fixedACLsUpdater - the number of threads to use
|
# fixedACLsUpdater - the number of threads to use
|
||||||
system.fixedACLsUpdater.numThreads=4
|
system.fixedACLsUpdater.numThreads=4
|
||||||
|
# fixedACLsUpdater - Force shared ACL to propagate through children even if there is an unexpected ACL
|
||||||
|
system.fixedACLsUpdater.forceSharedACL=false
|
||||||
# fixedACLsUpdater cron expression - fire at midnight every day
|
# fixedACLsUpdater cron expression - fire at midnight every day
|
||||||
system.fixedACLsUpdater.cronExpression=0 0 0 * * ?
|
system.fixedACLsUpdater.cronExpression=0 0 0 * * ?
|
||||||
|
|
||||||
|
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* #%L
|
||||||
|
* Alfresco Repository
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2005 - 2018 Alfresco Software Limited
|
||||||
|
* %%
|
||||||
|
* This file is part of the Alfresco software.
|
||||||
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
|
* the paid license agreement will prevail. Otherwise, the software is
|
||||||
|
* provided under the following open source license terms:
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package org.alfresco.messaging.camel;
|
||||||
|
|
||||||
|
import org.apache.camel.CamelContext;
|
||||||
|
import org.apache.camel.Produce;
|
||||||
|
import org.apache.camel.ProducerTemplate;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests Camel components defined in the application's Spring context
|
||||||
|
*/
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(locations = "/test-messaging-context.xml")
|
||||||
|
public class CamelComponentsTest {
|
||||||
|
@Autowired
|
||||||
|
protected CamelContext camelContext;
|
||||||
|
|
||||||
|
@Produce("activemq:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate activemqTemplate;
|
||||||
|
|
||||||
|
@Produce("amqp:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate amqpTemplate;
|
||||||
|
|
||||||
|
@Produce("jms:queue:alfresco.test")
|
||||||
|
protected ProducerTemplate jmsTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testActivemqComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <activemq>";
|
||||||
|
|
||||||
|
activemqTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("activemq:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAmqpComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <amqp>";
|
||||||
|
|
||||||
|
amqpTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("amqp:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJmsComponent()
|
||||||
|
{
|
||||||
|
final String msg = "ping <jms>";
|
||||||
|
|
||||||
|
jmsTemplate.sendBody(msg);
|
||||||
|
|
||||||
|
final Object reply = camelContext
|
||||||
|
.createConsumerTemplate()
|
||||||
|
.receiveBody("jms:queue:alfresco.test", 2000);
|
||||||
|
|
||||||
|
assertEquals(msg, reply);
|
||||||
|
}
|
||||||
|
}
|
@@ -61,76 +61,76 @@ public class CamelRoutesTest
|
|||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.1")
|
@Produce("direct-vm:alfresco.test.1")
|
||||||
protected ProducerTemplate template1;
|
protected ProducerTemplate template1;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.2")
|
@Produce("direct-vm:alfresco.test.2")
|
||||||
protected ProducerTemplate template2;
|
protected ProducerTemplate template2;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.default")
|
@Produce("direct-vm:alfresco.default")
|
||||||
protected ProducerTemplate template3;
|
protected ProducerTemplate template3;
|
||||||
|
|
||||||
@Produce("direct-vm:alfresco.test.transacted")
|
@Produce("direct-vm:alfresco.test.transacted")
|
||||||
protected ProducerTemplate template4;
|
protected ProducerTemplate template4;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockExceptionProcessor messagingExceptionProcessor;
|
protected MockExceptionProcessor messagingExceptionProcessor;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockConsumer mockConsumer;
|
protected MockConsumer mockConsumer;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected MockExceptionThrowingConsumer mockExceptionThrowingConsumer;
|
protected MockExceptionThrowingConsumer mockExceptionThrowingConsumer;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRouteXmlDefined() throws Exception {
|
public void testMessageRouteXmlDefined() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
resultEndpoint1.expectedBodiesReceived(expectedBody);
|
resultEndpoint1.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template1.sendBody(expectedBody);
|
template1.sendBody(expectedBody);
|
||||||
|
|
||||||
resultEndpoint1.assertIsSatisfied();
|
resultEndpoint1.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRoutePackageDefined() throws Exception {
|
public void testMessageRoutePackageDefined() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
resultEndpoint2.expectedBodiesReceived(expectedBody);
|
resultEndpoint2.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template2.sendBody(expectedBody);
|
template2.sendBody(expectedBody);
|
||||||
|
|
||||||
resultEndpoint2.assertIsSatisfied();
|
resultEndpoint2.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMessageRouteXmlOverride() throws Exception {
|
public void testMessageRouteXmlOverride() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
dlqEndpoint.expectedBodiesReceived(expectedBody);
|
dlqEndpoint.expectedBodiesReceived(expectedBody);
|
||||||
|
|
||||||
template3.sendBody(expectedBody);
|
template3.sendBody(expectedBody);
|
||||||
|
|
||||||
dlqEndpoint.assertIsSatisfied();
|
dlqEndpoint.assertIsSatisfied();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransactedRoute() throws Exception {
|
public void testTransactedRoute() throws Exception {
|
||||||
String expectedBody = "<matched.>";
|
String expectedBody = "<matched.>";
|
||||||
|
|
||||||
template4.sendBody(expectedBody);
|
template4.sendBody(expectedBody);
|
||||||
|
|
||||||
// Wait for Camel and ActiveMQ to process
|
// Wait for Camel and ActiveMQ to process
|
||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
|
|
||||||
// Test that our exception processor received the error
|
// Test that our exception processor received the error
|
||||||
assertNotNull(messagingExceptionProcessor.getLastError());
|
assertNotNull(messagingExceptionProcessor.getLastError());
|
||||||
assertTrue(messagingExceptionProcessor.getLastError().getClass().equals(
|
assertTrue(messagingExceptionProcessor.getLastError().getClass().equals(
|
||||||
IllegalArgumentException.class));
|
IllegalArgumentException.class));
|
||||||
|
|
||||||
// Check that an error was thrown the first time
|
// Check that an error was thrown the first time
|
||||||
assertTrue(mockExceptionThrowingConsumer.isErrorThrown());
|
assertTrue(mockExceptionThrowingConsumer.isErrorThrown());
|
||||||
assertNull(mockExceptionThrowingConsumer.getLastMessage());
|
assertNull(mockExceptionThrowingConsumer.getLastMessage());
|
||||||
|
|
||||||
// Check that the message was re-delivered to a second consumer
|
// Check that the message was re-delivered to a second consumer
|
||||||
assertEquals(expectedBody, mockConsumer.getLastMessage());
|
assertEquals(expectedBody, mockConsumer.getLastMessage());
|
||||||
}
|
}
|
||||||
|
@@ -90,8 +90,8 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
private CheckOutCheckInService checkOutCheckInService;
|
private CheckOutCheckInService checkOutCheckInService;
|
||||||
private ContentService contentService;
|
private ContentService contentService;
|
||||||
private AuthorityService authorityService;
|
private AuthorityService authorityService;
|
||||||
private static final long MAX_TRANSACTION_TIME_DEFAULT = 50;
|
private static final long MAX_TRANSACTION_TIME_DEFAULT = 10;
|
||||||
private static final int[] filesPerLevelMoreFolders = { 5, 3, 1, 50 };
|
private static final int[] filesPerLevelMoreFolders = { 5, 1, 1, 1, 1, 1, 1 };
|
||||||
private static final int[] filesPerLevelMoreFiles = { 5, 100 };
|
private static final int[] filesPerLevelMoreFiles = { 5, 100 };
|
||||||
private long maxTransactionTime;
|
private long maxTransactionTime;
|
||||||
private static HashMap<Integer, Class<?>> errors;
|
private static HashMap<Integer, Class<?>> errors;
|
||||||
@@ -306,7 +306,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testSyncCopyNoTimeOut() throws FileExistsException, FileNotFoundException
|
public void testSyncCopyNoTimeOut() throws FileExistsException, FileNotFoundException
|
||||||
{
|
{
|
||||||
NodeRef originalRef = createFolderHierarchyInRootForFolderTests("originFolder");
|
NodeRef originalRef = createFolderHierarchyInRootForFolderTests("originFolder");
|
||||||
NodeRef targetRef = createFolderHierarchyInRootForFolderTests("targetFolder");
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("targetFolder");
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
// Get ACLS for later comparison
|
||||||
ACLComparator aclComparatorOrigin = new ACLComparator(originalRef);
|
ACLComparator aclComparatorOrigin = new ACLComparator(originalRef);
|
||||||
@@ -316,6 +316,19 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
maxTransactionTime = 86400000;
|
maxTransactionTime = 86400000;
|
||||||
setFixedAclMaxTransactionTime(permissionsDaoComponent, homeFolderNodeRef, maxTransactionTime);
|
setFixedAclMaxTransactionTime(permissionsDaoComponent, homeFolderNodeRef, maxTransactionTime);
|
||||||
|
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
// Set Shared permissions on origin
|
// Set Shared permissions on origin
|
||||||
permissionService.setInheritParentPermissions(originalRef, true, false);
|
permissionService.setInheritParentPermissions(originalRef, true, false);
|
||||||
permissionService.setPermission(originalRef, TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR, true);
|
permissionService.setPermission(originalRef, TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR, true);
|
||||||
@@ -343,7 +356,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(originalRef);
|
deleteNodes(originalRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,14 +367,26 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testAsyncWithNodeCopy()
|
public void testAsyncWithNodeCopy()
|
||||||
{
|
{
|
||||||
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
||||||
NodeRef targetRef = createFile(fileFolderService, homeFolderNodeRef, "testAsyncWithNodeCopyTargetFolder",
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyTargetFolder");
|
||||||
ContentModel.TYPE_FOLDER);
|
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
|
||||||
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
||||||
|
|
||||||
// Set permissions on target folder
|
// Set permissions on target folder
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
permissionService.setInheritParentPermissions(targetRef, false, false);
|
permissionService.setInheritParentPermissions(targetRef, false, false);
|
||||||
@@ -410,7 +435,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(folderRef);
|
deleteNodes(folderRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,13 +446,26 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testAsyncWithNodeCopyToPendingFolder()
|
public void testAsyncWithNodeCopyToPendingFolder()
|
||||||
{
|
{
|
||||||
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
||||||
NodeRef targetRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyTargetFolder");
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyTargetFolder");
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
|
||||||
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
||||||
|
|
||||||
// Set permissions on target folder
|
// Set permissions on target folder
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
permissionService.setInheritParentPermissions(targetRef, false, false);
|
permissionService.setInheritParentPermissions(targetRef, false, false);
|
||||||
@@ -487,7 +525,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(folderRef);
|
deleteNodes(folderRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -499,13 +537,26 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testAsyncWithNodeCopyParentToChildPendingFolder()
|
public void testAsyncWithNodeCopyParentToChildPendingFolder()
|
||||||
{
|
{
|
||||||
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyOriginFolder");
|
||||||
NodeRef targetRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyTargetFolder");
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeCopyTargetFolder");
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
|
||||||
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
||||||
|
|
||||||
// Set permissions on target folder
|
// Set permissions on target folder
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
permissionService.setInheritParentPermissions(targetRef, false, false);
|
permissionService.setInheritParentPermissions(targetRef, false, false);
|
||||||
@@ -585,7 +636,151 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(folderRef);
|
deleteNodes(folderRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Move child of node that has the aspect to a child folder of a folder that also has the aspect applied before job
|
||||||
|
* runs
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAsyncWithNodeMoveChildToChildPendingFolder()
|
||||||
|
{
|
||||||
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveChildToChildPendingFolderOrigin");
|
||||||
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveChildToChildPendingFolderTarget");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Set permissions on a child to get a new shared ACL with pending acl nodes
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRef, true, false);
|
||||||
|
permissionService.setPermission(targetRef, TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Get target Folder with a pending ACL
|
||||||
|
NodeRef targetFolderWithPendingAcl = getFirstNodeWithAclPending(ContentModel.TYPE_FOLDER, targetRef);
|
||||||
|
assertNotNull("No children folders were found with pendingFixACl aspect", targetFolderWithPendingAcl);
|
||||||
|
NodeRef targetFolderWithPendingAclChild = nodeDAO
|
||||||
|
.getNodePair(getChild(nodeDAO.getNodePair(targetFolderWithPendingAcl).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetFolderWithPendingAcl);
|
||||||
|
aclComparatorTarget.setOriginalPermission(TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR);
|
||||||
|
|
||||||
|
// Set permissions on origin folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(folderRef, true, false);
|
||||||
|
permissionService.setPermission(folderRef, TEST_GROUP_NAME_FULL, DEFAULT_PERMISSION, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Find a pending ACL folder
|
||||||
|
NodeRef originFolderWithPendingAcl = getFirstNodeWithAclPending(ContentModel.TYPE_FOLDER, folderRef);
|
||||||
|
assertNotNull("No children folders were found with pendingFixACl aspect", originFolderWithPendingAcl);
|
||||||
|
NodeRef originFolderWithPendingAclChild = nodeDAO
|
||||||
|
.getNodePair(getChild(nodeDAO.getNodePair(originFolderWithPendingAcl).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorMovedNode = new ACLComparator(originFolderWithPendingAclChild);
|
||||||
|
aclComparatorMovedNode.setOriginalPermission(TEST_GROUP_NAME_FULL, DEFAULT_PERMISSION);
|
||||||
|
|
||||||
|
// Move one pending folder into the other
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
fileFolderService.move(originFolderWithPendingAclChild, targetFolderWithPendingAclChild, "movedFolder");
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger job
|
||||||
|
triggerFixedACLJob();
|
||||||
|
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
assertTrue("Moved node did not inherit permissions from target",
|
||||||
|
aclComparatorMovedNode.hasPermission(TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR));
|
||||||
|
assertTrue("Child of Pending Moved node did not inherit permissions from target",
|
||||||
|
aclComparatorMovedNode.firstChildHasPermission(TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR));
|
||||||
|
assertFalse("Moved node kept original permissions", aclComparatorMovedNode.parentHasOriginalPermission());
|
||||||
|
assertFalse("Child of Moved node kept original permissions",
|
||||||
|
aclComparatorMovedNode.firstChildHasOriginalPermission());
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
deleteNodes(folderRef);
|
||||||
|
deleteNodes(targetRefBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a conflicting ACL on a node and then try to run the job normally, without forcing the ACL to get the
|
||||||
|
* expected error and then run it again with the forcedShareACL property as true so it can override the problematic
|
||||||
|
* ACL
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAsyncWithErrorsForceSharedACL()
|
||||||
|
{
|
||||||
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithErrorsForceSharedACL");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Set permissions on origin folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(folderRef, true, false);
|
||||||
|
permissionService.setPermission(folderRef, TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Find a pending ACL folder
|
||||||
|
NodeRef originFolderWithPendingAcl = getFirstNodeWithAclPending(ContentModel.TYPE_FOLDER, folderRef);
|
||||||
|
assertNotNull("No children folders were found with pendingFixACl aspect", originFolderWithPendingAcl);
|
||||||
|
NodeRef originFolderWithPendingAclChild = nodeDAO
|
||||||
|
.getNodePair(getChild(nodeDAO.getNodePair(originFolderWithPendingAcl).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Create a new ACL elsewhere and put the shared ACL (from a child) on the pending node child to simulate
|
||||||
|
// conflict
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
NodeRef tempNode = createFile(fileFolderService, folderRef, "testAsyncWithErrorsForceSharedACLTemp",
|
||||||
|
ContentModel.TYPE_FOLDER);
|
||||||
|
permissionService.setInheritParentPermissions(tempNode, false, false);
|
||||||
|
permissionService.setPermission(tempNode, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
NodeRef tempNodeChild = createFile(fileFolderService, tempNode, "testAsyncWithErrorsForceSharedACLTempChild",
|
||||||
|
ContentModel.TYPE_FOLDER);
|
||||||
|
setACL(permissionsDaoComponent, originFolderWithPendingAclChild,
|
||||||
|
nodeDAO.getNodeAclId(nodeDAO.getNodePair(tempNodeChild).getFirst()));
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
ACLComparator aclComparator = new ACLComparator(originFolderWithPendingAclChild);
|
||||||
|
|
||||||
|
// Trigger job without forcing the shared ACL, only 1 error is expected
|
||||||
|
triggerFixedACLJob(false);
|
||||||
|
assertEquals("Unexpected number of errors", 1, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
// Trigger job forcing the shared ACL
|
||||||
|
triggerFixedACLJob(true);
|
||||||
|
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
assertTrue("Child of node with conflict does not have correct permissions",
|
||||||
|
aclComparator.firstChildHasPermission(TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR));
|
||||||
|
assertTrue("Node with conflict does not have correct permissions",
|
||||||
|
aclComparator.hasPermission(TEST_GROUP_NAME_FULL, PermissionService.COORDINATOR));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
deleteNodes(folderRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,14 +791,26 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testAsyncWithNodeMove()
|
public void testAsyncWithNodeMove()
|
||||||
{
|
{
|
||||||
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveOriginFolder");
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveOriginFolder");
|
||||||
NodeRef targetRef = createFile(fileFolderService, homeFolderNodeRef, "testAsyncWithNodeMoveTargetFolder",
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveTargetFolder");
|
||||||
ContentModel.TYPE_FOLDER);
|
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
|
||||||
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
||||||
|
|
||||||
// Set permissions on target folder
|
// Set permissions on target folder
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
permissionService.setInheritParentPermissions(targetRef, false, false);
|
permissionService.setInheritParentPermissions(targetRef, false, false);
|
||||||
@@ -649,7 +856,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(folderRef);
|
deleteNodes(folderRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -660,13 +867,27 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
public void testAsyncWithNodeMoveToPendingFolder()
|
public void testAsyncWithNodeMoveToPendingFolder()
|
||||||
{
|
{
|
||||||
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveOriginFolder");
|
NodeRef folderRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveOriginFolder");
|
||||||
NodeRef targetRef = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveTargetFolder");
|
NodeRef targetRefBase = createFolderHierarchyInRootForFolderTests("testAsyncWithNodeMoveTargetFolder");
|
||||||
|
|
||||||
// Get ACLS for later comparison
|
|
||||||
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Set permissions on target folder
|
||||||
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
permissionService.setInheritParentPermissions(targetRefBase, true, false);
|
||||||
|
permissionService.setPermission(targetRefBase, TEST_GROUP_NAME_FULL, PermissionService.CONSUMER, true);
|
||||||
|
return null;
|
||||||
|
}, false, true);
|
||||||
|
|
||||||
|
// Trigger the job so the target folder structure has a different base ACL
|
||||||
|
triggerFixedACLJob();
|
||||||
|
assertEquals("Not all nodes were processed", 0, getNodesCountWithPendingFixedAclAspect());
|
||||||
|
|
||||||
|
NodeRef targetRef = nodeDAO.getNodePair(getChild(nodeDAO.getNodePair(targetRefBase).getFirst())).getSecond();
|
||||||
|
|
||||||
|
// Get ACLS for later comparison
|
||||||
|
ACLComparator aclComparatorTarget = new ACLComparator(targetRef);
|
||||||
|
|
||||||
// Set permissions on target folder
|
// Set permissions on target folder
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
permissionService.setInheritParentPermissions(targetRef, false, false);
|
permissionService.setInheritParentPermissions(targetRef, false, false);
|
||||||
@@ -723,7 +944,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
deleteNodes(folderRef);
|
deleteNodes(folderRef);
|
||||||
deleteNodes(targetRef);
|
deleteNodes(targetRefBase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1250,6 +1471,19 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void setACL(PermissionsDaoComponent permissionsDaoComponent, NodeRef nodeRef, long aclId)
|
||||||
|
{
|
||||||
|
if (permissionsDaoComponent instanceof ADMPermissionsDaoComponentImpl)
|
||||||
|
{
|
||||||
|
AccessControlListDAO acldao = ((ADMPermissionsDaoComponentImpl) permissionsDaoComponent).getACLDAO(nodeRef);
|
||||||
|
if (acldao instanceof ADMAccessControlListDAO)
|
||||||
|
{
|
||||||
|
ADMAccessControlListDAO admAcLDao = (ADMAccessControlListDAO) acldao;
|
||||||
|
admAcLDao.setAccessControlList(nodeRef, aclId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private NodeRef createFolderHierarchyInRoot(String folderName, int[] filesPerLevel)
|
private NodeRef createFolderHierarchyInRoot(String folderName, int[] filesPerLevel)
|
||||||
{
|
{
|
||||||
return txnHelper.doInTransaction((RetryingTransactionCallback<NodeRef>) () -> {
|
return txnHelper.doInTransaction((RetryingTransactionCallback<NodeRef>) () -> {
|
||||||
@@ -1318,6 +1552,11 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void triggerFixedACLJob()
|
private void triggerFixedACLJob()
|
||||||
|
{
|
||||||
|
triggerFixedACLJob(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void triggerFixedACLJob(boolean forceSharedACL)
|
||||||
{
|
{
|
||||||
// run the fixedAclUpdater until there is nothing more to fix (running the updater may create more to fix up) or
|
// run the fixedAclUpdater until there is nothing more to fix (running the updater may create more to fix up) or
|
||||||
// the count doesn't change for 3 cycles, meaning we have a problem.
|
// the count doesn't change for 3 cycles, meaning we have a problem.
|
||||||
@@ -1325,6 +1564,7 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
int previousCount = 0;
|
int previousCount = 0;
|
||||||
int rounds = 0;
|
int rounds = 0;
|
||||||
|
fixedAclUpdater.setForceSharedACL(forceSharedACL);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
previousCount = count;
|
previousCount = count;
|
||||||
@@ -1356,8 +1596,13 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
isDescendent = true;
|
isDescendent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDescendent && nodeDAO.getNodeType(nodeDAO.getNodePair(nodeRef).getFirst()).equals(nodeType))
|
if (isDescendent && nodeDAO.getNodeType(nodeDAO.getNodePair(nodeRef).getFirst()).equals(nodeType))
|
||||||
{
|
{
|
||||||
|
// If folder, the tests will need a child and a grandchild to verify permissions
|
||||||
|
if (nodeType.equals(ContentModel.TYPE_FOLDER) && !hasGrandChilden(nodeRef)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return nodeRef;
|
return nodeRef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1377,6 +1622,10 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
NodeRef nodeRef = nodesWithAclPendingAspect.get(i);
|
NodeRef nodeRef = nodesWithAclPendingAspect.get(i);
|
||||||
if (nodeDAO.getNodeType(nodeDAO.getNodePair(nodeRef).getFirst()).equals(nodeType))
|
if (nodeDAO.getNodeType(nodeDAO.getNodePair(nodeRef).getFirst()).equals(nodeType))
|
||||||
{
|
{
|
||||||
|
// If folder, the tests will need a child and a grandchild to verify permissions
|
||||||
|
if (nodeType.equals(ContentModel.TYPE_FOLDER) && !hasGrandChilden(nodeRef)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return nodeRef;
|
return nodeRef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1385,6 +1634,18 @@ public class FixedAclUpdaterTest extends TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasGrandChilden(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
Long nodeId = nodeDAO.getNodePair(nodeRef).getFirst();
|
||||||
|
Long childId = getChild(nodeId);
|
||||||
|
Long grandChild = null;
|
||||||
|
if (childId != null)
|
||||||
|
{
|
||||||
|
grandChild = getChild(childId);
|
||||||
|
}
|
||||||
|
return (grandChild != null);
|
||||||
|
}
|
||||||
|
|
||||||
private void deleteNodes(NodeRef folder)
|
private void deleteNodes(NodeRef folder)
|
||||||
{
|
{
|
||||||
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
txnHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||||
|
@@ -9,13 +9,13 @@
|
|||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<import resource="classpath:/alfresco/subsystems/Messaging/default/messaging-context.xml" />
|
<import resource="classpath:/alfresco/subsystems/Messaging/default/messaging-context.xml" />
|
||||||
|
|
||||||
<bean id="messagingExceptionProcessor"
|
<bean id="messagingExceptionProcessor"
|
||||||
class="org.alfresco.messaging.camel.MockExceptionProcessor" />
|
class="org.alfresco.messaging.camel.MockExceptionProcessor" />
|
||||||
|
|
||||||
<bean id="mockConsumer"
|
<bean id="mockConsumer"
|
||||||
class="org.alfresco.messaging.camel.MockConsumer" />
|
class="org.alfresco.messaging.camel.MockConsumer" />
|
||||||
|
|
||||||
<bean id="mockExceptionThrowingConsumer"
|
<bean id="mockExceptionThrowingConsumer"
|
||||||
class="org.alfresco.messaging.camel.MockExceptionThrowingConsumer" />
|
class="org.alfresco.messaging.camel.MockExceptionThrowingConsumer" />
|
||||||
|
|
||||||
@@ -25,4 +25,19 @@
|
|||||||
<property name="routeContextId" value="customRoutes" />
|
<property name="routeContextId" value="customRoutes" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="transactionAwareEventProducer" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rawevents.TransactionAwareEventProducer" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="policyComponent" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.policy.PolicyComponentImpl"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="renditionEventProcessor" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rendition2.RenditionEventProcessor"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="transformRequestProcessor" class="org.mockito.Mockito" factory-method="mock">
|
||||||
|
<constructor-arg value="org.alfresco.repo.rendition2.TransformRequestProcessor" />
|
||||||
|
</bean>
|
||||||
</beans>
|
</beans>
|
@@ -1,6 +1,9 @@
|
|||||||
messaging.broker.url=vm://localhost?broker.persistent=false
|
messaging.broker.url=nio://localhost:61616
|
||||||
messaging.broker.ssl=false
|
messaging.broker.ssl=false
|
||||||
messaging.broker.connections.max=8
|
messaging.broker.connections.max=8
|
||||||
messaging.transacted=true
|
messaging.transacted=true
|
||||||
messaging.broker.username=
|
messaging.broker.username=
|
||||||
messaging.broker.password=
|
messaging.broker.password=
|
||||||
|
|
||||||
|
acs.repo.rendition.events.endpoint=jms:acs-repo-rendition-events-test?jmsMessageType=Text
|
||||||
|
acs.repo.transform.request.endpoint=jms:acs-repo-transform-request-test?jmsMessageType=Text
|
Reference in New Issue
Block a user