From 37d6d3004b5c5d231fc7258dcd2d00c1c0ec74a5 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 15 Feb 2025 23:56:53 +0900 Subject: [PATCH] fix: targeted voucher code not working --- src/net/torvald/terrarum/gameactors/ActorValue.kt | 4 +++- .../modulebasegame/redeemable/RedeemCodeMachine.kt | 14 +++++++++++--- .../modulebasegame/ui/UIRedeemCodeMachine.kt | 10 ++++++---- .../torvald/terrarum/tests/RedeemCodeGenTest.kt | 8 ++++++-- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/net/torvald/terrarum/gameactors/ActorValue.kt b/src/net/torvald/terrarum/gameactors/ActorValue.kt index e29dc269a..76c61b488 100644 --- a/src/net/torvald/terrarum/gameactors/ActorValue.kt +++ b/src/net/torvald/terrarum/gameactors/ActorValue.kt @@ -33,9 +33,11 @@ class ActorValue : KVHashMap { hashMap = newMap } + private fun isString(key: String) = (get(key) is String) + override fun set(key: String, value: Any) { // check if the key exists and is a blob - if (getAsString(key.toLowerCase())?.startsWith(BLOB) == true) { + if (isString(key.toLowerCase()) && getAsString(key.toLowerCase())?.startsWith(BLOB) == true) { throw IllegalStateException("Cannot write plain values to the blob object") } else diff --git a/src/net/torvald/terrarum/modulebasegame/redeemable/RedeemCodeMachine.kt b/src/net/torvald/terrarum/modulebasegame/redeemable/RedeemCodeMachine.kt index 05e02e4ee..3876ea7ad 100644 --- a/src/net/torvald/terrarum/modulebasegame/redeemable/RedeemCodeMachine.kt +++ b/src/net/torvald/terrarum/modulebasegame/redeemable/RedeemCodeMachine.kt @@ -106,7 +106,7 @@ object RedeemCodeMachine { bytes[bytes.size - 1] = crc16.toByte() - val basePwd = initialPassword.random() + val basePwd = initialPassword.random().copyOf() val receiverPwd = receiver?.toByteArray() ?: ByteArray(16) // 128 bits of something // xor basePWD with receiverPwd @@ -124,11 +124,19 @@ object RedeemCodeMachine { fun decode(codeStr: String, decoderUUID: UUID? = null): RedeemVoucher? { val receiverPwd = decoderUUID?.toByteArray() ?: ByteArray(16) // 128 bits of something - val passwords = initialPassword.map { basePwd -> + // for decrypting targeted code + val passwords1 = initialPassword.map { basePwd -> ByteArray(32) { i -> basePwd[i] xor receiverPwd[i % 16] } } + // for decrypting generic code + val passwords2 = initialPassword.map { basePwd -> + ByteArray(32) { i -> + basePwd[i] + } + } + val passwords = passwords1 + passwords2 // try to decode the input string by just trying all 8 possible keys val decodeds = passwords.map { @@ -149,7 +157,7 @@ object RedeemCodeMachine { } // if all CRC fails... - if (crcResults.none()) { + if (crcResults.indexOf(true) < 0) { return null } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIRedeemCodeMachine.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIRedeemCodeMachine.kt index 471a2c6f4..82b12e7ab 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIRedeemCodeMachine.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIRedeemCodeMachine.kt @@ -24,16 +24,18 @@ class UIRedeemCodeMachine : UICanvas( override var width = Toolkit.drawWidth override var height = App.scr.height + private val codeCols = 12 + val title = UIItemTextLabel(this, { "Enter the Code" }, - (Toolkit.drawWidth - UIItemRedeemCodeArea.estimateWidth(14)) / 2, + (Toolkit.drawWidth - UIItemRedeemCodeArea.estimateWidth(codeCols)) / 2, App.scr.halfh - UIItemRedeemCodeArea.estimateHeight(4) - 48 - 48, - UIItemRedeemCodeArea.estimateWidth(14) + UIItemRedeemCodeArea.estimateWidth(codeCols) ) val inputPanel = UIItemRedeemCodeArea(this, - (Toolkit.drawWidth - UIItemRedeemCodeArea.estimateWidth(14)) / 2, + (Toolkit.drawWidth - UIItemRedeemCodeArea.estimateWidth(codeCols)) / 2, App.scr.halfh - UIItemRedeemCodeArea.estimateHeight(4) - 48, - 14, 4) + codeCols, 4) init { addUIitem(title) diff --git a/src/net/torvald/terrarum/tests/RedeemCodeGenTest.kt b/src/net/torvald/terrarum/tests/RedeemCodeGenTest.kt index 785d4566e..8620577a6 100644 --- a/src/net/torvald/terrarum/tests/RedeemCodeGenTest.kt +++ b/src/net/torvald/terrarum/tests/RedeemCodeGenTest.kt @@ -1,15 +1,19 @@ import net.torvald.terrarum.modulebasegame.redeemable.RedeemCodeMachine +import java.util.* fun main() { + val uuid = UUID.randomUUID() + val code = RedeemCodeMachine.encode( "item@basegame:65511", 6, - true + true, + null ) println(code) - val voucher = RedeemCodeMachine.decode(code) + val voucher = RedeemCodeMachine.decode(code, uuid) println(voucher) } \ No newline at end of file