diff --git a/src/main/java/org/ultramine/permission/World.java b/src/main/java/org/ultramine/permission/World.java index d33f363..c324112 100644 --- a/src/main/java/org/ultramine/permission/World.java +++ b/src/main/java/org/ultramine/permission/World.java @@ -11,11 +11,11 @@ public class World extends UserContainer { - private GroupPermission defaultPermissions; + private GroupPermission defaultGroup; public World() { - this.defaultPermissions = new GroupPermission(""); + this.defaultGroup = new GroupPermission(""); } public void load(PermissionRepository repository, WorldData data) @@ -23,11 +23,17 @@ if (data == null) return; - defaultPermissions.clearPermissions(); - if (data.default_permissions != null) + defaultGroup = new GroupPermission(""); + if (data.default_group != null) { - for (String permission : data.default_permissions) - defaultPermissions.addPermission(repository.getPermission(permission)); + if (data.default_group.meta != null) + defaultGroup.setInnerMeta(data.default_group.meta); + + if (data.default_group.permissions != null) + { + for (String permission : data.default_group.permissions) + defaultGroup.addPermission(repository.getPermission(permission)); + } } clear(); @@ -47,7 +53,7 @@ { WorldData data = new WorldData(); - data.default_permissions = defaultPermissions.getInnerPermissions(); + data.default_group = new HolderData(defaultGroup); data.users = new HashMap(users.size()); for (User user : users.values()) @@ -60,9 +66,9 @@ return data; } - public GroupPermission getDefaultPermissions() + public GroupPermission getDefaultGroup() { - return defaultPermissions; + return defaultGroup; } public void setParentContainer(UserContainer container) @@ -71,19 +77,22 @@ } @Override + public String getUserMeta(String userName, String metaKey) + { + String result = super.getUserMeta(userName, metaKey); + return result.isEmpty() ? defaultGroup.getMeta(metaKey) : result; + } + + @Override protected CheckResult check(String userName, String permissionKey) { CheckResult result = super.check(userName, permissionKey); - - if (result == CheckResult.UNRESOLVED) - result = defaultPermissions.check(permissionKey); - - return result; + return result == CheckResult.UNRESOLVED ? defaultGroup.check(permissionKey) : result; } public static class WorldData { - public List default_permissions = new ArrayList(); + public HolderData default_group = new HolderData(); public Map users = new HashMap(); } diff --git a/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java index 7a87963..20180a3 100644 --- a/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java +++ b/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java @@ -31,7 +31,7 @@ this.owner = owner; for (String permission : DEFAULT_PERMISSIONS) - global.getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); + global.getDefaultGroup().addPermission(permissionRepository.getPermission(permission)); } @Override @@ -49,7 +49,7 @@ @Override public void addToWorld(String world, String permission) { - global.getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); + global.getDefaultGroup().addPermission(permissionRepository.getPermission(permission)); } @Override @@ -71,7 +71,7 @@ @Override public void removeFromWorld(String world, String permission) { - global.getDefaultPermissions().removePermission(permission); + global.getDefaultGroup().removePermission(permission); } @Override diff --git a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java index 2f1c8b8..e783af2 100644 --- a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java @@ -69,7 +69,7 @@ @Override public void addToWorld(String world, String permission) { - getOrCreateWorld(world).getDefaultPermissions() + getOrCreateWorld(world).getDefaultGroup() .addPermission(permissionRepository.getPermission(permission)); } @@ -96,7 +96,7 @@ if (worldObj == null) return; - worldObj.getDefaultPermissions().removePermission(permission); + worldObj.getDefaultGroup().removePermission(permission); } @Override @@ -112,11 +112,11 @@ @Override public String getMeta(String world, String player, String key) { - User user = getUser(world, player); - if (user == null) - return ""; - else - return user.getMeta(key); + World worldObj = worlds.get(world); + if (worldObj == null) + worldObj = worlds.get(GLOBAL_WORLD); + + return worldObj.getUserMeta(player, key); } @Override diff --git a/src/main/java/org/ultramine/permission/internal/UserContainer.java b/src/main/java/org/ultramine/permission/internal/UserContainer.java index 9ed1ca1..af8c40e 100644 --- a/src/main/java/org/ultramine/permission/internal/UserContainer.java +++ b/src/main/java/org/ultramine/permission/internal/UserContainer.java @@ -28,16 +28,32 @@ return check(userName, permissionKey).asBoolean(); } + public String getUserMeta(String userName, String metaKey) + { + userName = userName.toLowerCase(); + String result = ""; + + User user = get(userName); + if (user != null) + result = user.getMeta(metaKey); + + if (result.isEmpty() && parentContainer != null) + result = parentContainer.getUserMeta(userName, metaKey); + + return result; + } + protected CheckResult check(String userName, String permissionKey) { userName = userName.toLowerCase(); CheckResult result = CheckResult.UNRESOLVED; - if (parentContainer != null) - result = parentContainer.check(userName, permissionKey); + User user = get(userName); + if (user != null) + result = user.check(permissionKey); - if (result == CheckResult.UNRESOLVED && contains(userName)) - result = get(userName).check(permissionKey); + if (result == CheckResult.UNRESOLVED && parentContainer != null) + result = parentContainer.check(userName, permissionKey); return result; } diff --git a/src/test/groovy/org/ultramine/permission/UserContainerTest.groovy b/src/test/groovy/org/ultramine/permission/UserContainerTest.groovy index 10f913f..a282b78 100644 --- a/src/test/groovy/org/ultramine/permission/UserContainerTest.groovy +++ b/src/test/groovy/org/ultramine/permission/UserContainerTest.groovy @@ -33,8 +33,8 @@ when: "Override parent user in child container" child.add(stubUser("parent", [parent: false, child: true])) - then: "Parent container permissions have higher priority" - child.checkUserPermission("parent", "parent") + then: "Parent container permissions have lower priority" + !child.checkUserPermission("parent", "parent") child.checkUserPermission("parent", "child") and: "Parent container permissions is not modified" diff --git a/src/test/groovy/org/ultramine/permission/WorldTest.groovy b/src/test/groovy/org/ultramine/permission/WorldTest.groovy index 2da0c66..2afec70 100644 --- a/src/test/groovy/org/ultramine/permission/WorldTest.groovy +++ b/src/test/groovy/org/ultramine/permission/WorldTest.groovy @@ -80,14 +80,14 @@ when: "Add data to container" container.add(user) - container.getDefaultPermissions().addPermission(repository.getPermission("d1")) + container.getDefaultGroup().addPermission(repository.getPermission("d1")) and: "Save data" def data = container.save() then: "Output data is correct" - data.default_permissions.contains('d1') - data.default_permissions.size() == 1 + data.default_group.permissions.contains('d1') + data.default_group.permissions.size() == 1 data.users.size() == 1 data.users['test'].permissions.containsAll(['p1', '^p2']) data.users['test'].permissions.size() == 2 @@ -109,7 +109,9 @@ def testWorldData = new World.WorldData( - default_permissions: ['d'], + default_group: new World.HolderData( + permissions: ['d'] + ), users: [ user1: new World.HolderData( permissions: ['p.1', '^p.2'],