From 77222c302372ba38bdac4f91a46adce0ef0df7a0 Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Tue, 22 Jul 2014 15:31:28 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud) 76565: Merged V4.2-BUG-FIX (4.2.4) to HEAD-BUG-FIX (5.0/Cloud) 76177: Merged DEV to V4.2-BUG-FIX (4.2.3) 74967 : MNT-11749 : It is possible to create groups with same name in race conditions - Disallow creation of authorities with equal names 76118 : MNT-11749 : It is possible to create groups with same name in race conditions - Remove throwing AlfrescoRuntimeException for duplicated authorities. Fix related test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@77631 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../security/authority/AuthorityDAOImpl.java | 3 ++ .../authority/AuthorityServiceImpl.java | 6 --- .../authority/AuthorityServiceTest.java | 47 +++++++++++++++---- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java b/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java index c2a2a668cc..626d3b7b68 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java @@ -86,6 +86,7 @@ import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyCheck; import org.alfresco.util.SearchLanguageConversion; import org.alfresco.util.registry.NamedObjectRegistry; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; @@ -367,6 +368,8 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor public void createAuthority(String name, String authorityDisplayName, Set authorityZones) { HashMap props = new HashMap(); + /* MNT-11749 : Alfresco allows to create authorities with different char cases, but disallow duplicates */ + props.put(ContentModel.PROP_NAME, DigestUtils.md5Hex(name)); props.put(ContentModel.PROP_AUTHORITY_NAME, name); props.put(ContentModel.PROP_AUTHORITY_DISPLAY_NAME, authorityDisplayName); NodeRef childRef; diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java b/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java index 7b7dbe81a1..237610bdc3 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java @@ -596,12 +596,6 @@ public class AuthorityServiceImpl implements AuthorityService, InitializingBean checkTypeIsMutable(type); String name = getName(type, shortName); - //MNT-9794 fix. If authority with 'name' exists it is an error - in line with person creation - if (authorityExists(name)) - { - throw new AlfrescoRuntimeException("Authority '" + name + "' already exists."); - } - authorityDAO.createAuthority(name, authorityDisplayName, authorityZones); return name; diff --git a/source/test-java/org/alfresco/repo/security/authority/AuthorityServiceTest.java b/source/test-java/org/alfresco/repo/security/authority/AuthorityServiceTest.java index 4c725935aa..8051b848bf 100644 --- a/source/test-java/org/alfresco/repo/security/authority/AuthorityServiceTest.java +++ b/source/test-java/org/alfresco/repo/security/authority/AuthorityServiceTest.java @@ -50,6 +50,7 @@ import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -566,7 +567,7 @@ public class AuthorityServiceTest extends TestCase assertEquals(0, pubAuthorityService.getAllRootAuthorities(AuthorityType.ROLE).size()); } - public void testCreateAuth() + public void testCreateAuth() throws Exception { String auth1; String auth2; @@ -649,7 +650,10 @@ public class AuthorityServiceTest extends TestCase pubAuthorityService.deleteAuthority(auth1); assertEquals(0, getAllAuthorities(AuthorityType.ROLE).size()); assertEquals(0, pubAuthorityService.getAllRootAuthorities(AuthorityType.ROLE).size()); - + + tx.rollback(); + startNewTransaction(); + // Testing MNT-9794 fix. Creates authority 'DUPLICATEDGROUP' twice. Only one authority with such name should be created. String dublicatedAuthorityShortName = "DUPLICATEDGROUP"; AuthorityType dublicatedAuthorityType = AuthorityType.GROUP; @@ -658,22 +662,49 @@ public class AuthorityServiceTest extends TestCase pubAuthorityService.createAuthority(dublicatedAuthorityType, dublicatedAuthorityShortName); try { + commitAndStartNewTransaction(); pubAuthorityService.createAuthority(dublicatedAuthorityType, dublicatedAuthorityShortName); + + tx.commit(); + fail(); } - catch(AlfrescoRuntimeException are) + catch(DuplicateChildNodeNameException dcnne) { - + tx.rollback(); } - - List duplicatedGroupAuthorities = getAuthorityByTypeAndShortName(dublicatedAuthorityType, dublicatedAuthorityShortName); - + + startNewTransaction(); + //Only one authority should be created with duplicated name + List duplicatedGroupAuthorities = getAuthorityByTypeAndShortName(dublicatedAuthorityType, dublicatedAuthorityShortName); assertEquals(1, duplicatedGroupAuthorities.size()); - + + // we should be able to create authorities with different charcases + String differentCasesAuthorityShofrName = dublicatedAuthorityShortName.toLowerCase(); + pubAuthorityService.createAuthority(dublicatedAuthorityType, differentCasesAuthorityShofrName); + + // delete created authorities pubAuthorityService.deleteAuthority("GROUP_DUPLICATEDGROUP"); + pubAuthorityService.deleteAuthority(pubAuthorityService.getName(AuthorityType.GROUP, differentCasesAuthorityShofrName)); + + commitAndStartNewTransaction(); + List duplicatedAuthoritiesAfterDelete = getAuthorityByTypeAndShortName(dublicatedAuthorityType, dublicatedAuthorityShortName); assertEquals(0, duplicatedAuthoritiesAfterDelete.size()); + assertEquals(GRP_CNT, getAllAuthorities(AuthorityType.GROUP).size()); + } + + private void commitAndStartNewTransaction() throws Exception + { + tx.commit(); + startNewTransaction(); + } + + private void startNewTransaction() throws Exception + { + tx = transactionService.getUserTransaction(); + tx.begin(); } /**