Skip to content

Commit be7dbfe

Browse files
committed
feat: Egern 支持 VLESS REALITY(xtls-rprx-vision). 根据请求的 User-Agent 中的版本号自动开启, 或使用 includeUnsupportedProxy 参数或开启 包含官方/商店版不支持的协议 开关
1 parent b1cc4bd commit be7dbfe

3 files changed

Lines changed: 59 additions & 41 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.20.19",
3+
"version": "2.20.21",
44
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket.",
55
"main": "src/main.js",
66
"scripts": {

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ import { isPresent } from './utils';
22

33
export default function Egern_Producer() {
44
const type = 'ALL';
5-
const produce = (proxies, type) => {
5+
const produce = (proxies, type, opts = {}) => {
66
// https://egernapp.com/zh-CN/docs/configuration/proxies
77
const list = proxies
88
.filter((proxy) => {
9-
// if (opts['include-unsupported-proxy']) return true;
109
if (
1110
![
1211
'http',
@@ -60,8 +59,12 @@ export default function Egern_Producer() {
6059
!['http', 'ws', 'tcp'].includes(proxy.network) &&
6160
proxy.network) ||
6261
(proxy.type === 'vless' &&
63-
(typeof proxy.flow !== 'undefined' ||
64-
proxy['reality-opts'] ||
62+
((!opts['include-unsupported-proxy'] &&
63+
(typeof proxy.flow !== 'undefined' ||
64+
proxy['reality-opts'])) ||
65+
(opts['include-unsupported-proxy'] &&
66+
typeof proxy.flow !== 'undefined' &&
67+
proxy.flow !== 'xtls-rprx-vision') ||
6568
(!['http', 'ws', 'tcp'].includes(proxy.network) &&
6669
proxy.network))) ||
6770
(proxy.type === 'tuic' &&
@@ -74,6 +77,7 @@ export default function Egern_Producer() {
7477
})
7578
.map((proxy) => {
7679
const original = { ...proxy };
80+
let flow;
7781
if (proxy.tls && !proxy.sni) {
7882
proxy.sni = proxy.server;
7983
}
@@ -312,14 +316,27 @@ export default function Egern_Producer() {
312316
},
313317
};
314318
} else if (proxy.network === 'tcp' || !proxy.network) {
319+
let reality;
320+
if (
321+
proxy['reality-opts']?.['short-id'] ||
322+
proxy['reality-opts']?.['public-key']
323+
) {
324+
reality = {
325+
short_id: proxy['reality-opts']['short-id'],
326+
public_key: proxy['reality-opts']['public-key'],
327+
};
328+
}
315329
proxy.transport = {
316330
[proxy.tls ? 'tls' : 'tcp']: {
317331
sni: proxy.tls ? proxy.sni : undefined,
318332
skip_tls_verify: proxy.tls
319333
? proxy['skip-cert-verify']
320334
: undefined,
335+
reality,
321336
},
322337
};
338+
339+
flow = proxy.flow;
323340
}
324341
proxy = {
325342
type: 'vless',
@@ -333,6 +350,7 @@ export default function Egern_Producer() {
333350
proxy.udp || proxy.udp_relay || proxy.udp_relay,
334351
next_hop: proxy.next_hop,
335352
transport: proxy.transport,
353+
flow,
336354
// sni: proxy.sni,
337355
// skip_tls_verify: proxy['skip-cert-verify'],
338356
};

backend/src/utils/user-agent.js

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -61,41 +61,41 @@ export function getPlatformFromHeaders(headers) {
6161
return getPlatformFromUserAgent({ ua, UA, accept });
6262
}
6363
export function shouldIncludeUnsupportedProxy(platform, ua) {
64-
// try {
65-
// const target = getPlatformFromUserAgent({
66-
// UA: ua,
67-
// ua: ua.toLowerCase(),
68-
// });
69-
// if (!['Stash', 'Egern', 'Loon'].includes(target)) {
70-
// return false;
71-
// }
72-
// const coerceVersion = coerce(ua);
73-
// $.log(JSON.stringify(coerceVersion, null, 2));
74-
// const { version } = coerceVersion;
75-
// if (
76-
// platform === 'Stash' &&
77-
// target === 'Stash' &&
78-
// gte(version, '3.1.0')
79-
// ) {
80-
// return true;
81-
// }
82-
// if (
83-
// platform === 'Egern' &&
84-
// target === 'Egern' &&
85-
// gte(version, '1.29.0')
86-
// ) {
87-
// return true;
88-
// }
89-
// // Loon 的 UA 不规范, version 取出来是 build
90-
// if (
91-
// platform === 'Loon' &&
92-
// target === 'Loon' &&
93-
// gte(version, '842.0.0')
94-
// ) {
95-
// return true;
96-
// }
97-
// } catch (e) {
98-
// $.error(`获取版本号失败: ${e}`);
99-
// }
64+
try {
65+
const target = getPlatformFromUserAgent({
66+
UA: ua,
67+
ua: ua.toLowerCase(),
68+
});
69+
if (!['Egern'].includes(target)) {
70+
return false;
71+
}
72+
const coerceVersion = coerce(ua);
73+
$.log(JSON.stringify(coerceVersion, null, 2));
74+
const { version } = coerceVersion;
75+
// if (
76+
// platform === 'Stash' &&
77+
// target === 'Stash' &&
78+
// gte(version, '3.1.0')
79+
// ) {
80+
// return true;
81+
// }
82+
if (
83+
platform === 'Egern' &&
84+
target === 'Egern' &&
85+
gte(version, '2.7.0')
86+
) {
87+
return true;
88+
}
89+
// Loon 的 UA 不规范, version 取出来是 build
90+
// if (
91+
// platform === 'Loon' &&
92+
// target === 'Loon' &&
93+
// gte(version, '842.0.0')
94+
// ) {
95+
// return true;
96+
// }
97+
} catch (e) {
98+
$.error(`获取版本号失败: ${e}`);
99+
}
100100
return false;
101101
}

0 commit comments

Comments
 (0)