diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
index 8116b69d78..b7758de742 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties
@@ -72,6 +72,12 @@ rm.completerecord.mandatorypropertiescheck.enabled=true
#
rm.patch.v22.convertToStandardFilePlan=false
+# Permission mapping
+# these take a comma separated string of permissions from org.alfresco.service.cmr.security.PermissionService
+# read maps to ReadRecords and write to FileRecords
+rm.haspermissionmap.read=ReadProperties,ReadChildren
+rm.haspermissionmap.write=WriteProperties,AddChildren
+
#
# Extended auto-version behaviour. If true and other auto-version properties are satisfied, then
# a document will be auto-versioned when its type is changed.
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml
index 3882036382..3d1e3db821 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml
@@ -138,6 +138,12 @@
+
+ ${rm.haspermissionmap.read}
+
+
+ ${rm.haspermissionmap.write}
+
diff --git a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java
index b859425123..4aa903c1c5 100644
--- a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java
@@ -21,8 +21,10 @@ package org.alfresco.repo.security.permissions.impl;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import java.io.Serializable;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
@@ -30,6 +32,7 @@ import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.repo.cache.SimpleCache;
+
import org.alfresco.repo.security.permissions.AccessControlEntry;
import org.alfresco.repo.security.permissions.AccessControlList;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -42,6 +45,7 @@ import org.alfresco.util.PropertyCheck;
import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationEvent;
+
/**
* Extends the core permission service implementation allowing the consideration of the read records
* permission.
@@ -56,6 +60,16 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl
/** Writers simple cache */
protected SimpleCache> writersCache;
+ /**
+ * Configured Permission mapping.
+ *
+ * These strings come from alfresco-global.properties and allow fine tuning of the how permissions are mapped.
+ * This was added as a fix for MNT-16852 to enhance compatibility with our Outlook Integration.
+ *
+ **/
+ protected List configuredReadPermissions;
+ protected List configuredFilePermissions;
+
/** File plan service */
private FilePlanService filePlanService;
@@ -97,6 +111,28 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl
this.writersCache = writersCache;
}
+ /**
+ * Maps the string from the properties file (rm.haspermissionmap.read)
+ * to the list used in the hasPermission method
+ *
+ * @param readMapping the mapping of permissions to ReadRecord
+ */
+ public void setConfiguredReadPermissions(String readMapping)
+ {
+ this.configuredReadPermissions = Arrays.asList(readMapping.split(","));
+ }
+
+ /**
+ * Maps the string set in the properties file (rm.haspermissionmap.write)
+ * to the list used in the hasPermission method
+ *
+ * @param fileMapping the mapping of permissions to FileRecord
+ */
+ public void setConfiguredFilePermissions(String fileMapping)
+ {
+ this.configuredFilePermissions = Arrays.asList(fileMapping.split(","));
+ }
+
/**
* @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#onBootstrap(org.springframework.context.ApplicationEvent)
*/
@@ -118,18 +154,18 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl
public AccessStatus hasPermission(NodeRef nodeRef, String perm)
{
AccessStatus acs = super.hasPermission(nodeRef, perm);
+
if (AccessStatus.DENIED.equals(acs) &&
- PermissionService.READ.equals(perm) &&
nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT))
{
- return super.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS);
- }
- // Added ADD_CHILDREN check in for MNT-16852.
- else if (AccessStatus.DENIED.equals(acs) &&
- (PermissionService.WRITE.equals(perm) || PermissionService.ADD_CHILDREN.equals(perm)) &&
- nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT))
- {
- return super.hasPermission(nodeRef, RMPermissionModel.FILE_RECORDS);
+ if (PermissionService.READ.equals(perm) || this.configuredReadPermissions.contains(perm))
+ {
+ return super.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS);
+ }
+ else if (PermissionService.WRITE.equals(perm) || this.configuredFilePermissions.contains(perm))
+ {
+ return super.hasPermission(nodeRef, RMPermissionModel.FILE_RECORDS);
+ }
}
return acs;