diff --git a/backend/package.json b/backend/package.json index 7b1de3c..4cb4dc8 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.19.13", + "version": "2.19.14", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.js b/backend/src/core/proxy-utils/parsers/peggy/loon.js index 5a1c979..216c2f1 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.js +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -54,7 +54,7 @@ shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs $set(proxy, "plugin-opts.path", obfs.path); } } -vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/tls_cert_sha256/tls_pubkey_sha256/vmess_alterId/fast_open/udp_relay/ip_mode/others)* { +vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/tls_cert_sha256/tls_pubkey_sha256/vmess_alterId/fast_open/udp_relay/ip_mode/public_key/short_id/others)* { proxy.type = "vmess"; proxy.cipher = proxy.cipher || "none"; proxy.alterId = proxy.alterId || 0; diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg index 66e93c0..e768ed3 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -52,7 +52,7 @@ shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs $set(proxy, "plugin-opts.path", obfs.path); } } -vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/tls_cert_sha256/tls_pubkey_sha256/vmess_alterId/fast_open/udp_relay/ip_mode/others)* { +vmess = tag equals "vmess"i address method uuid (transport/transport_host/transport_path/over_tls/tls_host/tls_verification/tls_cert_sha256/tls_pubkey_sha256/vmess_alterId/fast_open/udp_relay/ip_mode/public_key/short_id/others)* { proxy.type = "vmess"; proxy.cipher = proxy.cipher || "none"; proxy.alterId = proxy.alterId || 0; diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index d454317..b443c5d 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -21,7 +21,7 @@ export default function Loon_Producer() { case 'trojan': return trojan(proxy); case 'vmess': - return vmess(proxy); + return vmess(proxy, opts['include-unsupported-proxy']); case 'vless': return vless(proxy, opts['include-unsupported-proxy']); case 'http': @@ -269,7 +269,17 @@ function trojan(proxy) { return result.toString(); } -function vmess(proxy) { +function vmess(proxy, includeUnsupportedProxy) { + if (!includeUnsupportedProxy && proxy['reality-opts']) { + throw new Error(`VMess REALITY is not supported`); + } + + let isReality = false; + if (includeUnsupportedProxy) { + if (proxy['reality-opts']) { + isReality = true; + } + } const result = new Result(proxy); result.append( `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.uuid}"`, @@ -317,16 +327,28 @@ function vmess(proxy) { 'skip-cert-verify', ); - // sni - result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); - result.appendIfPresent( - `,tls-cert-sha256=${proxy['tls-fingerprint']}`, - 'tls-fingerprint', - ); - result.appendIfPresent( - `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, - 'tls-pubkey-sha256', - ); + if (isReality) { + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,public-key="${proxy['reality-opts']['public-key']}"`, + 'reality-opts.public-key', + ); + result.appendIfPresent( + `,short-id=${proxy['reality-opts']['short-id']}`, + 'reality-opts.short-id', + ); + } else { + // sni + result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + result.appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); + } // AEAD if (isPresent(proxy, 'aead')) { @@ -354,19 +376,19 @@ function vless(proxy, includeUnsupportedProxy) { ) { throw new Error(`VLESS XTLS/REALITY is not supported`); } + let isXtls = false; let isReality = false; if (includeUnsupportedProxy) { - if ( - proxy['reality-opts'] && - ['xtls-rprx-vision'].includes(proxy.flow) - ) { + if (proxy['reality-opts']) { isReality = true; - } else if (proxy['reality-opts']) { - throw new Error( - `VLESS REALITY with flow(${proxy.flow}) is not supported`, - ); - } else if (proxy.flow) { - throw new Error(`VLESS XTLS is not supported`); + } + + if (typeof proxy.flow !== 'undefined') { + if (['xtls-rprx-vision'].includes(proxy.flow)) { + isXtls = true; + } else { + throw new Error(`VLESS flow(${proxy.flow}) is not supported`); + } } } const result = new Result(proxy); @@ -416,9 +438,10 @@ function vless(proxy, includeUnsupportedProxy) { 'skip-cert-verify', ); - // sni - if (isReality) { + if (isXtls) { result.appendIfPresent(`,flow=${proxy.flow}`, 'flow'); + } + if (isReality) { result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); result.appendIfPresent( `,public-key="${proxy['reality-opts']['public-key']}"`, @@ -429,18 +452,18 @@ function vless(proxy, includeUnsupportedProxy) { 'reality-opts.short-id', ); } else { + // sni result.appendIfPresent(`,tls-name=${proxy.sni}`, 'sni'); + result.appendIfPresent( + `,tls-cert-sha256=${proxy['tls-fingerprint']}`, + 'tls-fingerprint', + ); + result.appendIfPresent( + `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, + 'tls-pubkey-sha256', + ); } - result.appendIfPresent( - `,tls-cert-sha256=${proxy['tls-fingerprint']}`, - 'tls-fingerprint', - ); - result.appendIfPresent( - `,tls-pubkey-sha256=${proxy['tls-pubkey-sha256']}`, - 'tls-pubkey-sha256', - ); - // tfo result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); diff --git a/backend/src/products/resource-parser.loon.js b/backend/src/products/resource-parser.loon.js index ce2a087..c5de867 100644 --- a/backend/src/products/resource-parser.loon.js +++ b/backend/src/products/resource-parser.loon.js @@ -44,7 +44,7 @@ let resourceUrl = typeof $resourceUrl !== 'undefined' ? $resourceUrl : ''; let proxies = ProxyUtils.parse(resource); result = ProxyUtils.produce(proxies, 'Loon', undefined, { 'include-unsupported-proxy': - arg?.includeUnsupportedProxy || build >= 838, + arg?.includeUnsupportedProxy || build >= 842, }); } catch (e) { console.log('解析器: 使用 resource 出现错误'); @@ -67,7 +67,7 @@ let resourceUrl = typeof $resourceUrl !== 'undefined' ? $resourceUrl : ''; let proxies = ProxyUtils.parse(raw); result = ProxyUtils.produce(proxies, 'Loon', undefined, { 'include-unsupported-proxy': - arg?.includeUnsupportedProxy || build >= 838, + arg?.includeUnsupportedProxy || build >= 842, }); } catch (e) { console.log(e.message ?? e); diff --git a/backend/src/utils/user-agent.js b/backend/src/utils/user-agent.js index b8bbbd5..682946f 100644 --- a/backend/src/utils/user-agent.js +++ b/backend/src/utils/user-agent.js @@ -90,7 +90,7 @@ export function shouldIncludeUnsupportedProxy(platform, ua) { if ( platform === 'Loon' && target === 'Loon' && - gte(version, '838.0.0') + gte(version, '842.0.0') ) { return true; }