From dc1515d04db097c26b6f3cd8ad8518158ff1af75 Mon Sep 17 00:00:00 2001 From: arm64v8a <48624112+arm64v8a@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:32:48 +0900 Subject: [PATCH] support fp share link --- .../nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt | 18 +++++++++++++++--- .../nekohasekai/sagernet/group/RawUpdater.kt | 6 ++++++ buildSrc/src/main/kotlin/Helpers.kt | 2 +- sager.properties => nb4a.properties | 0 4 files changed, 22 insertions(+), 4 deletions(-) rename sager.properties => nb4a.properties (100%) diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt index 94a4aa2..18f6918 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt @@ -186,6 +186,10 @@ fun StandardV2RayBean.parseDuckSoft(url: HttpUrl) { encryption = it } } + + url.queryParameter("fp")?.let { + utlsFingerprint = it + } } // 不确定是谁的格式 @@ -266,7 +270,8 @@ fun parseV2RayN(link: String): VMessBean { bean.name = json.getStr("ps") ?: "" bean.sni = json.getStr("sni") ?: bean.host - bean.security = json.getStr("tls") + bean.security = json.getStr("tls") ?: "none" + bean.utlsFingerprint = json.getStr("fp") ?: "" if (json.optInt("v", 2) < 2) { when (bean.type) { @@ -354,7 +359,8 @@ data class VmessQRCode( var path: String = "", var tls: String = "", var sni: String = "", - var alpn: String = "" + var alpn: String = "", + var fp: String = "", ) fun VMessBean.toV2rayN(): String { @@ -379,6 +385,7 @@ fun VMessBean.toV2rayN(): String { tls = if (this@toV2rayN.security == "tls") "tls" else "" sni = this@toV2rayN.sni scy = this@toV2rayN.encryption + fp = this@toV2rayN.utlsFingerprint }.let { NGUtil.encode(Gson().toJson(it)) } @@ -438,7 +445,12 @@ fun StandardV2RayBean.toUri(standard: Boolean = true): String { if (certificates.isNotBlank()) { builder.addQueryParameter("cert", certificates) } - if (allowInsecure) builder.addQueryParameter("allowInsecure", "1") + if (allowInsecure) { + builder.addQueryParameter("allowInsecure", "1") + } + if (utlsFingerprint.isNotBlank()) { + builder.addQueryParameter("fp", utlsFingerprint) + } } } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt index 980104d..13c4d3d 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt @@ -1,5 +1,6 @@ package io.nekohasekai.sagernet.group +import android.annotation.SuppressLint import android.net.Uri import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.database.* @@ -30,6 +31,7 @@ import java.io.StringReader @Suppress("EXPERIMENTAL_API_USAGE") object RawUpdater : GroupUpdater() { + @SuppressLint("Recycle") override suspend fun doUpdate( proxyGroup: ProxyGroup, subscription: SubscriptionBean, @@ -283,6 +285,8 @@ object RawUpdater : GroupUpdater() { "h2" -> bean.type = "http" } } + "client-fingerprint" -> bean.utlsFingerprint = + opt.value as String "tls" -> bean.security = if (opt.value?.toString() == "true") "tls" else "" "skip-cert-verify" -> bean.allowInsecure = @@ -354,6 +358,8 @@ object RawUpdater : GroupUpdater() { "server" -> bean.serverAddress = opt.value as String "port" -> bean.serverPort = opt.value.toString().toInt() "password" -> bean.password = opt.value?.toString() + "client-fingerprint" -> bean.utlsFingerprint = + opt.value as String "sni" -> bean.sni = opt.value?.toString() "skip-cert-verify" -> bean.allowInsecure = opt.value?.toString() == "true" diff --git a/buildSrc/src/main/kotlin/Helpers.kt b/buildSrc/src/main/kotlin/Helpers.kt index e6944e0..f253f59 100644 --- a/buildSrc/src/main/kotlin/Helpers.kt +++ b/buildSrc/src/main/kotlin/Helpers.kt @@ -46,7 +46,7 @@ fun Project.requireFlavor(): String { fun Project.requireMetadata(): Properties { if (!::metadata.isInitialized) { metadata = Properties().apply { - load(rootProject.file("sager.properties").inputStream()) + load(rootProject.file("nb4a.properties").inputStream()) } } return metadata diff --git a/sager.properties b/nb4a.properties similarity index 100% rename from sager.properties rename to nb4a.properties