From e27747ab9c32b6f72b04bb24cbc51e95384c1747 Mon Sep 17 00:00:00 2001 From: Joel Gustafson Date: Wed, 7 Dec 2022 05:08:08 -0500 Subject: [PATCH] fix: treat /dns, /dns4, and /dns6 addrs as public (#406) Updates filtering rules to treat dns addresses as public. Closes #377 Co-authored-by: Alex Potsides --- src/utils.ts | 23 ++++++++++++++++++++++- test/kad-utils.spec.ts | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 7031c7ae..058d919f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -19,6 +19,16 @@ export function removePrivateAddresses (peer: PeerInfo): PeerInfo { multiaddrs: peer.multiaddrs.filter(multiaddr => { const [[type, addr]] = multiaddr.stringTuples() + // treat /dns, /dns4, and /dns6 addrs as public + if (type === 53 || type === 54 || type === 55) { + // localhost can be a dns address but it's private + if (addr === 'localhost') { + return false + } + + return true + } + if (type !== 4 && type !== 6) { return false } @@ -45,6 +55,10 @@ export function removePublicAddresses (peer: PeerInfo): PeerInfo { multiaddrs: peer.multiaddrs.filter(multiaddr => { const [[type, addr]] = multiaddr.stringTuples() + if (addr === 'localhost') { + return true + } + if (type !== 4 && type !== 6) { return false } @@ -53,7 +67,14 @@ export function removePublicAddresses (peer: PeerInfo): PeerInfo { return false } - return isPrivateIp(addr) + const isPrivate = isPrivateIp(addr) + + if (isPrivate == null) { + // not an ip address + return false + } + + return isPrivate }) } } diff --git a/test/kad-utils.spec.ts b/test/kad-utils.spec.ts index c8068605..9a5f91cc 100644 --- a/test/kad-utils.spec.ts +++ b/test/kad-utils.spec.ts @@ -4,6 +4,7 @@ import { expect } from 'aegir/chai' import { concat as uint8ArrayConcat } from 'uint8arrays/concat' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' +import { multiaddr } from '@multiformats/multiaddr' import * as utils from '../src/utils.js' import { createPeerId, createPeerIds } from './utils/create-peer-id.js' @@ -60,4 +61,38 @@ describe('kad utils', () => { }) }) }) + + describe('removePrivateAddresses', () => { + it('filters private multiaddrs', async () => { + const id = await createPeerId() + + const multiaddrs = [ + multiaddr('/dns4/example.com/tcp/4001'), + multiaddr('/ip4/192.168.0.1/tcp/4001'), + multiaddr('/ip4/1.1.1.1/tcp/4001'), + multiaddr('/dns4/localhost/tcp/4001') + ] + + const peerInfo = utils.removePrivateAddresses({ id, multiaddrs, protocols: [] }) + expect(peerInfo.multiaddrs.map((ma) => ma.toString())) + .to.eql(['/dns4/example.com/tcp/4001', '/ip4/1.1.1.1/tcp/4001']) + }) + }) + + describe('removePublicAddresses', () => { + it('filters public multiaddrs', async () => { + const id = await createPeerId() + + const multiaddrs = [ + multiaddr('/dns4/example.com/tcp/4001'), + multiaddr('/ip4/192.168.0.1/tcp/4001'), + multiaddr('/ip4/1.1.1.1/tcp/4001'), + multiaddr('/dns4/localhost/tcp/4001') + ] + + const peerInfo = utils.removePublicAddresses({ id, multiaddrs, protocols: [] }) + expect(peerInfo.multiaddrs.map((ma) => ma.toString())) + .to.eql(['/ip4/192.168.0.1/tcp/4001', '/dns4/localhost/tcp/4001']) + }) + }) })