From 893122fe1f534beb660d75a33a4969de7248a93d Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 15 Mar 2020 22:37:24 -0300 Subject: [PATCH 1/2] scarpet run() runs with scriptACE permissions. Fixes #175 --- src/main/java/carpet/CarpetSettings.java | 13 ++++++++++++- .../java/carpet/script/CarpetExpression.java | 2 +- .../java/carpet/settings/SettingsManager.java | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) 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()); From c7603038dac6e92ed823a169bc0342143f17a805 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 15 Mar 2020 23:04:14 -0300 Subject: [PATCH 2/2] fixed on_damage for all and on_death for multiplayer players. Fixes #177 --- .../mixins/ServerPlayerEntity_scarpetEventMixin.java | 8 ++++++++ src/main/java/carpet/script/EntityEventsGroup.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java index 7626b0c5..c5beb8da 100644 --- a/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayerEntity_scarpetEventMixin.java @@ -1,7 +1,9 @@ package carpet.mixins; import carpet.fakes.EntityInterface; +import carpet.script.EntityEventsGroup; import com.mojang.authlib.GameProfile; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; @@ -55,6 +57,12 @@ public abstract class ServerPlayerEntity_scarpetEventMixin extends PlayerEntity STATISTICS.onPlayerStatistic((ServerPlayerEntity) (Object)this, stat, amount); } + @Inject(method = "onDeath", at = @At("HEAD")) + private void onDeathEvent(DamageSource source, CallbackInfo ci) + { + ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DEATH, this, source.name); + } + @Redirect(method = "method_14218", at = @At( value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;setSneaking(Z)V" diff --git a/src/main/java/carpet/script/EntityEventsGroup.java b/src/main/java/carpet/script/EntityEventsGroup.java index 6ea9d746..601c88b9 100644 --- a/src/main/java/carpet/script/EntityEventsGroup.java +++ b/src/main/java/carpet/script/EntityEventsGroup.java @@ -80,7 +80,7 @@ public class EntityEventsGroup }, ON_REMOVED("on_removed", 0), ON_TICK("on_tick", 0), - ON_DAMAGE("on_damaged", 2) + ON_DAMAGE("on_damaged", 3) { @Override public List makeArgs(Entity entity, Object... providedArgs)