Add tests for disguise param options permissions
This commit is contained in:
parent
be3c1536a9
commit
145c1057c3
@ -333,61 +333,6 @@ public class DisguiseParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HashMap<String, HashMap<String, Boolean>> getDisguiseOptions(CommandSender sender, String permNode, DisguisePerm type) {
|
|
||||||
HashMap<String, HashMap<String, Boolean>> returns = new HashMap<>();
|
|
||||||
|
|
||||||
// libsdisguises.options.<command>.<disguise>.<method>.<options>
|
|
||||||
for (PermissionAttachmentInfo permission : sender.getEffectivePermissions()) {
|
|
||||||
String lowerPerm = permission.getPermission().toLowerCase(Locale.ENGLISH);
|
|
||||||
|
|
||||||
if (!lowerPerm.startsWith("libsdisguises.options.")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] split = lowerPerm.split("\\.");
|
|
||||||
|
|
||||||
// <command>.<disguise>.<method>.<options>
|
|
||||||
if (split.length < 4) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!split[2].equalsIgnoreCase(permNode) && !split[2].equalsIgnoreCase("*")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean applicable = false;
|
|
||||||
|
|
||||||
for (String s : split[3].split("/")) {
|
|
||||||
if (!s.equals("*") && !s.replace("_", "").equalsIgnoreCase(type.toReadable().replace(" ", ""))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
applicable = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!applicable) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Boolean> options = new HashMap<>();
|
|
||||||
|
|
||||||
for (int i = 5; i < split.length; i++) {
|
|
||||||
options.put(split[i], permission.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String s : split[4].split("/")) {
|
|
||||||
if (returns.containsKey(s)) {
|
|
||||||
returns.get(s).putAll(options);
|
|
||||||
} else {
|
|
||||||
returns.put(s, options);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returns;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DisguisePerm getDisguisePerm(String name) {
|
public static DisguisePerm getDisguisePerm(String name) {
|
||||||
for (DisguisePerm perm : getDisguisePerms()) {
|
for (DisguisePerm perm : getDisguisePerms()) {
|
||||||
if (!perm.toReadable().replaceAll("[ |_]", "").equalsIgnoreCase(name.replaceAll("[ |_]", ""))) {
|
if (!perm.toReadable().replaceAll("[ |_]", "").equalsIgnoreCase(name.replaceAll("[ |_]", ""))) {
|
||||||
@ -440,32 +385,6 @@ public class DisguiseParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the string is found in the map, or it's not a whitelisted setup
|
|
||||||
* <p>
|
|
||||||
* Returns if command user can access the disguise creation permission type
|
|
||||||
*/
|
|
||||||
private static boolean hasPermissionOption(HashMap<String, HashMap<String, Boolean>> disguiseOptions, String method, String value) {
|
|
||||||
method = method.toLowerCase(Locale.ENGLISH);
|
|
||||||
|
|
||||||
// If no permissions were defined, return true
|
|
||||||
if (!disguiseOptions.containsKey(method)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Boolean> map = disguiseOptions.get(method);
|
|
||||||
|
|
||||||
value = value.toLowerCase(Locale.ENGLISH);
|
|
||||||
|
|
||||||
// If they were explictly defined, can just return the value
|
|
||||||
if (map.containsKey(value)) {
|
|
||||||
return map.get(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is at least one whitelisted value, then they needed the whitelist to use it
|
|
||||||
return !map.containsValue(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getName(CommandSender entity) {
|
public static String getName(CommandSender entity) {
|
||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
return "??";
|
return "??";
|
||||||
@ -778,7 +697,7 @@ public class DisguiseParser {
|
|||||||
throw new DisguiseParseException(LibsMsg.NO_PERM_DISGUISE);
|
throw new DisguiseParseException(LibsMsg.NO_PERM_DISGUISE);
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap<String, HashMap<String, Boolean>> disguiseOptions = getDisguiseOptions(sender, permNode, disguisePerm);
|
HashMap<String, HashMap<String, Boolean>> disguiseOptions = DisguisePermissions.getDisguiseOptions(sender, permNode, disguisePerm);
|
||||||
|
|
||||||
if (disguise == null) {
|
if (disguise == null) {
|
||||||
if (disguisePerm.isPlayer()) {
|
if (disguisePerm.isPlayer()) {
|
||||||
@ -788,8 +707,9 @@ public class DisguiseParser {
|
|||||||
throw new DisguiseParseException(LibsMsg.PARSE_SUPPLY_PLAYER);
|
throw new DisguiseParseException(LibsMsg.PARSE_SUPPLY_PLAYER);
|
||||||
} else {
|
} else {
|
||||||
// If they can't use this name, throw error
|
// If they can't use this name, throw error
|
||||||
if (!hasPermissionOption(disguiseOptions, "setname", args[1].toLowerCase(Locale.ENGLISH))) {
|
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", args[1].toLowerCase(Locale.ENGLISH))) {
|
||||||
if (!args[1].equalsIgnoreCase(sender.getName()) || !hasPermissionOption(disguiseOptions, "setname", "themselves")) {
|
if (!args[1].equalsIgnoreCase(sender.getName()) ||
|
||||||
|
!DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", "themselves")) {
|
||||||
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_NAME);
|
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_NAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -872,7 +792,7 @@ public class DisguiseParser {
|
|||||||
doCheck(sender, permissions, disguisePerm, usedOptions);
|
doCheck(sender, permissions, disguisePerm, usedOptions);
|
||||||
String itemName = itemStack == null ? "null" : itemStack.getType().name().toLowerCase(Locale.ENGLISH);
|
String itemName = itemStack == null ? "null" : itemStack.getType().name().toLowerCase(Locale.ENGLISH);
|
||||||
|
|
||||||
if (!hasPermissionOption(disguiseOptions, optionName, itemName)) {
|
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, optionName, itemName)) {
|
||||||
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName, disguisePerm.toReadable());
|
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName, disguisePerm.toReadable());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -898,7 +818,7 @@ public class DisguiseParser {
|
|||||||
|
|
||||||
doCheck(sender, permissions, disguisePerm, usedOptions);
|
doCheck(sender, permissions, disguisePerm, usedOptions);
|
||||||
|
|
||||||
if (!hasPermissionOption(disguiseOptions, optionName, miscId + "")) {
|
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, optionName, miscId + "")) {
|
||||||
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, miscId + "", disguisePerm.toReadable());
|
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, miscId + "", disguisePerm.toReadable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -947,7 +867,7 @@ public class DisguiseParser {
|
|||||||
Collection<String> usedOptions, String[] args, String permNode) throws Throwable {
|
Collection<String> usedOptions, String[] args, String permNode) throws Throwable {
|
||||||
WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getWatcher().getClass(), true);
|
WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getWatcher().getClass(), true);
|
||||||
List<String> list = new ArrayList<>(Arrays.asList(args));
|
List<String> list = new ArrayList<>(Arrays.asList(args));
|
||||||
HashMap<String, HashMap<String, Boolean>> disguiseOptions = getDisguiseOptions(sender, permNode, disguisePerm);
|
HashMap<String, HashMap<String, Boolean>> disguiseOptions = DisguisePermissions.getDisguiseOptions(sender, permNode, disguisePerm);
|
||||||
|
|
||||||
for (int argIndex = 0; argIndex < args.length; argIndex++) {
|
for (int argIndex = 0; argIndex < args.length; argIndex++) {
|
||||||
// This is the method name they provided
|
// This is the method name they provided
|
||||||
@ -1034,7 +954,7 @@ public class DisguiseParser {
|
|||||||
if (!disguiseOptions.isEmpty()) {
|
if (!disguiseOptions.isEmpty()) {
|
||||||
String stringValue = ParamInfoManager.toString(valueToSet);
|
String stringValue = ParamInfoManager.toString(valueToSet);
|
||||||
|
|
||||||
if (!hasPermissionOption(disguiseOptions, methodToUse.getName(), stringValue)) {
|
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, methodToUse.getName(), stringValue)) {
|
||||||
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, stringValue, disguisePerm.toReadable());
|
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, stringValue, disguisePerm.toReadable());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package me.libraryaddict.disguise.utilities.parser;
|
|||||||
|
|
||||||
import me.libraryaddict.disguise.DisguiseConfig;
|
import me.libraryaddict.disguise.DisguiseConfig;
|
||||||
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Ageable;
|
import org.bukkit.entity.Ageable;
|
||||||
import org.bukkit.entity.Animals;
|
import org.bukkit.entity.Animals;
|
||||||
import org.bukkit.entity.Monster;
|
import org.bukkit.entity.Monster;
|
||||||
@ -494,4 +495,85 @@ public class DisguisePermissions {
|
|||||||
private PermissionStorage getStorage(DisguisePerm disguisePerm) {
|
private PermissionStorage getStorage(DisguisePerm disguisePerm) {
|
||||||
return disguises.stream().filter(disguise -> disguise.getDisguise().equals(disguisePerm)).findAny().orElse(null);
|
return disguises.stream().filter(disguise -> disguise.getDisguise().equals(disguisePerm)).findAny().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, HashMap<String, Boolean>> getDisguiseOptions(Permissible permissionsHolder, String permNode, DisguisePerm type) {
|
||||||
|
HashMap<String, HashMap<String, Boolean>> returns = new HashMap<>();
|
||||||
|
|
||||||
|
// libsdisguises.options.<command>.<disguise>.<method>.<options>
|
||||||
|
for (PermissionAttachmentInfo permission : permissionsHolder.getEffectivePermissions()) {
|
||||||
|
String lowerPerm = permission.getPermission().toLowerCase(Locale.ENGLISH);
|
||||||
|
|
||||||
|
if (!lowerPerm.startsWith("libsdisguises.options.")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] split = lowerPerm.split("\\.");
|
||||||
|
|
||||||
|
// <command>.<disguise>.<method>.<options>
|
||||||
|
if (split.length < 4) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!split[2].equalsIgnoreCase(permNode) && !split[2].equalsIgnoreCase("*")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean applicable = false;
|
||||||
|
|
||||||
|
for (String s : split[3].split("/")) {
|
||||||
|
if (!s.equals("*") && !s.replace("_", "").equalsIgnoreCase(type.toReadable().replace(" ", ""))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
applicable = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!applicable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<String, Boolean> options = new HashMap<>();
|
||||||
|
|
||||||
|
for (int i = 5; i < split.length; i++) {
|
||||||
|
options.put(split[i], permission.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String s : split[4].split("/")) {
|
||||||
|
if (returns.containsKey(s)) {
|
||||||
|
returns.get(s).putAll(options);
|
||||||
|
} else {
|
||||||
|
returns.put(s, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return returns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the string is found in the map, or it's not a whitelisted setup
|
||||||
|
* <p>
|
||||||
|
* Returns if command user can access the disguise creation permission type
|
||||||
|
*/
|
||||||
|
public static boolean hasPermissionOption(HashMap<String, HashMap<String, Boolean>> disguiseOptions, String method, String value) {
|
||||||
|
method = method.toLowerCase(Locale.ENGLISH);
|
||||||
|
|
||||||
|
// If no permissions were defined, return true
|
||||||
|
if (!disguiseOptions.containsKey(method)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<String, Boolean> map = disguiseOptions.get(method);
|
||||||
|
|
||||||
|
value = value.toLowerCase(Locale.ENGLISH);
|
||||||
|
|
||||||
|
// If they were explictly defined, can just return the value
|
||||||
|
if (map.containsKey(value)) {
|
||||||
|
return map.get(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is at least one whitelisted value, then they needed the whitelist to use it
|
||||||
|
return !map.containsValue(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package me.libraryaddict.disguise.utilities.parser;
|
package me.libraryaddict.disguise.utilities.parser;
|
||||||
|
|
||||||
import me.libraryaddict.disguise.DisguiseConfig;
|
import me.libraryaddict.disguise.DisguiseConfig;
|
||||||
|
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
||||||
|
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
|
||||||
|
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
|
||||||
|
import org.bukkit.Material;
|
||||||
import org.bukkit.permissions.Permissible;
|
import org.bukkit.permissions.Permissible;
|
||||||
import org.bukkit.permissions.Permission;
|
import org.bukkit.permissions.Permission;
|
||||||
import org.bukkit.permissions.PermissionAttachment;
|
import org.bukkit.permissions.PermissionAttachment;
|
||||||
@ -12,6 +16,7 @@ import org.junit.Test;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -158,7 +163,7 @@ public class DisguisePermissionsTest {
|
|||||||
|
|
||||||
DisguisePermissions permissions =
|
DisguisePermissions permissions =
|
||||||
createPermissions("Disguise", false, "libsdisguises.disguise.cow", "libsdisguises.disguise.sheep.setColor.setSprinting",
|
createPermissions("Disguise", false, "libsdisguises.disguise.cow", "libsdisguises.disguise.sheep.setColor.setSprinting",
|
||||||
"libsdisguises.disguise.animal.-setSprinting");
|
"libsdisguises.disguise.animal.-setSprinting", "libsdisguises.disguise.sheep.setcolor.blue");
|
||||||
|
|
||||||
Assert.assertTrue("There should be a valid disguise", permissions.hasPermissions());
|
Assert.assertTrue("There should be a valid disguise", permissions.hasPermissions());
|
||||||
|
|
||||||
@ -192,6 +197,23 @@ public class DisguisePermissionsTest {
|
|||||||
|
|
||||||
Assert.assertFalse("The disguise should not be allowed even with options",
|
Assert.assertFalse("The disguise should not be allowed even with options",
|
||||||
permissions.isAllowedDisguise(firework, Arrays.asList("setBaby", "setBurning")));
|
permissions.isAllowedDisguise(firework, Arrays.asList("setBaby", "setBurning")));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDisguiseParameters() {
|
||||||
|
HashMap<String, HashMap<String, Boolean>> disguiseOptions =
|
||||||
|
DisguisePermissions.getDisguiseOptions(createPermissionsHolder(false, "libsdisguises.options.disguise.falling_block.setblock.stone"), "Disguise",
|
||||||
|
new DisguisePerm(DisguiseType.FALLING_BLOCK));
|
||||||
|
|
||||||
|
Assert.assertTrue("They should be allowed to use true as a disguise option on setBurning",
|
||||||
|
DisguisePermissions.hasPermissionOption(disguiseOptions, "setBurning", "true"));
|
||||||
|
|
||||||
|
Assert.assertTrue("They should be allowed to use Material.STONE as a disguise option",
|
||||||
|
DisguisePermissions.hasPermissionOption(disguiseOptions, "setBlock", "STONE"));
|
||||||
|
|
||||||
|
Assert.assertFalse("They should be not allowed to use Material.DIRT as a disguise option",
|
||||||
|
DisguisePermissions.hasPermissionOption(disguiseOptions, "setBlock", "DIRT"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -236,7 +258,8 @@ public class DisguisePermissionsTest {
|
|||||||
DisguiseConfig.setExplicitDisguisePermissions(false);
|
DisguiseConfig.setExplicitDisguisePermissions(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DisguisePermissions createPermissions(String commandName, boolean isOp, String... perms) {
|
private Permissible createPermissionsHolder(boolean isOp, String... perms) {
|
||||||
|
|
||||||
List<String> permitted = new ArrayList<>();
|
List<String> permitted = new ArrayList<>();
|
||||||
List<String> negated = new ArrayList<>();
|
List<String> negated = new ArrayList<>();
|
||||||
Set<PermissionAttachmentInfo> attachments = new HashSet<>();
|
Set<PermissionAttachmentInfo> attachments = new HashSet<>();
|
||||||
@ -321,6 +344,10 @@ public class DisguisePermissionsTest {
|
|||||||
attachments.add(new PermissionAttachmentInfo(permissible, perm, null, setTrue));
|
attachments.add(new PermissionAttachmentInfo(permissible, perm, null, setTrue));
|
||||||
});
|
});
|
||||||
|
|
||||||
return new DisguisePermissions(permissible, commandName);
|
return permissible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DisguisePermissions createPermissions(String commandName, boolean isOp, String... perms) {
|
||||||
|
return new DisguisePermissions(createPermissionsHolder(isOp, perms), commandName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user