Fix issue where group nodes could be unset using the permission commands, and where users with per-server groups wouldn't be assigned to the default group globally

This commit is contained in:
Luck 2017-03-05 19:05:05 +00:00
parent 53c9e5bb4a
commit ecf1d3790c
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
4 changed files with 92 additions and 26 deletions

View File

@ -31,6 +31,7 @@ import me.lucko.luckperms.common.commands.utils.ArgumentUtils;
import me.lucko.luckperms.common.commands.utils.ContextHelper;
import me.lucko.luckperms.common.constants.Message;
import me.lucko.luckperms.common.constants.Permission;
import me.lucko.luckperms.common.core.NodeFactory;
import me.lucko.luckperms.common.core.model.PermissionHolder;
import me.lucko.luckperms.common.data.LogEntry;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@ -59,19 +60,38 @@ public class PermissionUnset extends SharedSubCommand {
String world = ArgumentUtils.handleWorld(2, args);
try {
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermission(node);
Message.UNSETPERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermission(node, server);
Message.UNSETPERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermission(node, server, world);
Message.UNSETPERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
// unset exact - with false value only
if (node.startsWith("group.")) {
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermissionExact(NodeFactory.make(node, false));
Message.UNSETPERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermissionExact(NodeFactory.make(node, false, server));
Message.UNSETPERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermissionExact(NodeFactory.make(node, false, server, world));
Message.UNSETPERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
}
} else {
// standard unset
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermission(node);
Message.UNSETPERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermission(node, server);
Message.UNSETPERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermission(node, server, world);
Message.UNSETPERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
}
}
LogEntry.build().actor(sender).acted(holder)

View File

@ -31,6 +31,7 @@ import me.lucko.luckperms.common.commands.utils.ArgumentUtils;
import me.lucko.luckperms.common.commands.utils.ContextHelper;
import me.lucko.luckperms.common.constants.Message;
import me.lucko.luckperms.common.constants.Permission;
import me.lucko.luckperms.common.core.NodeFactory;
import me.lucko.luckperms.common.core.model.PermissionHolder;
import me.lucko.luckperms.common.data.LogEntry;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@ -59,19 +60,37 @@ public class PermissionUnsetTemp extends SharedSubCommand {
String world = ArgumentUtils.handleWorld(2, args);
try {
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermission(node, true);
Message.UNSET_TEMP_PERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermission(node, server, true);
Message.UNSET_TEMP_PERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermission(node, server, world, true);
Message.UNSET_TEMP_PERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
// unset exact - with false value only
if (node.startsWith("group.")) {
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermissionExact(NodeFactory.make(node, false, true));
Message.UNSET_TEMP_PERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermissionExact(NodeFactory.make(node, false, server, true));
Message.UNSET_TEMP_PERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermissionExact(NodeFactory.make(node, false, server, world, true));
Message.UNSET_TEMP_PERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
}
} else {
switch (ContextHelper.determine(server, world)) {
case NONE:
holder.unsetPermission(node, true);
Message.UNSET_TEMP_PERMISSION_SUCCESS.send(sender, node, holder.getFriendlyName());
break;
case SERVER:
holder.unsetPermission(node, server, true);
Message.UNSET_TEMP_PERMISSION_SERVER_SUCCESS.send(sender, node, holder.getFriendlyName(), server);
break;
case SERVER_AND_WORLD:
holder.unsetPermission(node, server, world, true);
Message.UNSET_TEMP_PERMISSION_SERVER_WORLD_SUCCESS.send(sender, node, holder.getFriendlyName(), server, world);
break;
}
}
LogEntry.build().actor(sender).acted(holder)

View File

@ -875,6 +875,29 @@ public abstract class PermissionHolder {
} catch (ObjectLacksException ignored) {}
}
/**
* Unsets a permission node
*
* @param node the node to unset
* @throws ObjectLacksException if the holder doesn't have this node already
*/
public void unsetPermissionExact(Node node) throws ObjectLacksException {
ImmutableSet<Node> before = ImmutableSet.copyOf(getNodes());
synchronized (nodes) {
nodes.removeIf(e -> e.equals(node));
}
invalidateCache(true);
ImmutableSet<Node> after = ImmutableSet.copyOf(getNodes());
if (before.size() == after.size()) {
throw new ObjectLacksException();
}
plugin.getApiProvider().getEventFactory().handleNodeRemove(node, this, before, after);
}
/**
* Unsets a transient permission node
*

View File

@ -42,6 +42,10 @@ public class GenericUserManager extends AbstractManager<UserIdentifier, User> im
if (user.getPrimaryGroup() != null && !user.getPrimaryGroup().isEmpty()) {
for (Node node : user.getPermissions(false)) {
if (node.isServerSpecific() || node.isWorldSpecific()) {
continue;
}
if (node.isGroupNode()) {
hasGroup = true;
break;