Implemented new permission system
Dieser Commit ist enthalten in:
Ursprung
cc9ccc8976
Commit
5d2a195835
7
pom.xml
7
pom.xml
@ -78,6 +78,13 @@
|
|||||||
<type>jar</type>
|
<type>jar</type>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.yaml</groupId>
|
||||||
|
<artifactId>snakeyaml</artifactId>
|
||||||
|
<version>1.7</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava-collections</artifactId>
|
<artifactId>guava-collections</artifactId>
|
||||||
|
@ -431,11 +431,25 @@ public class ServerConfigurationManager {
|
|||||||
public void e(String s) {
|
public void e(String s) {
|
||||||
this.h.add(s.toLowerCase());
|
this.h.add(s.toLowerCase());
|
||||||
this.l();
|
this.l();
|
||||||
|
|
||||||
|
// Craftbukkit start
|
||||||
|
Player player = server.server.getPlayer(s);
|
||||||
|
if (player != null) {
|
||||||
|
player.recalculatePermissions();
|
||||||
|
}
|
||||||
|
// Craftbukkit end
|
||||||
}
|
}
|
||||||
|
|
||||||
public void f(String s) {
|
public void f(String s) {
|
||||||
this.h.remove(s.toLowerCase());
|
this.h.remove(s.toLowerCase());
|
||||||
this.l();
|
this.l();
|
||||||
|
|
||||||
|
// Craftbukkit start
|
||||||
|
Player player = server.server.getPlayer(s);
|
||||||
|
if (player != null) {
|
||||||
|
player.recalculatePermissions();
|
||||||
|
}
|
||||||
|
// Craftbukkit end
|
||||||
}
|
}
|
||||||
|
|
||||||
private void k() {
|
private void k() {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.bukkit.craftbukkit;
|
package org.bukkit.craftbukkit;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import com.avaje.ebean.config.DataSourceConfig;
|
import com.avaje.ebean.config.DataSourceConfig;
|
||||||
import com.avaje.ebean.config.ServerConfig;
|
import com.avaje.ebean.config.ServerConfig;
|
||||||
@ -18,12 +19,14 @@ import org.bukkit.inventory.ShapedRecipe;
|
|||||||
import org.bukkit.inventory.ShapelessRecipe;
|
import org.bukkit.inventory.ShapelessRecipe;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import jline.ConsoleReader;
|
import jline.ConsoleReader;
|
||||||
@ -58,9 +61,13 @@ import org.bukkit.craftbukkit.command.ServerCommandListener;
|
|||||||
import org.bukkit.scheduler.BukkitWorker;
|
import org.bukkit.scheduler.BukkitWorker;
|
||||||
import org.bukkit.craftbukkit.scheduler.CraftScheduler;
|
import org.bukkit.craftbukkit.scheduler.CraftScheduler;
|
||||||
import org.bukkit.event.world.WorldInitEvent;
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
import org.bukkit.permissions.Permission;
|
||||||
import org.bukkit.plugin.PluginLoadOrder;
|
import org.bukkit.plugin.PluginLoadOrder;
|
||||||
import org.bukkit.util.config.Configuration;
|
import org.bukkit.util.config.Configuration;
|
||||||
import org.bukkit.util.config.ConfigurationNode;
|
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 {
|
public final class CraftServer implements Server {
|
||||||
private final String serverName = "Craftbukkit";
|
private final String serverName = "Craftbukkit";
|
||||||
@ -74,6 +81,7 @@ public final class CraftServer implements Server {
|
|||||||
protected final ServerConfigurationManager server;
|
protected final ServerConfigurationManager server;
|
||||||
private final Map<String, World> worlds = new LinkedHashMap<String, World>();
|
private final Map<String, World> worlds = new LinkedHashMap<String, World>();
|
||||||
private final Configuration configuration;
|
private final Configuration configuration;
|
||||||
|
private final Yaml yaml = new Yaml(new SafeConstructor());
|
||||||
|
|
||||||
public CraftServer(MinecraftServer console, ServerConfigurationManager server) {
|
public CraftServer(MinecraftServer console, ServerConfigurationManager server) {
|
||||||
this.console = console;
|
this.console = console;
|
||||||
@ -101,6 +109,8 @@ public final class CraftServer implements Server {
|
|||||||
configuration.getString("settings.update-folder", "update");
|
configuration.getString("settings.update-folder", "update");
|
||||||
configuration.getInt("settings.spawn-radius", 16);
|
configuration.getInt("settings.spawn-radius", 16);
|
||||||
|
|
||||||
|
configuration.getString("settings.permissions-file", "permissions.yml");
|
||||||
|
|
||||||
if (configuration.getNode("aliases") == null) {
|
if (configuration.getNode("aliases") == null) {
|
||||||
List<String> icanhasbukkit = new ArrayList<String>();
|
List<String> icanhasbukkit = new ArrayList<String>();
|
||||||
icanhasbukkit.add("version");
|
icanhasbukkit.add("version");
|
||||||
@ -139,6 +149,7 @@ public final class CraftServer implements Server {
|
|||||||
|
|
||||||
if (type == PluginLoadOrder.POSTWORLD) {
|
if (type == PluginLoadOrder.POSTWORLD) {
|
||||||
commandMap.registerServerAliases();
|
commandMap.registerServerAliases();
|
||||||
|
loadCustomPermissions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +160,16 @@ public final class CraftServer implements Server {
|
|||||||
private void loadPlugin(Plugin plugin) {
|
private void loadPlugin(Plugin plugin) {
|
||||||
try {
|
try {
|
||||||
pluginManager.enablePlugin(plugin);
|
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) {
|
} catch (Throwable ex) {
|
||||||
Logger.getLogger(CraftServer.class.getName()).log(Level.SEVERE, ex.getMessage() + " loading " + plugin.getDescription().getFullName() + " (Is it up to date?)", 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);
|
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
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "CraftServer{" + "serverName=" + serverName + ",serverVersion=" + serverVersion + ",protocolVersion=" + protocolVersion + '}';
|
return "CraftServer{" + "serverName=" + serverName + ",serverVersion=" + serverVersion + ",protocolVersion=" + protocolVersion + '}';
|
||||||
|
@ -1,15 +1,23 @@
|
|||||||
|
|
||||||
package org.bukkit.craftbukkit.entity;
|
package org.bukkit.craftbukkit.entity;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
import net.minecraft.server.EntityHuman;
|
import net.minecraft.server.EntityHuman;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
|
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
|
||||||
import org.bukkit.craftbukkit.CraftServer;
|
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 {
|
public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||||||
private CraftInventoryPlayer inventory;
|
private CraftInventoryPlayer inventory;
|
||||||
|
private final PermissibleBase perm = new PermissibleBase(this);
|
||||||
|
private boolean op;
|
||||||
|
|
||||||
public CraftHumanEntity(final CraftServer server, final EntityHuman entity) {
|
public CraftHumanEntity(final CraftServer server, final EntityHuman entity) {
|
||||||
super(server, entity);
|
super(server, entity);
|
||||||
@ -55,4 +63,57 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
|||||||
public int getSleepTicks() {
|
public int getSleepTicks() {
|
||||||
return getHandle().sleepTicks;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,15 +25,20 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
|
||||||
public class CraftPlayer extends CraftHumanEntity implements Player {
|
public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||||
|
|
||||||
public CraftPlayer(CraftServer server, EntityPlayer entity) {
|
public CraftPlayer(CraftServer server, EntityPlayer entity) {
|
||||||
super(server, entity);
|
super(server, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean isOp() {
|
public boolean isOp() {
|
||||||
return server.getHandle().isOp(getName());
|
return server.getHandle().isOp(getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOp(boolean value) {
|
||||||
|
server.getHandle().e(getName());
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isPlayer() {
|
public boolean isPlayer() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren