From 3ab21b0e266c5b3137c5073a29db12b055a4ccfb Mon Sep 17 00:00:00 2001 From: xream Date: Sun, 21 Apr 2024 12:36:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20Loon=20SOCKS5/SOCK?= =?UTF-8?q?S5-TLS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- backend/package.json | 2 +- backend/src/core/proxy-utils/parsers/index.js | 10 ++++++++ .../core/proxy-utils/parsers/peggy/loon.js | 7 ++++-- .../core/proxy-utils/parsers/peggy/loon.peg | 7 ++++-- .../src/core/proxy-utils/producers/loon.js | 25 +++++++++++++++++++ 6 files changed, 47 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 94a81e7..acd2c2e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Core functionalities: - [x] Clash Proxies YAML - [x] Clash Proxy JSON(single line) - [x] QX (SS, SSR, VMess, Trojan, HTTP, SOCKS5, VLESS) -- [x] Loon (SS, SSR, VMess, Trojan, HTTP, SOCKS5, WireGuard, VLESS, Hysteria 2) +- [x] Loon (SS, SSR, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, WireGuard, VLESS, Hysteria 2) - [x] Surge (SS, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, TUIC, Snell, Hysteria 2, SSH(Password authentication only), SSR(external, only for macOS), External Proxy Program(only for macOS), WireGuard(Surge to Surge)) - [x] Surfboard (SS, VMess, Trojan, HTTP, SOCKS5, SOCKS5-TLS, WireGuard(Surfboard to Surfboard)) - [x] Shadowrocket (SS, SSR, VMess, Trojan, HTTP, SOCKS5, Snell, VLESS, WireGuard, Hysteria, Hysteria 2, TUIC) diff --git a/backend/package.json b/backend/package.json index 25bdf04..35cde16 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.291", + "version": "2.14.292", "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 b69aaeb..499d305 100644 --- a/backend/src/core/proxy-utils/parsers/index.js +++ b/backend/src/core/proxy-utils/parsers/index.js @@ -996,6 +996,15 @@ function Loon_Http() { const parse = (line) => getLoonParser().parse(line); return { name, test, parse }; } +function Loon_Socks5() { + const name = 'Loon SOCKS5 Parser'; + const test = (line) => { + return /^.*=\s*socks5/i.test(line.split(',')[0]); + }; + + const parse = (line) => getLoonParser().parse(line); + return { name, test, parse }; +} function Loon_WireGuard() { const name = 'Loon WireGuard Parser'; @@ -1302,6 +1311,7 @@ export default [ Loon_Hysteria2(), Loon_Trojan(), Loon_Http(), + Loon_Socks5(), Loon_WireGuard(), QX_SS(), QX_SSR(), diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.js b/backend/src/core/proxy-utils/parsers/peggy/loon.js index 8c87d22..3976390 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.js +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -35,7 +35,7 @@ const grammars = String.raw` } } -start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/hysteria2) { +start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/socks5/hysteria2) { return proxy; } @@ -78,6 +78,9 @@ https = tag equals "https"i address (username password)? (tls_host/tls_verificat http = tag equals "http"i address (username password)? (fast_open/udp_relay/others)* { proxy.type = "http"; } +socks5 = tag equals "socks5"i address (username password)? (over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "socks5"; +} address = comma server:server comma port:port { proxy.server = server; @@ -167,7 +170,7 @@ ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protoc vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } -tls_host = comma "tls-name" equals host:domain { proxy.sni = host; } +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; } fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg index 16f00d3..0f272d5 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -33,7 +33,7 @@ } } -start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/hysteria2) { +start = (shadowsocksr/shadowsocks/vmess/vless/trojan/https/http/socks5/hysteria2) { return proxy; } @@ -76,6 +76,9 @@ https = tag equals "https"i address (username password)? (tls_host/tls_verificat http = tag equals "http"i address (username password)? (fast_open/udp_relay/others)* { proxy.type = "http"; } +socks5 = tag equals "socks5"i address (username password)? (over_tls/tls_host/tls_verification/fast_open/udp_relay/others)* { + proxy.type = "socks5"; +} address = comma server:server comma port:port { proxy.server = server; @@ -165,7 +168,7 @@ ssr_protocol_param = comma "protocol-param" equals param:$[^=,]+ { proxy["protoc vmess_alterId = comma "alterId" equals alterId:$[0-9]+ { proxy.alterId = parseInt(alterId); } over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; } -tls_host = comma "tls-name" equals host:domain { proxy.sni = host; } +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; } fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; } diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index 96ba007..5bad345 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -18,6 +18,8 @@ export default function Loon_Producer() { return vless(proxy); case 'http': return http(proxy); + case 'socks5': + return socks5(proxy); case 'wireguard': return wireguard(proxy); case 'hysteria2': @@ -316,6 +318,29 @@ function http(proxy) { return result.toString(); } +function socks5(proxy) { + const result = new Result(proxy); + result.append(`${proxy.name}=socks5,${proxy.server},${proxy.port}`); + result.appendIfPresent(`,${proxy.username}`, 'username'); + result.appendIfPresent(`,"${proxy.password}"`, 'password'); + + // tls + result.appendIfPresent(`,over-tls=${proxy.tls}`, 'tls'); + + // sni + result.appendIfPresent(`,sni=${proxy.sni}`, 'sni'); + + // tls verification + result.appendIfPresent( + `,skip-cert-verify=${proxy['skip-cert-verify']}`, + 'skip-cert-verify', + ); + + // tfo + result.appendIfPresent(`,tfo=${proxy.tfo}`, 'tfo'); + + return result.toString(); +} function wireguard(proxy) { if (Array.isArray(proxy.peers) && proxy.peers.length > 0) {