From 7750284e53f434fb70fd9abc42716e9d837ad811 Mon Sep 17 00:00:00 2001
From: Karlatemp <kar@kasukusakura.com>
Date: Sun, 18 Jun 2023 19:36:16 +0800
Subject: [PATCH] [core] Push device to sso service & little change

---
 .../network/components/EcdhInitialPublicKeyUpdater.kt       | 4 +++-
 .../kotlin/network/protocol/packet/OutgoingPacket.kt        | 6 ++++--
 mirai-core/src/commonMain/kotlin/spi/EncryptService.kt      | 1 +
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/mirai-core/src/commonMain/kotlin/network/components/EcdhInitialPublicKeyUpdater.kt b/mirai-core/src/commonMain/kotlin/network/components/EcdhInitialPublicKeyUpdater.kt
index 3d57dc221..ea6c30efa 100644
--- a/mirai-core/src/commonMain/kotlin/network/components/EcdhInitialPublicKeyUpdater.kt
+++ b/mirai-core/src/commonMain/kotlin/network/components/EcdhInitialPublicKeyUpdater.kt
@@ -120,7 +120,9 @@ internal class EcdhInitialPublicKeyUpdaterImpl(
         }
 
         encryptWorker.initialize(EncryptServiceContext(bot.id, buildTypeSafeMap {
-            set(EncryptServiceContext.KEY_CHANNEL_PROXY, createChannelProxy(bot.client))
+            set(EncryptServiceContext.KEY_CHANNEL_PROXY, createChannelProxy(bot))
+            set(EncryptServiceContext.KEY_DEVICE_INFO, bot.client.device)
+            set(EncryptServiceContext.KEY_BOT_PROTOCOL, bot.configuration.protocol)
         }))
     }
 
diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacket.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacket.kt
index 3ef19401c..c86f5db91 100644
--- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacket.kt
+++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/OutgoingPacket.kt
@@ -12,6 +12,7 @@ package net.mamoe.mirai.internal.network.protocol.packet
 
 import io.ktor.utils.io.core.*
 import kotlinx.serialization.encodeToByteArray
+import net.mamoe.mirai.internal.QQAndroidBot
 import net.mamoe.mirai.internal.network.*
 import net.mamoe.mirai.internal.network.components.EcdhInitialPublicKeyUpdater
 import net.mamoe.mirai.internal.network.protocol.data.proto.SSOReserveField
@@ -252,7 +253,7 @@ internal fun <R : Packet?> OutgoingPacketFactory<R>.buildLoginOutgoingPacket(
 
 private inline val BRP_STUB get() = ByteReadPacket.Empty
 
-internal fun createChannelProxy(client: QQAndroidClient): EncryptService.ChannelProxy {
+internal fun createChannelProxy(bot: QQAndroidBot): EncryptService.ChannelProxy {
     return object : EncryptService.ChannelProxy {
         override suspend fun sendMessage(
             remark: String,
@@ -261,6 +262,7 @@ internal fun createChannelProxy(client: QQAndroidClient): EncryptService.Channel
             data: ByteArray
         ): EncryptService.ChannelResult? {
             if (commandName.startsWith(TRpcRawPacket.COMMAND_PREFIX)) {
+                val client = bot.client
                 val packet = client.bot.network.sendAndExpect(
                     TRpcRawPacket.buildLoginOutgoingPacket(
                         client = client,
@@ -322,7 +324,7 @@ internal inline fun BytePacketBuilder.writeSsoPacket(
         val signResult = encryptWorker?.qSecurityGetSign(
             EncryptServiceContext(client.uin, buildTypeSafeMap {
                 set(EncryptServiceContext.KEY_APP_QUA, "V1_AND_SQ_8.9.58_4106_YYB_D") // 8.9.58
-                set(EncryptServiceContext.KEY_CHANNEL_PROXY, createChannelProxy(client))
+                set(EncryptServiceContext.KEY_CHANNEL_PROXY, createChannelProxy(client.bot))
             }),
             sequenceId,
             commandName,
diff --git a/mirai-core/src/commonMain/kotlin/spi/EncryptService.kt b/mirai-core/src/commonMain/kotlin/spi/EncryptService.kt
index a374f7a14..e54c65c18 100644
--- a/mirai-core/src/commonMain/kotlin/spi/EncryptService.kt
+++ b/mirai-core/src/commonMain/kotlin/spi/EncryptService.kt
@@ -31,6 +31,7 @@ public class EncryptServiceContext @MiraiInternalApi constructor(
         public val KEY_BOT_PROTOCOL: TypeKey<BotConfiguration.MiraiProtocol> = TypeKey("BOT_PROTOCOL")
         public val KEY_APP_QUA: TypeKey<String> = TypeKey("KEY_APP_QUA")
         public val KEY_CHANNEL_PROXY: TypeKey<EncryptService.ChannelProxy> = TypeKey("KEY_CHANNEL_PROXY")
+        public val KEY_DEVICE_INFO: TypeKey<DeviceInfo> = TypeKey("KEY_DEVICE_INFO")
     }
 }