402-announce 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/announce.js +15 -6
- package/build/announce.js.map +1 -1
- package/build/event.js +24 -2
- package/build/event.js.map +1 -1
- package/build/utils.d.ts +14 -2
- package/build/utils.js +152 -22
- package/build/utils.js.map +1 -1
- package/package.json +1 -1
package/build/announce.js
CHANGED
|
@@ -20,6 +20,9 @@ export async function announceService(config) {
|
|
|
20
20
|
if (relays.length === 0) {
|
|
21
21
|
throw new Error('At least one relay URL is required');
|
|
22
22
|
}
|
|
23
|
+
if (relays.length > 50) {
|
|
24
|
+
throw new Error('Too many relays (maximum 50)');
|
|
25
|
+
}
|
|
23
26
|
for (const url of relays) {
|
|
24
27
|
if (!/^wss?:\/\//i.test(url)) {
|
|
25
28
|
throw new Error(`Invalid relay URL: ${url} — must start with wss:// or ws://`);
|
|
@@ -32,6 +35,9 @@ export async function announceService(config) {
|
|
|
32
35
|
catch {
|
|
33
36
|
throw new Error(`Invalid relay URL: ${url}`);
|
|
34
37
|
}
|
|
38
|
+
if (parsed.username || parsed.password) {
|
|
39
|
+
throw new Error(`Relay URL must not contain credentials: ${url}`);
|
|
40
|
+
}
|
|
35
41
|
if (isPrivateHost(parsed.hostname)) {
|
|
36
42
|
throw new Error(`Relay URL points to a private/loopback address: ${url}`);
|
|
37
43
|
}
|
|
@@ -52,12 +58,15 @@ export async function announceService(config) {
|
|
|
52
58
|
// preventing the connection from leaking in the background.
|
|
53
59
|
const connectPromise = Relay.connect(url);
|
|
54
60
|
let timedOut = false;
|
|
61
|
+
let timerId;
|
|
55
62
|
const relay = await Promise.race([
|
|
56
|
-
connectPromise,
|
|
57
|
-
new Promise((_, reject) =>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
connectPromise.then((r) => { clearTimeout(timerId); return r; }),
|
|
64
|
+
new Promise((_, reject) => {
|
|
65
|
+
timerId = setTimeout(() => {
|
|
66
|
+
timedOut = true;
|
|
67
|
+
reject(new Error(`Relay connection timeout: ${url}`));
|
|
68
|
+
}, 10_000);
|
|
69
|
+
}),
|
|
61
70
|
]).catch(async (err) => {
|
|
62
71
|
// If the timeout fired, wait for the connect promise to settle so we
|
|
63
72
|
// can close any relay that connected after the deadline.
|
|
@@ -72,7 +81,7 @@ export async function announceService(config) {
|
|
|
72
81
|
}));
|
|
73
82
|
for (const result of results) {
|
|
74
83
|
if (result.status === 'rejected') {
|
|
75
|
-
console.warn(`[402-announce] Failed to publish
|
|
84
|
+
console.warn(`[402-announce] Failed to publish: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`);
|
|
76
85
|
}
|
|
77
86
|
}
|
|
78
87
|
if (accepted === 0) {
|
package/build/announce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG1C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAsB;IAC1D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAEpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,oCAAoC,CAAC,CAAA;QAChF,CAAC;QAED,2DAA2D;QAC3D,IAAI,MAAW,CAAA;QACf,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;QAC9C,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,mCAAmC;QACnC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CACV,oDAAoD,GAAG,6BAA6B,CACrF,CAAA;QACH,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAEnD,4CAA4C;IAC5C,MAAM,eAAe,GAAiC,EAAE,CAAA;IACxD,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,gFAAgF;QAChF,+EAA+E;QAC/E,+EAA+E;QAC/E,4DAA4D;QAC5D,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAEzC,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC/B,cAAc;
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../src/announce.ts"],"names":[],"mappings":"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"}
|
package/build/event.js
CHANGED
|
@@ -15,7 +15,8 @@ export function buildAnnounceEvent(secretKeyHex, config) {
|
|
|
15
15
|
if (!/^[0-9a-f]{64}$/i.test(secretKeyHex)) {
|
|
16
16
|
throw new Error('secretKey must be a 64-character hex string');
|
|
17
17
|
}
|
|
18
|
-
// M1: Validate url field
|
|
18
|
+
// M1: Validate url field (scheme only — this function serialises the URL
|
|
19
|
+
// into event tags without performing network I/O, so private hosts are allowed)
|
|
19
20
|
if (!config.url.startsWith('http://') && !config.url.startsWith('https://')) {
|
|
20
21
|
throw new Error('config.url must start with http:// or https://');
|
|
21
22
|
}
|
|
@@ -32,6 +33,23 @@ export function buildAnnounceEvent(secretKeyHex, config) {
|
|
|
32
33
|
if (config.identifier.length > 256) {
|
|
33
34
|
throw new Error('config.identifier must not exceed 256 characters');
|
|
34
35
|
}
|
|
36
|
+
// Tag field length limits
|
|
37
|
+
if (config.name.length > 256) {
|
|
38
|
+
throw new Error('config.name must not exceed 256 characters');
|
|
39
|
+
}
|
|
40
|
+
if (config.about.length > 4096) {
|
|
41
|
+
throw new Error('config.about must not exceed 4096 characters');
|
|
42
|
+
}
|
|
43
|
+
if (config.topics) {
|
|
44
|
+
if (config.topics.length > 50) {
|
|
45
|
+
throw new Error('config.topics must not exceed 50 entries');
|
|
46
|
+
}
|
|
47
|
+
for (const topic of config.topics) {
|
|
48
|
+
if (topic.length > 64) {
|
|
49
|
+
throw new Error(`config.topics entry must not exceed 64 characters, got: "${topic.slice(0, 20)}..."`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
35
53
|
// M3: Validate all pricing entries
|
|
36
54
|
for (const p of config.pricing) {
|
|
37
55
|
if (!Number.isFinite(p.price) || p.price < 0) {
|
|
@@ -67,10 +85,14 @@ export function buildAnnounceEvent(secretKeyHex, config) {
|
|
|
67
85
|
if (config.version) {
|
|
68
86
|
contentObj.version = config.version;
|
|
69
87
|
}
|
|
88
|
+
const content = JSON.stringify(contentObj);
|
|
89
|
+
if (Buffer.byteLength(content, 'utf8') > 65_536) {
|
|
90
|
+
throw new Error('Event content exceeds maximum size (64 KiB)');
|
|
91
|
+
}
|
|
70
92
|
const event = finalizeEvent({
|
|
71
93
|
kind: L402_ANNOUNCE_KIND,
|
|
72
94
|
tags,
|
|
73
|
-
content
|
|
95
|
+
content,
|
|
74
96
|
created_at: Math.floor(Date.now() / 1000),
|
|
75
97
|
}, sk);
|
|
76
98
|
return event;
|
package/build/event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,MAAsC;IAEtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
|
package/build/utils.d.ts
CHANGED
|
@@ -4,14 +4,26 @@ export declare function hexToBytes(hex: string): Uint8Array;
|
|
|
4
4
|
* RFC-1918 private address. Used to prevent SSRF via relay URLs.
|
|
5
5
|
*
|
|
6
6
|
* Rejects:
|
|
7
|
-
* - localhost
|
|
7
|
+
* - localhost, localhost., *.localhost
|
|
8
8
|
* - 127.0.0.0/8 (IPv4 loopback)
|
|
9
|
+
* - 0.0.0.0/8 (RFC 1122 "this network")
|
|
9
10
|
* - ::1 (IPv6 loopback)
|
|
10
|
-
* -
|
|
11
|
+
* - :: (IPv6 unspecified)
|
|
11
12
|
* - 169.254.0.0/16 (IPv4 link-local)
|
|
12
13
|
* - fe80::/10 (IPv6 link-local)
|
|
14
|
+
* - fc00::/7 (IPv6 unique-local / ULA)
|
|
13
15
|
* - 10.0.0.0/8 (RFC-1918)
|
|
14
16
|
* - 172.16.0.0/12 (RFC-1918)
|
|
15
17
|
* - 192.168.0.0/16 (RFC-1918)
|
|
18
|
+
* - ::ffff:<private> (IPv4-mapped IPv6)
|
|
19
|
+
* - ::<private> (IPv4-compatible IPv6, deprecated)
|
|
20
|
+
*
|
|
21
|
+
* Also rejects octal, hex, and shorthand IPv4 notations that could
|
|
22
|
+
* bypass naive decimal-only checks.
|
|
23
|
+
*
|
|
24
|
+
* Note: This checks the hostname string only. It does not perform DNS
|
|
25
|
+
* resolution, so a hostname that resolves to a private IP at connection
|
|
26
|
+
* time (DNS rebinding) is not caught. Deploy behind network-level
|
|
27
|
+
* egress controls in production.
|
|
16
28
|
*/
|
|
17
29
|
export declare function isPrivateHost(hostname: string): boolean;
|
package/build/utils.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export function hexToBytes(hex) {
|
|
2
|
+
if (hex.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(hex)) {
|
|
3
|
+
throw new Error('hexToBytes: input must be an even-length hex string');
|
|
4
|
+
}
|
|
2
5
|
const bytes = new Uint8Array(hex.length / 2);
|
|
3
6
|
for (let i = 0; i < hex.length; i += 2) {
|
|
4
7
|
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
@@ -10,45 +13,172 @@ export function hexToBytes(hex) {
|
|
|
10
13
|
* RFC-1918 private address. Used to prevent SSRF via relay URLs.
|
|
11
14
|
*
|
|
12
15
|
* Rejects:
|
|
13
|
-
* - localhost
|
|
16
|
+
* - localhost, localhost., *.localhost
|
|
14
17
|
* - 127.0.0.0/8 (IPv4 loopback)
|
|
18
|
+
* - 0.0.0.0/8 (RFC 1122 "this network")
|
|
15
19
|
* - ::1 (IPv6 loopback)
|
|
16
|
-
* -
|
|
20
|
+
* - :: (IPv6 unspecified)
|
|
17
21
|
* - 169.254.0.0/16 (IPv4 link-local)
|
|
18
22
|
* - fe80::/10 (IPv6 link-local)
|
|
23
|
+
* - fc00::/7 (IPv6 unique-local / ULA)
|
|
19
24
|
* - 10.0.0.0/8 (RFC-1918)
|
|
20
25
|
* - 172.16.0.0/12 (RFC-1918)
|
|
21
26
|
* - 192.168.0.0/16 (RFC-1918)
|
|
27
|
+
* - ::ffff:<private> (IPv4-mapped IPv6)
|
|
28
|
+
* - ::<private> (IPv4-compatible IPv6, deprecated)
|
|
29
|
+
*
|
|
30
|
+
* Also rejects octal, hex, and shorthand IPv4 notations that could
|
|
31
|
+
* bypass naive decimal-only checks.
|
|
32
|
+
*
|
|
33
|
+
* Note: This checks the hostname string only. It does not perform DNS
|
|
34
|
+
* resolution, so a hostname that resolves to a private IP at connection
|
|
35
|
+
* time (DNS rebinding) is not caught. Deploy behind network-level
|
|
36
|
+
* egress controls in production.
|
|
22
37
|
*/
|
|
23
38
|
export function isPrivateHost(hostname) {
|
|
24
39
|
const h = hostname.toLowerCase();
|
|
25
|
-
// Reject
|
|
26
|
-
if (h === 'localhost')
|
|
40
|
+
// Reject localhost, localhost., *.localhost, *.localhost.
|
|
41
|
+
if (h === 'localhost' || h === 'localhost.')
|
|
27
42
|
return true;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
if (h.endsWith('.localhost') || h.endsWith('.localhost.'))
|
|
44
|
+
return true;
|
|
45
|
+
// Strip IPv6 brackets and zone IDs (e.g. [::1%25eth0] → ::1)
|
|
46
|
+
const stripped = h.replace(/^\[|\]$/g, '').replace(/%.*$/, '');
|
|
47
|
+
// IPv6 loopback ::1 and unspecified ::
|
|
48
|
+
if (stripped === '::1' || stripped === '::')
|
|
31
49
|
return true;
|
|
32
50
|
// IPv6 link-local fe80::/10 (prefix fe80 through febf)
|
|
33
51
|
if (/^fe[89ab][0-9a-f]:/i.test(stripped))
|
|
34
52
|
return true;
|
|
35
|
-
//
|
|
36
|
-
|
|
53
|
+
// IPv6 unique-local fc00::/7 (fc00:: through fdff::)
|
|
54
|
+
if (/^f[cd][0-9a-f]{2}:/i.test(stripped))
|
|
55
|
+
return true;
|
|
56
|
+
// Expand :: compression so prefix checks work on all forms
|
|
57
|
+
const expanded = expandIPv6(stripped);
|
|
58
|
+
if (expanded) {
|
|
59
|
+
// 6to4 (2002::/16) — embeds IPv4 in bits 16–47: 2002:AABB:CCDD::
|
|
60
|
+
const sixToFour = expanded.match(/^2002:([0-9a-f]{4}):([0-9a-f]{4}):/i);
|
|
61
|
+
if (sixToFour) {
|
|
62
|
+
const hi = parseInt(sixToFour[1], 16);
|
|
63
|
+
const lo = parseInt(sixToFour[2], 16);
|
|
64
|
+
const ip = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
|
|
65
|
+
return isPrivateIPv4(ip);
|
|
66
|
+
}
|
|
67
|
+
// Teredo (2001:0000::/32) — block the entire prefix rather than decode
|
|
68
|
+
if (expanded.startsWith('2001:0000:'))
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
// IPv4-mapped IPv6 — ::ffff:x.x.x.x or ::ffff:HHHH:HHHH
|
|
72
|
+
const v4mapped = stripped.match(/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i);
|
|
73
|
+
if (v4mapped) {
|
|
74
|
+
return isPrivateIPv4(v4mapped[1]);
|
|
75
|
+
}
|
|
76
|
+
// ::ffff:HHHH:HHHH form (e.g. ::ffff:7f00:1 = 127.0.0.1)
|
|
77
|
+
const v4mappedHex = stripped.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
|
|
78
|
+
if (v4mappedHex) {
|
|
79
|
+
const hi = parseInt(v4mappedHex[1], 16);
|
|
80
|
+
const lo = parseInt(v4mappedHex[2], 16);
|
|
81
|
+
const ip = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
|
|
82
|
+
return isPrivateIPv4(ip);
|
|
83
|
+
}
|
|
84
|
+
// IPv4-compatible IPv6 (deprecated) — ::x.x.x.x
|
|
85
|
+
const v4compat = stripped.match(/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
|
|
86
|
+
if (v4compat) {
|
|
87
|
+
return isPrivateIPv4(v4compat[1]);
|
|
88
|
+
}
|
|
89
|
+
// Reject non-decimal IPv4 notations that could bypass checks:
|
|
90
|
+
// - Octal (leading zero): 0177.0.0.1
|
|
91
|
+
// - Hex: 0x7f.0.0.1 or 0x7f000001
|
|
92
|
+
// - Shorthand: 127.1 (two-part), 127.0.1 (three-part)
|
|
93
|
+
// - Decimal integer: 2130706433
|
|
94
|
+
// These are all valid in some URL parsers / OS network stacks.
|
|
95
|
+
// Reject hex IPv4 literals (e.g. 0x7f000001 or 0x7f.0.0.1) but NOT
|
|
96
|
+
// legitimate DNS names with labels starting with 0x (e.g. 0xchat.example).
|
|
97
|
+
// A hex IPv4 has all dot-separated parts matching hex/numeric patterns.
|
|
98
|
+
if (/^0x/i.test(h)) {
|
|
99
|
+
const hexParts = h.split('.');
|
|
100
|
+
if (hexParts.every(p => /^(0x[0-9a-f]+|\d+)$/i.test(p)))
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
// Reject pure decimal integer IPs (e.g. 2130706433)
|
|
104
|
+
if (/^\d{1,10}$/.test(h) && !h.includes('.'))
|
|
105
|
+
return true;
|
|
106
|
+
// Reject shorthand IPv4 (2 or 3 parts instead of 4).
|
|
107
|
+
// Intentionally conservative: rejects ALL shorthand numeric forms, not just
|
|
108
|
+
// private ranges, because some OS stacks interpret e.g. 10.1 as 10.0.0.1.
|
|
109
|
+
// Single-part all-numeric is already handled above.
|
|
110
|
+
const parts = h.split('.');
|
|
111
|
+
if (parts.length >= 2 && parts.length <= 3 && parts.every(p => /^\d+$/.test(p)))
|
|
112
|
+
return true;
|
|
113
|
+
// Parse dotted-decimal IPv4 (exactly 4 numeric parts)
|
|
114
|
+
const ipv4 = h.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
|
37
115
|
if (ipv4) {
|
|
38
|
-
const [,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
return true; // 192.168.0.0/16
|
|
49
|
-
if (a === 169 && b === 254)
|
|
50
|
-
return true; // 169.254.0.0/16
|
|
116
|
+
const rawOctets = [ipv4[1], ipv4[2], ipv4[3], ipv4[4]];
|
|
117
|
+
// Reject leading zeros (octal notation bypass: 0177 = 127)
|
|
118
|
+
for (const octet of rawOctets) {
|
|
119
|
+
if (octet.length > 1 && octet.startsWith('0'))
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
// Reject out-of-range octets (not valid decimal IPv4)
|
|
123
|
+
if (rawOctets.some(o => Number(o) > 255))
|
|
124
|
+
return false;
|
|
125
|
+
return isPrivateIPv4(h);
|
|
51
126
|
}
|
|
52
127
|
return false;
|
|
53
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Expand a compressed IPv6 address to its full 8-group form.
|
|
131
|
+
* Returns null if the input is not a valid IPv6 address.
|
|
132
|
+
*/
|
|
133
|
+
function expandIPv6(addr) {
|
|
134
|
+
// Reject if it contains a dotted-quad suffix (IPv4-mapped/compatible handled separately)
|
|
135
|
+
if (/\d+\.\d+\.\d+\.\d+/.test(addr))
|
|
136
|
+
return null;
|
|
137
|
+
const halves = addr.split('::');
|
|
138
|
+
if (halves.length > 2)
|
|
139
|
+
return null;
|
|
140
|
+
let groups;
|
|
141
|
+
if (halves.length === 2) {
|
|
142
|
+
const left = halves[0] ? halves[0].split(':') : [];
|
|
143
|
+
const right = halves[1] ? halves[1].split(':') : [];
|
|
144
|
+
const missing = 8 - left.length - right.length;
|
|
145
|
+
if (missing < 0)
|
|
146
|
+
return null;
|
|
147
|
+
groups = [...left, ...Array(missing).fill('0'), ...right];
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
groups = addr.split(':');
|
|
151
|
+
}
|
|
152
|
+
if (groups.length !== 8)
|
|
153
|
+
return null;
|
|
154
|
+
if (!groups.every(g => /^[0-9a-f]{1,4}$/i.test(g)))
|
|
155
|
+
return null;
|
|
156
|
+
return groups.map(g => g.padStart(4, '0')).join(':');
|
|
157
|
+
}
|
|
158
|
+
/** Check a strict decimal dotted-quad IPv4 against private ranges. */
|
|
159
|
+
function isPrivateIPv4(ip) {
|
|
160
|
+
const parts = ip.split('.').map(Number);
|
|
161
|
+
if (parts.length !== 4 || parts.some(p => isNaN(p) || p < 0 || p > 255))
|
|
162
|
+
return false;
|
|
163
|
+
const [a, b] = parts;
|
|
164
|
+
if (a === 0)
|
|
165
|
+
return true; // 0.0.0.0/8
|
|
166
|
+
if (a === 127)
|
|
167
|
+
return true; // 127.0.0.0/8
|
|
168
|
+
if (a === 10)
|
|
169
|
+
return true; // 10.0.0.0/8
|
|
170
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
171
|
+
return true; // 172.16.0.0/12
|
|
172
|
+
if (a === 192 && b === 168)
|
|
173
|
+
return true; // 192.168.0.0/16
|
|
174
|
+
if (a === 169 && b === 254)
|
|
175
|
+
return true; // 169.254.0.0/16
|
|
176
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
177
|
+
return true; // 100.64.0.0/10 (CGNAT / shared address space, RFC 6598)
|
|
178
|
+
if (a >= 240)
|
|
179
|
+
return true; // 240.0.0.0/4 (reserved) + 255.255.255.255 (broadcast)
|
|
180
|
+
if (a === 198 && (b === 18 || b === 19))
|
|
181
|
+
return true; // 198.18.0.0/15 (benchmarking, RFC 2544)
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
54
184
|
//# sourceMappingURL=utils.js.map
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED