mirror of
https://github.com/LuckPerms/LuckPerms.git
synced 2025-02-07 16:11:29 +01:00
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:
parent
53c9e5bb4a
commit
ecf1d3790c
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user