diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java index b4c491adc4..08ddbd2cd5 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java @@ -518,7 +518,8 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl { for (String child : children) { - if (!PermissionService.ALL_AUTHORITIES.equals(child)) + if (authorityService.authorityExists(child) && + !PermissionService.ALL_AUTHORITIES.equals(child)) { authorityService.addAuthority(group, child); } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/impl/ExtendedPermissionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/impl/ExtendedPermissionServiceImpl.java index ebf27a1705..c0ad905d28 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/impl/ExtendedPermissionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/repo/security/permissions/impl/ExtendedPermissionServiceImpl.java @@ -374,7 +374,9 @@ public class ExtendedPermissionServiceImpl extends PermissionServiceImpl impleme // add the current owner to the list of extended writers Set modifiedWrtiers = new HashSet(writers); String owner = ownableService.getOwner(nodeRef); - if (StringUtils.isNotBlank(owner) && !owner.equals(OwnableService.NO_OWNER)) + if (StringUtils.isNotBlank(owner) && + !owner.equals(OwnableService.NO_OWNER) && + authorityService.authorityExists(owner)) { modifiedWrtiers.add(owner); } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/InplaceRecordPermissionTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/InplaceRecordPermissionTest.java index c5156e3224..8a25952a77 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/InplaceRecordPermissionTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/InplaceRecordPermissionTest.java @@ -45,6 +45,7 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; import org.alfresco.module.org_alfresco_module_rm.test.util.bdt.BehaviourTest; import org.alfresco.repo.security.permissions.AccessDeniedException; +import org.alfresco.repo.site.SiteModel; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.AccessStatus; @@ -67,7 +68,9 @@ public class InplaceRecordPermissionTest extends BaseRMTestCase .collect(Collectors.toList()); /** test data */ - NodeRef contribDoc; + private NodeRef contribDoc; + private NodeRef deleteUserDoc; + private String deletedUser; /** services */ private NodeService dbNodeService; @@ -770,6 +773,41 @@ public class InplaceRecordPermissionTest extends BaseRMTestCase ; } + /** + * Given a user is the cm:creator of a document + * And the user is deleted + * When the document is declared as a record by a manager + * Then it succesfully becomes a record + */ + public void testCmCreatorDeletedBeforeRecordDeclaration() + { + test() + .given() + .asAdmin() + .perform(() -> + { + deletedUser = GUID.generate(); + createPerson(deletedUser); + siteService.setMembership(collabSiteId, deletedUser, SiteModel.SITE_CONTRIBUTOR); + }) + .as(deletedUser) + .perform(() -> + { + deleteUserDoc = fileFolderService.create(dmFolder, "deleteUserDoc.txt" , ContentModel.TYPE_CONTENT).getNodeRef(); + dbNodeService.addAspect(deleteUserDoc, ContentModel.ASPECT_AUDITABLE, null); + }) + .asAdmin() + .perform(() -> personService.deletePerson(deletedUser)) + .when() + .as(dmCollaborator) + .perform(() -> recordService.createRecord(filePlan, deleteUserDoc)) + .then() + .expect(true) + .from(() -> recordService.isRecord(deleteUserDoc)) + .because("The document is now a record.") + ; + } + /** * Test group reuse */ @@ -778,22 +816,16 @@ public class InplaceRecordPermissionTest extends BaseRMTestCase test() .when() .as(dmCollaborator) - .perform(() -> + .perform(50, () -> { - for (int i = 0; i < 50; i++) - { - NodeRef newDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); - recordService.createRecord(filePlan, newDocument); - } + NodeRef newDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + recordService.createRecord(filePlan, newDocument); }) .as(dmContributor) - .perform(() -> + .perform(50, () -> { - for (int i = 0; i < 50; i++) - { - NodeRef newDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); - recordService.createRecord(filePlan, newDocument); - } + NodeRef newDocument = fileFolderService.create(dmFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + recordService.createRecord(filePlan, newDocument); }) .then() .asAdmin() diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/bdt/BehaviourTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/bdt/BehaviourTest.java index 87cde18f70..7ba8091d4a 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/bdt/BehaviourTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/bdt/BehaviourTest.java @@ -227,6 +227,23 @@ public class BehaviourTest return new ExpectedFailure(this, exceptionClass); } + /** + * Perform work a number of times + * + * @param count number of times to perform the work + * @param work work to perform + * @return BehaviourTest test instance + */ + public BehaviourTest perform(int count, Work work) + { + for (int i = 0; i < count; i++) + { + perform(work); + } + + return this; + } + /** * Perform work *