diff --git a/backend/package.json b/backend/package.json index fe4be9a..d8cb8e5 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.16.8", + "version": "2.16.9", "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 1a21ee7..2ffa236 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.js +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -39,7 +39,7 @@ start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/socks5/hysteria2 return proxy; } -shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/others)*{ +shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/udp_port/shadow_tls_version/shadow_tls_sni/shadow_tls_password/others)*{ proxy.type = "ssr"; // handle ssr obfs proxy.obfs = obfs.type; diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg index cd73918..fe70a53 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -37,7 +37,7 @@ start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/socks5/hysteria2 return proxy; } -shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/others)*{ +shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ssr_protocol_param/obfs_ssr/obfs_ssr_param/obfs_host/obfs_uri/fast_open/udp_relay/udp_port/shadow_tls_version/shadow_tls_sni/shadow_tls_password/others)*{ proxy.type = "ssr"; // handle ssr obfs proxy.obfs = obfs.type; diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index 7689e6b..27bb654 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -9,7 +9,7 @@ export default function Loon_Producer() { case 'ss': return shadowsocks(proxy, opts['include-unsupported-proxy']); case 'ssr': - return shadowsocksr(proxy); + return shadowsocksr(proxy, opts['include-unsupported-proxy']); case 'trojan': return trojan(proxy); case 'vmess': @@ -143,7 +143,7 @@ function shadowsocks(proxy, includeUnsupportedProxy) { return result.toString(); } -function shadowsocksr(proxy) { +function shadowsocksr(proxy, includeUnsupportedProxy) { const result = new Result(proxy); result.append( `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"`, @@ -160,6 +160,49 @@ function shadowsocksr(proxy) { result.appendIfPresent(`,obfs=${proxy.obfs}`, 'obfs'); result.appendIfPresent(`,obfs-param=${proxy['obfs-param']}`, 'obfs-param'); + let isShadowTLS; + + // shadow-tls + if (isPresent(proxy, 'shadow-tls-password')) { + result.append(`,shadow-tls-password=${proxy['shadow-tls-password']}`); + + result.appendIfPresent( + `,shadow-tls-version=${proxy['shadow-tls-version']}`, + 'shadow-tls-version', + ); + result.appendIfPresent( + `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, + 'shadow-tls-sni', + ); + // udp-port + result.appendIfPresent(`,udp-port=${proxy['udp-port']}`, 'udp-port'); + isShadowTLS = true; + } else if (['shadow-tls'].includes(proxy.plugin) && proxy['plugin-opts']) { + const password = proxy['plugin-opts'].password; + const host = proxy['plugin-opts'].host; + const version = proxy['plugin-opts'].version; + if (password) { + result.append(`,shadow-tls-password=${password}`); + if (host) { + result.append(`,shadow-tls-sni=${host}`); + } + if (version) { + if (version < 2) { + throw new Error( + `shadow-tls version ${version} is not supported`, + ); + } + result.append(`,shadow-tls-version=${version}`); + } + // udp-port + result.appendIfPresent( + `,udp-port=${proxy['udp-port']}`, + 'udp-port', + ); + isShadowTLS = true; + } + } + // tfo result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); @@ -168,6 +211,12 @@ function shadowsocksr(proxy) { result.append(`,udp=true`); } + if (!includeUnsupportedProxy && isShadowTLS) { + throw new Error( + `shadow-tls is not supported(请使用 includeUnsupportedProxy 参数)`, + ); + } + return result.toString(); }