diff --git a/src/main/java/org/ultramine/permission/NegativePermission.java b/src/main/java/org/ultramine/permission/NegativePermission.java index 5578f5d..aa1b0f0 100644 --- a/src/main/java/org/ultramine/permission/NegativePermission.java +++ b/src/main/java/org/ultramine/permission/NegativePermission.java @@ -45,6 +45,12 @@ } @Override + public MetaResolver getMeta() + { + return MetaResolver.BLANK_RESOLVER; + } + + @Override public void makeDirty() { dirty = true; diff --git a/src/main/java/org/ultramine/permission/YamlBasedContainer.java b/src/main/java/org/ultramine/permission/YamlBasedContainer.java index 45ac42e..f9a8e03 100644 --- a/src/main/java/org/ultramine/permission/YamlBasedContainer.java +++ b/src/main/java/org/ultramine/permission/YamlBasedContainer.java @@ -16,7 +16,7 @@ private File config; private PermissionRepository repository; private GroupPermission defaultPermissions; - private User defaultUser; + private PermissionHolder defaultUser; public YamlBasedContainer(PermissionRepository permissionRepository, File config) { @@ -27,8 +27,9 @@ defaultPermissions = new GroupPermission(DP_PREFIX + name); defaultPermissions.setMeta("description", "Default permissions for " + name); - defaultUser = new User(DP_PREFIX + name); + defaultUser = new PermissionHolder(); defaultUser.addPermission(defaultPermissions); + repository.registerPermission(defaultPermissions); reload(); } @@ -36,13 +37,20 @@ public void reload() { WorldData data = YamlConfigProvider.getOrCreateConfig(config, WorldData.class); + if (data == null) + return; defaultPermissions.clearPermissions(); - for (String permission : data.default_permissions) - defaultPermissions.addPermission(repository.getPermission(permission)); - repository.registerPermission(defaultPermissions); + if (data.default_permissions != null) + { + for (String permission : data.default_permissions) + defaultPermissions.addPermission(repository.getPermission(permission)); + } clear(); + if (data.users == null) + return; + for (Map.Entry userData : data.users.entrySet()) { User user = new User(userData.getKey(), userData.getValue().meta); @@ -64,6 +72,7 @@ WorldData.UserData userData = new WorldData.UserData(); userData.permissions = user.getInnerPermissions(); userData.meta = user.getInnerMeta(); + data.users.put(user.getName(), userData); } YamlConfigProvider.saveConfig(config, data); diff --git a/src/test/groovy/org/ultramine/permission/NegativePermissionTest.groovy b/src/test/groovy/org/ultramine/permission/NegativePermissionTest.groovy index 5b22420..c548bab 100644 --- a/src/test/groovy/org/ultramine/permission/NegativePermissionTest.groovy +++ b/src/test/groovy/org/ultramine/permission/NegativePermissionTest.groovy @@ -16,7 +16,6 @@ getDescription() >> "Test Description" getPriority() >> 100 getPermissions() >> PermissionResolver.createForKey("test.key", 1) - getMeta() >> Mock(MetaResolver) { getString(_) >> "mock" } } when: "Create new NegativePermission" @@ -27,15 +26,12 @@ perm.getName() == "NOT: Test Name" perm.getDescription() == "NOT: Test Description" perm.getPriority() == 100 - perm.getMeta().getString("1") == "mock" perm.getPermissions().check("test.key") == FALSE } def "Test subscribe/unsubscribe IPermission"() { setup: - IPermission permission = Mock(IPermission) { - getPermissions() >> PermissionResolver.createForKey("test.key", 1) - } + IPermission permission = Mock(IPermission) def listener = Mock(IDirtyListener) def perm = new NegativePermission(permission) @@ -50,14 +46,13 @@ } def "Test wrap IChangeablePermission"() { - setup: + setup: "Create new NegativePermission" IPermission permission = Mock(IChangeablePermission) { getKey() >> "test.key" getName() >> "Test Name" getDescription() >> "Test Description" getPriority() >> 100 getPermissions() >> PermissionResolver.createForKey("test.key", 1) - getMeta() >> Mock(MetaResolver) { getString(_) >> "mock" } } when: "Create new NegativePermission" @@ -68,15 +63,15 @@ perm.getName() == "NOT: Test Name" perm.getDescription() == "NOT: Test Description" perm.getPriority() == 100 - perm.getMeta().getString("1") == "mock" perm.getPermissions().check("test.key") == FALSE + + and: "Subscribed to permission" + 1 * permission.subscribe(_) } def "Test subscribe/unsubscribe IChangeablePermission"() { setup: - IPermission permission = Mock(IChangeablePermission) { - getPermissions() >> PermissionResolver.createForKey("test.key", 1) - } + IPermission permission = Mock(IChangeablePermission) def listener = Mock(IDirtyListener) def perm = new NegativePermission(permission) @@ -94,7 +89,6 @@ def "Test blank description"() { setup: "Permission with blank description" IPermission permission = Mock(IChangeablePermission) { - getPermissions() >> PermissionResolver.createForKey("test.key", 1) getDescription() >> "" } @@ -104,4 +98,32 @@ then: "Description is blank" perm.getDescription() == "" } + + def "Test blank meta"() { + + when: "Create new NegativePermission" + def perm = new NegativePermission(Mock(IPermission)) + + then: "Description is blank" + perm.getMeta() == MetaResolver.BLANK_RESOLVER + } + + def "Test integration with group permission"() { + setup: + def group = new GroupPermission("group") + group.addPermission(new Permission("p1")) + + when: "Create negative permission" + def perm = new NegativePermission(group) + + then: "Negative permission contains group permissions" + perm.getPermissions().check("p1") == FALSE + + when: "Group permission updates" + group.addPermission(new Permission("p2")) + + then: "Negative permission also updates" + perm.getPermissions().check("p1") == FALSE + perm.getPermissions().check("p2") == FALSE + } } diff --git a/src/test/groovy/org/ultramine/permission/YamlBasedContainerTest.groovy b/src/test/groovy/org/ultramine/permission/YamlBasedContainerTest.groovy index 1ff728c..471a513 100644 --- a/src/test/groovy/org/ultramine/permission/YamlBasedContainerTest.groovy +++ b/src/test/groovy/org/ultramine/permission/YamlBasedContainerTest.groovy @@ -30,6 +30,86 @@ !container.get("user2").getMeta().getInt("b") } + def "Test config reloading"() { + setup: + def repository = new PermissionRepository() + def container = new YamlBasedContainer(repository, testYaml) + + when: "Add permission and meta to user" + container.get("user1").addPermission(repository.getPermission("test")) + container.get("user2").setMeta("test", "data") + + then: "User have this permission and meta" + container.checkUserPermission("user1", "test") + container.get("user2").getMeta().getString("test") == "data" + + when: "Reloading container" + container.reload() + + then: "User have not this permission and meta" + !container.checkUserPermission("user1", "test") + !container.get("user2").getMeta().getString("test") + + and: "Container is reloaded correctly" + container.checkUserPermission("user1", "d") + container.checkUserPermission("user1", "p.1") + !container.checkUserPermission("user1", "p.2") + !container.checkUserPermission("user1", "p.3") + !container.checkUserPermission("user1", "group.admin") + + !container.checkUserPermission("user2", "d") + !container.checkUserPermission("user2", "p.1") + !container.checkUserPermission("user2", "p.2") + container.checkUserPermission("user2", "p.3") + !container.checkUserPermission("user2", "group.admin") + + container.get("user1").getMeta().getString("a") == "a" + container.get("user1").getMeta().getInt("b") == 1 + !container.get("user2").getMeta().getString("a") + !container.get("user2").getMeta().getInt("b") + } + + def "Test config saving"() { + setup: + def file = File.createTempFile(RandomStringUtils.randomNumeric(10), ".yml") + def repository = new PermissionRepository() + def container = new YamlBasedContainer(repository, file) + def user = new User("test") + user.addPermission(repository.getPermission("p1")) + user.addPermission(repository.getPermission("^p2")) + + when: "Add data to container" + container.add(user) + container.getDefaultPermissions().addPermission(repository.getPermission("d1")) + + and: "Save data" + container.save() + + then: "Output data is correct" + file.text == +"""default_permissions: +- d1 +users: + test: + meta: {} + permissions: + - ^p2 + - p1 +""" + + when: "Try to load this config" + def anotherContainer = new YamlBasedContainer(new PermissionRepository(), file) + + then: "Container loaded correctly" + anotherContainer.checkUserPermission("test", "d1") + anotherContainer.checkUserPermission("test", "p1") + !anotherContainer.checkUserPermission("test", "p2") + + anotherContainer.checkUserPermission("test1", "d1") + !anotherContainer.checkUserPermission("test1", "p1") + !anotherContainer.checkUserPermission("test1", "p2") + } + def testYaml = File.createTempFile(RandomStringUtils.randomNumeric(10), ".yml") .with { write("""