Skip to content

Commit d12e9ef

Browse files
authored
fix: match ip6 zones and ip cidr in ip matchers (#61)
Support including ip6 zones and cidr blocks in ip6 and ip4/6 addresses
1 parent 528b09d commit d12e9ef

File tree

3 files changed

+27
-10
lines changed

3 files changed

+27
-10
lines changed

src/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
* ```
3333
*/
3434

35-
import { CODE_P2P, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_DNS, CODE_IP4, CODE_IP6, CODE_TCP, CODE_UDP, CODE_QUIC, CODE_QUIC_V1, CODE_WS, CODE_WSS, CODE_TLS, CODE_SNI, CODE_WEBRTC_DIRECT, CODE_CERTHASH, CODE_WEBTRANSPORT, CODE_P2P_CIRCUIT, CODE_WEBRTC, CODE_HTTP, CODE_UNIX, CODE_HTTPS, CODE_MEMORY } from '@multiformats/multiaddr'
35+
import { CODE_P2P, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_DNS, CODE_IP4, CODE_IP6, CODE_TCP, CODE_UDP, CODE_QUIC, CODE_QUIC_V1, CODE_WS, CODE_WSS, CODE_TLS, CODE_SNI, CODE_WEBRTC_DIRECT, CODE_CERTHASH, CODE_WEBTRANSPORT, CODE_P2P_CIRCUIT, CODE_WEBRTC, CODE_HTTP, CODE_UNIX, CODE_HTTPS, CODE_MEMORY, CODE_IP6ZONE, CODE_IPCIDR } from '@multiformats/multiaddr'
3636
import { and, or, optional, fmt, code, value } from './utils.js'
3737
import type { Multiaddr, Component } from '@multiformats/multiaddr'
3838

@@ -159,8 +159,15 @@ export const DNSADDR = fmt(_DNSADDR, optional(value(CODE_P2P)))
159159
*/
160160
export const DNS = fmt(or(_DNS, _DNSADDR, _DNS4, _DNS6), optional(value(CODE_P2P)))
161161

162-
const _IP4 = value(CODE_IP4)
163-
const _IP6 = value(CODE_IP6)
162+
const _IP4 = and(
163+
value(CODE_IP4),
164+
optional(value(CODE_IPCIDR))
165+
)
166+
const _IP6 = and(
167+
optional(value(CODE_IP6ZONE)),
168+
value(CODE_IP6),
169+
optional(value(CODE_IPCIDR))
170+
)
164171
const _IP = or(_IP4, _IP6)
165172

166173
const _IP_OR_DOMAIN = or(_IP, _DNS, _DNS4, _DNS6, _DNSADDR)

src/utils.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ export const code = (code: number): Matcher => {
99
match: (vals) => {
1010
const component = vals[0]
1111

12-
if (component?.code !== code) {
12+
if (component == null) {
13+
return false
14+
}
15+
16+
if (component.code !== code) {
17+
return false
18+
}
19+
20+
if (component.value != null) {
1321
return false
1422
}
1523

test/index.spec.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,19 @@ describe('multiaddr matcher', () => {
2828
const exactIP = [
2929
'/ip4/0.0.0.0',
3030
'/ip6/fc00::',
31-
'/ip6/fe80::8cb1:25ff:fec5:28e3'
32-
// https://github.com/ChainSafe/is-ip/issues/9
33-
// '/ip6/fe80::8cb1:25ff:fec5:28e3%llw0'
31+
'/ip6/fe80::8cb1:25ff:fec5:28e3',
32+
'/ip6/fe80::1cc1:a3b8:322f:cf22/ipcidr/24',
33+
'/ip6zone/utun0/ip6/fe80::1cc1:a3b8:322f:cf22',
34+
'/ip6zone/llw0/ip6/fe80::1cc1:a3b8:322f:cf22/ipcidr/24'
3435
]
3536

3637
const goodIP = [
3738
...exactIP,
3839
'/ip4/123.123.123.123/tcp/80',
39-
'/ip6/fe80::1cc1:a3b8:322f:cf22/udp/4921/wss'
40-
// https://github.com/ChainSafe/is-ip/issues/9
41-
// '/ip6/fe80::1cc1:a3b8:322f:cf22%utun0/udp/4921/wss'
40+
'/ip6/fe80::1cc1:a3b8:322f:cf22/udp/4921/wss',
41+
'/ip6/fe80::1cc1:a3b8:322f:cf22/ipcidr/24/tcp/1234/tls/ws',
42+
'/ip6zone/utun0/ip6/fe80::1cc1:a3b8:322f:cf22/udp/4921',
43+
'/ip6zone/llw0/ip6/fe80::1cc1:a3b8:322f:cf22/ipcidr/24/udp/4921'
4244
]
4345

4446
const badIP = [

0 commit comments

Comments
 (0)