刘光辉
14 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package jnpf.dmsPermission;
 
import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity;
import jnpf.dmsEntity.permission.model.DmsResourcePath;
import jnpf.dmsEntity.permission.model.DmsSubjectSet;
import org.junit.jupiter.api.Test;
 
import java.util.Arrays;
import java.util.UUID;
 
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
class DmsPermissionMatcherTest {
    private final DmsPermissionMatcher matcher = new DmsPermissionMatcher();
    private final UUID root = UUID.randomUUID();
    private final UUID child = UUID.randomUUID();
    private final UUID document = UUID.randomUUID();
    private final UUID version = UUID.randomUUID();
 
    @Test
    void folderSelfCoversDirectDocumentButNotChildFolder() {
        DmsFilePermissionEntity permission = permission("FOLDER", root, "SELF", "USER", "u1", false);
        DmsSubjectSet subjects = user("u1");
 
        assertTrue(matcher.matches(permission, documentPath(root), subjects));
        assertFalse(matcher.matches(permission, folderPath(child, root), subjects));
    }
 
    @Test
    void folderSubtreeCoversDescendantVersion() {
        DmsFilePermissionEntity permission = permission("FOLDER", root, "SUBTREE", "USER", "u1", false);
        assertTrue(matcher.matches(permission, versionPath(child, root), user("u1")));
    }
 
    @Test
    void documentSelfCoversAllItsVersions() {
        DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "USER", "u1", false);
        assertTrue(matcher.matches(permission, versionPath(child, root), user("u1")));
    }
 
    @Test
    void fileVersionDoesNotCoverAnotherVersion() {
        DmsFilePermissionEntity permission = permission("FILE_VERSION", version, "SELF", "USER", "u1", false);
        DmsResourcePath other = versionPath(child, root);
        other.setActualResourceId(UUID.randomUUID());
        assertFalse(matcher.matches(permission, other, user("u1")));
    }
 
    @Test
    void childOrganizationRequiresIncludeChildOrgs() {
        DmsSubjectSet subjects = user("u1");
        subjects.getDirectOrgIds().add("child-org");
        subjects.getAncestorOrgIds().addAll(Arrays.asList("child-org", "root-org"));
        DmsFilePermissionEntity directOnly = permission("DOCUMENT", document, "SELF", "ORG", "root-org", false);
        DmsFilePermissionEntity descendants = permission("DOCUMENT", document, "SELF", "ORG", "root-org", true);
 
        assertFalse(matcher.matches(directOnly, documentPath(child), subjects));
        assertTrue(matcher.matches(descendants, documentPath(child), subjects));
    }
 
    @Test
    void dmsGroupUsesResolvedPermissionGroupsOnly() {
        DmsSubjectSet subjects = user("u1");
        subjects.getPlatformGroupIds().add("g1");
        DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "GROUP", "g1", false);
 
        assertFalse(matcher.matches(permission, documentPath(child), subjects));
        subjects.getPermissionGroupIds().add("g1");
        assertTrue(matcher.matches(permission, documentPath(child), subjects));
    }
 
    private DmsFilePermissionEntity permission(String type, UUID resourceId, String scope,
                                                String principalType, String principalId, boolean childOrgs) {
        DmsFilePermissionEntity result = new DmsFilePermissionEntity();
        result.setResourceType(type);
        result.setResourceId(resourceId);
        result.setResourceScope(scope);
        result.setPrincipalType(principalType);
        result.setPrincipalId(principalId);
        result.setIncludeChildOrgs(childOrgs);
        return result;
    }
 
    private DmsSubjectSet user(String id) {
        DmsSubjectSet result = new DmsSubjectSet();
        result.setUserId(id);
        return result;
    }
 
    private DmsResourcePath folderPath(UUID actual, UUID... ancestors) {
        DmsResourcePath result = new DmsResourcePath();
        result.setActualResourceType("FOLDER");
        result.setActualResourceId(actual);
        result.setDirectFolderId(actual);
        result.getFolderPath().add(actual);
        result.getFolderPath().addAll(Arrays.asList(ancestors));
        return result;
    }
 
    private DmsResourcePath documentPath(UUID folder) {
        DmsResourcePath result = new DmsResourcePath();
        result.setActualResourceType("DOCUMENT");
        result.setActualResourceId(document);
        result.setDocumentId(document);
        result.setDirectFolderId(folder);
        result.getFolderPath().add(folder);
        return result;
    }
 
    private DmsResourcePath versionPath(UUID folder, UUID... ancestors) {
        DmsResourcePath result = new DmsResourcePath();
        result.setActualResourceType("FILE_VERSION");
        result.setActualResourceId(version);
        result.setDocumentId(document);
        result.setDirectFolderId(folder);
        result.getFolderPath().add(folder);
        result.getFolderPath().addAll(Arrays.asList(ancestors));
        return result;
    }
}