summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/PermissionContextFilter.java
blob: 75b20355cee1db9e1f63a1a14b321db47a4ebdbf (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
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package io.dico.dicore.command;

import java.util.List;
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);
    }

    public 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 (isInheritable()) {
            doFilter(subContext, getInheritedPermission(path));
        }
    }

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

    public boolean isInheritable() {
        return permissionComponents != null;
    }

    public String getPermission() {
        return permission;
    }

    public int getComponentInsertionIndex() {
        return componentInsertionIndex;
    }

    public String getFailMessage() {
        return failMessage;
    }

    /*
    private fun getPermissionsOf(address: ICommandAddress) = getPermissionsOf(address, emptyArray(), mutableListOf())

    private fun getPermissionsOf(address: ICommandAddress, path: Array<String>, result: MutableList<String>): List<String> {
        val command = address.command ?: return result

        var inherited = false
        for (filter in command.contextFilters) {
            when (filter) {
                is PermissionContextFilter -> {
                    if (path.isEmpty()) result.add(filter.permission)
                    else if (filter.isInheritable) result.add(filter.getInheritedPermission(path))
                }
                is InheritingContextFilter -> {
                    if (filter.priority == PERMISSION && address.hasParent() && !inherited) {
                        inherited = true
                        getPermissionsOf(address.parent, arrayOf(address.mainKey, *path), result)
                    }
                }
            }
        }

        return result
    }
     */

}