diff --git a/backend/package.json b/backend/package.json index 69e1af3..6bafcfd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.339", + "version": "2.14.340", "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 3976390..c101e63 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.js +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.js @@ -68,7 +68,7 @@ trojan = tag equals "trojan"i address password (transport/transport_host/transpo proxy.type = "trojan"; handleTransport(); } -hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/fast_open/download_bandwidth/ecn/others)* { +hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/fast_open/download_bandwidth/salamander_password/ecn/others)* { proxy.type = "hysteria2"; } https = tag equals "https"i address (username password)? (tls_host/tls_verification/fast_open/udp_relay/others)* { @@ -178,6 +178,7 @@ udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } +salamander_password = comma "salamander-password" equals match:[^,]+ { proxy['obfs-password'] = match.join(""); proxy.obfs = 'salamander'; } tag = match:[^=,]* { proxy.name = match.join("").trim(); } comma = _ "," _ diff --git a/backend/src/core/proxy-utils/parsers/peggy/loon.peg b/backend/src/core/proxy-utils/parsers/peggy/loon.peg index 0f272d5..fd653ff 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/loon.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/loon.peg @@ -66,7 +66,7 @@ trojan = tag equals "trojan"i address password (transport/transport_host/transpo proxy.type = "trojan"; handleTransport(); } -hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/fast_open/download_bandwidth/ecn/others)* { +hysteria2 = tag equals "hysteria2"i address password (tls_host/tls_verification/udp_relay/fast_open/download_bandwidth/salamander_password/ecn/others)* { proxy.type = "hysteria2"; } https = tag equals "https"i address (username password)? (tls_host/tls_verification/fast_open/udp_relay/others)* { @@ -176,6 +176,7 @@ udp_relay = comma "udp" equals flag:bool { proxy.udp = flag; } ecn = comma "ecn" equals flag:bool { proxy.ecn = flag; } download_bandwidth = comma "download-bandwidth" equals match:[^,]+ { proxy.down = match.join(""); } +salamander_password = comma "salamander-password" equals match:[^,]+ { proxy['obfs-password'] = match.join(""); proxy.obfs = 'salamander'; } tag = match:[^=,]* { proxy.name = match.join("").trim(); } comma = _ "," _ diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index 5bad345..0fc3a97 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -408,8 +408,8 @@ function wireguard(proxy) { } function hysteria2(proxy) { - if (proxy.obfs || proxy['obfs-password']) { - throw new Error(`obfs is unsupported`); + if (proxy['obfs-password'] && proxy.obfs != 'salamander') { + throw new Error(`only salamander obfs is supported`); } const result = new Result(proxy); result.append(`${proxy.name}=Hysteria2,${proxy.server},${proxy.port}`); @@ -423,6 +423,10 @@ function hysteria2(proxy) { 'skip-cert-verify', ); + if (proxy['obfs-password'] && proxy.obfs == 'salamander') { + result.append(`,salamander-password="${proxy['obfs-password']}"`); + } + // tfo result.appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo');