Skip to content

Commit 93a5ce6

Browse files
committed
feat: 支持 dialer-proxy, detour
1 parent cb66c8d commit 93a5ce6

7 files changed

Lines changed: 45 additions & 1 deletion

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.14.281",
3+
"version": "2.14.282",
44
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.",
55
"main": "src/main.js",
66
"scripts": {

backend/src/core/proxy-utils/parsers/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,9 @@ function Clash_All() {
751751
if (proxy.fingerprint) {
752752
proxy['tls-fingerprint'] = proxy.fingerprint;
753753
}
754+
if (proxy['dialer-proxy']) {
755+
proxy['underlying-proxy'] = proxy['dialer-proxy'];
756+
}
754757

755758
if (proxy['benchmark-url']) {
756759
proxy['test-url'] = proxy['benchmark-url'];

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ export default function Clash_Producer() {
144144
proxy.fingerprint = proxy['tls-fingerprint'];
145145
}
146146
delete proxy['tls-fingerprint'];
147+
148+
if (proxy['underlying-proxy']) {
149+
proxy['dialer-proxy'] = proxy['underlying-proxy'];
150+
}
151+
delete proxy['underlying-proxy'];
152+
147153
if (isPresent(proxy, 'tls') && typeof proxy.tls !== 'boolean') {
148154
delete proxy.tls;
149155
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ export default function ClashMeta_Producer() {
160160
proxy.fingerprint = proxy['tls-fingerprint'];
161161
}
162162
delete proxy['tls-fingerprint'];
163+
164+
if (proxy['underlying-proxy']) {
165+
proxy['dialer-proxy'] = proxy['underlying-proxy'];
166+
}
167+
delete proxy['underlying-proxy'];
168+
163169
if (isPresent(proxy, 'tls') && typeof proxy.tls !== 'boolean') {
164170
delete proxy.tls;
165171
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ export default function ShadowRocket_Producer() {
163163
proxy.fingerprint = proxy['tls-fingerprint'];
164164
}
165165
delete proxy['tls-fingerprint'];
166+
167+
if (proxy['underlying-proxy']) {
168+
proxy['dialer-proxy'] = proxy['underlying-proxy'];
169+
}
170+
delete proxy['underlying-proxy'];
171+
166172
if (isPresent(proxy, 'tls') && typeof proxy.tls !== 'boolean') {
167173
delete proxy.tls;
168174
}

backend/src/core/proxy-utils/producers/sing-box.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import ClashMeta_Producer from './clashmeta';
22
import $ from '@/core/app';
33

4+
const detourParser = (proxy, parsedProxy) => {
5+
if (proxy['dialer-proxy']) parsedProxy.detour = proxy['dialer-proxy'];
6+
};
47
const tfoParser = (proxy, parsedProxy) => {
58
parsedProxy.tcp_fast_open = false;
69
if (proxy.tfo) parsedProxy.tcp_fast_open = true;
@@ -249,6 +252,7 @@ const sshParser = (proxy = {}) => {
249252
parsedProxy.host_key_algorithms = proxy['host-key-algorithms'];
250253
if (proxy['fast-open']) parsedProxy.udp_fragment = true;
251254
tfoParser(proxy, parsedProxy);
255+
detourParser(proxy, parsedProxy);
252256
return parsedProxy;
253257
};
254258

@@ -274,6 +278,7 @@ const httpParser = (proxy = {}) => {
274278
}
275279
if (proxy['fast-open']) parsedProxy.udp_fragment = true;
276280
tfoParser(proxy, parsedProxy);
281+
detourParser(proxy, parsedProxy);
277282
tlsParser(proxy, parsedProxy);
278283
return parsedProxy;
279284
};
@@ -295,6 +300,7 @@ const socks5Parser = (proxy = {}) => {
295300
if (proxy['udp-over-tcp']) parsedProxy.udp_over_tcp = true;
296301
if (proxy['fast-open']) parsedProxy.udp_fragment = true;
297302
tfoParser(proxy, parsedProxy);
303+
detourParser(proxy, parsedProxy);
298304
return parsedProxy;
299305
};
300306

@@ -326,6 +332,7 @@ const shadowTLSParser = (proxy = {}) => {
326332
throw '端口值非法';
327333
if (proxy['fast-open'] === true) stPart.udp_fragment = true;
328334
tfoParser(proxy, stPart);
335+
detourParser(proxy, stPart);
329336
smuxParser(proxy.smux, ssPart);
330337
return { type: 'ss-with-st', ssPart, stPart };
331338
};
@@ -344,6 +351,7 @@ const ssParser = (proxy = {}) => {
344351
if (proxy['udp-over-tcp']) parsedProxy.udp_over_tcp = true;
345352
if (proxy['fast-open']) parsedProxy.udp_fragment = true;
346353
tfoParser(proxy, parsedProxy);
354+
detourParser(proxy, parsedProxy);
347355
smuxParser(proxy.smux, parsedProxy);
348356
if (proxy.plugin) {
349357
const optArr = [];
@@ -421,6 +429,7 @@ const ssrParser = (proxy = {}) => {
421429
parsedProxy.protocol_param = proxy['protocol-param'];
422430
if (proxy['fast-open']) parsedProxy.udp_fragment = true;
423431
tfoParser(proxy, parsedProxy);
432+
detourParser(proxy, parsedProxy);
424433
smuxParser(proxy.smux, parsedProxy);
425434
return parsedProxy;
426435
};
@@ -457,6 +466,7 @@ const vmessParser = (proxy = {}) => {
457466
if (proxy.network === 'grpc') grpcParser(proxy, parsedProxy);
458467

459468
tfoParser(proxy, parsedProxy);
469+
detourParser(proxy, parsedProxy);
460470
tlsParser(proxy, parsedProxy);
461471
smuxParser(proxy.smux, parsedProxy);
462472
return parsedProxy;
@@ -479,6 +489,7 @@ const vlessParser = (proxy = {}) => {
479489
if (proxy.network === 'grpc') grpcParser(proxy, parsedProxy);
480490

481491
tfoParser(proxy, parsedProxy);
492+
detourParser(proxy, parsedProxy);
482493
smuxParser(proxy.smux, parsedProxy);
483494
tlsParser(proxy, parsedProxy);
484495
return parsedProxy;
@@ -499,6 +510,7 @@ const trojanParser = (proxy = {}) => {
499510
if (proxy.network === 'ws') wsParser(proxy, parsedProxy);
500511

501512
tfoParser(proxy, parsedProxy);
513+
detourParser(proxy, parsedProxy);
502514
tlsParser(proxy, parsedProxy);
503515
smuxParser(proxy.smux, parsedProxy);
504516
return parsedProxy;
@@ -545,6 +557,7 @@ const hysteriaParser = (proxy = {}) => {
545557
}
546558
}
547559
tlsParser(proxy, parsedProxy);
560+
detourParser(proxy, parsedProxy);
548561
tfoParser(proxy, parsedProxy);
549562
smuxParser(proxy.smux, parsedProxy);
550563
return parsedProxy;
@@ -569,6 +582,7 @@ const hysteria2Parser = (proxy = {}) => {
569582
if (!parsedProxy.obfs.type) delete parsedProxy.obfs;
570583
tlsParser(proxy, parsedProxy);
571584
tfoParser(proxy, parsedProxy);
585+
detourParser(proxy, parsedProxy);
572586
smuxParser(proxy.smux, parsedProxy);
573587
return parsedProxy;
574588
};
@@ -597,6 +611,7 @@ const tuic5Parser = (proxy = {}) => {
597611
if (proxy['heartbeat-interval'])
598612
parsedProxy.heartbeat = `${proxy['heartbeat-interval']}ms`;
599613
tfoParser(proxy, parsedProxy);
614+
detourParser(proxy, parsedProxy);
600615
tlsParser(proxy, parsedProxy);
601616
smuxParser(proxy.smux, parsedProxy);
602617
return parsedProxy;
@@ -650,6 +665,7 @@ const wireguardParser = (proxy = {}) => {
650665
}
651666
}
652667
tfoParser(proxy, parsedProxy);
668+
detourParser(proxy, parsedProxy);
653669
smuxParser(proxy.smux, parsedProxy);
654670
return parsedProxy;
655671
};
@@ -789,6 +805,7 @@ export default function singbox_Producer() {
789805
$.error(e.message ?? e);
790806
}
791807
});
808+
792809
return type === 'internal'
793810
? list
794811
: JSON.stringify({ outbounds: list }, null, 2);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,12 @@ export default function Stash_Producer() {
242242
proxy.fingerprint = proxy['tls-fingerprint'];
243243
}
244244
delete proxy['tls-fingerprint'];
245+
246+
if (proxy['underlying-proxy']) {
247+
proxy['dialer-proxy'] = proxy['underlying-proxy'];
248+
}
249+
delete proxy['underlying-proxy'];
250+
245251
if (isPresent(proxy, 'tls') && typeof proxy.tls !== 'boolean') {
246252
delete proxy.tls;
247253
}

0 commit comments

Comments
 (0)