diff --git a/pom.xml b/pom.xml index 006c141515..be842a4b7f 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,13 @@ jar provided + + org.yaml + snakeyaml + 1.7 + jar + provided + com.google.guava guava-collections diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/ServerConfigurationManager.java index 5b41812a0e..0d8d621990 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 4b5e738d58..692fdd6d11 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 worlds = new LinkedHashMap(); 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 icanhasbukkit = new ArrayList(); 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 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> perms; + + try { + perms = (Map>)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 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 04723c3542..2e7ee5f56c 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 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 7d1c2b711a..39240809ed 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; }