Browse Source

Move DeviceInfo

Him188 6 years ago
parent
commit
e116224180

+ 4 - 6
mirai-core-qqandroid/src/androidMain/kotlin/net/mamoe/mirai/qqandroid/utils/SystemDeviceInfo.kt → mirai-core/src/androidMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt

@@ -7,22 +7,20 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package net.mamoe.mirai.qqandroid.utils
+package net.mamoe.mirai.utils
 
 import android.annotation.SuppressLint
 import android.net.wifi.WifiManager
 import android.os.Build
 import android.telephony.TelephonyManager
 import kotlinx.io.core.toByteArray
-import net.mamoe.mirai.utils.Context
-import net.mamoe.mirai.utils.localIpAddress
-import net.mamoe.mirai.utils.md5
 import java.io.File
 
 /**
- * Delegated by [Build]
+ * 部分引用指向 [Build].
+ * 部分需要权限, 若无权限则会使用默认值.
  */
-actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) {
+actual open class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) {
     override val display: ByteArray get() = Build.DISPLAY.toByteArray()
     override val product: ByteArray get() = Build.PRODUCT.toByteArray()
     override val device: ByteArray get() = Build.DEVICE.toByteArray()

+ 4 - 0
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt

@@ -39,6 +39,10 @@ class BotConfiguration {
      * 日志记录器
      */
     var logger: MiraiLogger? = null
+    /**
+     * 设备信息覆盖
+     */
+    var deviceInfo: ((Context) -> DeviceInfo)? = null
 
     /**
      * 父 [CoroutineContext]

+ 12 - 11
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/DeviceInfo.kt → mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/DeviceInfo.kt

@@ -7,17 +7,17 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package net.mamoe.mirai.qqandroid.utils
+package net.mamoe.mirai.utils
 
 import kotlinx.serialization.SerialId
 import kotlinx.serialization.Serializable
-import net.mamoe.mirai.qqandroid.io.serialization.ProtoBufWithNullableSupport
-import net.mamoe.mirai.utils.Context
+import kotlinx.serialization.protobuf.ProtoBuf
 import net.mamoe.mirai.utils.cryptor.contentToString
-import net.mamoe.mirai.utils.getValue
-import net.mamoe.mirai.utils.unsafeWeakRef
 
-abstract class DeviceInfo(
+/**
+ * 设备信息. 可通过继承 [SystemDeviceInfo] 来在默认的基础上修改
+ */
+abstract class DeviceInfo internal constructor(
     context: Context
 ) {
     val context: Context by context.unsafeWeakRef()
@@ -72,7 +72,7 @@ abstract class DeviceInfo(
             @SerialId(9) val innerVersion: ByteArray
         )
 
-        return ProtoBufWithNullableSupport.dump(
+        return ProtoBuf.dump(
             DevInfo.serializer(), DevInfo(
                 bootloader,
                 procVersion,
@@ -87,10 +87,6 @@ abstract class DeviceInfo(
         )
     }
 
-    override fun toString(): String { // net.mamoe.mirai.utils.cryptor.ProtoKt.contentToString
-        return "DeviceInfo(display=${display.contentToString()}, product=${product.contentToString()}, device=${device.contentToString()}, board=${board.contentToString()}, brand=${brand.contentToString()}, model=${model.contentToString()}, bootloader=${bootloader.contentToString()}, fingerprint=${fingerprint.contentToString()}, bootId=${bootId.contentToString()}, procVersion=${procVersion.contentToString()}, baseBand=${baseBand.contentToString()}, version=$version, simInfo=${simInfo.contentToString()}, osType=${osType.contentToString()}, macAddress=${macAddress.contentToString()}, wifiBSSID=${wifiBSSID?.contentToString()}, wifiSSID=${wifiSSID?.contentToString()}, imsiMd5=${imsiMd5.contentToString()}, imei='$imei', ipAddress='$ipAddress', androidId=${androidId.contentToString()}, apn=${apn.contentToString()})"
-    }
-
     interface Version {
         val incremental: ByteArray
         val release: ByteArray
@@ -99,6 +95,11 @@ abstract class DeviceInfo(
     }
 }
 
+/**
+ * Defaults "%4;7t>;28<fc.5*6".toByteArray()
+ */
+fun generateGuid(androidId: ByteArray, macAddress: ByteArray): ByteArray = md5(androidId + macAddress)
+
 /*
 fun DeviceInfo.toOidb0x769DeviceInfo() : Oidb0x769.DeviceInfo = Oidb0x769.DeviceInfo(
     brand = brand.encodeToString(),

+ 7 - 3
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/SystemDeviceInfo.kt → mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/SystemDeviceInfo.kt

@@ -7,11 +7,15 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package net.mamoe.mirai.qqandroid.utils
+package net.mamoe.mirai.utils
 
 import net.mamoe.mirai.utils.Context
+import net.mamoe.mirai.utils.DeviceInfo
 
 /**
- * System default values
+ * 通过本机信息来获取设备信息.
+ *
+ * Android: 获取手机信息, 与 QQ 官方相同.
+ * JVM: 部分为常量, 部分为随机
  */
-expect class SystemDeviceInfo(context: Context) : DeviceInfo
+open expect class SystemDeviceInfo(context: Context) : DeviceInfo

+ 11 - 16
mirai-core-qqandroid/src/jvmMain/kotlin/net/mamoe/mirai/qqandroid/utils/SystemDeviceInfo.kt → mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt

@@ -7,13 +7,14 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package net.mamoe.mirai.qqandroid.utils
+package net.mamoe.mirai.utils
 
 import kotlinx.io.core.toByteArray
-import net.mamoe.mirai.utils.Context
-import net.mamoe.mirai.utils.localIpAddress
+import net.mamoe.mirai.utils.io.getRandomByteArray
+import net.mamoe.mirai.utils.io.getRandomString
 
-actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) {
+@UseExperimental(ExperimentalUnsignedTypes::class)
+actual open class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(context) {
     override val display: ByteArray get() = "MIRAI.200122.001".toByteArray()
     override val product: ByteArray get() = "mirai".toByteArray()
     override val device: ByteArray get() = "mirai".toByteArray()
@@ -22,24 +23,18 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
     override val model: ByteArray get() = "mirai".toByteArray()
     override val bootloader: ByteArray get() = "unknown".toByteArray()
     override val fingerprint: ByteArray get() = "mamoe/mirai/mirai:10/MIRAI.200122.001/5891938:user/release-keys".toByteArray()
-    override val bootId: ByteArray get() = "5974cb66-bb69-4e82-a436-836b98ebd88c".toByteArray()
+    override val bootId: ByteArray = ExternalImage.generateUUID(md5(getRandomByteArray(16))).toByteArray()
     override val procVersion: ByteArray get() = "Linux version 3.0.31-g6fb96c9 ([email protected])".toByteArray()
     override val baseBand: ByteArray get() = byteArrayOf()
     override val version: DeviceInfo.Version get() = Version
     override val simInfo: ByteArray get() = "T-Mobile".toByteArray()
     override val osType: ByteArray get() = "android".toByteArray()
     override val macAddress: ByteArray get() = "02:00:00:00:00:00".toByteArray()
-    override val wifiBSSID: ByteArray?
-        get() = "02:00:00:00:00:00".toByteArray()
-    override val wifiSSID: ByteArray?
-        get() = "<unknown ssid>".toByteArray()
-    @UseExperimental(ExperimentalUnsignedTypes::class)
-    override val imsiMd5: ByteArray
-        get() = ubyteArrayOf(0xD4u, 0x1Du, 0x8Cu, 0xD9u, 0x8Fu, 0x00u, 0xB2u, 0x04u, 0xE9u, 0x80u, 0x09u, 0x98u, 0xECu, 0xF8u, 0x42u, 0x7Eu).toByteArray()
-    override val imei: String get() = "858414524711993"
-    @UseExperimental(ExperimentalUnsignedTypes::class)
-    override val ipAddress: ByteArray
-        get() = localIpAddress().split(".").map { it.toUByte().toByte() }.takeIf { it.size == 4 }?.toByteArray() ?: byteArrayOf()
+    override val wifiBSSID: ByteArray? get() = "02:00:00:00:00:00".toByteArray()
+    override val wifiSSID: ByteArray? get() = "<unknown ssid>".toByteArray()
+    override val imsiMd5: ByteArray get() = md5(getRandomByteArray(16))
+    override val imei: String get() = getRandomString(15, '0'..'9')
+    override val ipAddress: ByteArray get() = localIpAddress().split(".").map { it.toUByte().toByte() }.takeIf { it.size == 4 }?.toByteArray() ?: byteArrayOf()
     override val androidId: ByteArray get() = display
     override val apn: ByteArray get() = "wifi".toByteArray()