diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java b/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java index 712232d..9a8016e 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java @@ -16,6 +16,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.server.ConfigurationHandler; +import org.ultramine.server.PermissionHandler; @SideOnly(Side.SERVER) public class DedicatedPlayerList extends ServerConfigurationManager @@ -44,9 +45,7 @@ this.getBannedPlayers().saveToFileWithHeader(); this.getBannedIPs().loadBanList(); this.getBannedIPs().saveToFileWithHeader(); - this.loadOpsList(); this.readWhiteList(); - this.saveOpsList(); if (!this.whiteList.exists()) { @@ -64,13 +63,13 @@ public void addOp(String par1Str) { super.addOp(par1Str); - this.saveOpsList(); + PermissionHandler.getInstance().save(); } public void removeOp(String par1Str) { super.removeOp(par1Str); - this.saveOpsList(); + PermissionHandler.getInstance().save(); } public void removeFromWhitelist(String par1Str) diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index 758c89f..39e5c29 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -68,6 +68,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.server.ConfigurationHandler; +import org.ultramine.server.PermissionHandler; +import org.ultramine.server.util.OpPermissionProxySet; import org.ultramine.server.chunk.IChunkLoadCallback; public abstract class ServerConfigurationManager @@ -657,23 +659,23 @@ public void addOp(String par1Str) { - this.ops.add(par1Str.toLowerCase()); + PermissionHandler.getInstance().add("global", par1Str, PermissionHandler.OP_PERMISSION); } public void removeOp(String par1Str) { - this.ops.remove(par1Str.toLowerCase()); + PermissionHandler.getInstance().remove("global", par1Str, PermissionHandler.OP_PERMISSION); } public boolean isAllowedToLogin(String par1Str) { par1Str = par1Str.trim().toLowerCase(); - return !this.whiteListEnforced || this.ops.contains(par1Str) || this.whiteListedPlayers.contains(par1Str); + return !this.whiteListEnforced || PermissionHandler.getInstance().has("global", par1Str, PermissionHandler.OP_PERMISSION) || this.whiteListedPlayers.contains(par1Str); } public boolean isPlayerOpped(String par1Str) { - return this.ops.contains(par1Str.trim().toLowerCase()) || this.mcServer.isSinglePlayer() && this.mcServer.worldServers[0].getWorldInfo().areCommandsAllowed() && this.mcServer.getServerOwner().equalsIgnoreCase(par1Str) || this.commandsAllowedForAll; + 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; } public EntityPlayerMP getPlayerForUsername(String par1Str) @@ -874,9 +876,10 @@ return this.whiteListedPlayers; } + @Deprecated public Set getOps() { - return this.ops; + return new OpPermissionProxySet(); } public void loadWhiteList() {} diff --git a/src/main/java/org/ultramine/permission/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/ClientPermissionManager.java index 245bbfa..31278ae 100644 --- a/src/main/java/org/ultramine/permission/ClientPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ClientPermissionManager.java @@ -1,5 +1,7 @@ package org.ultramine.permission; +import java.util.Set; + public class ClientPermissionManager implements IPermissionHandler { private World global; @@ -64,4 +66,20 @@ global.get(player).setMeta(key, value); } + + @Override + public Set findUsersWithPermission(String world, String permission) + { + return global.getAllWithPermission(permission); + } + + @Override + public void save() + { + } + + @Override + public void reload() + { + } } diff --git a/src/main/java/org/ultramine/permission/IPermissionHandler.java b/src/main/java/org/ultramine/permission/IPermissionHandler.java index 405f9da..1911fc4 100644 --- a/src/main/java/org/ultramine/permission/IPermissionHandler.java +++ b/src/main/java/org/ultramine/permission/IPermissionHandler.java @@ -1,5 +1,7 @@ package org.ultramine.permission; +import java.util.Set; + public interface IPermissionHandler { public boolean has(String world, String player, String permission); @@ -15,4 +17,10 @@ public MetaResolver getMeta(String world, String player); public void setMeta(String world, String player, String key, Object value); + + public Set findUsersWithPermission(String world, String permission); + + public void save(); + + public void reload(); } \ 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 dc4789a..29989de 100644 --- a/src/main/java/org/ultramine/permission/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ServerPermissionManager.java @@ -5,6 +5,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; +import java.util.Set; public class ServerPermissionManager implements IPermissionHandler { @@ -109,6 +110,31 @@ worldContainer.get(player).setMeta(key, value); } + @Override + public Set findUsersWithPermission(String world, String permission) + { + if (!worlds.containsKey(world)) + return getGlobal().getAllWithPermission(permission); + + return getWorld(world).getAllWithPermission(permission); + } + + @Override + public void save() + { + saveGroups(); + for (String world : worlds.keySet()) + saveWorld(world); + } + + @Override + public void reload() + { + reloadGroups(); + for (String world : worlds.keySet()) + reloadWorld(world); + } + public void reloadWorld(String name) { World.WorldData data = YamlConfigProvider.getOrCreateConfig(worldFile(name), World.WorldData.class); diff --git a/src/main/java/org/ultramine/permission/UserContainer.java b/src/main/java/org/ultramine/permission/UserContainer.java index 95c870d..c11b64f 100644 --- a/src/main/java/org/ultramine/permission/UserContainer.java +++ b/src/main/java/org/ultramine/permission/UserContainer.java @@ -1,7 +1,9 @@ package org.ultramine.permission; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import static org.ultramine.permission.PermissionResolver.CheckResult; @@ -51,6 +53,23 @@ return users.get(name.toLowerCase()); } + public Set getAllWithPermission(String permission) + { + Set result; + if (parentContainer != null) + result = parentContainer.getAllWithPermission(permission); + else + result = new HashSet(); + + for (User user : users.values()) + { + if (user.getPermissions().check(permission) == CheckResult.TRUE) + result.add(user.getName()); + } + + return result; + } + public void add(T user) { if (users.containsKey(user.getName())) diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java index 328aed9..a8c3b44 100644 --- a/src/main/java/org/ultramine/server/PermissionHandler.java +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -8,8 +8,12 @@ import org.ultramine.permission.PermissionRepository; import org.ultramine.permission.ServerPermissionManager; +import java.util.Set; + public class PermissionHandler implements IPermissionHandler { + public static final String OP_PERMISSION = "minecraft.op"; + private static PermissionHandler instance; private static PermissionRepository permissionRepository = new PermissionRepository(); @@ -118,6 +122,24 @@ setMeta(worldName(player), player.getDisplayName(), key, value); } + @Override + public Set findUsersWithPermission(String world, String permission) + { + return handler.findUsersWithPermission(world, permission); + } + + @Override + public void save() + { + handler.save(); + } + + @Override + public void reload() + { + handler.reload(); + } + 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 a0f3f53..18ecdf3 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -47,6 +47,7 @@ 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 new file mode 100644 index 0000000..8835a39 --- /dev/null +++ b/src/main/java/org/ultramine/server/util/OpPermissionProxySet.java @@ -0,0 +1,111 @@ +package org.ultramine.server.util; + +import org.ultramine.server.PermissionHandler; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +/** + * Never use it! For backward сompatibility only. + */ +@Deprecated +public class OpPermissionProxySet implements Set +{ + @Override + public int size() + { + return ops().size(); + } + + @Override + public boolean isEmpty() + { + return ops().isEmpty(); + } + + @Override + public boolean contains(Object o) + { + return ops().contains(o); + } + + @Override + public Iterator iterator() + { + return ops().iterator(); + } + + @Override + public Object[] toArray() + { + return ops().toArray(); + } + + @Override + public T[] toArray(T[] a) + { + return ops().toArray(a); + } + + @Override + public boolean add(String s) + { + PermissionHandler.getInstance().add("global", s, PermissionHandler.OP_PERMISSION); + return true; + } + + @Override + public boolean remove(Object o) + { + PermissionHandler.getInstance().remove("global", o.toString(), PermissionHandler.OP_PERMISSION); + return true; + } + + @Override + public boolean containsAll(Collection c) + { + return ops().containsAll(c); + } + + @Override + public boolean addAll(Collection c) + { + for (String user : c) + add(user); + return true; + } + + @Override + public boolean retainAll(Collection c) + { + Set ops = ops(); + for (String user : ops) + { + if (!c.contains(user)) + remove(user); + } + return true; + } + + @Override + public boolean removeAll(Collection c) + { + for (Object user : c) + remove(user); + return true; + } + + @Override + public void clear() + { + Set ops = ops(); + for (String user : ops) + remove(user); + } + + private Set ops() + { + return PermissionHandler.getInstance().findUsersWithPermission("global", PermissionHandler.OP_PERMISSION); + } +}