diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt index 2623b05..2ed562e 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/app/ShamrockConfig.kt @@ -249,6 +249,11 @@ object ShamrockConfig { return preferences.getBoolean("enable_auto_start", false) } + fun enableAliveReply(ctx: Context): Boolean { + val preferences = ctx.getSharedPreferences("config", 0) + return preferences.getBoolean("alive_reply", false) + } + fun allowShell(ctx: Context): Boolean { val preferences = ctx.getSharedPreferences("config", 0) return preferences.getBoolean("shell", false) @@ -259,6 +264,11 @@ object ShamrockConfig { preferences.edit().putBoolean("enable_auto_start", v).apply() } + fun setAliveReply(ctx: Context, v: Boolean) { + val preferences = ctx.getSharedPreferences("config", 0) + preferences.edit().putBoolean("alive_reply", v).apply() + } + fun setShellStatus(ctx: Context, v: Boolean) { val preferences = ctx.getSharedPreferences("config", 0) preferences.edit().putBoolean("shell", v).apply() @@ -304,12 +314,13 @@ object ShamrockConfig { "inject_packet" to preferences.getBoolean("inject_packet", false), "debug" to preferences.getBoolean("debug", false), "anti_qq_trace" to preferences.getBoolean("anti_qq_trace", true), - "auto_clear" to preferences.getBoolean("auto_clear", false), + //"auto_clear" to preferences.getBoolean("auto_clear", false), "ssl_private_pwd" to preferences.getString("ssl_private_pwd", ""), "key_store" to preferences.getString("key_store", ""), "enable_self_msg" to preferences.getBoolean("enable_self_msg", false), "echo_number" to preferences.getBoolean("echo_number", false), "shell" to preferences.getBoolean("shell", false), + "alive_reply" to preferences.getBoolean("alive_reply", false), ) } diff --git a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt index 84e0925..5dae5f7 100644 --- a/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt +++ b/app/src/main/java/moe/fuqiuluo/shamrock/ui/fragment/LabFragment.kt @@ -85,17 +85,6 @@ fun LabFragment() { ShamrockConfig.pushUpdate(ctx) return@Function true } - - Function( - title = LocalString.antiTrace, - desc = LocalString.antiTraceDesc, - descColor = it, - isSwitch = ShamrockConfig.isAntiTrace(ctx) - ) { - ShamrockConfig.setAntiTrace(ctx, it) - ShamrockConfig.pushUpdate(ctx) - return@Function true - } } } @@ -124,13 +113,12 @@ fun LabFragment() { }*/ Function( - title = LocalString.injectPacket, - desc = LocalString.injectPacketDesc, + title = "自回复测试", + desc = "发送[ping],机器人发送一个具有调试信息的返回。", descColor = color, - isSwitch = ShamrockConfig.isInjectPacket(ctx) + isSwitch = ShamrockConfig.enableAliveReply(ctx) ) { - ShamrockConfig.setInjectPacket(ctx, it) - ShamrockConfig.pushUpdate(ctx) + ShamrockConfig.setAliveReply(ctx, it) return@Function true } @@ -167,7 +155,50 @@ fun LabFragment() { scope.toast(ctx, LocalString.restartSysToast) return@Function true } + }.onFailure { + AppRuntime.log("无法启用附加选项,LSPosed模块未激活或者不支持XSharedPreferences", Level.WARN) + } + } + } + + ActionBox( + modifier = Modifier.padding(top = 12.dp), + painter = painterResource(id = R.drawable.sharp_lock_24), + title = "安全性设置" + ) { color -> + Column { + Divider( + modifier = Modifier, + color = GlobalColor.Divider, + thickness = 0.2.dp + ) + + Function( + title = LocalString.injectPacket, + desc = LocalString.injectPacketDesc, + descColor = color, + isSwitch = ShamrockConfig.isInjectPacket(ctx) + ) { + ShamrockConfig.setInjectPacket(ctx, it) + ShamrockConfig.pushUpdate(ctx) + return@Function true + } + + Function( + title = LocalString.antiTrace, + desc = LocalString.antiTraceDesc, + descColor = color, + isSwitch = ShamrockConfig.isAntiTrace(ctx) + ) { + ShamrockConfig.setAntiTrace(ctx, it) + ShamrockConfig.pushUpdate(ctx) + return@Function true + } + + kotlin.runCatching { + ctx.getSharedPreferences("shared_config", Context.MODE_WORLD_READABLE) + }.onSuccess { Function( title = "反检测加强", desc = "可能导致某些设备频繁闪退", @@ -178,11 +209,8 @@ fun LabFragment() { scope.toast(ctx, LocalString.restartToast) return@Function true } - }.onFailure { - AppRuntime.log("无法启用附加选项,LSPosed模块未激活或者不支持XSharedPreferences", Level.WARN) } } - } ActionBox( diff --git a/app/src/main/res/drawable/sharp_lock_24.xml b/app/src/main/res/drawable/sharp_lock_24.xml new file mode 100644 index 0000000..9aca7ca --- /dev/null +++ b/app/src/main/res/drawable/sharp_lock_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt index 264ce60..361c309 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/config/ShamrockConfig.kt @@ -1,6 +1,7 @@ package moe.fuqiuluo.shamrock.remote.service.config import android.content.Intent +import com.tencent.mmkv.MMKV import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import moe.fuqiuluo.shamrock.tools.GlobalJson5 @@ -65,7 +66,7 @@ internal object ShamrockConfig { putString( "ssl_alias", intent.getStringExtra("ssl_alias")) // 证书别名 putInt( "ssl_port", intent.getIntExtra("ssl_port", 5701)) // 主动HTTP端口 - putBoolean("auto_clear", intent.getBooleanExtra("auto_clear", false)) // 自动清理 + putBoolean("alive_reply", intent.getBooleanExtra("alive_reply", false)) // 自回复测试 putBoolean("enable_self_msg", intent.getBooleanExtra("enable_self_msg", false)) // 推送自己发的消息 putBoolean("shell", intent.getBooleanExtra("shell", false)) // 开启Shell接口 @@ -75,6 +76,13 @@ internal object ShamrockConfig { updateConfig() } + private val mmkv: MMKV + get() = MMKVFetcher.mmkvWithId("shamrock_config") + + fun aliveReply(): Boolean { + return mmkv.getBoolean("alive_reply", false) + } + fun allowTempSession(): Boolean { return Config.allowTempSession } @@ -88,12 +96,10 @@ internal object ShamrockConfig { } fun enableSelfMsg(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("enable_self_msg", false) } fun openWebSocketClient(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("ws_client", false) } @@ -102,7 +108,6 @@ internal object ShamrockConfig { } fun openWebSocket(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("ws", false) } @@ -115,37 +120,30 @@ internal object ShamrockConfig { } fun useCQ(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("use_cqcode", false) } fun allowWebHook(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("http", false) } fun getWebHookAddress(): String { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getString("http_addr", "") ?: "" } fun forceTablet(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("tablet", true) } fun getPort(): Int { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getInt("port", 5700) } fun isInjectPacket(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("inject_packet", false) } fun isDebug(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("debug", false) } @@ -154,7 +152,6 @@ internal object ShamrockConfig { } fun getKeyStorePath(): File? { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.getString("key_store", null)?.let { return File(it) } @@ -162,52 +159,42 @@ internal object ShamrockConfig { } fun sslPwd(): CharArray? { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getString("ssl_pwd", null)?.toCharArray() } fun sslPrivatePwd(): String? { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getString("ssl_private_pwd", null) } fun sslAlias(): String? { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getString("ssl_alias", null) } fun getSslPort(): Int { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getInt("ssl_port", getPort()) } fun isDev(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("dev", false) } operator fun set(key: String, value: String) { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.putString(key, value) } operator fun set(key: String, value: Boolean) { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.putBoolean(key, value) } operator fun set(key: String, value: Int) { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.putInt(key, value) } operator fun set(key: String, value: Long) { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.putLong(key, value) } operator fun set(key: String, value: Float) { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") mmkv.putFloat(key, value) } @@ -216,7 +203,6 @@ internal object ShamrockConfig { } fun allowShell(): Boolean { - val mmkv = MMKVFetcher.mmkvWithId("shamrock_config") return mmkv.getBoolean("shell", false) } } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt index 11cf001..a540d82 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt @@ -7,6 +7,7 @@ import com.tencent.qqnt.kernel.nativeinterface.* import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.qqinterface.servlet.TicketSvc import moe.fuqiuluo.qqinterface.servlet.msg.convert.toCQCode import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc @@ -65,6 +66,10 @@ internal object AioListener: IKernelMsgListener { val rawMsg = record.elements.toCQCode(record.chatType, record.peerUin.toString()) if (rawMsg.isEmpty()) return + if (ShamrockConfig.aliveReply() && rawMsg == "ping") { + MessageHelper.sendMessageWithoutMsgId(record.chatType, record.peerUin.toString(), "pong", { _, _ -> }) + } + //if (rawMsg.contains("forward")) { // LogCenter.log(record.extInfoForUI.decodeToString(), Level.WARN) //} @@ -141,10 +146,7 @@ internal object AioListener: IKernelMsgListener { time = record.msgTime ) - val rawMsg = record.elements.toCQCode(record.chatType, record.peerUin.toString()) - if (rawMsg.isEmpty()) return@launch - - LogCenter.log("发送消息($msgHash | ${record.msgSeq} | ${record.msgId}): $rawMsg") + LogCenter.log("预发送消息($msgHash | ${record.msgSeq} | ${record.msgId})") } catch (e: Throwable) { LogCenter.log(e.stackTraceToString(), Level.WARN) }