summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java
blob: 649267759d0ce87de9769dfd6491241a158714ed (plain)
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
package io.dico.dicore.command;

import java.util.Objects;

public class PermissionContextFilter implements IContextFilter {
    private String permission;
    private String[] permissionComponents;
    private int componentInsertionIndex;
    private String failMessage;

    public PermissionContextFilter(String permission) {
        this.permission = Objects.requireNonNull(permission);
    }

    public PermissionContextFilter(String permission, String failMessage) {
        this(permission);
        this.failMessage = failMessage;
    }

    public PermissionContextFilter(String permission, boolean inheritable) {
        this(permission, null, inheritable);
    }

    public PermissionContextFilter(String permission, String failMessage, boolean inheritable) {
        this(permission, failMessage);
        if (inheritable) {
            setupInheritability(-1);
        }
    }

    public PermissionContextFilter(String permission, int componentInsertionIndex, String failMessage) {
        this(permission, failMessage);
        setupInheritability(componentInsertionIndex);
    }

    private void setupInheritability(int componentInsertionIndex) {
        this.permissionComponents = permission.split("\\.");
        this.componentInsertionIndex = componentInsertionIndex < 0 ? permissionComponents.length : componentInsertionIndex;
        if (componentInsertionIndex > permissionComponents.length) throw new IllegalArgumentException();
    }

    private void doFilter(ExecutionContext context, String permission) throws CommandException {
        if (failMessage != null) {
            Validate.isAuthorized(context.getSender(), permission, failMessage);
        } else {
            Validate.isAuthorized(context.getSender(), permission);
        }
    }

    @Override
    public void filterContext(ExecutionContext context) throws CommandException {
        doFilter(context, permission);
    }

    private String getInheritedPermission(String[] components) {
        int insertedAmount = components.length;
        String[] currentComponents = permissionComponents;
        int currentAmount = currentComponents.length;
        String[] targetArray = new String[currentAmount + insertedAmount];

        int insertionIndex;
        //int newInsertionIndex;
        if (componentInsertionIndex == -1) {
            insertionIndex = currentAmount;
            //newInsertionIndex = -1;
        } else {
            insertionIndex = componentInsertionIndex;
            //newInsertionIndex = insertionIndex + insertedAmount;
        }

        // copy the current components up to insertionIndex
        System.arraycopy(currentComponents, 0, targetArray, 0, insertionIndex);
        // copy the new components into the array at insertionIndex
        System.arraycopy(components, 0, targetArray, insertionIndex, insertedAmount);
        // copy the current components from insertionIndex + inserted amount
        System.arraycopy(currentComponents, insertionIndex, targetArray, insertionIndex + insertedAmount, currentAmount - insertionIndex);

        return String.join(".", targetArray);
    }

    @Override
    public void filterSubContext(ExecutionContext subContext, String... path) throws CommandException {
        if (permissionComponents != null) {
            doFilter(subContext, getInheritedPermission(path));
        }
    }

    @Override
    public Priority getPriority() {
        return Priority.PERMISSION;
    }

}