diff options
author | Dinnerbone <dinnerbone@dinnerbone.com> | 2011-07-17 17:19:41 +0100 |
---|---|---|
committer | Dinnerbone <dinnerbone@dinnerbone.com> | 2011-07-17 17:19:41 +0100 |
commit | 5d2a1958358cb86643ae16ad4f65c650678a1983 (patch) | |
tree | ce46be7585fcb7bc29eb942734db187a5615f0c9 | |
parent | cc9ccc8976a5c3ca9092a421413e2cc2224d5147 (diff) | |
download | craftbukkit-5d2a1958358cb86643ae16ad4f65c650678a1983.tar craftbukkit-5d2a1958358cb86643ae16ad4f65c650678a1983.tar.gz craftbukkit-5d2a1958358cb86643ae16ad4f65c650678a1983.tar.lz craftbukkit-5d2a1958358cb86643ae16ad4f65c650678a1983.tar.xz craftbukkit-5d2a1958358cb86643ae16ad4f65c650678a1983.zip |
Implemented new permission system
5 files changed, 151 insertions, 1 deletions
@@ -79,6 +79,13 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.yaml</groupId> + <artifactId>snakeyaml</artifactId> + <version>1.7</version> + <type>jar</type> + <scope>provided</scope> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava-collections</artifactId> <version>r03</version> diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/ServerConfigurationManager.java index 5b41812a..0d8d6219 100644 --- a/src/main/java/net/minecraft/server/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/ServerConfigurationManager.java @@ -431,11 +431,25 @@ public class ServerConfigurationManager { public void e(String s) { this.h.add(s.toLowerCase()); this.l(); + + // Craftbukkit start + Player player = server.server.getPlayer(s); + if (player != null) { + player.recalculatePermissions(); + } + // Craftbukkit end } public void f(String s) { this.h.remove(s.toLowerCase()); this.l(); + + // Craftbukkit start + Player player = server.server.getPlayer(s); + if (player != null) { + player.recalculatePermissions(); + } + // Craftbukkit end } private void k() { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 4b5e738d..692fdd6d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit; +import java.io.FileNotFoundException; import org.bukkit.generator.ChunkGenerator; import com.avaje.ebean.config.DataSourceConfig; import com.avaje.ebean.config.ServerConfig; @@ -18,12 +19,14 @@ import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.UUID; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import jline.ConsoleReader; @@ -58,9 +61,13 @@ import org.bukkit.craftbukkit.command.ServerCommandListener; import org.bukkit.scheduler.BukkitWorker; import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.permissions.Permission; import org.bukkit.plugin.PluginLoadOrder; import org.bukkit.util.config.Configuration; import org.bukkit.util.config.ConfigurationNode; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.error.MarkedYAMLException; public final class CraftServer implements Server { private final String serverName = "Craftbukkit"; @@ -74,6 +81,7 @@ public final class CraftServer implements Server { protected final ServerConfigurationManager server; private final Map<String, World> worlds = new LinkedHashMap<String, World>(); private final Configuration configuration; + private final Yaml yaml = new Yaml(new SafeConstructor()); public CraftServer(MinecraftServer console, ServerConfigurationManager server) { this.console = console; @@ -101,6 +109,8 @@ public final class CraftServer implements Server { configuration.getString("settings.update-folder", "update"); configuration.getInt("settings.spawn-radius", 16); + configuration.getString("settings.permissions-file", "permissions.yml"); + if (configuration.getNode("aliases") == null) { List<String> icanhasbukkit = new ArrayList<String>(); icanhasbukkit.add("version"); @@ -139,6 +149,7 @@ public final class CraftServer implements Server { if (type == PluginLoadOrder.POSTWORLD) { commandMap.registerServerAliases(); + loadCustomPermissions(); } } @@ -149,6 +160,16 @@ public final class CraftServer implements Server { private void loadPlugin(Plugin plugin) { try { pluginManager.enablePlugin(plugin); + + List<Permission> perms = plugin.getDescription().getPermissions(); + + for (Permission perm : perms) { + try { + pluginManager.addPermission(perm); + } catch (IllegalArgumentException ex) { + getLogger().log(Level.WARNING, "Plugin " + plugin.getDescription().getFullName() + " tried to register permission '" + perm.getName() + "' but it's already registered", ex); + } + } } catch (Throwable ex) { Logger.getLogger(CraftServer.class.getName()).log(Level.SEVERE, ex.getMessage() + " loading " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); } @@ -359,6 +380,48 @@ public final class CraftServer implements Server { enablePlugins(PluginLoadOrder.POSTWORLD); } + private void loadCustomPermissions() { + File file = new File(configuration.getString("settings.permissions-file")); + FileInputStream stream; + + try { + stream = new FileInputStream(file); + } catch (FileNotFoundException ex) { + try { + file.createNewFile(); + } finally { + return; + } + } + + Map<String, Map<String, Object>> perms; + + try { + perms = (Map<String, Map<String, Object>>)yaml.load(stream); + } catch (MarkedYAMLException ex) { + getLogger().log(Level.WARNING, "Server permissions file " + file + " is not valid YAML: " + ex.toString()); + return; + } catch (Throwable ex) { + getLogger().log(Level.WARNING, "Server permissions file " + file + " is not valid YAML.", ex); + return; + } + + if (perms == null) { + getLogger().log(Level.INFO, "Server permissions file " + file + " is empty, ignoring it"); + return; + } + + Set<String> keys = perms.keySet(); + + for (String name : keys) { + try { + pluginManager.addPermission(Permission.loadPermission(name, perms.get(name))); + } catch (Throwable ex) { + Bukkit.getServer().getLogger().log(Level.SEVERE, "Permission node '" + name + "' in server config is invalid", ex); + } + } + } + @Override public String toString() { return "CraftServer{" + "serverName=" + serverName + ",serverVersion=" + serverVersion + ",protocolVersion=" + protocolVersion + '}'; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 04723c35..2e7ee5f5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -1,15 +1,23 @@ package org.bukkit.craftbukkit.entity; +import java.util.Set; import net.minecraft.server.EntityHuman; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { private CraftInventoryPlayer inventory; + private final PermissibleBase perm = new PermissibleBase(this); + private boolean op; public CraftHumanEntity(final CraftServer server, final EntityHuman entity) { super(server, entity); @@ -55,4 +63,57 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { public int getSleepTicks() { return getHandle().sleepTicks; } + + public boolean isOp() { + return op; + } + + public boolean isPermissionSet(String name) { + return perm.isPermissionSet(name); + } + + public boolean isPermissionSet(Permission perm) { + return this.perm.isPermissionSet(perm); + } + + public boolean hasPermission(String name) { + return perm.hasPermission(name); + } + + public boolean hasPermission(Permission perm) { + return this.perm.hasPermission(perm); + } + + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { + return perm.addAttachment(plugin, name, value); + } + + public PermissionAttachment addAttachment(Plugin plugin) { + return perm.addAttachment(plugin); + } + + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { + return perm.addAttachment(plugin, name, value, ticks); + } + + public PermissionAttachment addAttachment(Plugin plugin, int ticks) { + return perm.addAttachment(plugin, ticks); + } + + public void removeAttachment(PermissionAttachment attachment) { + perm.removeAttachment(attachment); + } + + public void recalculatePermissions() { + perm.recalculatePermissions(); + } + + public void setOp(boolean value) { + this.op = value; + recalculatePermissions(); + } + + public Set<PermissionAttachmentInfo> getEffectivePermissions() { + return perm.getEffectivePermissions(); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 7d1c2b71..39240809 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -25,15 +25,20 @@ import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; public class CraftPlayer extends CraftHumanEntity implements Player { - public CraftPlayer(CraftServer server, EntityPlayer entity) { super(server, entity); } + @Override public boolean isOp() { return server.getHandle().isOp(getName()); } + @Override + public void setOp(boolean value) { + server.getHandle().e(getName()); + } + public boolean isPlayer() { return true; } |