From e7085f76022b0bdc3edfeb7fd9c4577f10336178 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:50:23 -0400 Subject: [PATCH] [F] Fix DFI response compat --- .../samnyan/aqua/net/transfer/AllNetClient.kt | 14 ++++++------- .../samnyan/aqua/net/transfer/DataBroker.kt | 3 ++- .../icu/samnyan/aqua/sega/allnet/AllNet.kt | 2 +- .../{util => allnet}/AllNetBillingDecoder.kt | 21 +++++++++++++------ .../icu/samnyan/aqua/sega/billing/Billing.kt | 2 +- 5 files changed, 26 insertions(+), 16 deletions(-) rename src/main/java/icu/samnyan/aqua/sega/{util => allnet}/AllNetBillingDecoder.kt (70%) diff --git a/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt b/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt index 9aca3f70..c24b7ba6 100644 --- a/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt +++ b/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt @@ -1,11 +1,11 @@ package icu.samnyan.aqua.net.transfer -import ext.bodyString import ext.header import ext.post import ext.request import icu.samnyan.aqua.sega.aimedb.AimeDbClient -import icu.samnyan.aqua.sega.util.AllNetBillingDecoder +import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder +import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNetResp val keychipPattern = Regex("([A-Z\\d]{4}-[A-Z\\d]{11}|[A-Z\\d]{11})") @@ -28,6 +28,7 @@ class AllNetClient(val dns: String, val keychip: String, val game: String, val v // Send AllNet PowerOn request to obtain game URL val gameUrl by lazy { "$dns/sys/servlet/PowerOn".request() + .header("User-Agent" to "AquaTrans/1.0") .header("Content-Type" to "application/x-www-form-urlencoded") .header("Pragma" to "DFI") .post(AllNetBillingDecoder.encodeAllNet(mapOf( @@ -37,11 +38,10 @@ class AllNetClient(val dns: String, val keychip: String, val game: String, val v "ip" to "127.0.0.1", "firm_ver" to "60001", "boot_ver" to "0000", "encode" to "UTF-8", "format_ver" to "3", "hops" to "1", "token" to "2864179931" ))) - .bodyString() - ?.split("&") - ?.map { it.split("=") } - ?.filter { it.size == 2 } - ?.associate { it[0] to it[1] }?.get("uri") + ?.also { + println(it) + } + ?.decodeAllNetResp()?.get("uri") ?: throw Exception("PowerOn Failed: No game URL returned") } diff --git a/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt b/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt index a4457215..87564ba9 100644 --- a/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt +++ b/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt @@ -35,7 +35,8 @@ abstract class DataBroker( inline fun String.get(key: String, data: JDict): T = getNullable(key, data) ?: run { log("❌ $this") - throw Exception("Failed to get $this") + if (this == "GetUserDataApi") 404 - "Failed to get $this (User not found?)" + else 417 - "Failed to get $this" } fun prePull(): Pair, MutableMap> { diff --git a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt index 1cd8c4b8..9fa80e8f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt +++ b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.allnet import ext.* import icu.samnyan.aqua.net.db.AquaNetUserRepo -import icu.samnyan.aqua.sega.util.AllNetBillingDecoder.decodeAllNet +import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNet import icu.samnyan.aqua.sega.util.AquaConst import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse diff --git a/src/main/java/icu/samnyan/aqua/sega/util/AllNetBillingDecoder.kt b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetBillingDecoder.kt similarity index 70% rename from src/main/java/icu/samnyan/aqua/sega/util/AllNetBillingDecoder.kt rename to src/main/java/icu/samnyan/aqua/sega/allnet/AllNetBillingDecoder.kt index 25297e32..a24c5087 100644 --- a/src/main/java/icu/samnyan/aqua/sega/util/AllNetBillingDecoder.kt +++ b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetBillingDecoder.kt @@ -1,9 +1,15 @@ -package icu.samnyan.aqua.sega.util +package icu.samnyan.aqua.sega.allnet +import ext.bodyString +import ext.header +import icu.samnyan.aqua.sega.util.ZLib +import java.net.http.HttpResponse import java.util.* import kotlin.text.Charsets.UTF_8 object AllNetBillingDecoder { + fun String.urlToMap() = split("&").map { it.split("=") }.filter { it.size == 2 }.associate { it[0] to it[1] } + /** * Decode the input byte array from Base64 MIME encoding and decompress the decoded byte array */ @@ -15,10 +21,7 @@ object AllNetBillingDecoder { val output = ZLib.decompress(bytes, nowrap).toString(UTF_8).trim() // Split the string by '&' symbol to separate key-value pairs - return output.split("&").associate { - val (key, value) = it.split("=") - key to value - } + return output.urlToMap() } fun encode(src: Map, base64: Boolean): ByteArray { @@ -29,7 +32,7 @@ object AllNetBillingDecoder { val bytes = ZLib.compress(output.toByteArray(UTF_8)) // Encode the compressed byte array to Base64 MIME encoding - return if (!base64) bytes else Base64.getMimeEncoder().encode(bytes) + return if (!base64) bytes else Base64.getEncoder().encode(bytes) } @JvmStatic @@ -38,4 +41,10 @@ object AllNetBillingDecoder { @JvmStatic fun decodeBilling(src: ByteArray) = decode(src, base64 = false, nowrap = true) + + fun HttpResponse.decodeAllNetResp() = + if (header("Pragma") == "DFI") decodeAllNet(body()) + else bodyString()?.urlToMap() } + + diff --git a/src/main/java/icu/samnyan/aqua/sega/billing/Billing.kt b/src/main/java/icu/samnyan/aqua/sega/billing/Billing.kt index ddfc84b5..bf12e1cc 100644 --- a/src/main/java/icu/samnyan/aqua/sega/billing/Billing.kt +++ b/src/main/java/icu/samnyan/aqua/sega/billing/Billing.kt @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.billing import ext.logger import ext.toUrl -import icu.samnyan.aqua.sega.util.AllNetBillingDecoder.decodeBilling +import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeBilling import jakarta.annotation.PostConstruct import jakarta.servlet.http.HttpServletRequest import org.eclipse.jetty.http.HttpVersion