Skip to content

Commit ee6298a

Browse files
committed
feat: QX tls-verification 支持非布尔值, 逻辑为 name-cert-verify
1 parent b21faf5 commit ee6298a

5 files changed

Lines changed: 49 additions & 31 deletions

File tree

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sub-store",
3-
"version": "2.36.15",
3+
"version": "2.36.16",
44
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket.",
55
"main": "src/main.js",
66
"packageManager": "pnpm@11.0.9",

backend/src/core/proxy-utils/parsers/peggy/qx.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,13 @@ fast_open = comma "fast-open" equals flag:bool { proxy.tfo = flag; }
187187
188188
over_tls = comma "over-tls" equals flag:bool { proxy.tls = flag; }
189189
tls_host = comma sni:("tls-host") equals match:[^,]+ { proxy.sni = match.join("").replace(/^"(.*)"$/, '$1'); }
190-
tls_verification = comma "tls-verification" equals flag:bool {
191-
proxy["skip-cert-verify"] = !flag;
190+
tls_verification = comma "tls-verification" equals raw:$[^,]+ {
191+
const value = raw.trim();
192+
if (value === "true" || value === "false") {
193+
proxy["skip-cert-verify"] = value !== "true";
194+
} else {
195+
proxy["name-cert-verify"] = value;
196+
}
192197
}
193198
tls_fingerprint = comma "tls-cert-sha256" equals tls_fingerprint:$[^,]+ { proxy["tls-fingerprint"] = tls_fingerprint.trim(); }
194199
tls_pubkey_sha256 = comma "tls-pubkey-sha256" equals param:$[^=,]+ { proxy["tls-pubkey-sha256"] = param; }

backend/src/core/proxy-utils/producers/qx.js

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ function getQxHttpObfs(proxy) {
6767
: 'http';
6868
}
6969

70+
function appendTlsVerification(result, proxy) {
71+
const attr = isPresent(proxy, 'name-cert-verify')
72+
? 'name-cert-verify'
73+
: 'skip-cert-verify';
74+
result.appendIfPresent(
75+
`,tls-verification=${
76+
proxy['name-cert-verify'] ?? !proxy['skip-cert-verify']
77+
}`,
78+
attr,
79+
);
80+
}
81+
7082
function shadowsocks(proxy) {
7183
const result = new Result(proxy);
7284
const append = result.append.bind(result);
@@ -170,10 +182,7 @@ function shadowsocks(proxy) {
170182
);
171183

172184
// tls verification
173-
appendIfPresent(
174-
`,tls-verification=${!proxy['skip-cert-verify']}`,
175-
'skip-cert-verify',
176-
);
185+
appendTlsVerification(result, proxy);
177186
if (!isSSOverTls) {
178187
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
179188
}
@@ -301,10 +310,7 @@ function trojan(proxy) {
301310
);
302311

303312
// tls verification
304-
appendIfPresent(
305-
`,tls-verification=${!proxy['skip-cert-verify']}`,
306-
'skip-cert-verify',
307-
);
313+
appendTlsVerification(result, proxy);
308314
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
309315
}
310316

@@ -395,10 +401,7 @@ function vmess(proxy) {
395401
);
396402

397403
// tls verification
398-
appendIfPresent(
399-
`,tls-verification=${!proxy['skip-cert-verify']}`,
400-
'skip-cert-verify',
401-
);
404+
appendTlsVerification(result, proxy);
402405
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
403406
}
404407

@@ -501,10 +504,7 @@ function vless(proxy) {
501504
);
502505

503506
// tls verification
504-
appendIfPresent(
505-
`,tls-verification=${!proxy['skip-cert-verify']}`,
506-
'skip-cert-verify',
507-
);
507+
appendTlsVerification(result, proxy);
508508
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
509509
}
510510

@@ -563,10 +563,7 @@ function anytls(proxy) {
563563
`,tls-cert-sha256=${proxy['tls-fingerprint']}`,
564564
'tls-fingerprint',
565565
);
566-
appendIfPresent(
567-
`,tls-verification=${!proxy['skip-cert-verify']}`,
568-
'skip-cert-verify',
569-
);
566+
appendTlsVerification(result, proxy);
570567
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
571568

572569
appendIfPresent(`,fast-open=${proxy.tfo}`, 'tfo');
@@ -618,10 +615,7 @@ function http(proxy) {
618615
);
619616

620617
// tls verification
621-
appendIfPresent(
622-
`,tls-verification=${!proxy['skip-cert-verify']}`,
623-
'skip-cert-verify',
624-
);
618+
appendTlsVerification(result, proxy);
625619
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
626620
}
627621

@@ -679,10 +673,7 @@ function socks5(proxy) {
679673
);
680674

681675
// tls verification
682-
appendIfPresent(
683-
`,tls-verification=${!proxy['skip-cert-verify']}`,
684-
'skip-cert-verify',
685-
);
676+
appendTlsVerification(result, proxy);
686677
appendIfPresent(`,tls-host=${proxy.sni}`, 'sni');
687678
}
688679

backend/src/test/proxy-parsers/v2ray-and-platforms.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,6 +2473,13 @@ describe('Platform raw-format parser coverage', function () {
24732473
'skip-cert-verify': false,
24742474
},
24752475
},
2476+
{
2477+
title: 'parses non-boolean tls-verification as name-cert-verify',
2478+
input: `vless=qx-vless-verify-name.example.com:443,method=none,password=${UUID},obfs=wss,tls-verification=true.example.com,tag=QX VLESS Verify Name`,
2479+
expected: {
2480+
'name-cert-verify': 'true.example.com',
2481+
},
2482+
},
24762483
{
24772484
title: 'parses shadowsocks over-tls lines without obfs-host',
24782485
input: 'shadowsocks=qx-ss-tls-no-host.example.com:443,method=aes-128-gcm,password=secret,obfs=over-tls,udp-relay=true,tag=QX SS Over TLS No Host',

backend/src/test/proxy-producers/text.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ function captureErrors(fn) {
3232
}
3333

3434
describe('Proxy text producers', function () {
35+
it('uses name-cert-verify as Quantumult X tls-verification', function () {
36+
const output = produceExternal('QX', {
37+
type: 'vless',
38+
name: 'VLESS',
39+
server: 'vless.example.com',
40+
port: 443,
41+
uuid: UUID,
42+
tls: true,
43+
'skip-cert-verify': true,
44+
'name-cert-verify': 'verify.example.com',
45+
});
46+
47+
expect(output).to.include('tls-verification=verify.example.com');
48+
});
49+
3550
it('produces Quantumult X shadowsocks over-tls lines from canonical tls nodes', function () {
3651
const output = produceExternal('QX', {
3752
type: 'ss',

0 commit comments

Comments
 (0)