From 3f9c22dd326476d0657a9ec79e38d7bb204ce73d Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Wed, 12 Feb 2014 14:54:12 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud) 61122: Merged V4.2-BUG-FIX (4.2.2) to HEAD-BUG-FIX (Cloud/4.3) 60991: Merged DEV to V4.2-BUG-FIX 60325 : MNT-10404 : Runas problem in workflow when package contains versioned content Added some unit tests. 60443 : MNT-10404 : Runas problem in workflow when package contains versioned content Added tests, debug log. Run work as system user in VersionableAspect. 60452 : MNT-10404 : Runas problem in workflow when package contains versioned content Wrap debug statements. 60492 : MNT-10404 : Runas problem in workflow when package contains versioned content Fix if statement indents. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@62387 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/version/Version2ServiceImpl.java | 90 +++++++++++++++++++ .../repo/version/VersionServiceImpl.java | 67 ++++++++++++++ .../repo/version/VersionableAspect.java | 2 +- .../repo/version/VersionServiceImplTest.java | 90 +++++++++++++++++++ 4 files changed, 248 insertions(+), 1 deletion(-) diff --git a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java index eff55a4f55..8d4e7111c8 100644 --- a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java +++ b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java @@ -114,6 +114,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe @Override public StoreRef getVersionStoreReference() { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.getVersionStoreReference(); @@ -127,6 +133,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe Map versionProperties) throws ReservedVersionNameException, AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.createVersion(nodeRef, versionProperties); @@ -155,6 +167,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe Map versionProperties) throws ReservedVersionNameException, AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + /* * Note: we can't control the order of the list, so if we have children and parents in the list and the * parents get versioned before the children and the children are not already versioned then the parents @@ -191,6 +209,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe int versionNumber) throws ReservedVersionNameException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.createVersion(nodeRef, origVersionProperties, versionNumber); @@ -419,6 +443,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public VersionHistory getVersionHistory(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.getVersionHistory(nodeRef); @@ -458,6 +488,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public Version getCurrentVersion(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.getCurrentVersion(nodeRef); @@ -1039,6 +1075,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public void revert(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { super.revert(nodeRef, getCurrentVersion(nodeRef), true); @@ -1054,6 +1096,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public void revert(NodeRef nodeRef, boolean deep) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { super.revert(nodeRef, getCurrentVersion(nodeRef), deep); @@ -1069,6 +1117,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public void revert(NodeRef nodeRef, Version version) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { super.revert(nodeRef, version, true); @@ -1084,6 +1138,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public void revert(NodeRef nodeRef, Version version, boolean deep) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if(logger.isDebugEnabled()) { logger.debug("revert nodeRef:" + nodeRef); @@ -1342,6 +1402,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe QName assocQName, boolean deep) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { return super.restore(nodeRef, parentNodeRef, assocTypeQName, assocQName, deep); @@ -1424,6 +1490,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe public void deleteVersionHistory(NodeRef nodeRef) throws AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { super.deleteVersionHistory(nodeRef); @@ -1465,6 +1537,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe */ public void deleteVersion(NodeRef nodeRef, Version version) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + if (useDeprecatedV1) { super.deleteVersion(nodeRef, version); // throws UnsupportedOperationException @@ -1505,6 +1583,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe @Override public boolean isAVersion(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + NodeRef realNodeRef = nodeRef; if(nodeRef.getStoreRef().getProtocol().equals(VersionBaseModel.STORE_PROTOCOL)) { @@ -1519,6 +1603,12 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe @Override public boolean isVersioned(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + NodeRef realNodeRef = nodeRef; if(nodeRef.getStoreRef().getProtocol().equals(VersionBaseModel.STORE_PROTOCOL)) { diff --git a/source/java/org/alfresco/repo/version/VersionServiceImpl.java b/source/java/org/alfresco/repo/version/VersionServiceImpl.java index 43d5e8f71b..e98c3ffbf1 100644 --- a/source/java/org/alfresco/repo/version/VersionServiceImpl.java +++ b/source/java/org/alfresco/repo/version/VersionServiceImpl.java @@ -35,6 +35,7 @@ import org.alfresco.repo.node.MLPropertyInterceptor; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyScope; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.version.VersionServicePolicies.CalculateVersionLabelPolicy; import org.alfresco.repo.version.common.AbstractVersionServiceImpl; import org.alfresco.repo.version.common.VersionHistoryImpl; @@ -195,6 +196,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve @Override public StoreRef getVersionStoreReference() { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + return new StoreRef( StoreRef.PROTOCOL_WORKSPACE, VersionModel.STORE_ID); @@ -208,6 +215,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve Map versionProperties) throws ReservedVersionNameException, AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + long startTime = System.currentTimeMillis(); int versionNumber = 0; // deprecated (unused) @@ -234,6 +247,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve boolean versionChildren) throws ReservedVersionNameException, AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + long startTime = System.currentTimeMillis(); int versionNumber = 0; // deprecated (unused) @@ -307,6 +326,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve Map versionProperties) throws ReservedVersionNameException, AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + long startTime = System.currentTimeMillis(); Collection result = new ArrayList(nodeRefs.size()); @@ -479,6 +504,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve */ public VersionHistory getVersionHistory(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + VersionHistory versionHistory = null; if (this.nodeService.exists(nodeRef) == true) @@ -498,6 +529,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve */ public Version getCurrentVersion(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + Version version = null; if (this.nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true) @@ -922,6 +959,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve */ public void ensureVersioningEnabled(NodeRef nodeRef, Map versionProperties) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + // Don't alter the auditable aspect! boolean disableAuditable = policyBehaviourFilter.isEnabled(ContentModel.ASPECT_AUDITABLE); if(disableAuditable) @@ -997,6 +1040,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve */ public void revert(NodeRef nodeRef, Version version, boolean deep) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + // Check the mandatory parameters ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("version", version); @@ -1141,6 +1190,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve QName assocQName, boolean deep) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + NodeRef restoredNodeRef = null; // Check that the node does not exist @@ -1267,6 +1322,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve public void deleteVersionHistory(NodeRef nodeRef) throws AspectMissingException { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + // Get the version history node for the node is question and delete it NodeRef versionHistoryNodeRef = getVersionHistoryNodeRef(nodeRef); @@ -1352,6 +1413,12 @@ public class VersionServiceImpl extends AbstractVersionServiceImpl implements Ve @Override public boolean isVersioned(NodeRef nodeRef) { + if (logger.isDebugEnabled()) + { + logger.debug("Run as user " + AuthenticationUtil.getRunAsUser()); + logger.debug("Fully authenticated " + AuthenticationUtil.getFullyAuthenticatedUser()); + } + return this.nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE); } } diff --git a/source/java/org/alfresco/repo/version/VersionableAspect.java b/source/java/org/alfresco/repo/version/VersionableAspect.java index 7aad65bf8f..230d69e156 100644 --- a/source/java/org/alfresco/repo/version/VersionableAspect.java +++ b/source/java/org/alfresco/repo/version/VersionableAspect.java @@ -544,7 +544,7 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate vs.createVersion(nf, vp); return null; } - },AuthenticationUtil.getRunAsUser()); + },AuthenticationUtil.getSystemUserName()); } diff --git a/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java b/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java index ce1cfdc2ec..66c552c1d0 100644 --- a/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java +++ b/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java @@ -54,6 +54,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionHistory; import org.alfresco.service.cmr.version.VersionService; @@ -90,6 +91,7 @@ public class VersionServiceImplTest extends BaseVersionStoreTest private static final String PWD_A = "passA"; private static final String USER_NAME_A = "userA"; + private PersonService personService; private VersionableAspect versionableAspect; private List excludedOnUpdateProps; @@ -97,6 +99,7 @@ public class VersionServiceImplTest extends BaseVersionStoreTest protected void onSetUpInTransaction() throws Exception { super.onSetUpInTransaction(); + personService = (PersonService) applicationContext.getBean("personService"); versionableAspect = (VersionableAspect) applicationContext.getBean("versionableAspect"); excludedOnUpdateProps = versionableAspect.getExcludedOnUpdateProps(); } @@ -2438,4 +2441,91 @@ public class VersionServiceImplTest extends BaseVersionStoreTest System.out.println("Finished: " + fileCount); } + + public void test_MNT10404() + { + String test_run = System.currentTimeMillis() + ""; + final String test_user = "userUsageTestUser-" + test_run; + final String document_name = "test_MNT10404" + test_run + ".txt"; + + final String theFirstContent = "This is simple content."; + final String theSecondContent = "Update content."; + + NodeRef document = null; + + try + { + // create user + if (personService.personExists(test_user)) + { + personService.deletePerson(test_user); + } + + HashMap properties = new HashMap(); + properties.put(ContentModel.PROP_USERNAME, test_user); + + NodeRef personNodeRef = personService.createPerson(properties); + + assertNotNull(personNodeRef); + + // create node + properties.clear(); + properties.put(ContentModel.PROP_NAME, document_name); + + document = nodeService.createNode(this.rootNodeRef, ContentModel.ASSOC_CONTAINS, QName.createQName(ContentModel.USER_MODEL_URI, document_name), + ContentModel.TYPE_CONTENT, properties).getChildRef(); + contentService.getWriter(document, ContentModel.PROP_CONTENT, true).putContent(theFirstContent); + + // add write permission + permissionService.setPermission(document, test_user, PermissionService.WRITE_CONTENT, true); + + // add versionable aspect as system user + final NodeRef doc = document; + + RunAsWork getWork = new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + Map versionProperties = new HashMap(); + versionProperties.put(ContentModel.PROP_VERSION_LABEL, "0.1"); + versionProperties.put(ContentModel.PROP_INITIAL_VERSION, true); + versionProperties.put(ContentModel.PROP_VERSION_TYPE, VersionType.MINOR); + nodeService.addAspect(doc, ContentModel.ASPECT_VERSIONABLE, versionProperties); + return null; + } + }; + AuthenticationUtil.runAs(getWork, AuthenticationUtil.getSystemUserName()); + + assertTrue(nodeService.hasAspect(document, ContentModel.ASPECT_VERSIONABLE)); + + // set content by test_user + RunAsWork getWorkSetContent = new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + contentService.getWriter(doc, ContentModel.PROP_CONTENT, true).putContent(theSecondContent); + return null; + } + }; + AuthenticationUtil.runAs(getWorkSetContent, test_user); + + assertTrue(theSecondContent.equals(contentService.getReader(document, ContentModel.PROP_CONTENT).getContentString())); + } + finally + { + // delete user + if (personService.personExists(test_user)) + { + personService.deletePerson(test_user); + } + + // delete node + if (document != null && nodeService.exists(document)) + { + nodeService.deleteNode(document); + } + } + } }