support fp share link

This commit is contained in:
arm64v8a 2023-03-16 17:32:48 +09:00
parent 7354a1f9ad
commit dc1515d04d
4 changed files with 22 additions and 4 deletions

View File

@ -186,6 +186,10 @@ fun StandardV2RayBean.parseDuckSoft(url: HttpUrl) {
encryption = it encryption = it
} }
} }
url.queryParameter("fp")?.let {
utlsFingerprint = it
}
} }
// 不确定是谁的格式 // 不确定是谁的格式
@ -266,7 +270,8 @@ fun parseV2RayN(link: String): VMessBean {
bean.name = json.getStr("ps") ?: "" bean.name = json.getStr("ps") ?: ""
bean.sni = json.getStr("sni") ?: bean.host 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) { if (json.optInt("v", 2) < 2) {
when (bean.type) { when (bean.type) {
@ -354,7 +359,8 @@ data class VmessQRCode(
var path: String = "", var path: String = "",
var tls: String = "", var tls: String = "",
var sni: String = "", var sni: String = "",
var alpn: String = "" var alpn: String = "",
var fp: String = "",
) )
fun VMessBean.toV2rayN(): String { fun VMessBean.toV2rayN(): String {
@ -379,6 +385,7 @@ fun VMessBean.toV2rayN(): String {
tls = if (this@toV2rayN.security == "tls") "tls" else "" tls = if (this@toV2rayN.security == "tls") "tls" else ""
sni = this@toV2rayN.sni sni = this@toV2rayN.sni
scy = this@toV2rayN.encryption scy = this@toV2rayN.encryption
fp = this@toV2rayN.utlsFingerprint
}.let { }.let {
NGUtil.encode(Gson().toJson(it)) NGUtil.encode(Gson().toJson(it))
} }
@ -438,7 +445,12 @@ fun StandardV2RayBean.toUri(standard: Boolean = true): String {
if (certificates.isNotBlank()) { if (certificates.isNotBlank()) {
builder.addQueryParameter("cert", certificates) builder.addQueryParameter("cert", certificates)
} }
if (allowInsecure) builder.addQueryParameter("allowInsecure", "1") if (allowInsecure) {
builder.addQueryParameter("allowInsecure", "1")
}
if (utlsFingerprint.isNotBlank()) {
builder.addQueryParameter("fp", utlsFingerprint)
}
} }
} }
} }

View File

@ -1,5 +1,6 @@
package io.nekohasekai.sagernet.group package io.nekohasekai.sagernet.group
import android.annotation.SuppressLint
import android.net.Uri import android.net.Uri
import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.database.* import io.nekohasekai.sagernet.database.*
@ -30,6 +31,7 @@ import java.io.StringReader
@Suppress("EXPERIMENTAL_API_USAGE") @Suppress("EXPERIMENTAL_API_USAGE")
object RawUpdater : GroupUpdater() { object RawUpdater : GroupUpdater() {
@SuppressLint("Recycle")
override suspend fun doUpdate( override suspend fun doUpdate(
proxyGroup: ProxyGroup, proxyGroup: ProxyGroup,
subscription: SubscriptionBean, subscription: SubscriptionBean,
@ -283,6 +285,8 @@ object RawUpdater : GroupUpdater() {
"h2" -> bean.type = "http" "h2" -> bean.type = "http"
} }
} }
"client-fingerprint" -> bean.utlsFingerprint =
opt.value as String
"tls" -> bean.security = "tls" -> bean.security =
if (opt.value?.toString() == "true") "tls" else "" if (opt.value?.toString() == "true") "tls" else ""
"skip-cert-verify" -> bean.allowInsecure = "skip-cert-verify" -> bean.allowInsecure =
@ -354,6 +358,8 @@ object RawUpdater : GroupUpdater() {
"server" -> bean.serverAddress = opt.value as String "server" -> bean.serverAddress = opt.value as String
"port" -> bean.serverPort = opt.value.toString().toInt() "port" -> bean.serverPort = opt.value.toString().toInt()
"password" -> bean.password = opt.value?.toString() "password" -> bean.password = opt.value?.toString()
"client-fingerprint" -> bean.utlsFingerprint =
opt.value as String
"sni" -> bean.sni = opt.value?.toString() "sni" -> bean.sni = opt.value?.toString()
"skip-cert-verify" -> bean.allowInsecure = "skip-cert-verify" -> bean.allowInsecure =
opt.value?.toString() == "true" opt.value?.toString() == "true"

View File

@ -46,7 +46,7 @@ fun Project.requireFlavor(): String {
fun Project.requireMetadata(): Properties { fun Project.requireMetadata(): Properties {
if (!::metadata.isInitialized) { if (!::metadata.isInitialized) {
metadata = Properties().apply { metadata = Properties().apply {
load(rootProject.file("sager.properties").inputStream()) load(rootProject.file("nb4a.properties").inputStream())
} }
} }
return metadata return metadata