From 21b63cbc53635ee8532c388e57f4552f1b3ae6e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Niedzielski?= Date: Mon, 10 May 2021 22:46:13 +0200 Subject: [PATCH] fix: fix mapping ipv6-based port mappings --- src/port-mapper.ts | 47 ++++++++++++++++++++++++---------------- test/port-mapper.test.ts | 4 ++-- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/port-mapper.ts b/src/port-mapper.ts index ca03685..f2a6300 100644 --- a/src/port-mapper.ts +++ b/src/port-mapper.ts @@ -4,26 +4,35 @@ const mapPorts = ( mapped?: { address: string; port: number } exposed: { port: number; protocol: string } }> => { - const result = !ports - ? [] - : (() => { - return ports.split(',').map((untypedPort) => { - const exposedFragments = untypedPort.trim().split('->') + if (!ports) { + return [] + } - const [port, protocol] = - exposedFragments.length === 1 - ? exposedFragments[0].split('/') - : exposedFragments[1].split('/') - const [address, mappedPort] = - exposedFragments.length === 2 ? exposedFragments[0].split(':') : [] - return { - exposed: { port: Number(port), protocol }, - ...(address && - mappedPort && { mapped: { port: Number(mappedPort), address } }) - } - }) - })() - return result + return ports.split(',').map((untypedPort) => { + const exposedFragments = untypedPort.trim().split('->') + + const [port, protocol] = + exposedFragments.length === 1 + ? exposedFragments[0].split('/') + : exposedFragments[1].split('/') + + const mapped = exposedFragments[0] + const lastDoubleColon = mapped.lastIndexOf(':') + + if (lastDoubleColon === -1) { + return { + exposed: { port: Number(port), protocol }, + } + } + + const address = mapped.substr(0, lastDoubleColon) + const mappedPort = mapped.substr(lastDoubleColon + 1) + + return { + exposed: { port: Number(port), protocol }, + mapped: { port: Number(mappedPort), address }, + } + }) } export default mapPorts diff --git a/test/port-mapper.test.ts b/test/port-mapper.test.ts index a4fff45..0c7e354 100644 --- a/test/port-mapper.test.ts +++ b/test/port-mapper.test.ts @@ -44,7 +44,7 @@ test('map multiple tcp ports exposed on ipv4 and ipv6 interfaces', () => { }, { exposed: { port: 443, protocol: 'tcp' }, - mapped: { address: ':::', port: 443 } + mapped: { address: '::', port: 443 } }, { exposed: { port: 80, protocol: 'tcp' }, @@ -52,7 +52,7 @@ test('map multiple tcp ports exposed on ipv4 and ipv6 interfaces', () => { }, { exposed: { port: 80, protocol: 'tcp' }, - mapped: { address: ':::', port: 80 } + mapped: { address: '::', port: 80 } } ]) })