diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 1269b072..27a95ec5 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -2,6 +2,7 @@ package carpet; import carpet.settings.ParsedRule; import carpet.settings.Rule; +import carpet.settings.SettingsManager; import carpet.settings.Validator; import carpet.utils.Messenger; import net.minecraft.server.MinecraftServer; @@ -39,6 +40,7 @@ public class CarpetSettings public static boolean impendingFillSkipUpdates = false; public static Box currentTelepotingEntityBox = null; public static Vec3d fixedPosition = null; + public static int runPermissionLevel = 2; @Rule( desc = "Nether portals correctly place entities going through", @@ -311,13 +313,22 @@ public class CarpetSettings ) public static String commandScript = "true"; + private static class ModulePermissionLevel extends Validator { + @Override public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String string) { + CarpetSettings.runPermissionLevel = SettingsManager.getCommandLevel(newValue); + return newValue; + } + @Override + public String description() { return "Also controls permission level of commands executed via `run()`";} + } @Rule( desc = "Enables restrictions for arbitrary code execution with scarpet", extra = { "Users that don't have this permission level", "won't be able to load apps or /script run" }, - category = {COMMAND, SCARPET} + category = {COMMAND, SCARPET}, + validate = ModulePermissionLevel.class ) public static String commandScriptACE = "ops"; diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 2157966d..36160a64 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -3600,7 +3600,7 @@ public class CarpetExpression Vec3d posf = new Vec3d((double)target.getX()+0.5D,(double)target.getY(),(double)target.getZ()+0.5D); ServerCommandSource s = ((CarpetContext)c).s; Value retval = new NumericValue(s.getMinecraftServer().getCommandManager().execute( - s.withPosition(posf).withSilent(), lv.get(0).evalValue(c).getString())); + s.withPosition(posf).withSilent().withLevel(CarpetSettings.runPermissionLevel), lv.get(0).evalValue(c).getString())); return (c_, t_) -> retval; }); diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index c3a9fcc7..77fad242 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -206,6 +206,24 @@ public class SettingsManager return false; } + public static int getCommandLevel(String commandLevel) + { + switch (commandLevel) + { + case "true": return 2; + case "false": return 0; + case "ops": return 2; // typical for other cheaty commands + case "0": + case "1": + case "2": + case "3": + case "4": + return Integer.parseInt(commandLevel); + } + return 0; + } + + private void loadConfigurationFromConf() { for (ParsedRule rule : rules.values()) rule.resetToDefault(server.getCommandSource());