From 07a270963ed95dcbbe61ffb4da819d7400a9017e Mon Sep 17 00:00:00 2001 From: xream Date: Fri, 1 Sep 2023 02:44:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20Surge=20WireGuard?= =?UTF-8?q?=20=E7=9A=84=E8=BE=93=E5=85=A5=E5=92=8C=E8=BE=93=E5=87=BA(?= =?UTF-8?q?=E7=94=B1=E4=BA=8E=20Surge=20=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E7=89=B9=E6=AE=8A=E6=80=A7,=20=E4=BB=85=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E5=90=8C=E8=BF=9B=E5=90=8C=E5=87=BA)=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=E6=A0=BC=E5=BC=8F:=20`HK=20WARP=20?= =?UTF-8?q?=3D=20wireguard,=20section-name=3DCloudflare,=20no-error-alert?= =?UTF-8?q?=3Dtrue,=20underlying-proxy=3DHK,=20test-url=3Dhttp://1.0.0.1/g?= =?UTF-8?q?enerate=5F204,=20ip-version=3Dv4-only`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/core/proxy-utils/parsers/index.js | 13 ++++++-- .../core/proxy-utils/parsers/peggy/surge.js | 9 +++++- .../core/proxy-utils/parsers/peggy/surge.peg | 9 +++++- .../src/core/proxy-utils/producers/surge.js | 30 +++++++++++++++++++ 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/backend/package.json b/backend/package.json index b855bf2..301472f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.46", + "version": "2.14.47", "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/index.js b/backend/src/core/proxy-utils/parsers/index.js index 7211f42..777b138 100644 --- a/backend/src/core/proxy-utils/parsers/index.js +++ b/backend/src/core/proxy-utils/parsers/index.js @@ -739,7 +739,7 @@ function Surge_Socks5() { function Surge_Snell() { const name = 'Surge Snell Parser'; const test = (line) => { - return /^.*=\s*snell?/.test(line.split(',')[0]); + return /^.*=\s*snell/.test(line.split(',')[0]); }; const parse = (line) => getSurgeParser().parse(line); return { name, test, parse }; @@ -748,7 +748,15 @@ function Surge_Snell() { function Surge_Tuic() { const name = 'Surge Tuic Parser'; const test = (line) => { - return /^.*=\s*tuic(-v5)??/.test(line.split(',')[0]); + return /^.*=\s*tuic(-v5)?/.test(line.split(',')[0]); + }; + const parse = (line) => getSurgeParser().parse(line); + return { name, test, parse }; +} +function Surge_WireGuard() { + const name = 'Surge WireGuard Parser'; + const test = (line) => { + return /^.*=\s*wireguard/.test(line.split(',')[0]); }; const parse = (line) => getSurgeParser().parse(line); return { name, test, parse }; @@ -767,6 +775,7 @@ export default [ Surge_Http(), Surge_Snell(), Surge_Tuic(), + Surge_WireGuard(), Surge_Socks5(), Loon_SS(), Loon_SSR(), diff --git a/backend/src/core/proxy-utils/parsers/peggy/surge.js b/backend/src/core/proxy-utils/parsers/peggy/surge.js index 0132599..9ae3e5f 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/surge.js +++ b/backend/src/core/proxy-utils/parsers/peggy/surge.js @@ -32,7 +32,7 @@ const grammars = String.raw` } } -start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5) { +start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5/wireguard) { return proxy; } @@ -83,6 +83,9 @@ tuic_v5 = tag equals "tuic-v5" address (alpn/passwordk/uuidk/ip_version/tls_veri proxy.type = "tuic"; proxy.version = 5; } +wireguard = tag equals "wireguard" (section_name/no_error_alert/ip_version/underlying_proxy/test_url/others)* { + proxy.type = "wireguard-surge"; +} socks5 = tag equals "socks5" address (username password)? (fast_open/others)* { proxy.type = "socks5"; } @@ -187,6 +190,10 @@ udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } tfo = comma "tfo" equals flag:bool { proxy.tfo = flag; } ip_version = comma "ip-version" equals match:[^,]+ { proxy["ip-version"] = match.join(""); } +section_name = comma "section-name" equals match:[^,]+ { proxy["section-name"] = match.join(""); } +no_error_alert = comma "no-error-alert" equals match:[^,]+ { proxy["no-error-alert"] = match.join(""); } +underlying_proxy = comma "underlying-proxy" equals match:[^,]+ { proxy["underlying-proxy"] = match.join(""); } +test_url = comma "test-url" equals match:[^,]+ { proxy["test-url"] = match.join(""); } token = comma "token" equals match:[^,]+ { proxy.token = match.join(""); } alpn = comma "alpn" equals match:[^,]+ { proxy.alpn = match.join(""); } uuidk = comma "uuid" equals match:[^,]+ { proxy.uuid = match.join(""); } diff --git a/backend/src/core/proxy-utils/parsers/peggy/surge.peg b/backend/src/core/proxy-utils/parsers/peggy/surge.peg index 461de8a..69eb159 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/surge.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/surge.peg @@ -30,7 +30,7 @@ } } -start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5) { +start = (shadowsocks/vmess/trojan/https/http/snell/socks5/socks5_tls/tuic/tuic_v5/wireguard) { return proxy; } @@ -81,6 +81,9 @@ tuic_v5 = tag equals "tuic-v5" address (alpn/passwordk/uuidk/ip_version/tls_veri proxy.type = "tuic"; proxy.version = 5; } +wireguard = tag equals "wireguard" (section_name/no_error_alert/ip_version/underlying_proxy/test_url/others)* { + proxy.type = "wireguard-surge"; +} socks5 = tag equals "socks5" address (username password)? (fast_open/others)* { proxy.type = "socks5"; } @@ -185,6 +188,10 @@ udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } tfo = comma "tfo" equals flag:bool { proxy.tfo = flag; } ip_version = comma "ip-version" equals match:[^,]+ { proxy["ip-version"] = match.join(""); } +section_name = comma "section-name" equals match:[^,]+ { proxy["section-name"] = match.join(""); } +no_error_alert = comma "no-error-alert" equals match:[^,]+ { proxy["no-error-alert"] = match.join(""); } +underlying_proxy = comma "underlying-proxy" equals match:[^,]+ { proxy["underlying-proxy"] = match.join(""); } +test_url = comma "test-url" equals match:[^,]+ { proxy["test-url"] = match.join(""); } token = comma "token" equals match:[^,]+ { proxy.token = match.join(""); } alpn = comma "alpn" equals match:[^,]+ { proxy.alpn = match.join(""); } uuidk = comma "uuid" equals match:[^,]+ { proxy.uuid = match.join(""); } diff --git a/backend/src/core/proxy-utils/producers/surge.js b/backend/src/core/proxy-utils/producers/surge.js index 855888a..bd7601d 100644 --- a/backend/src/core/proxy-utils/producers/surge.js +++ b/backend/src/core/proxy-utils/producers/surge.js @@ -29,6 +29,8 @@ export default function Surge_Producer() { return snell(proxy); case 'tuic': return tuic(proxy); + case 'wireguard-surge': + return wireguard(proxy); } throw new Error( `Platform ${targetPlatform} does not support proxy type: ${proxy.type}`, @@ -289,6 +291,34 @@ function tuic(proxy) { return result.toString(); } +function wireguard(proxy) { + const result = new Result(proxy); + + result.append(`${proxy.name}=wireguard`); + + result.appendIfPresent( + `,section-name=${proxy['section-name']}`, + 'section-name', + ); + result.appendIfPresent( + `,no-error-alert=${proxy['no-error-alert']}`, + 'no-error-alert', + ); + result.appendIfPresent( + `,underlying-proxy=${proxy['underlying-proxy']}`, + 'underlying-proxy', + ); + result.appendIfPresent( + `,ip-version=${ipVersions[proxy['ip-version']] || proxy['ip-version']}`, + 'ip-version', + ); + + // test-url + result.appendIfPresent(`,test-url=${proxy['test-url']}`, 'test-url'); + + return result.toString(); +} + function handleTransport(result, proxy) { if (isPresent(proxy, 'network')) { if (proxy.network === 'ws') {