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;
}
}
|