From b17d784d802edae37187fa9e17cc876b85f9b813 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:49:16 -0500 Subject: [PATCH] [O] Hash user ids --- src/main/java/ext/Ext.kt | 8 +++++--- .../samnyan/aqua/sega/maimai2/worldslink/FutariLobby.kt | 1 + .../samnyan/aqua/sega/maimai2/worldslink/FutariModels.kt | 2 +- .../samnyan/aqua/sega/maimai2/worldslink/FutariServer.kt | 6 +++--- src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index db2d6073..c4f24d5e 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalStdlibApi::class) + package ext import icu.samnyan.aqua.net.utils.ApiException @@ -113,7 +115,6 @@ val HTTP = HttpClient(CIO) { } val TIKA = Tika() val MIMES = MimeTypes.getDefaultMimeTypes() -val MD5 = MessageDigest.getInstance("MD5") // Class resource object Ext { val log = logger() } @@ -216,11 +217,12 @@ operator fun Str.get(range: IntRange) = substring(range.first, (range.last + 1). operator fun Str.get(start: Int, end: Int) = substring(start, end.coerceAtMost(length)) fun Str.center(width: Int, padChar: Char = ' ') = padStart((length + width) / 2, padChar).padEnd(width, padChar) fun Str.splitLines() = replace("\r\n", "\n").split('\n') -@OptIn(ExperimentalStdlibApi::class) -fun Str.md5() = MD5.digest(toByteArray(Charsets.UTF_8)).toHexString() +fun Str.hash(algo: Str) = MessageDigest.getInstance(algo).digest(toByteArray(StandardCharsets.UTF_8)) +fun Str.md5() = hash("MD5") fun Str.fromChusanUsername() = String(this.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) fun Str.truncate(len: Int) = if (this.length > len) this.take(len) + "..." else this val Str.some get() = ifBlank { null } +val ByteArray.hexStr get() = toHexString() // Coroutine suspend fun async(block: suspend kotlinx.coroutines.CoroutineScope.() -> T): T = withContext(Dispatchers.IO) { block() } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariLobby.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariLobby.kt index b1fd8b29..a0b37d3b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariLobby.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariLobby.kt @@ -64,6 +64,7 @@ class FutariLobby(paths: PathProps) { recruits[d.ip] = RecruitRecord(d.RecruitInfo) if (!exists) log(d, "StartRecruit") + d.RecruitInfo.MechaInfo.UserIDs = d.RecruitInfo.MechaInfo.UserIDs.map { it.str.hashToUInt().toLong() } } @API("recruit/finish") diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariModels.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariModels.kt index 9bb87fd9..35afb20b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariModels.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariModels.kt @@ -11,7 +11,7 @@ data class MechaInfo( val IpAddress: UInt, val MusicID: Int, val Entrys: List, - val UserIDs: List, + var UserIDs: List, val UserNames: List, val IconIDs: List, val FumenDifs: List, diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariServer.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariServer.kt index 1aa2f16d..1b9ef0ae 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariServer.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/worldslink/FutariServer.kt @@ -1,6 +1,7 @@ package icu.samnyan.aqua.sega.maimai2.worldslink import ext.logger +import ext.md5 import ext.millis import ext.thread import java.io.BufferedReader @@ -10,7 +11,6 @@ import java.io.OutputStreamWriter import java.net.ServerSocket import java.net.Socket import java.net.SocketTimeoutException -import java.security.MessageDigest import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.locks.ReentrantLock import kotlin.collections.set @@ -110,14 +110,14 @@ fun ActiveClient.handle(msg: Msg) { } } -fun hashStringToUInt(input: String) = MessageDigest.getInstance("MD5").digest(input.toByteArray()).let { +fun String.hashToUInt() = md5().let { ((it[0].toUInt() and 0xFFu) shl 24) or ((it[1].toUInt() and 0xFFu) shl 16) or ((it[2].toUInt() and 0xFFu) shl 8) or (it[3].toUInt() and 0xFFu) } -fun keychipToStubIp(keychip: String) = hashStringToUInt(keychip) +fun keychipToStubIp(keychip: String) = keychip.hashToUInt() // Keychip ID to Socket val clients = ConcurrentHashMap() diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt index a1496ab2..8b2273ed 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt @@ -71,7 +71,7 @@ class WaccaServer { """"maintNoticeTime":0,"maintNotPlayableTime":0,"maintStartTime":0,"params":$paramsJson}""" return ResponseEntity.ok().headers( - "X-Wacca-Hash" to resp.md5(), + "X-Wacca-Hash" to resp.md5().hexStr, "Content-Type" to "application/json; charset=utf-8" ).body(resp) }