From 032f66378aa6075ceafa54a0ba6fa6d99a593811 Mon Sep 17 00:00:00 2001 From: rain-bus Date: Tue, 4 Mar 2025 23:50:33 +0800 Subject: [PATCH] Temp --- .gitignore | 1 + .idea/misc.xml | 2 +- src/main/kotlin/conf/Clash.kt | 816 +++++++++++++++++++--------------- 3 files changed, 458 insertions(+), 361 deletions(-) diff --git a/.gitignore b/.gitignore index b1dff0d..cf65fa7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ build/ !**/src/test/**/build/ ### IntelliJ IDEA ### +.idea/ .idea/modules.xml .idea/jarRepositories.xml .idea/compiler.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 88922cc..1ebec2f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/conf/Clash.kt b/src/main/kotlin/conf/Clash.kt index fa562f4..7c62f52 100644 --- a/src/main/kotlin/conf/Clash.kt +++ b/src/main/kotlin/conf/Clash.kt @@ -1,63 +1,111 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable - @Serializable data class Clash( - // Port - val port: Int? = null, - val socksPort: Int? = null, - val mixedPort: Int? = null, - // LAN + /*------------------------------------------- *General configuration* -------------------------------------------*/ + // Allow LAN val allowLan: Boolean? = null, val bindAddress: String? = null, - val authentication: List? = null, - val skipAuthPrefixes: List? = null, val lanAllowedIps: List? = null, val lanDisallowedIps: List? = null, - val findProcessMode: String? = null, + val authentication: List? = null, + val skipAuthPrefixes: List? = null, + + // Operation Mode val mode: String? = null, - // Geo - val geoxUrl: GeoXUrl? = null, - val geoAutoUpdate: Boolean? = null, - val geoUpdateInterval: Int? = null, + + // Log Level val logLevel: String? = null, - val ipv6: Boolean? = null, - val tls: TLS? = null, - // External Controller + + // TCP Keep Alive Settings + val keepAliveInterval: Int? = null, + val keepAliveIdle: Int? = null, + val disableKeepAlive: Boolean? = null, + + // Process Matching Mode + val findProcessMode: String? = null, + + // External Control (API) val externalController: String? = null, val externalControllerTls: String? = null, val externalControllerCors: ExternalControllerCors? = null, val externalControllerUnix: String? = null, val externalControllerPipe: String? = null, + val secret: String? = null, + val externalDohServer: String? = null, + + // External User Interface val externalUi: String? = null, val externalUiName: String? = null, val externalUiUrl: String? = null, - val externalDohServer: String? = null, - val interfaceName: String? = null, - val globalClientFingerprint: String? = null, - val experimental: Experimental? = null, - val unifiedDelay: Boolean? = null, - val hosts: List? = null, + + // Cache val profile: Profile? = null, - val tun: Tun? = null, - val sniffer: Sniffer? = null, - val tunnels: List? = null, + + // Unified Delay + val unifiedDelay: Boolean? = null, + + // TCP Concurrency + val tcpConcurrent: Boolean? = null, + + // Outbound Interface + val interfaceName: String? = null, + + // Routing Mark + val routingMark: Int? = null, + + // TLS + val tls: TLS? = null, + + // GEO Data Configuration + val geoxUrl: GeoXUrl? = null, + val geoAutoUpdate: Boolean? = null, + val geoUpdateInterval: Int? = null, + + // Global Client Fingerprint + val globalClientFingerprint: String? = null, + + // Custom Global UA + val globalUa: String? = null, + + // ETag Support + val etagSupport: Boolean? = null, + + /*------------------------------------------------ *DNS* ------------------------------------------------*/ + val hosts: List? = null, + // TODO: val dns: DNS? = null, + val sniffer: Sniffer? = null, + + + /*------------------------------------------------ *Inbounds* ------------------------------------------------*/ + // Proxy Port + val port: Int? = null, + val socksPort: Int? = null, + val mixedPort: Int? = null, + val redirPort: Int? = null, + val tproxyPort: Int? = null, + val tun: Tun? = null, + val listeners: List? = null, + + // 未在文档中提到的属性 + val experimental: Experimental? = null, + val tunnels: List? = null, val proxies: List? = null, val proxyGroups: List? = null, val proxyProviders: Map? = null, val ruleProviders: Map? = null, val rules: List? = null, val subRules: Map>? = null, - val listeners: List? = null ) @Serializable data class GeoXUrl( val geoip: String? = null, val geosite: String? = null, - val mmdb: String? = null + val mmdb: String? = null, + val asn: String? = null ) @Serializable @@ -88,20 +136,23 @@ data class Profile( data class Tun( val enable: Boolean? = null, val stack: String? = null, - val dnsHijack: List? = null, - val autoDetectInterface: Boolean? = null, val autoRoute: Boolean? = null, + val autoRedirect: Boolean? = null, + val autoDetectInterface: Boolean? = null, + val dnsHijack: List? = null, + val device: String? = null, val mtu: Int? = null, + val strictRoute: Boolean? = null, val gso: Boolean? = null, val gsoMaxSize: Int? = null, - val autoRedirect: Boolean? = null, - val strictRoute: Boolean? = null, + val udpTimeout: Int? = null, + val iproute2TableIndex: Int? = null, + val iproute2RuleIndex: Int? = null, + val endpointIndependentNat: Boolean? = null, val routeAddressSet: List? = null, val routeExcludeAddressSet: List? = null, val routeAddress: List? = null, - val inet4RouteAddress: List? = null, - val inet6RouteAddress: List? = null, - val endpointIndependentNat: Boolean? = null, + val routeExcludeAddress: List? = null, val includeInterface: List? = null, val excludeInterface: List? = null, val includeUid: List? = null, @@ -110,20 +161,26 @@ data class Tun( val excludeUidRange: List>? = null, val includeAndroidUser: List? = null, val includePackage: List? = null, - val excludePackage: List? = null + val excludePackage: List? = null, + @Deprecated("") val inet4RouteAddress: List? = null, + @Deprecated("") val inet6RouteAddress: List? = null, + @Deprecated("") val inet4RouteExcludeAddress: List? = null, + @Deprecated("") val inet6RouteExcludeAddress: List? = null ) @Serializable data class Sniffer( val enable: Boolean? = null, + val forceDnsMapping: Boolean? = null, + val parsePureIp: Boolean? = null, val overrideDestination: Boolean? = null, val sniff: Sniff? = null, val forceDomain: List? = null, + val skipDomain: List? = null, val skipSrcAddress: List? = null, val skipDstAddress: List? = null, - val skipDomain: List? = null, - val sniffing: List? = null, - val portWhitelist: List? = null + @Deprecated("") val sniffing: List? = null, + @Deprecated("") val portWhitelist: List? = null ) @Serializable @@ -204,173 +261,173 @@ data class FallbackFilter( @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? = 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? = null -// ) -// -// @Serializable -// data class H2Opts( -// val host: List? = 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? = 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? = null -// ) -// } + @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? = 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? = null + ) + + @Serializable + data class H2Opts( + val host: List? = 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? = 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? = null + ) + } @Serializable @SerialName("hysteria2") @@ -388,80 +445,80 @@ sealed class Proxy { 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? = null -// ) : Proxy() { -// @Serializable -// data class Peer( -// val server: String? = null, -// val port: Int? = null, -// val publicKey: String? = null, -// val allowedIps: List? = 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 + 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? = null + ) : Proxy() { + @Serializable + data class Peer( + val server: String? = null, + val port: Int? = null, + val publicKey: String? = null, + val allowedIps: List? = 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 @@ -648,6 +705,20 @@ data class Payload( @Serializable sealed class Listener { @Serializable + @SerialName("http") + data class HttpListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val users: List? = null, + val certificate: String? = null, + val privateKey: String? = null + ) : Listener() + + @Serializable + @SerialName("socks") data class SocksListener( val name: String? = null, val port: Int? = null, @@ -655,20 +726,13 @@ sealed class Listener { val rule: String? = null, val proxy: String? = null, val udp: Boolean? = null, - val users: List? = null - ) : Listener() - - @Serializable - data class HttpListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val users: List? = null + val users: List? = null, + val certificate: String? = null, + val privateKey: String? = null ) : Listener() @Serializable + @SerialName("mixed") data class MixedListener( val name: String? = null, val port: Int? = null, @@ -676,10 +740,13 @@ sealed class Listener { val rule: String? = null, val proxy: String? = null, val udp: Boolean? = null, - val users: List? = null + val users: List? = null, + val certificate: String? = null, + val privateKey: String? = null ) : Listener() @Serializable + @SerialName("redir") data class RedirListener( val name: String? = null, val port: Int? = null, @@ -689,84 +756,18 @@ sealed class Listener { ) : Listener() @Serializable + @SerialName("tproxy") data class TProxyListener( val name: String? = null, val port: Int? = null, val listen: String? = null, val rule: String? = null, val proxy: String? = null, - val udp: Boolean? = null - ) : Listener() - - @Serializable - data class ShadowsocksListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val password: String? = null, - val cipher: String? = null - ) : Listener() - - @Serializable - data class VmessListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val users: List? = null, - val wsPath: String? = null, - val certificate: String? = null, - val privateKey: String? = null, - val realityConfig: RealityConfig? = null - ) : Listener() - - @Serializable - data class TuicListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val token: List? = null, - val users: Map? = null, - val certificate: String? = null, - val privateKey: String? = null, - val congestionController: String? = null, - val maxIdleTime: Int? = null, - val authenticationTimeout: Int? = null, - val alpn: List? = null, - val maxUdpRelayPacketSize: Int? = null - ) : Listener() - - @Serializable - data class TunnelListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val network: List? = null, - val target: String? = null - ) : Listener() - - @Serializable - data class VlessListener( - val name: String? = null, - val port: Int? = null, - val listen: String? = null, - val rule: String? = null, - val proxy: String? = null, - val users: List? = null, - val wsPath: String? = null, - val certificate: String? = null, - val privateKey: String? = null, - val realityConfig: RealityConfig? = null + val udp: Boolean? = null, ) : Listener() @Serializable + @SerialName("tun") data class TunListener( val name: String? = null, val stack: String? = null, @@ -790,6 +791,101 @@ sealed class Listener { val includePackage: List? = null, val excludePackage: List? = null ) : Listener() + + @Serializable + @SerialName("shadowsocks") + data class ShadowsocksListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val password: String? = null, + val cipher: String? = null, + val udp: Boolean? = null + ) : Listener() + + @Serializable + @SerialName("vmess") + data class VmessListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val users: List? = null, + val privateKey: String? = null, + val certificate: String? = null, + // Follows are from mihomo config yaml + val wsPath: String? = null, + val realityConfig: RealityConfig? = null + ) : Listener() + + @Serializable + @SerialName("tuic") + data class TuicListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val token: List? = null, + val users: Map? = null, + val certificate: String? = null, + val privateKey: String? = null, + val congestionController: String? = null, + val maxIdleTime: Int? = null, + val authenticationTimeout: Int? = null, + val alpn: List? = null, + val maxUdpRelayPacketSize: Int? = null + ) : Listener() + + @Serializable + @SerialName("hysteria2") + data class Hysteria2Listener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val users: Map? = null, + val up: Int? = null, + val down: Int? = null, + val ignoreClientBandwidth: Boolean? = null, + val obfs: String? = null, + val obfsPassword: String? = null, + val masquerade: String? = null, + val alpn: List? = null, + val certificate: String? = null, + val privateKey: String? = null, + ) : Listener() + + @Serializable + @SerialName("tunnel") + data class TunnelListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val network: List? = null, + val target: String? = null + ) : Listener() + + @Serializable + @SerialName("vless") + data class VlessListener( + val name: String? = null, + val port: Int? = null, + val listen: String? = null, + val rule: String? = null, + val proxy: String? = null, + val users: List? = null, + val wsPath: String? = null, + val certificate: String? = null, + val privateKey: String? = null, + val realityConfig: RealityConfig? = null + ) : Listener() } @Serializable