From 0ce7429151ac2e72b8ce36ddc88aac76074197f8 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 20 Jan 2025 17:31:20 +0100 Subject: [PATCH] Fix Schematic Upload --- .../src/de/steamwar/routes/Schematic.kt | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt index c4d76f80..e0b220de 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt @@ -19,14 +19,11 @@ package de.steamwar.routes +import de.steamwar.ResponseError import de.steamwar.plugins.SWAuthPrincipal import de.steamwar.plugins.SWPermissionCheck -import de.steamwar.sql.NodeData +import de.steamwar.sql.* import de.steamwar.sql.NodeData.SchematicFormat -import de.steamwar.sql.NodeDownload -import de.steamwar.sql.NodeMember -import de.steamwar.sql.SWException -import de.steamwar.sql.SchematicNode import dev.dewy.nbt.Nbt import dev.dewy.nbt.tags.collection.CompoundTag import io.ktor.http.* @@ -36,12 +33,15 @@ import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromByteArray +import java.io.BufferedInputStream +import java.io.ByteArrayInputStream +import java.io.DataInputStream import java.security.MessageDigest import java.time.Duration import java.time.Instant import java.time.temporal.ChronoUnit import java.util.* +import java.util.zip.GZIPInputStream @Serializable data class ResponseSchematic(val name: String, val id: Int, val type: String?, val owner: Int, val item: String, val lastUpdate: Long, val rank: Int, val replaceColor: Boolean, val allowReplay: Boolean) { @@ -109,10 +109,20 @@ fun Route.configureSchematic() { post { val file = call.receive() val schemName = file.name.substringBeforeLast(".") + + if (SchematicNode.invalidSchemName(arrayOf(schemName))) { + call.respond(HttpStatusCode.BadRequest, ResponseError( + error = "INVALID_NAME" + )) + return@post + } + val schemType = file.name.substringAfterLast(".") if (schemType != "schem" && schemType != "schematic") { - call.respond(HttpStatusCode.BadRequest) + call.respond(HttpStatusCode.BadRequest, ResponseError( + error = "INVALID_SUFFIX" + )) return@post } @@ -126,7 +136,7 @@ fun Route.configureSchematic() { try { val content = Base64.getDecoder().decode(file.content) - var schem = nbt.fromByteArray(content) + var schem = nbt.fromStream(DataInputStream(BufferedInputStream(GZIPInputStream(ByteArrayInputStream(content))))) if (schem.size() == 1) schem = schem.first() as CompoundTag @@ -144,7 +154,9 @@ fun Route.configureSchematic() { call.respond(ResponseSchematic(node)) } catch (e: Exception) { - call.respond(HttpStatusCode.BadRequest) + call.respond(HttpStatusCode.BadRequest, ResponseError( + error = e.message ?: "GENERIC", code = "UPLOAD_ERROR" + )) } } }