Add finalmask support (#5242)

This commit is contained in:
DHR60 authored and GitHub committed 2026-02-06 19:27:02 +08:00
1 parent ff40b53e2f
commit 8eca5fe8af
3 files changed
+49 -29

No files matched your search

@@ -162,7 +162,7 @@ data class V2rayConfig(
var realitySettings: TlsSettingsBean? = null,
var grpcSettings: GrpcSettingsBean? = null,
var hysteriaSettings: HysteriaSettingsBean? = null,
var udpmasks: List<UdpMasksBean>? = null,
var finalmask: FinalMaskBean? = null,
val dsSettings: Any? = null,
var sockopt: SockoptBean? = null
) {
@@ -202,15 +202,8 @@ data class V2rayConfig(
var downlinkCapacity: Int = 100,
var congestion: Boolean = false,
var readBufferSize: Int = 1,
var writeBufferSize: Int = 1,
var header: HeaderBean = HeaderBean(),
var seed: String? = null
) {
data class HeaderBean(
var type: String = "none",
var domain: String? = null
var writeBufferSize: Int = 1
)
}
data class WsSettingsBean(
var path: String? = null,
@@ -310,15 +303,21 @@ data class V2rayConfig(
)
}
data class UdpMasksBean(
var type: String,
var settings: UdpMasksSettingsBean? = null
data class FinalMaskBean(
var tcp: List<MaskBean>? = null,
var udp: List<MaskBean>? = null
) {
data class UdpMasksSettingsBean(
var password: String? = null
data class MaskBean(
var type: String,
var settings: MaskSettingsBean? = null
) {
data class MaskSettingsBean(
var password: String? = null,
var domain: String? = null
)
}
}
}
data class MuxBean(
var enabled: Boolean,
@@ -5,8 +5,7 @@ import com.v2ray.ang.enums.EConfigType
import com.v2ray.ang.enums.NetworkType
import com.v2ray.ang.dto.ProfileItem
import com.v2ray.ang.dto.V2rayConfig.OutboundBean
import com.v2ray.ang.dto.V2rayConfig.OutboundBean.StreamSettingsBean
import com.v2ray.ang.dto.V2rayConfig.OutboundBean.StreamSettingsBean.UdpMasksBean.UdpMasksSettingsBean
import com.v2ray.ang.dto.V2rayConfig.OutboundBean.StreamSettingsBean.FinalMaskBean
import com.v2ray.ang.extension.idnHost
import com.v2ray.ang.extension.isNotNullEmpty
import com.v2ray.ang.extension.nullIfBlank
@@ -109,14 +108,16 @@ object Hysteria2Fmt : FmtBase() {
}
if (profileItem.obfsPassword.isNotNullEmpty()) {
outboundBean.streamSettings?.udpmasks = mutableListOf(
StreamSettingsBean.UdpMasksBean(
outboundBean.streamSettings?.finalmask = FinalMaskBean(
udp = listOf(
FinalMaskBean.MaskBean(
type = "salamander",
settings = UdpMasksSettingsBean(
settings = FinalMaskBean.MaskBean.MaskSettingsBean(
password = profileItem.obfsPassword
)
)
)
)
}
return outboundBean
}
@@ -1183,19 +1183,39 @@ object V2rayConfigManager {
}
NetworkType.KCP.type -> {
val kcpsetting = StreamSettingsBean.KcpSettingsBean()
kcpsetting.header.type = headerType ?: "none"
streamSettings.kcpSettings = StreamSettingsBean.KcpSettingsBean()
val udpMaskList = mutableListOf<StreamSettingsBean.FinalMaskBean.MaskBean>()
if (!headerType.isNullOrEmpty() && headerType != "none") {
val kcpHeaderType = when {
headerType == "wechat-video" -> "header-wechat"
else -> "header-$headerType"
}
udpMaskList.add(StreamSettingsBean.FinalMaskBean.MaskBean(
type = kcpHeaderType,
settings = if (headerType == "dns" && !host.isNullOrEmpty()) {
StreamSettingsBean.FinalMaskBean.MaskBean.MaskSettingsBean(
domain = host
)
} else {
null
}
))
}
if (seed.isNullOrEmpty()) {
kcpsetting.seed = null
udpMaskList.add(StreamSettingsBean.FinalMaskBean.MaskBean(
type = "mkcp-original"
))
} else {
kcpsetting.seed = seed
udpMaskList.add(StreamSettingsBean.FinalMaskBean.MaskBean(
type = "mkcp-aes128gcm",
settings = StreamSettingsBean.FinalMaskBean.MaskBean.MaskSettingsBean(
password = seed
)
))
}
if (host.isNullOrEmpty()) {
kcpsetting.header.domain = null
} else {
kcpsetting.header.domain = host
}
streamSettings.kcpSettings = kcpsetting
streamSettings.finalmask = StreamSettingsBean.FinalMaskBean(
udp = udpMaskList.toList()
)
}
NetworkType.WS.type -> {