diff --git a/backend/package.json b/backend/package.json index f609054..a7aee34 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.28", + "version": "2.14.29", "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/index.js b/backend/src/core/proxy-utils/parsers/index.js index 5d8627d..a8708ec 100644 --- a/backend/src/core/proxy-utils/parsers/index.js +++ b/backend/src/core/proxy-utils/parsers/index.js @@ -503,6 +503,113 @@ function Loon_Http() { return { name, test, parse }; } +function Loon_WireGuard() { + const name = 'Loon WireGuard Parser'; + const test = (line) => { + return /^.*=\s*wireguard/i.test(line.split(',')[0]); + }; + + const parse = (line) => { + const name = line.match( + /(^.*?)\s*?=\s*?wireguard\s*?,.+?\s*?=\s*?.+?/i, + )?.[1]; + line = line.replace(name, '').replace(/^\s*?=\s*?wireguard\s*/i, ''); + let peers = line.match( + /,\s*?peers\s*?=\s*?\[\s*?\{\s*?(.+?)\s*?\}\s*?\]/i, + )?.[1]; + let serverPort = peers.match( + /(,|^)\s*?endpoint\s*?=\s*?"?(.+?):(\d+)"?\s*?(,|$)/i, + ); + let server = serverPort?.[2]; + let port = parseInt(serverPort?.[3], 10); + let mtu = line.match(/(,|^)\s*?mtu\s*?=\s*?"?(\d+?)"?\s*?(,|$)/i)?.[2]; + if (mtu) { + mtu = parseInt(mtu, 10); + } + let keepalive = line.match( + /(,|^)\s*?keepalive\s*?=\s*?"?(\d+?)"?\s*?(,|$)/i, + )?.[2]; + if (keepalive) { + keepalive = parseInt(keepalive, 10); + } + let reserved = peers.match( + /(,|^)\s*?reserved\s*?=\s*?"?(\[\s*?.+?\s*?\])"?\s*?(,|$)/i, + )?.[2]; + if (reserved) { + reserved = JSON.parse(reserved); + } + + let dns; + let dnsv4 = line.match(/(,|^)\s*?dns\s*?=\s*?"?(.+?)"?\s*?(,|$)/i)?.[2]; + let dnsv6 = line.match( + /(,|^)\s*?dnsv6\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + if (dnsv4 || dnsv6) { + dns = []; + if (dnsv4) { + dns.push(dnsv4); + } + if (dnsv6) { + dns.push(dnsv6); + } + } + let allowedIps = peers + .match(/(,|^)\s*?allowed-ips\s*?=\s*?"(.+?)"\s*?(,|$)/i)?.[2] + ?.split(',') + .map((i) => i.trim()); + let preSharedKey = peers.match( + /(,|^)\s*?preshared-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let ip = line.match( + /(,|^)\s*?interface-ip\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let ipv6 = line.match( + /(,|^)\s*?interface-ipv6\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + let publicKey = peers.match( + /(,|^)\s*?public-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2]; + const proxy = { + type: 'wireguard', + name, + server, + port, + ip, + ipv6, + 'private-key': line.match( + /(,|^)\s*?private-key\s*?=\s*?"?(.+?)"?\s*?(,|$)/i, + )?.[2], + 'public-key': publicKey, + mtu, + keepalive, + reserved, + 'allowed-ips': allowedIps, + 'preshared-key': preSharedKey, + dns, + udp: true, + peers: [ + { + server, + port, + ip, + ipv6, + 'public-key': publicKey, + 'pre-shared-key': preSharedKey, + allowed_ips: allowedIps, + reserved, + }, + ], + }; + + proxy; + if (Array.isArray(proxy.dns) && proxy.dns.length > 0) { + proxy['remote-dns-resolve'] = true; + } + return proxy; + }; + return { name, test, parse }; +} + function Surge_SS() { const name = 'Surge SS Parser'; const test = (line) => { @@ -588,6 +695,7 @@ export default [ Loon_Vless(), Loon_Trojan(), Loon_Http(), + Loon_WireGuard(), QX_SS(), QX_SSR(), QX_VMess(), diff --git a/backend/src/core/proxy-utils/producers/clash.js b/backend/src/core/proxy-utils/producers/clash.js index fc6d34a..6e46050 100644 --- a/backend/src/core/proxy-utils/producers/clash.js +++ b/backend/src/core/proxy-utils/producers/clash.js @@ -58,6 +58,9 @@ export default function Clash_Producer() { proxy.keepalive = proxy.keepalive ?? proxy['persistent-keepalive']; proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; } if ( diff --git a/backend/src/core/proxy-utils/producers/loon.js b/backend/src/core/proxy-utils/producers/loon.js index 0e77db4..5956ec7 100644 --- a/backend/src/core/proxy-utils/producers/loon.js +++ b/backend/src/core/proxy-utils/producers/loon.js @@ -282,7 +282,7 @@ function wireguard(proxy) { proxy.ip = proxy.peers[0].ip; proxy.ipv6 = proxy.peers[0].ipv6; proxy['public-key'] = proxy.peers[0]['public-key']; - proxy['pre-shared-key'] = proxy.peers[0]['pre-shared-key']; + proxy['preshared-key'] = proxy.peers[0]['pre-shared-key']; proxy['allowed-ips'] = proxy.peers[0]['allowed_ips']; proxy.reserved = proxy.peers[0].reserved; } @@ -320,13 +320,13 @@ function wireguard(proxy) { if (reserved) { reserved = `,reserved=[${reserved}]`; } - let presharedKey = proxy['pre-shared-key']; + let presharedKey = proxy['preshared-key'] ?? proxy['pre-shared-key']; if (presharedKey) { presharedKey = `,preshared-key="${presharedKey}"`; } result.append( `,peers=[{public-key="${proxy['public-key']}",allowed-ips="${ - allowedIps || '0.0.0.0/0,::/0' + allowedIps ?? '0.0.0.0/0,::/0' }",endpoint=${proxy.server}:${proxy.port}${reserved ?? ''}${ presharedKey ?? '' }}]`, diff --git a/backend/src/core/proxy-utils/producers/shadowrocket.js b/backend/src/core/proxy-utils/producers/shadowrocket.js index b7e4bfd..d6cbc2d 100644 --- a/backend/src/core/proxy-utils/producers/shadowrocket.js +++ b/backend/src/core/proxy-utils/producers/shadowrocket.js @@ -78,6 +78,9 @@ export default function Stash_Producer() { proxy.keepalive = proxy.keepalive ?? proxy['persistent-keepalive']; proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; } if ( diff --git a/backend/src/core/proxy-utils/producers/stash.js b/backend/src/core/proxy-utils/producers/stash.js index a742325..2896d5e 100644 --- a/backend/src/core/proxy-utils/producers/stash.js +++ b/backend/src/core/proxy-utils/producers/stash.js @@ -91,6 +91,9 @@ export default function Stash_Producer() { proxy.keepalive = proxy.keepalive ?? proxy['persistent-keepalive']; proxy['persistent-keepalive'] = proxy.keepalive; + proxy['preshared-key'] = + proxy['preshared-key'] ?? proxy['pre-shared-key']; + proxy['pre-shared-key'] = proxy['preshared-key']; } if (