diff --git a/backend/package.json b/backend/package.json index 867eea7..472fb9e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.16.5", + "version": "2.16.6", "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 bbc4eca..1a21ee7 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.js +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -44,7 +44,7 @@ shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ // handle ssr obfs proxy.obfs = obfs.type; } -shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/others)* { +shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/udp_port/shadow_tls_version/shadow_tls_sni/shadow_tls_password/others)* { proxy.type = "ss"; // handle ss obfs if (obfs.type == "http" || obfs.type === "tls") { @@ -169,6 +169,11 @@ ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protoc vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } +udp_port = comma "udp-port" equals match:$[0-9]+ { proxy["udp-port"] = parseInt(match.trim()); } +shadow_tls_version = comma "shadow-tls-version" equals match:$[0-9]+ { proxy["shadow-tls-version"] = parseInt(match.trim()); } +shadow_tls_sni = comma "shadow-tls-sni" equals match:[^,]+ { proxy["shadow-tls-sni"] = match.join(""); } +shadow_tls_password = comma "shadow-tls-password" equals match:[^,]+ { proxy["shadow-tls-password"] = match.join(""); } + over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } tls_host = comma sni:("tls-name"/"sni") equals host:domain { proxy.sni = host; } tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg index b950fb6..cd73918 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -42,7 +42,7 @@ shadowsocksr = tag equals "shadowsocksr"i address method password (ssr_protocol/ // handle ssr obfs proxy.obfs = obfs.type; } -shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/others)* { +shadowsocks = tag equals "shadowsocks"i address method password (obfs_typev obfs_hostv)? (obfs_ss/obfs_host/obfs_uri/fast_open/udp_relay/udp_port/shadow_tls_version/shadow_tls_sni/shadow_tls_password/others)* { proxy.type = "ss"; // handle ss obfs if (obfs.type == "http" || obfs.type === "tls") { @@ -167,6 +167,11 @@ ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protoc vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } +udp_port = comma "udp-port" equals match:$[0-9]+ { proxy["udp-port"] = parseInt(match.trim()); } +shadow_tls_version = comma "shadow-tls-version" equals match:$[0-9]+ { proxy["shadow-tls-version"] = parseInt(match.trim()); } +shadow_tls_sni = comma "shadow-tls-sni" equals match:[^,]+ { proxy["shadow-tls-sni"] = match.join(""); } +shadow_tls_password = comma "shadow-tls-password" equals match:[^,]+ { proxy["shadow-tls-password"] = match.join(""); } + over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } tls_host = comma sni:("tls-name"/"sni") equals host:domain { proxy.sni = host; } tls_verification = comma "skip-cert-verify" equals flag:bool { proxy["skip-cert-verify"] = flag; } diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index a4e150c..0779ad4 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -32,7 +32,7 @@ export default function Loon_Producer() { return { produce }; } -function shadowsocks(proxy) { +function shadowsocks(proxy, includeUnsupportedProxy) { const result = new Result(proxy); if ( ![ @@ -78,11 +78,50 @@ function shadowsocks(proxy) { `,obfs-uri=${proxy['plugin-opts'].path}`, 'plugin-opts.path', ); - } else { + } else if (!['shadow-tls'].includes(proxy.plugin)) { throw new Error(`plugin ${proxy.plugin} is not supported`); } } + // 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'); + } 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', + ); + } + } + // tfo result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo'); @@ -91,6 +130,12 @@ function shadowsocks(proxy) { result.append(`,udp=true`); } + if (!includeUnsupportedProxy && result.includes(',shadow-tls-password=')) { + throw new Error( + `shadow-tls is not supported(请使用 includeUnsupportedProxy 参数)`, + ); + } + return result.toString(); } diff --git a/backend/src/core/proxy-utils/producers/surge.js b/backend/src/core/proxy-utils/producers/surge.js index dfbfd25..dfa262c 100644 --- a/backend/src/core/proxy-utils/producers/surge.js +++ b/backend/src/core/proxy-utils/producers/surge.js @@ -127,8 +127,6 @@ function shadowsocks(proxy, includeUnsupportedProxy) { // udp result.appendIfPresent(`,udp-relay=${proxy.udp}`, 'udp'); - // udp-port - result.appendIfPresent(`,udp-port=${proxy['udp-port']}`, 'udp-port'); // test-url result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); @@ -160,6 +158,8 @@ function shadowsocks(proxy, includeUnsupportedProxy) { `,shadow-tls-sni=${proxy['shadow-tls-sni']}`, 'shadow-tls-sni', ); + // udp-port + result.appendIfPresent(`,udp-port=${proxy['udp-port']}`, 'udp-port'); } else if (['shadow-tls'].includes(proxy.plugin) && proxy['plugin-opts']) { const password = proxy['plugin-opts'].password; const host = proxy['plugin-opts'].host; @@ -177,6 +177,11 @@ function shadowsocks(proxy, includeUnsupportedProxy) { } result.append(`,shadow-tls-version=${version}`); } + // udp-port + result.appendIfPresent( + `,udp-port=${proxy['udp-port']}`, + 'udp-port', + ); } }