diff --git a/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java b/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java index ab58a52..039bc0b 100644 --- a/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java +++ b/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java @@ -5,6 +5,7 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; import io.ib67.sfcraft.config.SFConfig; +import io.ib67.sfcraft.inject.MinecraftServerSupplier; import io.ib67.sfcraft.module.SignatureService; import io.ib67.sfcraft.module.supervisor.WebHandler; import io.ib67.sfcraft.util.Helper; @@ -43,6 +44,8 @@ public class SchematicUploader extends WebHandler { SFConfig config; @Inject SignatureService signatureService; + @Inject + MinecraftServerSupplier serverSupplier; @Override @SneakyThrows @@ -103,12 +106,19 @@ public class SchematicUploader extends WebHandler { return; } var signRaw = Base64.getUrlDecoder().decode(context.queryParam("sign")); - var verifiedSign = signatureService.readSignature(Unpooled.wrappedBuffer(signRaw)); - if ((verifiedSign.permission() & PERMISSION_UPLOAD_SCHEMATICS) == 0) { - context.result("Permission denied!"); + try { + var verifiedSign = signatureService.readSignature(Unpooled.wrappedBuffer(signRaw)); + if ((verifiedSign.permission() & PERMISSION_UPLOAD_SCHEMATICS) == 0) { + context.result("Permission denied!"); + context.status(403); + return; + } + context.attribute("sign", verifiedSign); + } catch (Exception e) { + context.result("Invalid signature. Please re-run /upload schematic in game."); + context.status(400); return; } - context.attribute("sign", verifiedSign); var files = context.uploadedFileMap(); var name = context.pathParam("name"); files.forEach((k, v) -> handleUploadSchematic(context, name, v)); @@ -128,24 +138,23 @@ public class SchematicUploader extends WebHandler { if (fileName.length() <= 10) return; var baseFileName = Helper.cleanFileName(fileName.substring(0, fileName.length() - 10)); var sign = context.attribute("sign"); - //var player = serverSupplier.get().getPlayerManager().getPlayer(sign.issuer()); - ServerPlayerEntity player = null; + var player = serverSupplier.get().getPlayerManager().getPlayer(sign.issuer()); + log.info("Handling file {} from player {}", fileName, sign.issuer()); if (fileName.endsWith(".schematic") || fileName.endsWith(".schem")) { Files.write(SCHEMATIC_DIR.resolve(baseFileName + ".schematic"), file.content().readAllBytes()); log.info("Saved " + fileName + " as a schematic."); if (player != null) { - player.sendMessage(Text.literal("Schematic " + baseFileName + " has been saved!").withColor(Color.GREEN.getRGB())); + player.sendMessage(Text.literal(sign.issuer()+": Schematic " + baseFileName + " has been saved! Use //schem list to find it").withColor(Color.GREEN.getRGB())); } } else if (fileName.endsWith(".litematic")) { - log.info("Handling new litematic: {}", fileName); - try (var converter = new LitematicConverterV3(file.content(), new NbtSizeTracker(config.maxSchematicSize, 16))) { + try (var converter = new LitematicConverterV3(file.content(), new NbtSizeTracker(config.maxSchematicSize, 64))) { converter.read((name, nbt) -> { name = baseFileName + "-" + name + ".schematic"; try { NbtIo.writeCompressed(nbt, SCHEMATIC_DIR.resolve(name)); - log.info("Schematic " + name + " has been saved!"); + log.info(sign.issuer()+": Schematic " + name + " has been saved!"); if (player != null) { - player.sendMessage(Text.literal("Schematic " + name + " has been saved!").withColor(Color.GREEN.getRGB())); + player.sendMessage(Text.literal("Schematic " + name + " has been saved! Use //schem list to find it").withColor(Color.GREEN.getRGB())); } context.result("Success!"); } catch (Exception e) { diff --git a/src/main/java/io/ib67/sfcraft/util/TypedNbtList.java b/src/main/java/io/ib67/sfcraft/util/TypedNbtList.java new file mode 100644 index 0000000..2722224 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/util/TypedNbtList.java @@ -0,0 +1,24 @@ +package io.ib67.sfcraft.util; + +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; + +import java.io.DataOutput; +import java.io.IOException; +import java.util.List; + +public class TypedNbtList extends NbtList { + public TypedNbtList(List list, byte type) { + super(list, type); + } + + @Override + public void write(DataOutput output) throws IOException { + output.writeByte(this.getHeldType()); + output.writeInt(this.size()); + + for (NbtElement nbtElement : this) { + nbtElement.write(output); + } + } +} diff --git a/src/main/java/io/ib67/sfcraft/util/litematic/LitematicConverter.java b/src/main/java/io/ib67/sfcraft/util/litematic/LitematicConverter.java index b5e4535..e5d145f 100644 --- a/src/main/java/io/ib67/sfcraft/util/litematic/LitematicConverter.java +++ b/src/main/java/io/ib67/sfcraft/util/litematic/LitematicConverter.java @@ -1,9 +1,11 @@ package io.ib67.sfcraft.util.litematic; +import io.ib67.sfcraft.util.TypedNbtList; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import lombok.SneakyThrows; import net.minecraft.nbt.*; +import org.apache.commons.compress.utils.Lists; import java.io.InputStream; import java.util.ArrayList; @@ -76,7 +78,8 @@ public class LitematicConverter implements AutoCloseable { } protected NbtList convertToWETileEntities(NbtList tileEntities) { - var weTEs = new NbtList(); + var weTEs = new TypedNbtList(Lists.newArrayList(), NbtElement.COMPOUND_TYPE); + for (NbtElement _tileEntity : tileEntities) { var weTE = new NbtCompound(); var tE = (NbtCompound) _tileEntity; diff --git a/src/main/resources/sfcraft.accesswidener b/src/main/resources/sfcraft.accesswidener index 2e8c5c9..dc5ba10 100644 --- a/src/main/resources/sfcraft.accesswidener +++ b/src/main/resources/sfcraft.accesswidener @@ -1,2 +1,3 @@ accessWidener v2 named -mutable field net/minecraft/item/Item registryEntry Lnet/minecraft/registry/entry/RegistryEntry$Reference; \ No newline at end of file +mutable field net/minecraft/item/Item registryEntry Lnet/minecraft/registry/entry/RegistryEntry$Reference; +accessible method net/minecraft/nbt/NbtList (Ljava/util/List;B)V \ No newline at end of file