diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index 39e5c29..3f79c5b 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -659,23 +659,23 @@ public void addOp(String par1Str) { - PermissionHandler.getInstance().add("global", par1Str, PermissionHandler.OP_PERMISSION); + PermissionHandler.getInstance().add("global", par1Str, OpPermissionProxySet.OP_PERMISSION); } public void removeOp(String par1Str) { - PermissionHandler.getInstance().remove("global", par1Str, PermissionHandler.OP_PERMISSION); + PermissionHandler.getInstance().remove("global", par1Str, OpPermissionProxySet.OP_PERMISSION); } public boolean isAllowedToLogin(String par1Str) { par1Str = par1Str.trim().toLowerCase(); - return !this.whiteListEnforced || PermissionHandler.getInstance().has("global", par1Str, PermissionHandler.OP_PERMISSION) || this.whiteListedPlayers.contains(par1Str); + return !this.whiteListEnforced || PermissionHandler.getInstance().has("global", par1Str, OpPermissionProxySet.OP_PERMISSION) || this.whiteListedPlayers.contains(par1Str); } public boolean isPlayerOpped(String par1Str) { - return PermissionHandler.getInstance().has("global", par1Str, PermissionHandler.OP_PERMISSION) || this.mcServer.isSinglePlayer() && this.mcServer.worldServers[0].getWorldInfo().areCommandsAllowed() && this.mcServer.getServerOwner().equalsIgnoreCase(par1Str) || this.commandsAllowedForAll; + return PermissionHandler.getInstance().has("global", par1Str, OpPermissionProxySet.OP_PERMISSION) || this.mcServer.isSinglePlayer() && this.mcServer.worldServers[0].getWorldInfo().areCommandsAllowed() && this.mcServer.getServerOwner().equalsIgnoreCase(par1Str) || this.commandsAllowedForAll; } public EntityPlayerMP getPlayerForUsername(String par1Str) diff --git a/src/main/java/org/ultramine/permission/IPermissionHandler.java b/src/main/java/org/ultramine/permission/IPermissionHandler.java deleted file mode 100644 index ead733f..0000000 --- a/src/main/java/org/ultramine/permission/IPermissionHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.ultramine.permission; - -import org.ultramine.permission.internal.MetaResolver; - -import java.util.Set; - -public interface IPermissionHandler -{ - public boolean has(String world, String player, String permission); - - public void add(String world, String player, String permission); - - public void addToWorld(String world, String permission); - - public void addToGroup(String group, String permission); - - public void remove(String world, String player, String permission); - - public void removeFromWorld(String world, String permission); - - public void removeFromGroup(String group, String permission); - - public MetaResolver getMeta(String world, String player); - - public void setMeta(String world, String player, String key, String value); - - public Set findUsersWithPermission(String world, String permission); - - public void save(); - - public void reload(); - - public PermissionRepository getRepository(); -} \ No newline at end of file diff --git a/src/main/java/org/ultramine/permission/IPermissionManager.java b/src/main/java/org/ultramine/permission/IPermissionManager.java new file mode 100644 index 0000000..37cd173 --- /dev/null +++ b/src/main/java/org/ultramine/permission/IPermissionManager.java @@ -0,0 +1,34 @@ +package org.ultramine.permission; + +import org.ultramine.permission.internal.UserContainer; + +public interface IPermissionManager +{ + public boolean has(String world, String player, String permission); + + public void add(String world, String player, String permission); + + public void addToWorld(String world, String permission); + + public void addToGroup(String group, String permission); + + public void remove(String world, String player, String permission); + + public void removeFromWorld(String world, String permission); + + public void removeFromGroup(String group, String permission); + + public String getMeta(String world, String player, String key); + + public void setMeta(String world, String player, String key, String value); + + public void setGroupMeta(String group, String key, String value); + + public void save(); + + public void reload(); + + public PermissionRepository getRepository(); + + public UserContainer getWorldContainer(String world); +} \ No newline at end of file diff --git a/src/main/java/org/ultramine/permission/World.java b/src/main/java/org/ultramine/permission/World.java index bd1d765..21b30d0 100644 --- a/src/main/java/org/ultramine/permission/World.java +++ b/src/main/java/org/ultramine/permission/World.java @@ -11,16 +11,14 @@ public class World extends UserContainer { - private PermissionRepository repository; private GroupPermission defaultPermissions; - public World(PermissionRepository permissionRepository) + public World() { - this.repository = permissionRepository; this.defaultPermissions = new GroupPermission(""); } - public void load(WorldData data) + public void load(PermissionRepository repository, WorldData data) { if (data == null) return; diff --git a/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java index c6dc538..94c0a05 100644 --- a/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java +++ b/src/main/java/org/ultramine/permission/internal/ClientPermissionManager.java @@ -1,12 +1,16 @@ package org.ultramine.permission.internal; -import org.ultramine.permission.*; +import org.ultramine.permission.GroupPermission; +import org.ultramine.permission.IPermissionManager; +import org.ultramine.permission.IPermissionManager; +import org.ultramine.permission.PermissionRepository; +import org.ultramine.permission.User; +import org.ultramine.permission.World; import java.util.HashMap; import java.util.Map; -import java.util.Set; -public class ClientPermissionManager implements IPermissionHandler +public class ClientPermissionManager implements IPermissionManager { private World global; private PermissionRepository permissionRepository; @@ -15,7 +19,7 @@ public ClientPermissionManager(PermissionRepository permissionRepository) { this.permissionRepository = permissionRepository; - this.global = new World(permissionRepository); + this.global = new World(); this.groups = new HashMap(); } @@ -28,10 +32,7 @@ @Override public void add(String world, String player, String permission) { - if (!global.contains(player)) - global.add(new User(player)); - - global.get(player).addPermission(permissionRepository.getPermission(permission)); + getOrCreateUser(player).addPermission(permissionRepository.getPermission(permission)); } @Override @@ -43,22 +44,17 @@ @Override public void addToGroup(String group, String permission) { - if (!group.startsWith("group.")) - group = "group." + group; - - if (!groups.containsKey(group)) - groups.put(group, new GroupPermission(group)); - - groups.get(group).addPermission(permissionRepository.getPermission(permission)); + getOrCreateGroup(group).addPermission(permissionRepository.getPermission(permission)); } @Override public void remove(String world, String player, String permission) { - if (!global.contains(player)) + User user = global.get(player); + if (user == null) return; - global.get(player).removePermission(permission); + user.removePermission(permission); } @Override @@ -70,37 +66,30 @@ @Override public void removeFromGroup(String group, String permission) { - if (!group.startsWith("group.")) - group = "group." + group; - - if (!groups.containsKey(group)) - return; - - groups.get(group).removePermission(permission); + GroupPermission groupObj = groups.get(ServerPermissionManager.fixGroupKey(group)); + groupObj.removePermission(permission); } @Override - public MetaResolver getMeta(String world, String player) + public String getMeta(String world, String player, String key) { - if (!global.contains(player)) - return MetaResolver.BLANK_RESOLVER; - - return global.get(player).getMetaResolver(); + User user = global.get(player); + if (user == null) + return ""; + else + return user.getMeta(key); } @Override public void setMeta(String world, String player, String key, String value) { - if (!global.contains(player)) - global.add(new User(player)); - - global.get(player).setMeta(key, value); + getOrCreateUser(player).setMeta(key, value); } @Override - public Set findUsersWithPermission(String world, String permission) + public void setGroupMeta(String group, String key, String value) { - return global.getAllWithPermission(permission); + getOrCreateGroup(group).setMeta(key, value); } @Override @@ -118,4 +107,36 @@ { return permissionRepository; } + + @Override + public UserContainer getWorldContainer(String world) + { + return global; + } + + private User getOrCreateUser(String name) + { + User user = global.get(name); + if (user == null) + { + user = new User(name); + global.add(user); + } + + return user; + } + + private GroupPermission getOrCreateGroup(String name) + { + String groupKey = ServerPermissionManager.fixGroupKey(name); + GroupPermission group = groups.get(groupKey); + if (group == null) + { + group = new GroupPermission(groupKey); + permissionRepository.registerPermission(group); + groups.put(groupKey, group); + } + + return group; + } } diff --git a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java index 2601652..5fd6277 100644 --- a/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/internal/ServerPermissionManager.java @@ -1,16 +1,19 @@ package org.ultramine.permission.internal; -import org.ultramine.permission.*; +import org.ultramine.permission.GroupPermission; +import org.ultramine.permission.IPermissionManager; +import org.ultramine.permission.PermissionRepository; +import org.ultramine.permission.User; +import org.ultramine.permission.World; import org.ultramine.server.util.YamlConfigProvider; import java.io.File; import java.util.HashMap; import java.util.Map; -import java.util.Set; -public class ServerPermissionManager implements IPermissionHandler +public class ServerPermissionManager implements IPermissionManager { - private final static String GLOBAL_WORLD = "global"; + public final static String GLOBAL_WORLD = "global"; private final static String GROUPS_CONFIG = "groups.yml"; private static final String GROUP_PREFIX = "group."; @@ -32,117 +35,97 @@ reloadWorld(GLOBAL_WORLD); } + @Override + public PermissionRepository getRepository() + { + return permissionRepository; + } + + @Override + public UserContainer getWorldContainer(String world) + { + return worlds.get(world); + } @Override public boolean has(String world, String player, String permission) { - if (!worlds.containsKey(world)) - return getGlobal().checkUserPermission(player, permission); + World worldObj = worlds.get(world); + if (worldObj == null) + worldObj = worlds.get(GLOBAL_WORLD); - return getWorld(world).checkUserPermission(player, permission); + return worldObj.checkUserPermission(player, permission); } @Override public void add(String world, String player, String permission) { - if (!worlds.containsKey(world)) - reloadWorld(world); - - World worldContainer = getWorld(world); - if (!worldContainer.contains(player)) - worldContainer.add(new User(player)); - - worldContainer.get(player).addPermission(permissionRepository.getPermission(permission)); + getOrCreateUser(world, player).addPermission(permissionRepository.getPermission(permission)); } @Override public void addToWorld(String world, String permission) { - if (!worlds.containsKey(world)) - reloadWorld(world); - - getWorld(world).getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); + getOrCreateWorld(world).getDefaultPermissions() + .addPermission(permissionRepository.getPermission(permission)); } @Override public void addToGroup(String group, String permission) { - if (!group.startsWith(GROUP_PREFIX)) - group = GROUP_PREFIX + group; - - if (!groups.containsKey(group)) - groups.put(group, new GroupPermission(group)); - - groups.get(group).addPermission(permissionRepository.getPermission(permission)); + getOrCreateGroup(group).addPermission(permissionRepository.getPermission(permission)); } @Override public void remove(String world, String player, String permission) { - if (!worlds.containsKey(world)) + User user = getUser(world, player); + if (user == null) return; - World worldContainer = getWorld(world); - if (!worldContainer.contains(player)) - return; - - worldContainer.get(player).removePermission(permission); + user.removePermission(permission); } @Override public void removeFromWorld(String world, String permission) { - if (!worlds.containsKey(world)) + World worldObj = worlds.get(world); + if (worldObj == null) return; - getWorld(world).getDefaultPermissions().removePermission(permission); + worldObj.getDefaultPermissions().removePermission(permission); } @Override public void removeFromGroup(String group, String permission) { - if (!group.startsWith(GROUP_PREFIX)) - group = GROUP_PREFIX + group; - - if (!groups.containsKey(group)) + GroupPermission groupObj = groups.get(fixGroupKey(group)); + if (groupObj == null) return; - groups.get(group).removePermission(permission); + groupObj.removePermission(permission); } @Override - public MetaResolver getMeta(String world, String player) + public String getMeta(String world, String player, String key) { - if (!worlds.containsKey(world)) - return MetaResolver.BLANK_RESOLVER; - - World worldContainer = getWorld(world); - if (!worldContainer.contains(player)) - return MetaResolver.BLANK_RESOLVER; - - return worldContainer.get(player).getMetaResolver(); + User user = getUser(world, player); + if (user == null) + return ""; + else + return user.getMeta(key); } @Override public void setMeta(String world, String player, String key, String value) { - if (!worlds.containsKey(world)) - reloadWorld(world); - - World worldContainer = getWorld(world); - if (!worldContainer.contains(player)) - worldContainer.add(new User(player)); - - worldContainer.get(player).setMeta(key, value); + getOrCreateUser(world, player).setMeta(key, value); } @Override - public Set findUsersWithPermission(String world, String permission) + public void setGroupMeta(String group, String key, String value) { - if (!worlds.containsKey(world)) - return getGlobal().getAllWithPermission(permission); - - return getWorld(world).getAllWithPermission(permission); + getOrCreateGroup(group).setMeta(key, value); } @Override @@ -161,31 +144,31 @@ reloadWorld(world); } - @Override - public PermissionRepository getRepository() - { - return permissionRepository; - } - - public void reloadWorld(String name) + public World reloadWorld(String name) { World.WorldData data = YamlConfigProvider.getOrCreateConfig(worldFile(name), World.WorldData.class); - if (!worlds.containsKey(name)) - worlds.put(name, new World(permissionRepository)); + World world = worlds.get(name); + if (world == null) + { + world = new World(); + worlds.put(name, world); + } - worlds.get(name).load(data); + world.load(permissionRepository, data); if (!name.equals(GLOBAL_WORLD)) - worlds.get(name).setParentContainer(getGlobal()); + world.setParentContainer(worlds.get(GLOBAL_WORLD)); + return world; } public void saveWorld(String name) { - if (!worlds.containsKey(name)) + World world = worlds.get(name); + if (world == null) return; - YamlConfigProvider.saveConfig(worldFile(name), worlds.get(name).save()); + YamlConfigProvider.saveConfig(worldFile(name), world.save()); } public void reloadGroups() @@ -202,22 +185,8 @@ for (Map.Entry groupData : data.groups.entrySet()) { - GroupPermission group; - String groupKey = groupData.getKey(); - if (!groupKey.startsWith(GROUP_PREFIX)) - groupKey = GROUP_PREFIX + groupKey; - - if (!groups.containsKey(groupKey)) - { - group = new GroupPermission(groupKey, groupData.getValue().meta); - permissionRepository.registerPermission(group); - groups.put(groupKey, group); - } - else - { - group = groups.get(groupKey); - group.setInnerMeta(groupData.getValue().meta); - } + GroupPermission group = getOrCreateGroup(groupData.getKey()); + group.setInnerMeta(groupData.getValue().meta); for (String pKey : groupData.getValue().permissions) group.addPermission(permissionRepository.getPermission(pKey)); @@ -234,14 +203,58 @@ YamlConfigProvider.saveConfig(groupsFile(), data); } - public World getWorld(String name) + private World getOrCreateWorld(String name) { - return worlds.get(name); + World world = worlds.get(name); + if (world == null) + world = reloadWorld(name); + + return world; } - public World getGlobal() + private User getUser(String worldName, String userName) { - return getWorld(GLOBAL_WORLD); + World world = worlds.get(worldName); + if (world == null) + return null; + + return world.get(userName); + } + + private User getOrCreateUser(String worldName, String userName) + { + World world = getOrCreateWorld(worldName); + + User user = world.get(userName); + if (user == null) + { + user = new User(userName); + world.add(user); + } + + return user; + } + + public static String fixGroupKey(String key) + { + if (key.startsWith(GROUP_PREFIX)) + return key; + else + return GROUP_PREFIX + key; + } + + private GroupPermission getOrCreateGroup(String name) + { + String groupKey = fixGroupKey(name); + GroupPermission group = groups.get(groupKey); + if (group == null) + { + group = new GroupPermission(groupKey); + permissionRepository.registerPermission(group); + groups.put(groupKey, group); + } + + return group; } private File worldFile(String name) diff --git a/src/main/java/org/ultramine/permission/internal/UserContainer.java b/src/main/java/org/ultramine/permission/internal/UserContainer.java index 82d01a2..9ed1ca1 100644 --- a/src/main/java/org/ultramine/permission/internal/UserContainer.java +++ b/src/main/java/org/ultramine/permission/internal/UserContainer.java @@ -85,6 +85,7 @@ public void clear() { users.clear(); + parentContainer = null; } public boolean contains(String name) diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java index b742370..bfa413d 100644 --- a/src/main/java/org/ultramine/server/PermissionHandler.java +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -1,32 +1,18 @@ package org.ultramine.server; import net.minecraft.command.ICommandSender; -import org.ultramine.permission.DummyPermission; import org.ultramine.permission.IPermission; -import org.ultramine.permission.IPermissionHandler; +import org.ultramine.permission.IPermissionManager; import org.ultramine.permission.PermissionRepository; import org.ultramine.permission.internal.ClientPermissionManager; -import org.ultramine.permission.internal.MetaResolver; import org.ultramine.permission.internal.ServerPermissionManager; +import org.ultramine.permission.internal.UserContainer; -import java.util.Set; - -public class PermissionHandler implements IPermissionHandler +public class PermissionHandler implements IPermissionManager { - public static final String OP_PERMISSION = "minecraft.op"; - private static PermissionHandler instance; private static PermissionRepository mainRepository = new PermissionRepository(); - // TODO: Удалить - public static void registerPermission(String key, String name, String description) - { - if (instance != null) - getInstance().getRepository().registerPermission(new DummyPermission(key)); - else - mainRepository.registerPermission(new DummyPermission(key)); - } - public static void registerPermission(IPermission permission) { if (instance != null) @@ -69,9 +55,9 @@ return instance; } - private IPermissionHandler handler; + private IPermissionManager handler; - private PermissionHandler(IPermissionHandler handler) + private PermissionHandler(IPermissionManager handler) { this.handler = handler; } @@ -154,14 +140,14 @@ } @Override - public MetaResolver getMeta(String world, String player) + public String getMeta(String world, String player, String key) { - return handler.getMeta(world, player); + return handler.getMeta(world, player, key); } - public MetaResolver getMeta(ICommandSender player) + public String getMeta(ICommandSender player, String key) { - return getMeta(worldName(player), player.getCommandSenderName()); + return getMeta(worldName(player), player.getCommandSenderName(), key); } @Override @@ -170,18 +156,18 @@ handler.setMeta(world, player, key, value); } + @Override + public void setGroupMeta(String group, String key, String value) + { + handler.setGroupMeta(group, key, value); + } + public void setMeta(ICommandSender player, String key, String value) { setMeta(worldName(player), player.getCommandSenderName(), key, value); } @Override - public Set findUsersWithPermission(String world, String permission) - { - return handler.findUsersWithPermission(world, permission); - } - - @Override public void save() { handler.save(); @@ -199,6 +185,12 @@ return handler.getRepository(); } + @Override + public UserContainer getWorldContainer(String world) + { + return handler.getWorldContainer(world); + } + private String worldName(ICommandSender player) { return player.getEntityWorld().getWorldInfo().getWorldName(); diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index e814f5c..f3551f5 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -50,7 +50,6 @@ public void preInit(FMLPreInitializationEvent e) { ConfigurationHandler.load(); - PermissionHandler.registerPermission(PermissionHandler.OP_PERMISSION, "Op", "Standard minecraft op permissions"); } @Subscribe diff --git a/src/main/java/org/ultramine/server/util/OpPermissionProxySet.java b/src/main/java/org/ultramine/server/util/OpPermissionProxySet.java index 8835a39..d97a4e9 100644 --- a/src/main/java/org/ultramine/server/util/OpPermissionProxySet.java +++ b/src/main/java/org/ultramine/server/util/OpPermissionProxySet.java @@ -1,5 +1,6 @@ package org.ultramine.server.util; +import org.ultramine.permission.internal.ServerPermissionManager; import org.ultramine.server.PermissionHandler; import java.util.Collection; @@ -12,6 +13,8 @@ @Deprecated public class OpPermissionProxySet implements Set { + public static final String OP_PERMISSION = "minecraft.op"; + @Override public int size() { @@ -51,14 +54,14 @@ @Override public boolean add(String s) { - PermissionHandler.getInstance().add("global", s, PermissionHandler.OP_PERMISSION); + PermissionHandler.getInstance().add("global", s, OP_PERMISSION); return true; } @Override public boolean remove(Object o) { - PermissionHandler.getInstance().remove("global", o.toString(), PermissionHandler.OP_PERMISSION); + PermissionHandler.getInstance().remove("global", o.toString(), OP_PERMISSION); return true; } @@ -106,6 +109,7 @@ private Set ops() { - return PermissionHandler.getInstance().findUsersWithPermission("global", PermissionHandler.OP_PERMISSION); + return PermissionHandler.getInstance() + .getWorldContainer(ServerPermissionManager.GLOBAL_WORLD).getAllWithPermission(OP_PERMISSION); } } diff --git a/src/test/groovy/org/ultramine/permission/WorldTest.groovy b/src/test/groovy/org/ultramine/permission/WorldTest.groovy index 22f802b..2da0c66 100644 --- a/src/test/groovy/org/ultramine/permission/WorldTest.groovy +++ b/src/test/groovy/org/ultramine/permission/WorldTest.groovy @@ -6,8 +6,8 @@ def "Test config parsing"() { setup: - def container = new World(new PermissionRepository()) - container.load(testWorldData) + def container = new World() + container.load(new PermissionRepository(), testWorldData) expect: "Permissions are loaded correctly" container.checkUserPermission("user1", "d") @@ -33,8 +33,8 @@ def "Test config reloading"() { setup: def repository = new PermissionRepository() - def container = new World(repository) - container.load(testWorldData) + def container = new World() + container.load(repository, testWorldData) when: "Add permission and meta to user" container.get("user1").addPermission(repository.getPermission("test")) @@ -45,7 +45,7 @@ container.get("user2").getMeta("test") == "data" when: "Reloading container" - container.load(testWorldData) + container.load(repository, testWorldData) then: "User have not this permission and meta" !container.checkUserPermission("user1", "test") @@ -73,7 +73,7 @@ def "Test config saving"() { setup: def repository = new PermissionRepository() - def container = new World(repository) + def container = new World() def user = new User("test") user.addPermission(repository.getPermission("p1")) user.addPermission(repository.getPermission("^p2")) @@ -94,8 +94,8 @@ data.users['test'].meta.size() == 0 when: "Try to load this config" - def anotherContainer = new World(repository) - anotherContainer.load(data) + def anotherContainer = new World() + anotherContainer.load(repository, data) then: "Container loaded correctly" anotherContainer.checkUserPermission("test", "d1")