From e54e713db7c1c6fe4925241b64586ffaa1db1c0b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:17:30 +0800 Subject: [PATCH] Add local SOCKS username/password support --- .../src/main/java/com/v2ray/ang/AppConfig.kt | 2 ++ .../main/java/com/v2ray/ang/dto/V2rayConfig.kt | 8 +++++++- .../com/v2ray/ang/handler/SettingsManager.kt | 8 ++++++++ .../com/v2ray/ang/handler/V2rayConfigManager.kt | 17 +++++++++++++++++ .../java/com/v2ray/ang/service/TProxyService.kt | 8 ++++++++ .../java/com/v2ray/ang/ui/SettingsActivity.kt | 12 ++++++++++-- V2rayNG/app/src/main/res/values-ar/strings.xml | 4 ++++ V2rayNG/app/src/main/res/values-bn/strings.xml | 4 ++++ V2rayNG/app/src/main/res/values-fa/strings.xml | 4 ++++ V2rayNG/app/src/main/res/values-ru/strings.xml | 4 ++++ V2rayNG/app/src/main/res/values-vi/strings.xml | 4 ++++ .../app/src/main/res/values-zh-rCN/strings.xml | 10 +++++++--- .../app/src/main/res/values-zh-rTW/strings.xml | 4 ++++ V2rayNG/app/src/main/res/values/strings.xml | 4 ++++ V2rayNG/app/src/main/res/xml/pref_settings.xml | 11 +++++++++++ 15 files changed, 98 insertions(+), 6 deletions(-) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 7ab21797..350fcce0 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -58,6 +58,8 @@ object AppConfig { const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" const val PREF_ALLOW_INSECURE = "pref_allow_insecure" const val PREF_SOCKS_PORT = "pref_socks_port" + const val PREF_SOCKS_USERNAME = "pref_socks_username" + const val PREF_SOCKS_PASSWORD = "pref_socks_password" const val PREF_REMOTE_DNS = "pref_remote_dns" const val PREF_DOMESTIC_DNS = "pref_domestic_dns" const val PREF_DNS_HOSTS = "pref_dns_hosts" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt index bcb23a5c..4fbbc32b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt @@ -44,10 +44,16 @@ data class V2rayConfig( var auth: String? = null, var udp: Boolean? = null, var userLevel: Int? = null, + var accounts: List? = null, var name: String? = null, @SerializedName("MTU") var mtu: Int? = null - ) + ) { + data class SocksAccountBean( + var user: String = "", + var pass: String = "" + ) + } data class SniffingBean( var enabled: Boolean, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt index 0acb5f45..8677d7ae 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt @@ -276,6 +276,14 @@ object SettingsManager { return Utils.parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_SOCKS_PORT), AppConfig.PORT_SOCKS.toInt()) } + fun getSocksUsername(): String? { + return MmkvManager.decodeSettingsString(AppConfig.PREF_SOCKS_USERNAME)?.trim()?.takeIf { it.isNotEmpty() } + } + + fun getSocksPassword(): String? { + return MmkvManager.decodeSettingsString(AppConfig.PREF_SOCKS_PASSWORD)?.trim()?.takeIf { it.isNotEmpty() } + } + /** * Get the HTTP port. * @return The HTTP port. diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt index 97426893..70b3c469 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -373,12 +373,29 @@ object V2rayConfigManager { private fun getInbounds(v2rayConfig: V2rayConfig): Boolean { try { val socksPort = SettingsManager.getSocksPort() + val socksUsername = SettingsManager.getSocksUsername() + val socksPassword = SettingsManager.getSocksPassword() val inbound1 = v2rayConfig.inbounds[0] + if (inbound1.settings == null) { + inbound1.settings = V2rayConfig.InboundBean.InSettingsBean() + } if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) { inbound1.listen = AppConfig.LOOPBACK } inbound1.port = socksPort + if (socksUsername != null && socksPassword != null) { + inbound1.settings?.auth = "password" + inbound1.settings?.accounts = listOf( + V2rayConfig.InboundBean.InSettingsBean.SocksAccountBean( + user = socksUsername, + pass = socksPassword + ) + ) + } else { + inbound1.settings?.auth = "noauth" + inbound1.settings?.accounts = null + } val fakedns = MmkvManager.decodeSettingsBool(AppConfig.PREF_FAKE_DNS_ENABLED) == true val sniffAllTlsAndHttp = MmkvManager.decodeSettingsBool(AppConfig.PREF_SNIFFING_ENABLED, true) != false diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt index 2317e886..7d04f03d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt @@ -57,7 +57,11 @@ class TProxyService( private fun buildConfig(): String { val socksPort = SettingsManager.getSocksPort() + val socksUsername = SettingsManager.getSocksUsername() + val socksPassword = SettingsManager.getSocksPassword() val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() + val escapedSocksUsername = socksUsername?.replace("'", "''") + val escapedSocksPassword = socksPassword?.replace("'", "''") return buildString { appendLine("tunnel:") appendLine(" mtu: ${SettingsManager.getVpnMtu()}") @@ -71,6 +75,10 @@ class TProxyService( appendLine(" port: ${socksPort}") appendLine(" address: ${AppConfig.LOOPBACK}") appendLine(" udp: 'udp'") + if (escapedSocksUsername != null && escapedSocksPassword != null) { + appendLine(" username: '${escapedSocksUsername}'") + appendLine(" password: '${escapedSocksPassword}'") + } // Read-write timeout settings val timeoutSetting = MmkvManager.decodeSettingsString(AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT) ?: AppConfig.HEVTUN_RW_TIMEOUT diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index 7e989eba..523d3d79 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -118,9 +118,17 @@ class SettingsActivity : BaseActivity() { fun updateSummary(pref: androidx.preference.Preference) { when (pref) { is EditTextPreference -> { - pref.summary = pref.text.orEmpty() + if (pref.key == AppConfig.PREF_SOCKS_PASSWORD) { + pref.summary = if (pref.text.isNullOrEmpty()) "" else "******" + } else { + pref.summary = pref.text.orEmpty() + } pref.setOnPreferenceChangeListener { p, newValue -> - p.summary = (newValue as? String).orEmpty() + if (p.key == AppConfig.PREF_SOCKS_PASSWORD) { + p.summary = if ((newValue as? String).isNullOrEmpty()) "" else "******" + } else { + p.summary = (newValue as? String).orEmpty() + } true } } diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 4a141936..b644105a 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -219,6 +219,10 @@ منفذ بروكسي Local منفذ بروكسي Local + Local proxy username (optional) + Username + Local proxy password (optional) + Password منفذ DNS المحلي منفذ DNS المحلي diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 7155f7b4..6e09a832 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -219,6 +219,10 @@ Local প্রক্সি পোর্ট Local প্রক্সি পোর্ট + Local proxy username (optional) + Username + Local proxy password (optional) + Password স্থানীয় DNS পোর্ট স্থানীয় DNS পোর্ট diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index ef2bbbc8..88901cef 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -217,6 +217,10 @@ پورت پروکسی محلی پورت پروکسی محلی + Local proxy username (optional) + Username + Local proxy password (optional) + Password پورت DNS محلی پورت DNS محلی diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 7a390b05..fca89831 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -218,6 +218,10 @@ Порт локального прокси Порт локального прокси + Имя пользователя локального прокси (опционально) + Имя пользователя + Пароль локального прокси (опционально) + Пароль Порт локальной DNS Порт локальной DNS diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index a1b255f1..34308552 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -219,6 +219,10 @@ Cổng Proxy Local Cổng Proxy Local + Tên người dùng Proxy Local (Không bắt buộc) + Tên người dùng + Mật khẩu Proxy Local (Không bắt buộc) + Mật khẩu Cổng Local DNS Cổng Local DNS diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index 9259aad5..bdcbbb1f 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -214,10 +214,14 @@ 跳过证书验证 (allowInsecure) 传输层安全选 tls 时,默认跳过证书验证 (allowInsecure) - 本地代理端口 - 本地代理端口 + 本地代理端口 + 本地代理端口 + 本地代理用户名 (可选) + 用户名 + 本地代理密码 (可选) + 密码 - 本地 DNS 端口 + 本地 DNS 端口 本地 DNS 端口 删除配置确认 diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index 06029d6a..86fcfe47 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -217,6 +217,10 @@ 本地代理埠 本地代理埠 + 本地代理使用者名稱 (選擇) + 使用者名稱 + 本地代理密碼 (選擇) + 密碼 本機 DNS 埠 本機 DNS 埠 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index ac5507ab..fc247e42 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -222,6 +222,10 @@ Local proxy port Local proxy port + Local proxy username (optional) + Username + Local proxy password (optional) + Password Local DNS port Local DNS port diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index d82374a6..15f4053e 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -157,6 +157,17 @@ android:summary="10808" android:title="@string/title_pref_socks_port" /> + + + +