This commit is contained in:
2025-03-09 22:31:25 +08:00
parent 73b2199d4f
commit 184b4d495d

View File

@@ -1,3 +1,4 @@
import com.charleskorn.kaml.YamlNode
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@@ -89,12 +90,13 @@ data class Clash(
val tun: Tun? = null, val tun: Tun? = null,
val listeners: List<Listener>? = null, val listeners: List<Listener>? = null,
// Outbound
val proxies: List<Proxy>? = null,
val proxyProviders: Map<String, ProxyProvider>? = null,
// 未在文档中提到的属性 // 未在文档中提到的属性
val experimental: Experimental? = null, val experimental: Experimental? = null,
val tunnels: List<Tunnel>? = null, val tunnels: List<Tunnel>? = null,
val proxies: List<Proxy>? = null,
val proxyGroups: List<ProxyGroup>? = null, val proxyGroups: List<ProxyGroup>? = null,
val proxyProviders: Map<String, ProxyProvider>? = null,
val ruleProviders: Map<String, RuleProvider>? = null, val ruleProviders: Map<String, RuleProvider>? = null,
val rules: List<String>? = null, val rules: List<String>? = null,
val subRules: Map<String, List<String>>? = null, val subRules: Map<String, List<String>>? = null,
@@ -246,268 +248,6 @@ data class FallbackFilter(
val domain: List<String>? = null val domain: List<String>? = null
) )
//@Serializable
//sealed class Proxy {
// @Serializable
// data class Socks5Proxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class HttpProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null,
// val fingerprint: String? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class SnellProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val psk: String? = null,
// val version: Int? = null,
// val obfsOpts: ObfsOpts? = null
// ) : Proxy() {
// @Serializable
// data class ObfsOpts(
// val mode: String? = null,
// val host: String? = null
// )
// }
//
// @Serializable
// data class ShadowsocksProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null,
// val plugin: String? = null,
// val pluginOpts: PluginOpts? = null
// ) : Proxy() {
// @Serializable
// data class PluginOpts(
// val mode: String? = null,
// val host: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val fingerprint: String? = null,
// val path: String? = null,
// val headers: Map<String, String>? = null,
// val clientFingerprint: String? = null,
// val version: Int? = null,
// val password: String? = null,
// val restlsScript: String? = null
// )
// }
//
// @Serializable
// data class VmessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val alterId: Int? = null,
// val cipher: String? = null,
// val udp: Boolean? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val servername: String? = null,
// val network: String? = null,
// val wsOpts: WsOpts? = null,
// val h2Opts: H2Opts? = null,
// val grpcOpts: GrpcOpts? = null
// ) : Proxy() {
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
//
// @Serializable
// data class H2Opts(
// val host: List<String>? = null,
// val path: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
// }
//
// @Serializable
// data class VlessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val network: String? = null,
// val tls: Boolean? = null,
// val udp: Boolean? = null,
// val flow: String? = null,
// val clientFingerprint: String? = null,
// val servername: String? = null,
// val realityOpts: RealityOpts? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class RealityOpts(
// val publicKey: String? = null,
// val shortId: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
//
// @Serializable
// data class TrojanProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val password: String? = null,
// val clientFingerprint: String? = null,
// val udp: Boolean? = null,
// val sni: String? = null,
// val skipCertVerify: Boolean? = null,
// val flow: String? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
//
// @Serializable
// @SerialName("hysteria2")
// data class HysteriaProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val authStr: String? = null,
// val obfs: String? = null,
// val protocol: String? = null,
// val up: String? = null,
// val down: String? = null,
// val sni: String? = null,
// val skipCertVerify: Boolean? = null,
// val fingerprint: String? = null
// ) : Proxy()
//
// @Serializable
// data class WireguardProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val ip: String? = null,
// val ipv6: String? = null,
// val publicKey: String? = null,
// val privateKey: String? = null,
// val udp: Boolean? = null,
// val reserved: String? = null,
// val peers: List<Peer>? = null
// ) : Proxy() {
// @Serializable
// data class Peer(
// val server: String? = null,
// val port: Int? = null,
// val publicKey: String? = null,
// val allowedIps: List<String>? = null,
// val reserved: String? = null
// )
// }
//
// @Serializable
// data class TuicProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val token: String? = null,
// val uuid: String? = null,
// val password: String? = null,
// val udpRelayMode: String? = null,
// val congestionController: String? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null
// ) : Proxy()
//
// @Serializable
// data class ShadowsocksRProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val obfs: String? = null,
// val protocol: String? = null,
// val udp: Boolean? = null
// ) : Proxy()
//
// @Serializable
// data class SSHProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val privateKey: String? = null
// ) : Proxy()
//
// @Serializable
// data class MieruProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val transport: String? = null,
// val username: String? = null,
// val password: String? = null,
// val multiplexing: String? = null
// ) : Proxy()
//
// @Serializable
// data class DNSProxy(
// val name: String? = null
// ) : Proxy()
//}
@Serializable @Serializable
sealed class Proxy { sealed class Proxy {
abstract val tfo: Boolean? abstract val tfo: Boolean?
@@ -677,8 +417,8 @@ sealed class Proxy {
val cipher: String? = null, val cipher: String? = null,
val udp: Boolean? = null, val udp: Boolean? = null,
val plugin: String? = null, val plugin: String? = null,
// TODO: // NOTE: 暂时先不对该字段进行解析
// val pluginOpts: Map<String, @Contextual Any>? = null, val pluginOpts: Map<String, YamlNode>? = null,
val udpOverTCP: Boolean? = null, val udpOverTCP: Boolean? = null,
val udpOverTCPVersion: Int? = null, val udpOverTCPVersion: Int? = null,
val clientFingerprint: String? = null, val clientFingerprint: String? = null,
@@ -724,8 +464,7 @@ sealed class Proxy {
val psk: String? = null, val psk: String? = null,
val udp: Boolean? = null, val udp: Boolean? = null,
val version: Int? = null, val version: Int? = null,
// TODO: val obfsOpts: Map<String, SimpleObfsOption>? = null,
// val obfsOpts: Map<String, @Contextual Any>? = null,
override val tfo: Boolean? = null, override val tfo: Boolean? = null,
override val mptcp: Boolean? = null, override val mptcp: Boolean? = null,
@@ -1032,6 +771,12 @@ sealed class Proxy {
val up: String? = null, val up: String? = null,
val down: String? = null, val down: String? = null,
) )
@Serializable
data class SimpleObfsOption(
val mode: String? = null,
val host: String? = null
)
} }
@@ -1118,31 +863,177 @@ sealed class ProxyGroup {
) : ProxyGroup() ) : ProxyGroup()
} }
//@Serializable
//sealed class ProxyProvider {
// @Serializable
// data class HttpProxyProvider(
// val type: String? = null,
// val url: String? = null,
// val interval: Int? = null,
// val path: String? = null,
// val proxy: String? = null,
// val header: Header? = null,
// val healthCheck: HealthCheck? = null,
// val override: Override? = null
// ) : ProxyProvider()
//
// @Serializable
// data class InlineProxyProvider(
// val type: String? = null, val dialerProxy: String? = null, val payload: List<Payload>? = null
// ) : ProxyProvider()
//
// @Serializable
// data class FileProxyProvider(
// val type: String? = null, val path: String? = null, val healthCheck: HealthCheck? = null
// ) : ProxyProvider()
//}
//data class ProxyProvider(
// val type: String? = null,
// val path: String? = null,
// val url: String? = null,
// val proxy: String? = null,
// val interval: Int? = null,
// val filter: String? = null,
// val excludeFilter: String? = null,
// val excludeType: String? = null,
// val dialerProxy: String? = null,
// val sizeLimit: Long? = null,
// val payload: List<Map<String, Any>>? = null,
// val healthCheck: HealthCheck? = null,
// val override: Override? = null,
// val header: Map<String, List<String>>? = null
//) {
// data class HealthCheck(
// val enable: Boolean? = null,
// val url: String? = null,
// val interval: Int? = null,
// val testTimeout: Int? = null,
// val lazy: Boolean? = null,
// val expectedStatus: String? = null
// )
//
// data class Override(
// val tfo: Boolean? = null,
// val mptcp: Boolean? = null,
// val udp: Boolean? = null,
// val udpOverTcp: Boolean? = null,
// val up: String? = null,
// val down: String? = null,
// val dialerProxy: String? = null,
// val skipCertVerify: Boolean? = null,
// val interfaceName: String? = null,
// val routingMark: Int? = null,
// val ipVersion: String? = null,
// val additionalPrefix: String? = null,
// val additionalSuffix: String? = null,
// val proxyName: List<OverrideProxyNameSchema>? = null
// )
//
// data class OverrideProxyNameSchema(
// val pattern: String? = null,
// val target: String? = null
// )
//
//}
@Serializable @Serializable
sealed class ProxyProvider { sealed class ProxyProvider {
abstract val name: String?
abstract val interval: Int?
abstract val filter: String?
abstract val excludeFilter: String?
abstract val excludeType: String?
abstract val dialerProxy: String?
abstract val healthCheck: HealthCheck?
abstract val override: Override?
@Serializable @Serializable
data class HttpProxyProvider( @SerialName("file")
val type: String? = null, data class FileProvider(
val url: String? = null, override val name: String? = null,
val interval: Int? = null, override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
val path: String?,
) : ProxyProvider()
@Serializable
@SerialName("http")
data class HttpProvider(
override val name: String? = null,
override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
val url: String,
val path: String? = null, val path: String? = null,
val proxy: String? = null, val proxy: String? = null,
val header: Header? = null, val sizeLimit: Long? = null,
val healthCheck: HealthCheck? = null, val header: Map<String, List<String>>? = null,
val override: Override? = null
) : ProxyProvider() ) : ProxyProvider()
@Serializable @Serializable
data class InlineProxyProvider( @SerialName("inline")
val type: String? = null, val dialerProxy: String? = null, val payload: List<Payload>? = null data class InlineProvider(
override val name: String? = null,
override val interval: Int?,
override val filter: String?,
override val excludeFilter: String?,
override val excludeType: String?,
override val dialerProxy: String?,
override val healthCheck: HealthCheck?,
override val override: Override?,
// TODO:
val payload: List<Map<String, YamlNode>>?,
) : ProxyProvider() ) : ProxyProvider()
@Serializable @Serializable
data class FileProxyProvider( data class HealthCheck(
val type: String? = null, val path: String? = null, val healthCheck: HealthCheck? = null val enable: Boolean,
) : ProxyProvider() val url: String,
val interval: Int,
val timeout: Int? = null,
val lazy: Boolean? = true,
val expectedStatus: String? = null,
)
@Serializable
data class Override(
val tfo: Boolean? = null,
val mptcp: Boolean? = null,
val udp: Boolean? = null,
val udpOverTcp: Boolean? = null,
val up: String? = null,
val down: String? = null,
val dialerProxy: String? = null,
val skipCertVerify: Boolean? = null,
val interfaceName: String? = null,
val routingMark: Int? = null,
val ipVersion: String? = null,
val additionalPrefix: String? = null,
val additionalSuffix: String? = null,
val proxyName: List<OverrideProxyName>? = null,
)
@Serializable
data class OverrideProxyName(
val pattern: String,
val target: String,
)
} }
@Serializable @Serializable
sealed class RuleProvider { sealed class RuleProvider {
@Serializable @Serializable