Skip to content

Commit

Permalink
Use implicit permissions checks for classes and arenas.
Browse files Browse the repository at this point in the history
Removes the dynamic registration of permissions for classes and arenas.

This means that it is no longer enough to just check whether a Player.hasPermission("mobarena.classes.Knight"), but we also need to check if the Player.isPermissionSet("mobarena.classes.Knight"), which it won't be by default.

To make the stringly typed parts of this dynamic permissions checking more focused, ArenaClass and Arena now both have hasPermission(Player) methods, so the actual permissions checking happens on the objects themselves, rather than from the caller of these methods.
  • Loading branch information
garbagemule committed Apr 26, 2018
1 parent 31aa4c1 commit 94d198c
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 45 deletions.
5 changes: 5 additions & 0 deletions src/main/java/com/garbagemule/MobArena/ArenaClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ public void setArmor(List<Thing> armor) {
this.armor = armor;
}

public boolean hasPermission(Player p) {
String perm = "mobarena.classes." + configName;
return !p.isPermissionSet(perm) || p.hasPermission(perm);
}

/**
* Grants all of the class items and armor to the given player.
* The normal items will be added to the inventory normally, while the
Expand Down
32 changes: 18 additions & 14 deletions src/main/java/com/garbagemule/MobArena/ArenaImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.stream.Collectors;

public class ArenaImpl implements Arena
{
Expand Down Expand Up @@ -657,6 +657,12 @@ public void forceEnd() {
cleanup();
}

@Override
public boolean hasPermission(Player p) {
String perm = "mobarena.arenas." + name;
return !p.isPermissionSet(perm) || p.hasPermission(perm);
}

@Override
public boolean playerJoin(Player p, Location loc)
{
Expand Down Expand Up @@ -1353,21 +1359,19 @@ public void addRandomPlayer(Player p) {
@Override
public void assignRandomClass(Player p)
{
Random r = new Random();
List<String> classes = new LinkedList<>(this.classes.keySet());
List<ArenaClass> classes = this.classes.values().stream()
.filter(c -> c.hasPermission(p))
.collect(Collectors.toList());

String className = classes.remove(r.nextInt(classes.size()));
while (!plugin.has(p, "mobarena.classes." + className))
{
if (classes.isEmpty())
{
plugin.getLogger().info("Player '" + p.getName() + "' has no class permissions!");
playerLeave(p);
return;
}
className = classes.remove(r.nextInt(classes.size()));
if (classes.isEmpty()) {
plugin.getLogger().info("Player '" + p.getName() + "' has no class permissions!");
playerLeave(p);
return;
}

int index = MobArena.random.nextInt(classes.size());
String className = classes.get(index).getConfigName();

assignClass(p, className);
messenger.tell(p, Msg.LOBBY_CLASS_PICKED, this.classes.get(className).getConfigName());
}
Expand Down Expand Up @@ -1621,7 +1625,7 @@ else if (arenaPlayers.contains(p) || lobbyPlayers.contains(p))
messenger.tell(p, Msg.JOIN_ALREADY_PLAYING);
else if (running)
messenger.tell(p, Msg.JOIN_ARENA_IS_RUNNING);
else if (!plugin.has(p, "mobarena.arenas." + configName()))
else if (!hasPermission(p))
messenger.tell(p, Msg.JOIN_ARENA_PERMISSION);
else if (getMaxPlayers() > 0 && lobbyPlayers.size() >= getMaxPlayers())
messenger.tell(p, Msg.JOIN_PLAYER_LIMIT_REACHED);
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/garbagemule/MobArena/ArenaListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -1061,14 +1061,15 @@ private void handleSign(Sign sign, Player p) {
if (!arena.getClasses().containsKey(className) && !className.equals("random"))
return;

ArenaClass newAC = arena.getClasses().get(className);

// Check for permission.
if (!plugin.has(p, "mobarena.classes." + className) && !className.equals("random")) {
if (!newAC.hasPermission(p) && !className.equals("random")) {
arena.getMessenger().tell(p, Msg.LOBBY_CLASS_PERMISSION);
return;
}

ArenaClass oldAC = arena.getArenaPlayer(p).getArenaClass();
ArenaClass newAC = arena.getClasses().get(className);

// Same class, do nothing.
if (newAC.equals(oldAC)) {
Expand Down
30 changes: 2 additions & 28 deletions src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -140,15 +137,15 @@ public List<Arena> getEnabledArenas(List<Arena> arenas) {
public List<Arena> getPermittedArenas(Player p) {
List<Arena> result = new ArrayList<>(arenas.size());
for (Arena arena : arenas)
if (plugin.has(p, "mobarena.arenas." + arena.configName()))
if (arena.hasPermission(p))
result.add(arena);
return result;
}

public List<Arena> getEnabledAndPermittedArenas(Player p) {
List<Arena> result = new ArrayList<>(arenas.size());
for (Arena arena : arenas)
if (arena.isEnabled() && plugin.has(p, "mobarena.arenas." + arena.configName()))
if (arena.isEnabled() && arena.hasPermission(p))
result.add(arena);
return result;
}
Expand Down Expand Up @@ -338,9 +335,6 @@ private ArenaClass loadClass(String classname) {
loadClassPermissions(arenaClass, section);
loadClassLobbyPermissions(arenaClass, section);

// Register the permission.
registerPermission("mobarena.classes." + lowercase, PermissionDefault.TRUE).addParent("mobarena.classes", true);

// Check for class chests
Location cc = parseLocation(section, "classchest", null);
arenaClass.setClassChest(cc);
Expand Down Expand Up @@ -486,8 +480,6 @@ public void removeClassNode(String classname) {

// Remove the class from the map.
classes.remove(lowercase);

unregisterPermission("mobarena.arenas." + lowercase);
}

public boolean addClassPermission(String classname, String perm) {
Expand Down Expand Up @@ -621,7 +613,6 @@ private Arena loadArena(String arenaname) {
ConfigUtils.addIfEmpty(plugin, "waves.yml", makeSection(section, "waves"));

Arena arena = new ArenaImpl(plugin, section, arenaname, world);
registerPermission("mobarena.arenas." + arenaname.toLowerCase(), PermissionDefault.TRUE);
arenas.add(arena);
plugin.getLogger().info("Loaded arena '" + arenaname + "'");
return arena;
Expand Down Expand Up @@ -669,7 +660,6 @@ private Arena createArenaNode(ConfigurationSection arenas, String arenaName, Wor

public void removeArenaNode(Arena arena) {
arenas.remove(arena);
unregisterPermission("mobarena.arenas." + arena.configName());

config.set("arenas." + arena.configName(), null);
plugin.saveConfig();
Expand All @@ -690,20 +680,4 @@ public void reloadConfig() {
public void saveConfig() {
plugin.saveConfig();
}

private Permission registerPermission(String permString, PermissionDefault value) {
PluginManager pm = plugin.getServer().getPluginManager();

Permission perm = pm.getPermission(permString);
if (perm == null) {
perm = new Permission(permString);
perm.setDefault(value);
pm.addPermission(perm);
}
return perm;
}

private void unregisterPermission(String s) {
plugin.getServer().getPluginManager().removePermission(s);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
}

// Check for permission.
if (!am.getPlugin().has(p, "mobarena.classes." + lowercase) && !lowercase.equals("random")) {
if (!ac.hasPermission(p) && !lowercase.equals("random")) {
arena.getMessenger().tell(p, Msg.LOBBY_CLASS_PERMISSION);
return true;
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/garbagemule/MobArena/framework/Arena.java
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@ public interface Arena
void forceStart();

void forceEnd();

boolean hasPermission(Player p);

boolean playerJoin(Player p, Location loc);

Expand Down

0 comments on commit 94d198c

Please sign in to comment.