forked from SteamWar/SteamWar
Fix Schematic Upload
This commit is contained in:
@@ -19,14 +19,11 @@
|
|||||||
|
|
||||||
package de.steamwar.routes
|
package de.steamwar.routes
|
||||||
|
|
||||||
|
import de.steamwar.ResponseError
|
||||||
import de.steamwar.plugins.SWAuthPrincipal
|
import de.steamwar.plugins.SWAuthPrincipal
|
||||||
import de.steamwar.plugins.SWPermissionCheck
|
import de.steamwar.plugins.SWPermissionCheck
|
||||||
import de.steamwar.sql.NodeData
|
import de.steamwar.sql.*
|
||||||
import de.steamwar.sql.NodeData.SchematicFormat
|
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.Nbt
|
||||||
import dev.dewy.nbt.tags.collection.CompoundTag
|
import dev.dewy.nbt.tags.collection.CompoundTag
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
@@ -36,12 +33,15 @@ import io.ktor.server.request.*
|
|||||||
import io.ktor.server.response.*
|
import io.ktor.server.response.*
|
||||||
import io.ktor.server.routing.*
|
import io.ktor.server.routing.*
|
||||||
import kotlinx.serialization.Serializable
|
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.security.MessageDigest
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.temporal.ChronoUnit
|
import java.time.temporal.ChronoUnit
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.zip.GZIPInputStream
|
||||||
|
|
||||||
@Serializable
|
@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) {
|
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 {
|
post {
|
||||||
val file = call.receive<UploadSchematic>()
|
val file = call.receive<UploadSchematic>()
|
||||||
val schemName = file.name.substringBeforeLast(".")
|
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(".")
|
val schemType = file.name.substringAfterLast(".")
|
||||||
|
|
||||||
if (schemType != "schem" && schemType != "schematic") {
|
if (schemType != "schem" && schemType != "schematic") {
|
||||||
call.respond(HttpStatusCode.BadRequest)
|
call.respond(HttpStatusCode.BadRequest, ResponseError(
|
||||||
|
error = "INVALID_SUFFIX"
|
||||||
|
))
|
||||||
return@post
|
return@post
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +136,7 @@ fun Route.configureSchematic() {
|
|||||||
try {
|
try {
|
||||||
val content = Base64.getDecoder().decode(file.content)
|
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
|
if (schem.size() == 1) schem = schem.first() as CompoundTag
|
||||||
|
|
||||||
@@ -144,7 +154,9 @@ fun Route.configureSchematic() {
|
|||||||
|
|
||||||
call.respond(ResponseSchematic(node))
|
call.respond(ResponseSchematic(node))
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
call.respond(HttpStatusCode.BadRequest)
|
call.respond(HttpStatusCode.BadRequest, ResponseError(
|
||||||
|
error = e.message ?: "GENERIC", code = "UPLOAD_ERROR"
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user