diff --git a/src/main/java/org/ultramine/permission/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/ClientPermissionManager.java new file mode 100644 index 0000000..245bbfa --- /dev/null +++ b/src/main/java/org/ultramine/permission/ClientPermissionManager.java @@ -0,0 +1,67 @@ +package org.ultramine.permission; + +public class ClientPermissionManager implements IPermissionHandler +{ + private World global; + private PermissionRepository permissionRepository; + + public ClientPermissionManager(PermissionRepository permissionRepository) + { + this.permissionRepository = permissionRepository; + this.global = new World(permissionRepository); + } + + @Override + public boolean has(String world, String player, String permission) + { + return global.checkUserPermission(player, permission); + } + + @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)); + } + + @Override + public void add(String world, String permission) + { + global.getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); + } + + @Override + public void remove(String world, String player, String permission) + { + if (!global.contains(player)) + return; + + global.get(player).removePermission(permission); + } + + @Override + public void remove(String world, String permission) + { + global.getDefaultPermissions().removePermission(permission); + } + + @Override + public MetaResolver getMeta(String world, String player) + { + if (!global.contains(player)) + return MetaResolver.BLANK_RESOLVER; + + return global.get(player).getMeta(); + } + + @Override + public void setMeta(String world, String player, String key, Object value) + { + if (!global.contains(player)) + global.add(new User(player)); + + global.get(player).setMeta(key, value); + } +} diff --git a/src/main/java/org/ultramine/permission/IPermissionHandler.java b/src/main/java/org/ultramine/permission/IPermissionHandler.java new file mode 100644 index 0000000..405f9da --- /dev/null +++ b/src/main/java/org/ultramine/permission/IPermissionHandler.java @@ -0,0 +1,18 @@ +package org.ultramine.permission; + +public interface IPermissionHandler +{ + public boolean has(String world, String player, String permission); + + public void add(String world, String player, String permission); + + public void add(String world, String permission); + + public void remove(String world, String player, String permission); + + public void remove(String world, String permission); + + public MetaResolver getMeta(String world, String player); + + public void setMeta(String world, String player, String key, Object value); +} \ No newline at end of file diff --git a/src/main/java/org/ultramine/permission/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/ServerPermissionManager.java index 233e758..dc4789a 100644 --- a/src/main/java/org/ultramine/permission/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ServerPermissionManager.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.Map; -public class ServerPermissionManager +public class ServerPermissionManager implements IPermissionHandler { private final static String GLOBAL_WORLD = "global"; private final static String GROUPS_CONFIG = "groups.yml"; @@ -16,18 +16,99 @@ private PermissionRepository permissionRepository; private Map groups; - public ServerPermissionManager(File configDir) + public ServerPermissionManager(File configDir, PermissionRepository permissionRepository) { this.configDir = new File(configDir, "permissions"); if (!this.configDir.exists()) this.configDir.mkdir(); - this.permissionRepository = new PermissionRepository(); + this.permissionRepository = permissionRepository; this.worlds = new HashMap(); this.groups = new HashMap(); + reloadGroups(); reloadWorld(GLOBAL_WORLD); } + + @Override + public boolean has(String world, String player, String permission) + { + if (!worlds.containsKey(world)) + return getGlobal().checkUserPermission(player, permission); + + return getWorld(world).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)); + } + + @Override + public void add(String world, String permission) + { + if (!worlds.containsKey(world)) + reloadWorld(world); + + getWorld(world).getDefaultPermissions().addPermission(permissionRepository.getPermission(permission)); + } + + @Override + public void remove(String world, String player, String permission) + { + if (!worlds.containsKey(world)) + return; + + World worldContainer = getWorld(world); + if (!worldContainer.contains(player)) + return; + + worldContainer.get(player).removePermission(permission); + } + + @Override + public void remove(String world, String permission) + { + if (!worlds.containsKey(world)) + return; + + getWorld(world).getDefaultPermissions().removePermission(permission); + } + + @Override + public MetaResolver getMeta(String world, String player) + { + if (!worlds.containsKey(world)) + return MetaResolver.BLANK_RESOLVER; + + World worldContainer = getWorld(world); + if (!worldContainer.contains(player)) + return MetaResolver.BLANK_RESOLVER; + + return worldContainer.get(player).getMeta(); + } + + @Override + public void setMeta(String world, String player, String key, Object 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); + } + public void reloadWorld(String name) { World.WorldData data = YamlConfigProvider.getOrCreateConfig(worldFile(name), World.WorldData.class); @@ -113,6 +194,6 @@ public static class GroupData { - Map groups = new HashMap(); + public Map groups = new HashMap(); } } diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java new file mode 100644 index 0000000..328aed9 --- /dev/null +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -0,0 +1,125 @@ +package org.ultramine.server; + +import net.minecraft.entity.player.EntityPlayer; +import org.ultramine.permission.ClientPermissionManager; +import org.ultramine.permission.IPermissionHandler; +import org.ultramine.permission.MetaResolver; +import org.ultramine.permission.Permission; +import org.ultramine.permission.PermissionRepository; +import org.ultramine.permission.ServerPermissionManager; + +public class PermissionHandler implements IPermissionHandler +{ + private static PermissionHandler instance; + private static PermissionRepository permissionRepository = new PermissionRepository(); + + public static void registerPermission(String key, String name, String description) + { + permissionRepository.registerPermission(new Permission(key, name, description)); + } + + public static PermissionRepository getRepository() + { + return permissionRepository; + } + + public static void initServer() + { + if (instance != null) + throw new IllegalStateException("Handler is already initialized"); + instance = new PermissionHandler(new ServerPermissionManager(ConfigurationHandler.getSettingDir(), permissionRepository)); + } + + public static void initClient() + { + if (instance != null) + throw new IllegalStateException("Handler is already initialized"); + instance = new PermissionHandler(new ClientPermissionManager(permissionRepository)); + } + + public static PermissionHandler getInstance() + { + if (instance == null) + throw new IllegalStateException("Handler is not initialized"); + return instance; + } + + private IPermissionHandler handler; + + private PermissionHandler(IPermissionHandler handler) + { + this.handler = handler; + } + + @Override + public boolean has(String world, String player, String permission) + { + return handler.has(world, player, permission); + } + + public boolean has(EntityPlayer player, String permission) + { + return has(worldName(player), player.getDisplayName(), permission); + } + + @Override + public void add(String world, String player, String permission) + { + handler.add(world, player, permission); + } + + public void add(EntityPlayer player, String permission) + { + add(worldName(player), player.getDisplayName(), permission); + } + + @Override + public void add(String world, String permission) + { + handler.add(world, permission); + } + + @Override + public void remove(String world, String player, String permission) + { + handler.remove(world, player, permission); + } + + public void remove(EntityPlayer player, String permission) + { + remove(worldName(player), player.getDisplayName(), permission); + } + + @Override + public void remove(String world, String permission) + { + handler.remove(world, permission); + } + + @Override + public MetaResolver getMeta(String world, String player) + { + return handler.getMeta(world, player); + } + + public MetaResolver getMeta(EntityPlayer player) + { + return getMeta(worldName(player), player.getDisplayName()); + } + + @Override + public void setMeta(String world, String player, String key, Object value) + { + handler.setMeta(world, player, key, value); + } + + public void setMeta(EntityPlayer player, String key, Object value) + { + setMeta(worldName(player), player.getDisplayName(), key, value); + } + + private String worldName(EntityPlayer 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 0a89844..a0f3f53 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -14,6 +14,7 @@ import cpw.mods.fml.common.event.FMLConstructionEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkCheckHandler; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; @@ -74,6 +75,20 @@ ); } + @Subscribe + public void serverStarting(FMLServerStartingEvent e) + { + switch (e.getSide()) + { + case CLIENT: + PermissionHandler.initClient(); + break; + case SERVER: + PermissionHandler.initServer(); + break; + } + } + @Override public Object getMod() { diff --git a/src/main/java/org/ultramine/server/util/YamlConfigProvider.java b/src/main/java/org/ultramine/server/util/YamlConfigProvider.java index 6844cd0..6b0b915 100644 --- a/src/main/java/org/ultramine/server/util/YamlConfigProvider.java +++ b/src/main/java/org/ultramine/server/util/YamlConfigProvider.java @@ -44,7 +44,10 @@ { try { - reader.close(); + if (reader != null) + { + reader.close(); + } } catch (IOException ignored) {} } } @@ -69,7 +72,10 @@ { try { - writer.close(); + if (writer != null) + { + writer.close(); + } } catch (IOException ignored) {} } }