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']) + }) + }) })