fix issue with the LP Vault impl and servers with more than one server context

This commit is contained in:
Luck 2017-11-21 16:44:20 +00:00
parent 29eba93ee3
commit e71ef834c0
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
3 changed files with 74 additions and 40 deletions

View File

@ -254,13 +254,13 @@ public class VaultChatHook extends Chat {
} }
String finalWorld = perms.correctWorld(world); String finalWorld = perms.correctWorld(world);
perms.log("Setting meta: '" + key + "' for " + holder.getObjectName() + " on world " + world + ", server " + perms.getServer()); perms.log("Setting meta: '" + key + "' for " + holder.getObjectName() + " on world " + world + ", server " + perms.getVaultServer());
perms.getExecutor().execute(() -> { perms.getExecutor().execute(() -> {
holder.removeIf(n -> n.isMeta() && n.getMeta().getKey().equals(key)); holder.removeIf(n -> n.isMeta() && n.getMeta().getKey().equals(key));
Node.Builder metaNode = NodeFactory.makeMetaNode(key, value).setValue(true); Node.Builder metaNode = NodeFactory.makeMetaNode(key, value).setValue(true);
metaNode.setServer(perms.getServer()); metaNode.setServer(perms.getVaultServer());
metaNode.setWorld(finalWorld); metaNode.setWorld(finalWorld);
holder.setPermission(metaNode.build()); holder.setPermission(metaNode.build());
@ -274,7 +274,7 @@ public class VaultChatHook extends Chat {
} }
String finalWorld = perms.correctWorld(world); String finalWorld = perms.correctWorld(world);
perms.log("Setting " + type.name().toLowerCase() + " for " + holder.getObjectName() + " on world " + world + ", server " + perms.getServer()); perms.log("Setting " + type.name().toLowerCase() + " for " + holder.getObjectName() + " on world " + world + ", server " + perms.getVaultServer());
perms.getExecutor().execute(() -> { perms.getExecutor().execute(() -> {
// remove all prefixes/suffixes directly set on the user/group // remove all prefixes/suffixes directly set on the user/group
@ -286,7 +286,7 @@ public class VaultChatHook extends Chat {
.mapToInt(e -> e).max().orElse(0) + 10; .mapToInt(e -> e).max().orElse(0) + 10;
Node.Builder chatMetaNode = NodeFactory.makeChatMetaNode(type, priority, value); Node.Builder chatMetaNode = NodeFactory.makeChatMetaNode(type, priority, value);
chatMetaNode.setServer(perms.getServer()); chatMetaNode.setServer(perms.getVaultServer());
chatMetaNode.setWorld(finalWorld); chatMetaNode.setWorld(finalWorld);
holder.setPermission(chatMetaNode.build()); holder.setPermission(chatMetaNode.build());
@ -300,7 +300,6 @@ public class VaultChatHook extends Chat {
} }
world = perms.correctWorld(world); world = perms.correctWorld(world);
perms.log("Getting meta: '" + node + "' for holder " + holder.getFriendlyName() + " on world " + world + ", server " + perms.getServer());
Contexts contexts; Contexts contexts;
if (holder instanceof User) { if (holder instanceof User) {
@ -309,6 +308,8 @@ public class VaultChatHook extends Chat {
contexts = perms.createContextForWorldLookup(world); contexts = perms.createContextForWorldLookup(world);
} }
perms.log("Getting meta: '" + node + "' for holder " + holder.getFriendlyName() + " in contexts " + contexts);
String ret = holder.getCachedData().getMetaData(contexts).getMeta().get(node); String ret = holder.getCachedData().getMetaData(contexts).getMeta().get(node);
return ret != null ? ret : defaultValue; return ret != null ? ret : defaultValue;
} }
@ -319,7 +320,6 @@ public class VaultChatHook extends Chat {
} }
world = perms.correctWorld(world); world = perms.correctWorld(world);
perms.log("Getting " + type.name().toLowerCase() + " for holder " + holder.getFriendlyName() + " on world " + world + ", server " + perms.getServer());
Contexts contexts; Contexts contexts;
if (holder instanceof User) { if (holder instanceof User) {
@ -328,6 +328,8 @@ public class VaultChatHook extends Chat {
contexts = perms.createContextForWorldLookup(world); contexts = perms.createContextForWorldLookup(world);
} }
perms.log("Getting " + type.name().toLowerCase() + " for holder " + holder.getFriendlyName() + " in contexts " + contexts);
MetaData data = holder.getCachedData().getMetaData(contexts); MetaData data = holder.getCachedData().getMetaData(contexts);
String ret = type == ChatMetaType.PREFIX ? data.getPrefix() : data.getSuffix(); String ret = type == ChatMetaType.PREFIX ? data.getPrefix() : data.getSuffix();
return ret != null ? ret : ""; return ret != null ? ret : "";

View File

@ -32,6 +32,7 @@ import com.google.common.base.Preconditions;
import me.lucko.luckperms.api.Contexts; import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.api.context.MutableContextSet; import me.lucko.luckperms.api.context.MutableContextSet;
import me.lucko.luckperms.bukkit.LPBukkitPlugin; import me.lucko.luckperms.bukkit.LPBukkitPlugin;
import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.config.ConfigKeys;
@ -50,8 +51,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.Map;
/** /**
* An implementation of the Vault {@link Permission} API using LuckPerms. * An implementation of the Vault {@link Permission} API using LuckPerms.
* *
@ -131,7 +130,6 @@ public class VaultPermissionHook extends Permission {
private boolean playerHas(String world, Player player, String permission) { private boolean playerHas(String world, Player player, String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Checking if player " + player + " has permission: " + permission + " on world " + world + ", server " + getServer());
if (player == null) { if (player == null) {
return false; return false;
@ -142,8 +140,11 @@ public class VaultPermissionHook extends Permission {
return false; return false;
} }
Contexts contexts = createContextForWorldLookup(player, world);
log("Checking if player " + player + " has permission: " + permission + " in contexts " + contexts);
// Effectively fallback to the standard Bukkit #hasPermission check. // Effectively fallback to the standard Bukkit #hasPermission check.
return user.getCachedData().getPermissionData(createContextForWorldLookup(player, world)).getPermissionValue(permission, CheckOrigin.INTERNAL).asBoolean(); return user.getCachedData().getPermissionData(contexts).getPermissionValue(permission, CheckOrigin.INTERNAL).asBoolean();
} }
@Override @Override
@ -164,7 +165,7 @@ public class VaultPermissionHook extends Permission {
private boolean playerAdd(String world, Player player, String permission) { private boolean playerAdd(String world, Player player, String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Adding permission to player " + player + ": '" + permission + "' on world " + world + ", server " + getServer()); log("Adding permission to player " + player + ": '" + permission + "' on world " + world + ", server " + getVaultServer());
if (player == null) { if (player == null) {
return false; return false;
@ -197,7 +198,7 @@ public class VaultPermissionHook extends Permission {
private boolean playerRemove(String world, Player player, String permission) { private boolean playerRemove(String world, Player player, String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Removing permission from player " + player + ": '" + permission + "' on world " + world + ", server " + getServer()); log("Removing permission from player " + player + ": '" + permission + "' on world " + world + ", server " + getVaultServer());
if (player == null) { if (player == null) {
return false; return false;
@ -215,20 +216,23 @@ public class VaultPermissionHook extends Permission {
@Override @Override
public boolean groupHas(String world, @NonNull String groupName, @NonNull String permission) { public boolean groupHas(String world, @NonNull String groupName, @NonNull String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Checking if group " + groupName + " has permission: " + permission + " on world " + world + ", server " + getServer());
final Group group = plugin.getGroupManager().getByDisplayName(groupName); final Group group = plugin.getGroupManager().getByDisplayName(groupName);
if (group == null) return false; if (group == null) {
return false;
}
// This is a nasty call. Groups aren't cached. :( Contexts contexts = createContextForWorldLookup(world);
Map<String, Boolean> permissions = group.exportNodesAndShorthand(createContextForWorldLookup(world), true); log("Checking if group " + groupName + " has permission: " + permission + " in contexts " + contexts);
return permissions.containsKey(permission.toLowerCase()) && permissions.get(permission.toLowerCase());
// Effectively fallback to the standard Bukkit #hasPermission check.
return group.getCachedData().getPermissionData(createContextForWorldLookup(world)).getPermissionValue(permission, CheckOrigin.INTERNAL).asBoolean();
} }
@Override @Override
public boolean groupAdd(String world, @NonNull String groupName, @NonNull String permission) { public boolean groupAdd(String world, @NonNull String groupName, @NonNull String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Adding permission to group " + groupName + ": '" + permission + "' on world " + world + ", server " + getServer()); log("Adding permission to group " + groupName + ": '" + permission + "' on world " + world + ", server " + getVaultServer());
final Group group = plugin.getGroupManager().getByDisplayName(groupName); final Group group = plugin.getGroupManager().getByDisplayName(groupName);
if (group == null) return false; if (group == null) return false;
@ -240,7 +244,7 @@ public class VaultPermissionHook extends Permission {
@Override @Override
public boolean groupRemove(String world, @NonNull String groupName, @NonNull String permission) { public boolean groupRemove(String world, @NonNull String groupName, @NonNull String permission) {
world = correctWorld(world); world = correctWorld(world);
log("Removing permission from group " + groupName + ": '" + permission + "' on world " + world + ", server " + getServer()); log("Removing permission from group " + groupName + ": '" + permission + "' on world " + world + ", server " + getVaultServer());
final Group group = plugin.getGroupManager().getByDisplayName(groupName); final Group group = plugin.getGroupManager().getByDisplayName(groupName);
if (group == null) return false; if (group == null) return false;
@ -342,7 +346,6 @@ public class VaultPermissionHook extends Permission {
private String[] getPlayerGroups(String world, Player player) { private String[] getPlayerGroups(String world, Player player) {
world = correctWorld(world); world = correctWorld(world);
log("Getting groups of player: " + player + ", on world " + world + ", server " + getServer());
if (player == null) { if (player == null) {
return new String[0]; return new String[0];
@ -353,10 +356,12 @@ public class VaultPermissionHook extends Permission {
return new String[0]; return new String[0];
} }
String w = world; // screw effectively final ContextSet contexts = createContextForWorldLookup(player, world).getContexts();
log("Getting groups of player: " + player + " in contexts " + contexts);
return user.getEnduringNodes().values().stream() return user.getEnduringNodes().values().stream()
.filter(Node::isGroupNode) .filter(Node::isGroupNode)
.filter(n -> n.shouldApplyWithContext(createContextForWorldLookup(player, w).getContexts())) .filter(n -> n.shouldApplyWithContext(contexts))
.map(n -> { .map(n -> {
Group group = plugin.getGroupManager().getIfLoaded(n.getGroupName()); Group group = plugin.getGroupManager().getIfLoaded(n.getGroupName());
if (group != null) { if (group != null) {
@ -422,7 +427,7 @@ public class VaultPermissionHook extends Permission {
Preconditions.checkNotNull(permission, "permission is null"); Preconditions.checkNotNull(permission, "permission is null");
Preconditions.checkArgument(!permission.isEmpty(), "permission is an empty string"); Preconditions.checkArgument(!permission.isEmpty(), "permission is an empty string");
executor.execute(() -> { executor.execute(() -> {
if (holder.setPermission(NodeFactory.make(permission, true, getServer(), world)).asBoolean()) { if (holder.setPermission(NodeFactory.make(permission, true, getVaultServer(), world)).asBoolean()) {
holderSave(holder); holderSave(holder);
} }
}); });
@ -432,7 +437,7 @@ public class VaultPermissionHook extends Permission {
Preconditions.checkNotNull(permission, "permission is null"); Preconditions.checkNotNull(permission, "permission is null");
Preconditions.checkArgument(!permission.isEmpty(), "permission is an empty string"); Preconditions.checkArgument(!permission.isEmpty(), "permission is an empty string");
executor.execute(() -> { executor.execute(() -> {
if (holder.unsetPermission(NodeFactory.make(permission, getServer(), world)).asBoolean()) { if (holder.unsetPermission(NodeFactory.make(permission, getVaultServer(), world)).asBoolean()) {
holderSave(holder); holderSave(holder);
} }
}); });
@ -456,22 +461,29 @@ public class VaultPermissionHook extends Permission {
if (world != null && !world.equals("") && !world.equalsIgnoreCase("global")) { if (world != null && !world.equals("") && !world.equalsIgnoreCase("global")) {
context.add("world", world.toLowerCase()); context.add("world", world.toLowerCase());
} }
context.add("server", getServer()); context.add("server", getVaultServer());
return new Contexts(context, isIncludeGlobal(), true, true, true, true, false); return new Contexts(context, isIncludeGlobal(), true, true, true, true, false);
} }
public Contexts createContextForWorldLookup(String world) { public Contexts createContextForWorldLookup(String world) {
MutableContextSet context = plugin.getContextManager().getStaticContext().mutableCopy(); MutableContextSet context = plugin.getContextManager().getStaticContext().mutableCopy();
// worlds & servers get set depending on the config setting if (useVaultServer()) {
context.removeAll("world"); // remove already accumulated worlds
context.removeAll("server"); context.removeAll("world");
// add the vault world
if (world != null && !world.isEmpty() && !world.equalsIgnoreCase("global")) {
context.add("world", world.toLowerCase());
}
// add the vault settings // remove the server context from global
if (world != null && !world.isEmpty() && !world.equalsIgnoreCase("global")) { context.remove("server", getServer());
context.add("world", world.toLowerCase());
// add the vault specific server
if (!getVaultServer().equals("global")) {
context.add("server", getVaultServer());
}
} }
context.add("server", getServer());
return new Contexts(context, isIncludeGlobal(), true, true, true, true, false); return new Contexts(context, isIncludeGlobal(), true, true, true, true, false);
} }
@ -479,15 +491,22 @@ public class VaultPermissionHook extends Permission {
public Contexts createContextForWorldLookup(@NonNull Player player, String world) { public Contexts createContextForWorldLookup(@NonNull Player player, String world) {
MutableContextSet context = plugin.getContextManager().getApplicableContext(player).mutableCopy(); MutableContextSet context = plugin.getContextManager().getApplicableContext(player).mutableCopy();
// worlds & servers get set depending on the config setting if (useVaultServer()) {
context.removeAll("world"); // remove already accumulated worlds
context.removeAll("server"); context.removeAll("world");
// add the vault world
if (world != null && !world.isEmpty() && !world.equalsIgnoreCase("global")) {
context.add("world", world.toLowerCase());
}
// add the vault settings // remove the server context from global
if (world != null && !world.isEmpty() && !world.equalsIgnoreCase("global")) { context.remove("server", getServer());
context.add("world", world.toLowerCase());
// add the vault specific server
if (!getVaultServer().equals("global")) {
context.add("server", getVaultServer());
}
} }
context.add("server", getServer());
return new Contexts(context, isIncludeGlobal(), true, true, true, true, false); return new Contexts(context, isIncludeGlobal(), true, true, true, true, false);
} }
@ -495,9 +514,17 @@ public class VaultPermissionHook extends Permission {
// helper methods to just pull values from the config. // helper methods to just pull values from the config.
String getServer() { String getServer() {
return plugin.getConfiguration().get(ConfigKeys.SERVER);
}
String getVaultServer() {
return plugin.getConfiguration().get(ConfigKeys.VAULT_SERVER); return plugin.getConfiguration().get(ConfigKeys.VAULT_SERVER);
} }
boolean useVaultServer() {
return plugin.getConfiguration().get(ConfigKeys.USE_VAULT_SERVER);
}
boolean isIncludeGlobal() { boolean isIncludeGlobal() {
return plugin.getConfiguration().get(ConfigKeys.VAULT_INCLUDING_GLOBAL); return plugin.getConfiguration().get(ConfigKeys.VAULT_INCLUDING_GLOBAL);
} }

View File

@ -303,12 +303,17 @@ public class ConfigKeys {
*/ */
public static final ConfigKey<Boolean> COMMANDS_ALLOW_OP = EnduringKey.wrap(BooleanKey.of("commands-allow-op", true)); public static final ConfigKey<Boolean> COMMANDS_ALLOW_OP = EnduringKey.wrap(BooleanKey.of("commands-allow-op", true));
/**
* If the vault server option should be used
*/
public static final ConfigKey<Boolean> USE_VAULT_SERVER = BooleanKey.of("use-vault-server", true);
/** /**
* The name of the server to use for Vault. * The name of the server to use for Vault.
*/ */
public static final ConfigKey<String> VAULT_SERVER = AbstractKey.of(c -> { public static final ConfigKey<String> VAULT_SERVER = AbstractKey.of(c -> {
// default to true for backwards compatibility // default to true for backwards compatibility
if (c.getBoolean("use-vault-server", true)) { if (USE_VAULT_SERVER.get(c)) {
return c.getString("vault-server", "global").toLowerCase(); return c.getString("vault-server", "global").toLowerCase();
} else { } else {
return SERVER.get(c); return SERVER.get(c);