|
|
|
@@ -27,6 +27,7 @@
|
|
|
|
|
|
|
|
|
|
package org.alfresco.module.org_alfresco_module_rm.security;
|
|
|
|
|
|
|
|
|
|
import static java.util.Collections.singletonMap;
|
|
|
|
|
import static org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority.EXTENDED_READER;
|
|
|
|
|
import static org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriterDynamicAuthority.EXTENDED_WRITER;
|
|
|
|
|
import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT;
|
|
|
|
@@ -36,10 +37,15 @@ import static org.alfresco.service.cmr.security.OwnableService.NO_OWNER;
|
|
|
|
|
import static org.alfresco.util.ParameterCheck.mandatory;
|
|
|
|
|
import static org.apache.commons.lang.BooleanUtils.isTrue;
|
|
|
|
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
import org.alfresco.error.AlfrescoRuntimeException;
|
|
|
|
|
import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService;
|
|
|
|
|
import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent;
|
|
|
|
|
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
|
|
|
|
|
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
|
|
|
|
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
|
|
|
|
@@ -50,6 +56,7 @@ import org.alfresco.repo.policy.PolicyComponent;
|
|
|
|
|
import org.alfresco.repo.policy.annotation.Behaviour;
|
|
|
|
|
import org.alfresco.repo.policy.annotation.BehaviourBean;
|
|
|
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
|
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
|
|
|
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
|
|
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
|
|
|
import org.alfresco.service.cmr.security.AccessPermission;
|
|
|
|
@@ -75,6 +82,11 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
RMPermissionModel,
|
|
|
|
|
NodeServicePolicies.OnMoveNodePolicy
|
|
|
|
|
{
|
|
|
|
|
private static final String AUDIT_SET_PERMISSION = "set-permission";
|
|
|
|
|
|
|
|
|
|
/** An namespace to use when constructing QNames to use for auditing changes to permissions. */
|
|
|
|
|
private static final String AUDIT_NAMESPACE = "audit://permissions/";
|
|
|
|
|
|
|
|
|
|
/** Permission service */
|
|
|
|
|
private PermissionService permissionService;
|
|
|
|
|
|
|
|
|
@@ -93,6 +105,9 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
/** File plan service */
|
|
|
|
|
private FilePlanService filePlanService;
|
|
|
|
|
|
|
|
|
|
/** The RM audit service. */
|
|
|
|
|
private RecordsManagementAuditService recordsManagementAuditService;
|
|
|
|
|
|
|
|
|
|
/** Logger */
|
|
|
|
|
private static final Log LOGGER = LogFactory.getLog(FilePlanPermissionServiceImpl.class);
|
|
|
|
|
|
|
|
|
@@ -113,6 +128,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
NodeServicePolicies.OnMoveNodePolicy.QNAME,
|
|
|
|
|
TYPE_RECORD_CATEGORY,
|
|
|
|
|
new JavaBehaviour(this, "onMoveNode", TRANSACTION_COMMIT));
|
|
|
|
|
|
|
|
|
|
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Void doWork() throws Exception
|
|
|
|
|
{
|
|
|
|
|
recordsManagementAuditService.registerAuditEvent(new AuditEvent(AUDIT_SET_PERMISSION, "rm.audit.set-permission"));
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@@ -229,6 +254,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
this.filePlanService = filePlanService;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set the RM audit service.
|
|
|
|
|
*
|
|
|
|
|
* @param recordsManagementAuditService The RM audit service.
|
|
|
|
|
*/
|
|
|
|
|
public void setRecordsManagementAuditService(RecordsManagementAuditService recordsManagementAuditService)
|
|
|
|
|
{
|
|
|
|
|
this.recordsManagementAuditService = recordsManagementAuditService;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @see org.alfresco.module.org_alfresco_module_rm.security.FilePlanPermissionService#setupRecordCategoryPermissions(org.alfresco.service.cmr.repository.NodeRef)
|
|
|
|
|
*/
|
|
|
|
@@ -342,6 +377,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
|
|
|
|
|
final boolean hasUserPermission = authenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Boolean>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean doWork()
|
|
|
|
|
{
|
|
|
|
|
return getPermissionService().hasPermission(nodeRef, RMPermissionModel.FILING) == AccessStatus.ALLOWED;
|
|
|
|
@@ -352,6 +388,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
{
|
|
|
|
|
authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Void doWork()
|
|
|
|
|
{
|
|
|
|
|
getPermissionService().setPermission(nodeRef, user, RMPermissionModel.FILING, true);
|
|
|
|
@@ -367,6 +404,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
* @param parent parent node reference
|
|
|
|
|
* @param nodeRef child node reference
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void setupPermissions(final NodeRef parent, final NodeRef nodeRef)
|
|
|
|
|
{
|
|
|
|
|
mandatory("parent", parent);
|
|
|
|
@@ -376,6 +414,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
{
|
|
|
|
|
authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Object doWork()
|
|
|
|
|
{
|
|
|
|
|
// set inheritance
|
|
|
|
@@ -455,6 +494,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
|
|
|
|
|
authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Object doWork()
|
|
|
|
|
{
|
|
|
|
|
if (nodeService.exists(record) && nodeService.hasAspect(record, aspectTypeQName))
|
|
|
|
@@ -481,6 +521,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
|
|
|
|
|
authenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Void>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Void doWork()
|
|
|
|
|
{
|
|
|
|
|
NodeRef record = sourceAssocRef.getChildRef();
|
|
|
|
@@ -528,6 +569,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
/**
|
|
|
|
|
* @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#setPermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String, boolean)
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void setPermission(final NodeRef nodeRef, final String authority, final String permission)
|
|
|
|
|
{
|
|
|
|
|
ParameterCheck.mandatory("nodeRef", nodeRef);
|
|
|
|
@@ -536,12 +578,19 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
|
|
|
|
|
authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Void doWork()
|
|
|
|
|
{
|
|
|
|
|
if (canPerformPermissionAction(nodeRef))
|
|
|
|
|
{
|
|
|
|
|
// Construct a QName so that the authority and permission are visible in the log.
|
|
|
|
|
QName auditProperty = QName.createQName(AUDIT_NAMESPACE, authority + "_" + permission);
|
|
|
|
|
Map<QName, Serializable> oldPermission = getCurrentPermissionForAuthority(nodeRef, authority, permission, auditProperty);
|
|
|
|
|
// Set the permission on the node
|
|
|
|
|
getPermissionService().setPermission(nodeRef, authority, permission, true);
|
|
|
|
|
// Add an entry in the audit log.
|
|
|
|
|
recordsManagementAuditService.auditEvent(nodeRef, AUDIT_SET_PERMISSION,
|
|
|
|
|
oldPermission, new HashMap<>(singletonMap(auditProperty, (Serializable) true)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@@ -556,9 +605,31 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the current permission on a node for an authority.
|
|
|
|
|
*
|
|
|
|
|
* @param nodeRef The node.
|
|
|
|
|
* @param authority The authority.
|
|
|
|
|
* @param auditProperty The QName used as the key in the returned map.
|
|
|
|
|
* @return A map from the audit property to true or false depending on whether the user currently has permission.
|
|
|
|
|
*/
|
|
|
|
|
private Map<QName, Serializable> getCurrentPermissionForAuthority(NodeRef nodeRef, String authority, String permission, QName auditProperty)
|
|
|
|
|
{
|
|
|
|
|
Set<AccessPermission> allSetPermissions = getPermissionService().getAllSetPermissions(nodeRef);
|
|
|
|
|
for (AccessPermission setPermission : allSetPermissions)
|
|
|
|
|
{
|
|
|
|
|
if (setPermission.getAuthority().equals(authority) && setPermission.getPermission().equals(permission))
|
|
|
|
|
{
|
|
|
|
|
return new HashMap<>(singletonMap(auditProperty, true));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return new HashMap<>(singletonMap(auditProperty, false));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#deletePermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String)
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void deletePermission(final NodeRef nodeRef, final String authority, final String permission)
|
|
|
|
|
{
|
|
|
|
|
ParameterCheck.mandatory("nodeRef", nodeRef);
|
|
|
|
@@ -567,12 +638,19 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
|
|
|
|
|
|
|
|
|
|
authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Object>()
|
|
|
|
|
{
|
|
|
|
|
@Override
|
|
|
|
|
public Void doWork()
|
|
|
|
|
{
|
|
|
|
|
if (canPerformPermissionAction(nodeRef))
|
|
|
|
|
{
|
|
|
|
|
// Construct a QName so that the authority and permission are visible in the log.
|
|
|
|
|
QName auditProperty = QName.createQName(AUDIT_NAMESPACE, authority + "_" + permission);
|
|
|
|
|
Map<QName, Serializable> oldPermission = getCurrentPermissionForAuthority(nodeRef, authority, permission, auditProperty);
|
|
|
|
|
// Delete permission on this node
|
|
|
|
|
getPermissionService().deletePermission(nodeRef, authority, permission);
|
|
|
|
|
// Add an entry in the audit log.
|
|
|
|
|
recordsManagementAuditService.auditEvent(nodeRef, AUDIT_SET_PERMISSION,
|
|
|
|
|
oldPermission, new HashMap<>(singletonMap(auditProperty, (Serializable) false)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|