diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt index 213a090fa5..66f685c5ec 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/core/CoreOutboundBuilder.kt @@ -566,6 +566,7 @@ object CoreOutboundBuilder { serverName = sni.nullIfBlank(), fingerprint = profileItem.fingerPrint.nullIfBlank(), alpn = profileItem.alpn?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() }.takeIf { !it.isNullOrEmpty() }, + cipherSuites = profileItem.cipherSuites.nullIfBlank(), echConfigList = profileItem.echConfigList.nullIfBlank(), verifyPeerCertByName = profileItem.verifyPeerCertByName.nullIfBlank(), pinnedPeerCertSha256 = profileItem.pinnedCA256.nullIfBlank(), diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt index 9a4a87d6c8..6352e8419e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/entities/ProfileItem.kt @@ -40,6 +40,7 @@ data class ProfileItem( var sni: String? = null, var alpn: String? = null, var fingerPrint: String? = null, + var cipherSuites: String? = null, var insecure: Boolean? = null, var echConfigList: String? = null, var verifyPeerCertByName: String? = null, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt index a8dd86723a..f1ecc7f43a 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt @@ -121,6 +121,8 @@ class ServerActivity : BaseActivity() { private val et_path: EditText? by lazy { findViewById(R.id.et_path) } private val sp_stream_alpn: Spinner? by lazy { findViewById(R.id.sp_stream_alpn) } //uTLS private val container_alpn: LinearLayout? by lazy { findViewById(R.id.lay_stream_alpn) } + private val et_cipher_suites: EditText? by lazy { findViewById(R.id.et_cipher_suites) } + private val container_cipher_suites: LinearLayout? by lazy { findViewById(R.id.lay_cipher_suites) } private val et_public_key: EditText? by lazy { findViewById(R.id.et_public_key) } private val et_preshared_key: EditText? by lazy { findViewById(R.id.et_preshared_key) } private val container_public_key: LinearLayout? by lazy { findViewById(R.id.lay_public_key) } @@ -298,6 +300,7 @@ class ServerActivity : BaseActivity() { container_sni, container_fingerprint, container_alpn, + container_cipher_suites, container_allow_insecure, container_public_key, container_short_id, @@ -315,6 +318,7 @@ class ServerActivity : BaseActivity() { container_sni, container_fingerprint, container_alpn, + container_cipher_suites, container_allow_insecure, container_ech_config_list, container_verify_peer_cert_by_name, @@ -336,6 +340,7 @@ class ServerActivity : BaseActivity() { ).forEach { it?.visibility = View.VISIBLE } listOf( container_alpn, + container_cipher_suites, container_allow_insecure, container_ech_config_list, container_verify_peer_cert_by_name, @@ -424,6 +429,7 @@ class ServerActivity : BaseActivity() { if (allowinsecure >= 0) { sp_allow_insecure?.setSelection(allowinsecure) } + et_cipher_suites?.text = Utils.getEditable(config.cipherSuites) et_ech_config_list?.text = Utils.getEditable(config.echConfigList) et_verify_peer_cert_by_name?.text = Utils.getEditable(config.verifyPeerCertByName) et_pinned_ca256?.text = Utils.getEditable(config.pinnedCA256) @@ -628,6 +634,7 @@ class ServerActivity : BaseActivity() { val shortId = et_short_id?.text?.toString() val spiderX = et_spider_x?.text?.toString() val mldsa65Verify = et_mldsa65_verify?.text?.toString() + val cipherSuites = et_cipher_suites?.text?.toString() val echConfigList = et_ech_config_list?.text?.toString() val verifyPeerCertByName = et_verify_peer_cert_by_name?.text?.toString() val pinnedCA256 = et_pinned_ca256?.text?.toString() @@ -644,6 +651,7 @@ class ServerActivity : BaseActivity() { config.sni = sniField config.fingerPrint = uTlsItems[utlsIndex] config.alpn = alpns[alpnIndex] + config.cipherSuites = cipherSuites config.publicKey = publicKey config.shortId = shortId config.spiderX = spiderX diff --git a/V2rayNG/app/src/main/res/layout/layout_tls.xml b/V2rayNG/app/src/main/res/layout/layout_tls.xml index 76f23645a5..4f6ba44610 100644 --- a/V2rayNG/app/src/main/res/layout/layout_tls.xml +++ b/V2rayNG/app/src/main/res/layout/layout_tls.xml @@ -92,6 +92,27 @@ android:layout_marginTop="@dimen/padding_spacing_dp8" android:layout_marginBottom="@dimen/padding_spacing_dp8" android:entries="@array/streamsecurity_alpn" + android:nextFocusDown="@+id/et_cipher_suites" /> + + + + + + + + diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml index 6fb75c98c2..3ee85e70eb 100644 --- a/V2rayNG/app/src/main/res/values/arrays.xml +++ b/V2rayNG/app/src/main/res/values/arrays.xml @@ -82,6 +82,7 @@ qq random randomized + unsafe diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 419e5b6a7f..b586824660 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -71,6 +71,7 @@ TLS Fingerprint Alpn + Cipher Suites allowInsecure SNI address