diff --git a/lib/provider/ClashProvider.ts b/lib/provider/ClashProvider.ts index 0257b633d..439d9aae4 100644 --- a/lib/provider/ClashProvider.ts +++ b/lib/provider/ClashProvider.ts @@ -32,6 +32,7 @@ const logger = createLogger({ export default class ClashProvider extends Provider { public readonly _url: string; public readonly udpRelay?: boolean; + public readonly tls13?: boolean; constructor(name: string, config: ClashProviderConfig) { super(name, config); @@ -45,6 +46,8 @@ export default class ClashProvider extends Provider { ], }) .required(), + udpRelay: Joi.bool(), + tls13: Joi.bool(), }) .unknown(); @@ -56,6 +59,7 @@ export default class ClashProvider extends Provider { this._url = config.url; this.udpRelay = config.udpRelay; + this.tls13 = config.tls13; this.supportGetSubscriptionUserInfo = true; } @@ -85,6 +89,7 @@ export default class ClashProvider extends Provider { export const getClashSubscription = async ( url: string, udpRelay?: boolean, + tls13?: boolean, ): Promise<{ readonly nodeList: ReadonlyArray; readonly subscriptionUserinfo?: SubscriptionUserinfo; @@ -145,12 +150,16 @@ export const getClashSubscription = async ( } return { - nodeList: parseClashConfig(proxyList, udpRelay), + nodeList: parseClashConfig(proxyList, udpRelay, tls13), subscriptionUserinfo: response.subscriptionUserinfo, }; }; -export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boolean): ReadonlyArray => { +export const parseClashConfig = ( + proxyList: ReadonlyArray, + udpRelay?: boolean, + tls13?: boolean +): ReadonlyArray => { const nodeList: ReadonlyArray = proxyList .map(item => { switch (item.type) { @@ -176,14 +185,20 @@ export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boole method: item.cipher, password: item.password, 'udp-relay': resolveUdpRelay(item.udp, udpRelay), + + // obfs-local 新格式 ...(item.plugin && item.plugin === 'obfs' ? { obfs: item['plugin-opts'].mode, 'obfs-host': item['plugin-opts'].host || 'www.bing.com', } : null), + + // obfs-local 旧格式 ...(item.obfs ? { obfs: item.obfs, 'obfs-host': item['obfs-host'] || 'www.bing.com', } : null), + + // v2ray-plugin ...(item.plugin && item.plugin === 'v2ray-plugin' && item['plugin-opts'].mode === 'websocket' ? { obfs: item['plugin-opts'].tls === true ? 'wss' : 'ws', 'obfs-host': item['plugin-opts'].host || item.server, @@ -191,6 +206,7 @@ export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boole wsHeaders, ...(item['plugin-opts'].tls === true ? { skipCertVerify: item['plugin-opts']['skip-cert-verify'] === true, + tls13: tls13 ?? false, } : null), ...(typeof item['plugin-opts'].mux === 'boolean' ? { mux: item['plugin-opts'].mux, @@ -226,6 +242,7 @@ export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boole } : null), ...(item.tls ? { skipCertVerify: item['skip-cert-verify'] === true, + tls13: tls13 ?? false, } : null), } as VmessNodeConfig; } @@ -249,6 +266,7 @@ export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boole port: item.port, username: item.username || '', password: item.password || '', + tls13: tls13 ?? false, skipCertVerify: item['skip-cert-verify'] === true, } as HttpsNodeConfig; @@ -290,6 +308,7 @@ export const parseClashConfig = (proxyList: ReadonlyArray, udpRelay?: boole ...('alpn' in item ? { alpn: item.alpn } : null), ...('sni' in item ? { sni: item.sni } : null), ...('udp' in item ? { 'udp-relay': item.udp } : null), + tls13: tls13 ?? false, } as TrojanNodeConfig; default: diff --git a/lib/types.ts b/lib/types.ts index 3a33baf8c..d7cfff781 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -133,6 +133,7 @@ export interface V2rayNSubscribeProviderConfig extends ProviderConfig { export interface ClashProviderConfig extends ProviderConfig { readonly url: string; readonly udpRelay?: boolean; + readonly tls13?: boolean; } export interface CustomProviderConfig extends ProviderConfig {