diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml
index 1a42cce612..ddbe2aa11b 100644
--- a/config/alfresco/public-services-security-context.xml
+++ b/config/alfresco/public-services-security-context.xml
@@ -939,6 +939,7 @@
+
diff --git a/source/java/org/alfresco/service/cmr/workflow/WorkflowPermissionInterceptor.java b/source/java/org/alfresco/service/cmr/workflow/WorkflowPermissionInterceptor.java
index 4d85c75a05..293a26e9f1 100644
--- a/source/java/org/alfresco/service/cmr/workflow/WorkflowPermissionInterceptor.java
+++ b/source/java/org/alfresco/service/cmr/workflow/WorkflowPermissionInterceptor.java
@@ -29,9 +29,11 @@ import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
+import org.alfresco.repo.workflow.WorkflowConstants;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.repo.workflow.activiti.ActivitiConstants;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.namespace.QName;
@@ -43,6 +45,7 @@ public class WorkflowPermissionInterceptor implements MethodInterceptor
private PersonService personService;
private AuthorityService authorityService;
private WorkflowService workflowService;
+ private NodeService nodeService;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable
@@ -137,6 +140,16 @@ public class WorkflowPermissionInterceptor implements MethodInterceptor
Map props = wt.getProperties();
String ownerName = (String) props.get(ContentModel.PROP_OWNER);
+ //fix for MNT-14366; if owner value can't be found on workflow properties because initiator nodeRef no longer exists
+ //get owner from initiatorhome nodeRef owner property
+ if (ownerName == null)
+ {
+ NodeRef initiatorHomeNodeRef = (NodeRef)props.get( QName.createQName("", WorkflowConstants.PROP_INITIATOR_HOME));
+ if (initiatorHomeNodeRef != null )
+ {
+ ownerName = (String)nodeService.getProperty(initiatorHomeNodeRef, ContentModel.PROP_OWNER);
+ }
+ }
if (userName != null && userName.equalsIgnoreCase(ownerName))
{
return true;
@@ -274,4 +287,9 @@ public class WorkflowPermissionInterceptor implements MethodInterceptor
{
this.workflowService = workflowService;
}
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
}
diff --git a/source/test-java/org/alfresco/repo/security/person/TestPersonManager.java b/source/test-java/org/alfresco/repo/security/person/TestPersonManager.java
index c4256c478c..49ee1a1231 100644
--- a/source/test-java/org/alfresco/repo/security/person/TestPersonManager.java
+++ b/source/test-java/org/alfresco/repo/security/person/TestPersonManager.java
@@ -76,6 +76,20 @@ public class TestPersonManager
}
}, AuthenticationUtil.getSystemUserName());
}
+
+ public void deletePerson(final String userName)
+ {
+ AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork()
+ {
+ public Void doWork() throws Exception
+ {
+ personService.deletePerson(userName);
+ return null;
+ }
+ }, AuthenticationUtil.getSystemUserName());
+ people.remove(userName);
+ AuthenticationUtil.clearCurrentSecurityContext();
+ }
private NodeRef makePersonNode(String userName)
{
diff --git a/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java b/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java
index c46700f915..373f5174ff 100644
--- a/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java
+++ b/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java
@@ -44,6 +44,7 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.GUID;
/**
* @author Nick Smith
@@ -51,6 +52,8 @@ import org.alfresco.service.namespace.QName;
*/
public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServiceIntegrationTest
{
+ private final static String USER_RECREATED = "WFUserRecreated" + GUID.generate();
+
public void testOutcome() throws Exception
{
WorkflowDefinition definition = deployDefinition("alfresco/workflow/review.bpmn20.xml");
@@ -354,6 +357,44 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ
assertEquals("Assign listener was not triggered", new Double(1), assignment1);
}
+ /**
+ * Test for MNT-14366
+ */
+ public void testWorkflowRecreatedUser()
+ {
+ WorkflowDefinition definition = deployDefinition("alfresco/workflow/review.bpmn20.xml");
+
+ personManager.createPerson(USER_RECREATED);
+ personManager.setUser(USER_RECREATED);
+
+ //create an workfow as USER_RECREATED
+ Map params = new HashMap();
+ Serializable wfPackage = workflowService.createPackage(null);
+ params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
+ NodeRef assignee = personManager.get(USER2);
+ params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee); // task instance field
+ WorkflowPath path = workflowService.startWorkflow(definition.getId(), params);
+ String instanceId = path.getInstance().getId();
+
+ //check if workflow owner property value is the same as initiator username
+ WorkflowTask startTask = workflowService.getStartTask(instanceId);
+ String owner = (String)startTask.getProperties().get(ContentModel.PROP_OWNER);
+ assertEquals(owner, USER_RECREATED);
+
+ //delete and recreate user
+ personManager.deletePerson(USER_RECREATED);
+ personManager.createPerson(USER_RECREATED);
+ personManager.setUser(USER_RECREATED);
+
+ //check workflow owner after user deletion and recreation
+ startTask = workflowService.getStartTask(instanceId);
+ owner = (String)startTask.getProperties().get(ContentModel.PROP_OWNER);
+ //owner is now null as nodeRef pointed by initiator property no longer exists;
+ //user has access to wokflow because owner value is extracted after fix from initiatorhome noderef
+ assertNull(owner);
+ workflowService.endTask(startTask.getId(), null);
+ }
+
protected String getLongString(int numberOfCharacters) {
StringBuffer stringBuffer = new StringBuffer();
for(int i=0; i