diff --git a/src/main/java/org/ultramine/permission/DummyPermission.java b/src/main/java/org/ultramine/permission/DummyPermission.java index 54ea82a..b184024 100644 --- a/src/main/java/org/ultramine/permission/DummyPermission.java +++ b/src/main/java/org/ultramine/permission/DummyPermission.java @@ -48,7 +48,7 @@ @Override public void mergePermissionsTo(PermissionResolver resolver) { - resolver.merge(getKey(), true, Integer.MAX_VALUE); + resolver.merge(getKey(), (Boolean)true, Integer.MAX_VALUE); } @Override diff --git a/src/main/java/org/ultramine/permission/NegativePermission.java b/src/main/java/org/ultramine/permission/NegativePermission.java index 6042816..bc59143 100644 --- a/src/main/java/org/ultramine/permission/NegativePermission.java +++ b/src/main/java/org/ultramine/permission/NegativePermission.java @@ -38,9 +38,9 @@ super.mergePermissionsTo(new PermissionResolver() { @Override - public void merge(String key, Boolean value, int priority) + public boolean merge(String key, Boolean value, int priority) { - resolver.merge(key, !value, priority); + return resolver.merge(key, !value, priority); } }); } diff --git a/src/main/java/org/ultramine/permission/internal/CheckResult.java b/src/main/java/org/ultramine/permission/internal/CheckResult.java index b25f6f9..eca8663 100644 --- a/src/main/java/org/ultramine/permission/internal/CheckResult.java +++ b/src/main/java/org/ultramine/permission/internal/CheckResult.java @@ -9,7 +9,7 @@ return value ? TRUE : FALSE; } - public boolean toBoolean() + public boolean asBoolean() { return this == TRUE; } diff --git a/src/main/java/org/ultramine/permission/internal/PermissionResolver.java b/src/main/java/org/ultramine/permission/internal/PermissionResolver.java index 93f247a..af826ac 100644 --- a/src/main/java/org/ultramine/permission/internal/PermissionResolver.java +++ b/src/main/java/org/ultramine/permission/internal/PermissionResolver.java @@ -1,30 +1,30 @@ package org.ultramine.permission.internal; -import java.util.Map; +import java.util.*; public class PermissionResolver extends Resolver { + private SortedMap wildcards; + public PermissionResolver() { super(); + this.wildcards = new TreeMap(Collections.reverseOrder()); } public static PermissionResolver createInverted(PermissionResolver anotherResolver) { PermissionResolver resolver = new PermissionResolver(); for (Map.Entry entry : anotherResolver.values.entrySet()) - { - resolver.values.put(entry.getKey(), !entry.getValue()); - resolver.priorities.put(entry.getKey(), anotherResolver.priorities.get(entry.getKey())); - } + resolver.merge(entry.getKey(), !entry.getValue(), anotherResolver.priorities.get(entry.getKey())); + return resolver; } public static PermissionResolver createForKey(String key, int priority) { PermissionResolver resolver = new PermissionResolver(); - resolver.values.put(key, true); - resolver.priorities.put(key, priority); + resolver.merge(key, true, priority); return resolver; } @@ -37,19 +37,32 @@ if (values.containsKey(key)) return CheckResult.fromBoolean(values.get(key)); - int index = key.lastIndexOf('.'); - while (index >= 0) + if (wildcards.size() > 0) { - key = key.substring(0, index); - String wildcard = key + ".*"; - if (values.containsKey(wildcard)) - return CheckResult.fromBoolean(values.get(wildcard)); - - index = key.lastIndexOf('.'); + for (Map.Entry entry : wildcards.entrySet()) + { + if (key.startsWith(entry.getKey())) + return CheckResult.fromBoolean(entry.getValue()); + } } - if (values.containsKey("*")) - return CheckResult.fromBoolean(values.get("*")); return CheckResult.UNRESOLVED; } -} + + @Override + public void clear() + { + super.clear(); + wildcards.clear(); + } + + @Override + public boolean merge(String key, Boolean value, int priority) + { + boolean result = super.merge(key, value, priority); + if (result && key.endsWith(".*")) + wildcards.put(key.substring(0, key.length() - 1), value); + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/org/ultramine/permission/internal/Resolver.java b/src/main/java/org/ultramine/permission/internal/Resolver.java index 0b4b5b4..1966f64 100644 --- a/src/main/java/org/ultramine/permission/internal/Resolver.java +++ b/src/main/java/org/ultramine/permission/internal/Resolver.java @@ -35,12 +35,14 @@ } - public void merge(String key, T value, int priority) + public boolean merge(String key, T value, int priority) { if (!priorities.containsKey(key) || priorities.get(key) < priority) { values.put(key, value); priorities.put(key, priority); + return true; } + return false; } } diff --git a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java index 628539a..2601652 100644 --- a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java @@ -12,6 +12,7 @@ { private final static String GLOBAL_WORLD = "global"; private final static String GROUPS_CONFIG = "groups.yml"; + private static final String GROUP_PREFIX = "group."; private File configDir; private Map worlds; @@ -66,8 +67,8 @@ @Override public void addToGroup(String group, String permission) { - if (!group.startsWith("group.")) - group = "group." + group; + if (!group.startsWith(GROUP_PREFIX)) + group = GROUP_PREFIX + group; if (!groups.containsKey(group)) groups.put(group, new GroupPermission(group)); @@ -100,8 +101,8 @@ @Override public void removeFromGroup(String group, String permission) { - if (!group.startsWith("group.")) - group = "group." + group; + if (!group.startsWith(GROUP_PREFIX)) + group = GROUP_PREFIX + group; if (!groups.containsKey(group)) return; @@ -203,8 +204,8 @@ { GroupPermission group; String groupKey = groupData.getKey(); - if (!groupKey.startsWith("group.")) - groupKey = "group." + groupKey; + if (!groupKey.startsWith(GROUP_PREFIX)) + groupKey = GROUP_PREFIX + groupKey; if (!groups.containsKey(groupKey)) { diff --git a/src/main/java/org/ultramine/permission/internal/UserContainer.java b/src/main/java/org/ultramine/permission/internal/UserContainer.java index 85105c6..82d01a2 100644 --- a/src/main/java/org/ultramine/permission/internal/UserContainer.java +++ b/src/main/java/org/ultramine/permission/internal/UserContainer.java @@ -25,7 +25,7 @@ public final boolean checkUserPermission(String userName, String permissionKey) { - return check(userName, permissionKey) == CheckResult.TRUE; + return check(userName, permissionKey).asBoolean(); } protected CheckResult check(String userName, String permissionKey) @@ -55,10 +55,10 @@ else result = new HashSet(); - for (User user : users.values()) + for (String username : users.keySet()) { - if (user.check(permission) == CheckResult.TRUE) - result.add(user.getName()); + if (!result.contains(username) && checkUserPermission(username, permission)) + result.add(username); } return result; diff --git a/src/test/groovy/org/ultramine/permission/PermissionResolverTest.groovy b/src/test/groovy/org/ultramine/permission/PermissionResolverTest.groovy index eae64a1..4665fda 100644 --- a/src/test/groovy/org/ultramine/permission/PermissionResolverTest.groovy +++ b/src/test/groovy/org/ultramine/permission/PermissionResolverTest.groovy @@ -10,14 +10,6 @@ */ class PermissionResolverTest extends Specification { - def setupSpec() { - PermissionResolver.metaClass.addEntry = { String key, Boolean value, Integer prio -> - delegate.values.put(key, value) - delegate.priorities.put(key, prio) - return delegate - } - } - @Unroll def "Test createForKey: #key"() { when: "Creating resolver for key" @@ -33,8 +25,8 @@ def "Test createInverted"() { setup: def resolver = new PermissionResolver() - resolver.addEntry("p.true", true, 0) - resolver.addEntry("p.false", false, 0) + resolver.merge("p.true", true, 0) + resolver.merge("p.false", false, 0) when: "Create inverted resolver" def inverted = PermissionResolver.createInverted(resolver) @@ -50,7 +42,7 @@ def "Test wildcard"() { setup: "Resolver with wildcard permission" def resolver = new PermissionResolver() - resolver.addEntry("test.perm.*", true, 0) + resolver.merge("test.perm.*", true, 0) expect: "Other permissions are not affected" resolver.check("group.admin") == UNRESOLVED @@ -68,8 +60,8 @@ def "Test single permission override wildcard"() { setup: "Resolver with wildcard and permission" def resolver = new PermissionResolver() - resolver.addEntry("test.perm.*", true, 1) - resolver.addEntry("test.perm.super", false, 0) + resolver.merge("test.perm.*", true, 1) + resolver.merge("test.perm.super", false, 0) expect: "Wildcard has lower priority" resolver.check("test.perm.super") == FALSE @@ -86,8 +78,8 @@ def "Test higher node wildcard priority"() { setup: "Resolver with wildcards" def resolver = new PermissionResolver() - resolver.addEntry("test.perm.*", true, 1) - resolver.addEntry("test.perm.super.*", false, 0) + resolver.merge("test.perm.*", true, 1) + resolver.merge("test.perm.super.*", false, 0) expect: "Higher node wildcard has priority" resolver.check("test.perm.super.p") == FALSE @@ -106,7 +98,7 @@ def "Test clear"() { setup: def resolver = new PermissionResolver() - resolver.addEntry("test.perm", true, 0) + resolver.merge("test.perm", true, 0) when: "Clear resolver's data" resolver.clear() @@ -118,15 +110,15 @@ def "Test merge"() { setup: "First resolver" def resolver1 = new PermissionResolver() - resolver1.addEntry("test.perm", true, 1) - resolver1.addEntry("test.perm.1", true, 1) - resolver1.addEntry("test.perm.2", false, 1) + resolver1.merge("test.perm", true, 1) + resolver1.merge("test.perm.1", true, 1) + resolver1.merge("test.perm.2", false, 1) and: "Second resolver" def resolver2 = new PermissionResolver() - resolver2.addEntry("test.perm", false, 0) - resolver2.addEntry("test.perm.1", false, 2) - resolver2.addEntry("test.perm.3", true, 2) + resolver2.merge("test.perm", false, 0) + resolver2.merge("test.perm.1", false, 2) + resolver2.merge("test.perm.3", true, 2) when: "Merging first then second" def result = new PermissionResolver() @@ -165,8 +157,10 @@ def "Test clear -> merge lower priority"() { setup: "resolver(^test, 100)" - def resolver = new PermissionResolver().addEntry("test", false, 100) - def inverted = new PermissionResolver().addEntry("test", true, 50) + def resolver = new PermissionResolver() + resolver.merge("test", false, 100) + def inverted = new PermissionResolver() + inverted.merge("test", true, 50) when: resolver.clear()