From a0c1bbbf70e0bad2095fea7aa599e92be171fa1b Mon Sep 17 00:00:00 2001 From: xream Date: Thu, 18 Jul 2024 19:42:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9F=9F=E5=90=8D=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D;=20=E7=BB=93=E6=9E=9C=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?=5FIP4P=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- .../src/core/proxy-utils/processors/index.js | 36 +++++++++++-------- scripts/demo.js | 2 +- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/backend/package.json b/backend/package.json index 540d0ccb6..dfdae602d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.349", + "version": "2.14.350", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/processors/index.js b/backend/src/core/proxy-utils/processors/index.js index a49944b44..20f833cb5 100644 --- a/backend/src/core/proxy-utils/processors/index.js +++ b/backend/src/core/proxy-utils/processors/index.js @@ -360,14 +360,10 @@ function ScriptOperator(script, targetPlatform, $arguments, source) { }; } -function parseIP4P(ip) { +function parseIP4P(IP4P) { let server; let port; try { - const IP4P = new ipAddress.Address6(ip).correctForm(); - if (!/^2001::[^:]+:[^:]+:[^:]+$/.test(IP4P)) { - throw new Error(`Invalid IP4P: ${IP4P}`); - } let array = IP4P.split(':'); port = parseInt(array[2], 16); @@ -623,7 +619,7 @@ function ResolveDomainOperator({ if (!p['_no-resolve']) { if (results[p.server]) { p._resolved_ips = results[p.server]; - const ip = Array.isArray(results[p.server]) + let ip = Array.isArray(results[p.server]) ? results[p.server][ Math.floor( Math.random() * results[p.server].length, @@ -631,18 +627,30 @@ function ResolveDomainOperator({ ] : results[p.server]; if (type === 'IPv6' && isIPv6(ip)) { - const { server, port } = parseIP4P(ip); - if (server && port) { + ip = new ipAddress.Address6(ip).correctForm(); + if (/^2001::[^:]+:[^:]+:[^:]+$/.test(ip)) { + const { server, port } = parseIP4P(ip); + if (server && port) { + p._domain = p.server; + p.server = server; + p.port = port; + p.resolved = true; + p._IPv4 = p.server; + p._IP4P = ip; + if (!isIP(p._IP)) { + p._IP = p.server; + } + } else if (!p.resolved) { + p.resolved = false; + } + } else { p._domain = p.server; - p.server = server; - p.port = port; + p.server = ip; p.resolved = true; - p._IPv4 = p.server; + p[`_${type}`] = p.server; if (!isIP(p._IP)) { p._IP = p.server; } - } else { - p.resolved = false; } } else { p._domain = p.server; @@ -653,7 +661,7 @@ function ResolveDomainOperator({ p._IP = p.server; } } - } else { + } else if (!p.resolved) { p.resolved = false; } } diff --git a/scripts/demo.js b/scripts/demo.js index fbfd7c39e..3b2d48a24 100644 --- a/scripts/demo.js +++ b/scripts/demo.js @@ -8,7 +8,7 @@ function operator(proxies = [], targetPlatform, context) { // 0. 结构大致参考了 Clash.Meta(mihomo), 可参考 mihomo 的文档, 例如 `xudp`, `smux` 都可以自己设置. 但是有私货, 下面是我能想起来的一些私货 // 1. `_no-resolve` 为不解析域名 // 2. 域名解析后 会多一个 `_resolved` 字段, 表示是否解析成功 - // 3. 域名解析后会有`_IPv4`, `_IPv6`, `_IP`(若有多个步骤, 只取第一次成功的 v4 或 v6 数据), `_domain` 字段, `_resolved_ips` 为解析出的所有 IP + // 3. 域名解析后会有`_IPv4`, `_IPv6`, `_IP`(若有多个步骤, 只取第一次成功的 v4 或 v6 数据), `_IP4P`(若解析类型为 IPv6 且符合 IP4P 类型, 将自动转换), `_domain` 字段, `_resolved_ips` 为解析出的所有 IP // 4. 节点字段 `exec` 为 `ssr-local` 路径, 默认 `/usr/local/bin/ssr-local`; 端口从 10000 开始递增(暂不支持配置) // 5. `_subName` 为单条订阅名 // 6. `_collectionName` 为组合订阅名