From d9b7df363691a10150ee1ff584ec0bde8f128535 Mon Sep 17 00:00:00 2001 From: Restia-Ashbell <107416976+Restia-Ashbell@users.noreply.github.com> Date: Sat, 21 Sep 2024 00:07:23 +0800 Subject: [PATCH] test --- .../java/io/nekohasekai/sagernet/Constants.kt | 2 + .../sagernet/database/DataStore.kt | 3 + .../sagernet/database/ProxyEntity.kt | 72 +++++++++++++------ .../nekohasekai/sagernet/fmt/ConfigBuilder.kt | 64 ++++++----------- .../sagernet/ui/SettingsPreferenceFragment.kt | 13 ++++ app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/global_preferences.xml | 5 ++ 8 files changed, 99 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index a9521ff2..2065e888 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -51,6 +51,8 @@ object Key { const val MTU = "mtu" const val ALWAYS_SHOW_ADDRESS = "alwaysShowAddress" + const val CUSTOM_GLOBAL_CONFIG = "customGlobalConfig" + // Protocol Settings const val MUX_TYPE = "muxType" const val MUX_PROTOCOLS = "mux" diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt index bb1d52a1..f1be7530 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt @@ -107,6 +107,9 @@ object DataStore : OnPreferenceDataStoreChangeListener { var logBufSize by configurationStore.int(Key.LOG_BUF_SIZE) { 0 } var acquireWakeLock by configurationStore.boolean(Key.ACQUIRE_WAKE_LOCK) + // profileCacheStore??? + var customGlobalConfig by profileCacheStore.string(Key.CUSTOM_GLOBAL_CONFIG) + // hopefully hashCode = mHandle doesn't change, currently this is true from KitKat to Nougat private val userIndex by lazy { Binder.getCallingUserHandle().hashCode() } var mixedPort: Int diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt b/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt index f78cfbbc..81162a7c 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt @@ -7,30 +7,21 @@ import com.esotericsoftware.kryo.io.ByteBufferInput import com.esotericsoftware.kryo.io.ByteBufferOutput import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.fmt.* -import io.nekohasekai.sagernet.fmt.http.HttpBean -import io.nekohasekai.sagernet.fmt.http.toUri -import io.nekohasekai.sagernet.fmt.hysteria.* -import io.nekohasekai.sagernet.fmt.internal.ChainBean -import io.nekohasekai.sagernet.fmt.mieru.MieruBean -import io.nekohasekai.sagernet.fmt.mieru.buildMieruConfig -import io.nekohasekai.sagernet.fmt.naive.NaiveBean -import io.nekohasekai.sagernet.fmt.naive.buildNaiveConfig -import io.nekohasekai.sagernet.fmt.naive.toUri +import io.nekohasekai.sagernet.fmt.http.* +import io.nekohasekai.sagernet.fmt.socks.* import io.nekohasekai.sagernet.fmt.shadowsocks.* -import io.nekohasekai.sagernet.fmt.shadowsocksr.ShadowsocksRBean -import io.nekohasekai.sagernet.fmt.shadowsocksr.toUri -import moe.matsuri.nb4a.proxy.shadowtls.ShadowTLSBean -import io.nekohasekai.sagernet.fmt.socks.SOCKSBean -import io.nekohasekai.sagernet.fmt.socks.toUri -import io.nekohasekai.sagernet.fmt.ssh.SSHBean -import io.nekohasekai.sagernet.fmt.trojan.TrojanBean -import io.nekohasekai.sagernet.fmt.trojan_go.TrojanGoBean -import io.nekohasekai.sagernet.fmt.trojan_go.buildTrojanGoConfig -import io.nekohasekai.sagernet.fmt.trojan_go.toUri -import io.nekohasekai.sagernet.fmt.tuic.TuicBean -import io.nekohasekai.sagernet.fmt.tuic.toUri +import io.nekohasekai.sagernet.fmt.shadowsocksr.* import io.nekohasekai.sagernet.fmt.v2ray.* -import io.nekohasekai.sagernet.fmt.wireguard.WireGuardBean +import io.nekohasekai.sagernet.fmt.tuic.* +import io.nekohasekai.sagernet.fmt.hysteria.* +import io.nekohasekai.sagernet.fmt.wireguard.* +import io.nekohasekai.sagernet.fmt.ssh.* +import moe.matsuri.nb4a.proxy.shadowtls.* +import io.nekohasekai.sagernet.fmt.mieru.* +import io.nekohasekai.sagernet.fmt.naive.* +import io.nekohasekai.sagernet.fmt.trojan.* +import io.nekohasekai.sagernet.fmt.trojan_go.* +import io.nekohasekai.sagernet.fmt.internal.ChainBean import io.nekohasekai.sagernet.ktx.app import io.nekohasekai.sagernet.ktx.applyDefaultValues import io.nekohasekai.sagernet.ui.profile.* @@ -39,6 +30,7 @@ import moe.matsuri.nb4a.proxy.config.ConfigBean import moe.matsuri.nb4a.proxy.config.ConfigSettingActivity import moe.matsuri.nb4a.proxy.neko.* import moe.matsuri.nb4a.proxy.shadowtls.ShadowTLSSettingsActivity +import moe.matsuri.nb4a.utils.JavaUtil.gson @Entity( tableName = "proxy_entities", indices = [Index("groupId", name = "groupId")] @@ -230,6 +222,42 @@ data class ProxyEntity( } ?: error("Null ${displayType()} profile") } + fun buildSingBoxOutbound(bean: AbstractBean): MutableMap { + return when (bean) { + is ConfigBean -> + gson.fromJson>(bean.config, MutableMap::class.java) + + is ShadowTLSBean -> // before StandardV2RayBean + buildSingBoxOutboundShadowTLSBean(bean).asMap() + + is StandardV2RayBean -> // http/trojan/vmess/vless + buildSingBoxOutboundStandardV2RayBean(bean).asMap() + + is HysteriaBean -> + buildSingBoxOutboundHysteriaBean(bean) + + is TuicBean -> + buildSingBoxOutboundTuicBean(bean).asMap() + + is SOCKSBean -> + buildSingBoxOutboundSocksBean(bean).asMap() + + is ShadowsocksBean -> + buildSingBoxOutboundShadowsocksBean(bean).asMap() + + is ShadowsocksRBean -> + buildSingBoxOutboundShadowsocksRBean(bean).asMap() + + is WireGuardBean -> + buildSingBoxOutboundWireguardBean(bean).asMap() + + is SSHBean -> + buildSingBoxOutboundSSHBean(bean).asMap() + + else -> throw IllegalStateException("can't reach") + } + } + fun haveLink(): Boolean { return when (type) { TYPE_CHAIN -> false diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt index 8937c2bf..5b9908fa 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt @@ -9,22 +9,14 @@ import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_CONFIG import io.nekohasekai.sagernet.database.SagerDatabase import io.nekohasekai.sagernet.fmt.ConfigBuildResult.IndexEntity import io.nekohasekai.sagernet.fmt.hysteria.HysteriaBean -import io.nekohasekai.sagernet.fmt.hysteria.buildSingBoxOutboundHysteriaBean import io.nekohasekai.sagernet.fmt.internal.ChainBean import io.nekohasekai.sagernet.fmt.shadowsocks.ShadowsocksBean -import io.nekohasekai.sagernet.fmt.shadowsocks.buildSingBoxOutboundShadowsocksBean import io.nekohasekai.sagernet.fmt.shadowsocksr.ShadowsocksRBean -import io.nekohasekai.sagernet.fmt.shadowsocksr.buildSingBoxOutboundShadowsocksRBean import io.nekohasekai.sagernet.fmt.socks.SOCKSBean -import io.nekohasekai.sagernet.fmt.socks.buildSingBoxOutboundSocksBean import io.nekohasekai.sagernet.fmt.ssh.SSHBean -import io.nekohasekai.sagernet.fmt.ssh.buildSingBoxOutboundSSHBean import io.nekohasekai.sagernet.fmt.tuic.TuicBean -import io.nekohasekai.sagernet.fmt.tuic.buildSingBoxOutboundTuicBean import io.nekohasekai.sagernet.fmt.v2ray.StandardV2RayBean -import io.nekohasekai.sagernet.fmt.v2ray.buildSingBoxOutboundStandardV2RayBean import io.nekohasekai.sagernet.fmt.wireguard.WireGuardBean -import io.nekohasekai.sagernet.fmt.wireguard.buildSingBoxOutboundWireguardBean import io.nekohasekai.sagernet.ktx.isIpAddress import io.nekohasekai.sagernet.ktx.mkPort import io.nekohasekai.sagernet.utils.PackageCache @@ -38,6 +30,8 @@ import moe.matsuri.nb4a.utils.JavaUtil.gson import moe.matsuri.nb4a.utils.Util import moe.matsuri.nb4a.utils.listByLineOrComma import okhttp3.HttpUrl.Companion.toHttpUrlOrNull +import org.json.JSONArray +import org.json.JSONObject const val TAG_MIXED = "mixed-in" @@ -81,6 +75,25 @@ fun buildConfig( } } + if (!DataStore.customGlobalConfig.isNullOrBlank()) { + val jsonObject = JSONObject(DataStore.customGlobalConfig) + val outboundsArray: JSONArray = if (jsonObject.has("outbounds")) { + jsonObject.getJSONArray("outbounds") + } else { + JSONArray().also { jsonObject.put("outbounds", it) } + } + outboundsArray.put(0, JSONObject(proxy.buildSingBoxOutbound(proxy.requireBean()) as Map)) + + return ConfigBuildResult( + jsonObject.toString(), + listOf(), + proxy.id, // + mapOf(TAG_PROXY to listOf(proxy)), // + mapOf(proxy.id to TAG_PROXY), // + -1L + ) + } + val trafficMap = HashMap>() val tagMap = HashMap() val globalOutbounds = HashMap() @@ -350,40 +363,7 @@ fun buildConfig( server_port = localPort }.asMap() } else { // internal outbound - currentOutbound = when (bean) { - is ConfigBean -> - gson.fromJson(bean.config, currentOutbound.javaClass) - - is ShadowTLSBean -> // before StandardV2RayBean - buildSingBoxOutboundShadowTLSBean(bean).asMap() - - is StandardV2RayBean -> // http/trojan/vmess/vless - buildSingBoxOutboundStandardV2RayBean(bean).asMap() - - is HysteriaBean -> - buildSingBoxOutboundHysteriaBean(bean) - - is TuicBean -> - buildSingBoxOutboundTuicBean(bean).asMap() - - is SOCKSBean -> - buildSingBoxOutboundSocksBean(bean).asMap() - - is ShadowsocksBean -> - buildSingBoxOutboundShadowsocksBean(bean).asMap() - - is ShadowsocksRBean -> - buildSingBoxOutboundShadowsocksRBean(bean).asMap() - - is WireGuardBean -> - buildSingBoxOutboundWireguardBean(bean).asMap() - - is SSHBean -> - buildSingBoxOutboundSSHBean(bean).asMap() - - else -> throw IllegalStateException("can't reach") - } - + currentOutbound = proxyEntity.buildSingBoxOutbound(bean) currentOutbound.apply { // TODO nb4a keepAliveInterval? // val keepAliveInterval = DataStore.tcpKeepAliveInterval diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt index ff1e6691..e09d99db 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt @@ -15,6 +15,7 @@ import io.nekohasekai.sagernet.SagerNet import io.nekohasekai.sagernet.database.DataStore import io.nekohasekai.sagernet.database.preference.EditTextPreferenceModifiers import io.nekohasekai.sagernet.ktx.* +import io.nekohasekai.sagernet.ui.profile.ConfigEditActivity import io.nekohasekai.sagernet.utils.Theme import io.nekohasekai.sagernet.widget.AppListPreference import moe.matsuri.nb4a.Protocols @@ -123,6 +124,18 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { true } + val customGlobalConfig = findPreference(Key.CUSTOM_GLOBAL_CONFIG)!! + customGlobalConfig.setOnPreferenceClickListener { + DataStore.customGlobalConfig = "" + startActivity( + Intent(requireContext(), ConfigEditActivity::class.java).apply { + putExtra("key", Key.CUSTOM_GLOBAL_CONFIG) + } + ) + needRestart() + true + } + val muxProtocols = findPreference(Key.MUX_PROTOCOLS)!! muxProtocols.apply { diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 45768ca4..4d40d166 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -200,6 +200,7 @@ 已废弃 显示直连速度 在通知中也显示不经过代理的流量速度 + 当前出站使用完整自定义配置 选择配置 链式代理 链设置 @@ -459,6 +460,7 @@ 在 127.0.0.1:9090 提供 clash api 和 yacd 仪表板 Flow(VLESS 子协议) 日志级别 + 自定义全局配置 推广 重新启动应用程序以应用更改 启用 selector (免重载切换节点) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c9e09ede..25b83b42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,6 +70,7 @@ Show Direct Speed Show the traffic speed without proxy in the notification as well + Merge with currently selected outbound using custom global configuration TLS Security Settings Allow Insecure Disable certificate checking. When enabled, this configuration @@ -309,6 +310,7 @@ Auto Enable Log For debugging purposes + Custom global config List Random Ping diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index 1c941911..f48129c1 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -88,6 +88,11 @@ app:key="logLevel" app:title="@string/log_level" app:useSimpleSummaryProvider="true" /> +