package jnpf.dmsPermission; import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity; import jnpf.dmsEntity.permission.enums.DmsPrincipalType; import jnpf.dmsEntity.permission.enums.DmsResourceScope; import jnpf.dmsEntity.permission.enums.DmsResourceType; import jnpf.dmsEntity.permission.model.DmsResourcePath; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import org.springframework.stereotype.Component; @Component public class DmsPermissionMatcher { public boolean matches(DmsFilePermissionEntity permission, DmsResourcePath path, DmsSubjectSet subjects) { return matchesPrincipal(permission, subjects) && coversResource(permission, path); } public boolean matchesPrincipal(DmsFilePermissionEntity permission, DmsSubjectSet subjects) { DmsPrincipalType type = DmsPrincipalType.valueOf(permission.getPrincipalType()); String id = permission.getPrincipalId(); switch (type) { case USER: return id.equals(subjects.getUserId()); case ORG: if ("CHILDREN".equals(permission.getApprovedOrgScope()) && "WORKFLOW".equals(permission.getSourceType()) && "SERVICE".equals(permission.getGrantedByType()) && "dms-approved-read".equals(permission.getGrantedById()) && "READ".equals(permission.getActionCode()) && "FILE_VERSION".equals(permission.getResourceType())) { return subjects.getDirectOrgIds().contains(id) || subjects.getImmediateParentOrgIds().contains(id); } return Boolean.TRUE.equals(permission.getIncludeChildOrgs()) ? subjects.getAncestorOrgIds().contains(id) : subjects.getDirectOrgIds().contains(id); case POSITION: return subjects.getPositionIds().contains(id); case ROLE: return subjects.getRoleIds().contains(id); case GROUP: return subjects.getPermissionGroupIds().contains(id); default: return false; } } public boolean coversResource(DmsFilePermissionEntity permission, DmsResourcePath path) { DmsResourceType grantedType = DmsResourceType.valueOf(permission.getResourceType()); if (grantedType == DmsResourceType.FILE_VERSION) { return DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType()) && permission.getResourceId().equals(path.getActualResourceId()); } if (grantedType == DmsResourceType.DOCUMENT) { return permission.getResourceId().equals(path.getDocumentId()); } if (DmsResourceScope.SUBTREE.name().equals(permission.getResourceScope())) { return path.getFolderPath().contains(permission.getResourceId()); } return permission.getResourceId().equals(path.getDirectFolderId()); } }