From a6a6e40a8604dd8f8218b6550307fbc9dc223ccf Mon Sep 17 00:00:00 2001 From: Fedot Praslov Date: Tue, 13 Oct 2015 19:17:44 +0300 Subject: [PATCH 1/5] Added parsing of IPv4-mapped IPv6 addresses --- lib/IPAddress.js | 8 ++++++++ lib/IPParser.js | 8 +++++++- package.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/IPAddress.js b/lib/IPAddress.js index 124ea5c..05fff68 100644 --- a/lib/IPAddress.js +++ b/lib/IPAddress.js @@ -18,3 +18,11 @@ exports.parseIPv6 = function parseIPv6(ip) { } return v6Address.parsedAddress; }; + +exports.parseIPv4_Mapped_IPv6 = function parseIPv4_Mapped_IPv6(ip){ + var v6Address = new IPv6.Address(ip); + if (!v6Address.isValid() || !v6Address.is4()){ + throw new Error("Invalid IPv4-mapped IPv6 address"); + } + return v6Address.tov4().parsedAddress +} diff --git a/lib/IPParser.js b/lib/IPParser.js index 216179f..6e5c83c 100644 --- a/lib/IPParser.js +++ b/lib/IPParser.js @@ -6,7 +6,9 @@ module.exports = IPParser; function IPParser(ip) { if (ip.indexOf('.') !== -1) { - return IPParser.parseIPv4(ip); + if (ip.indexOf('::') !== -1){ + return IPParser.parseIPv4_Mapped_IPv6(ip) + } else return IPParser.parseIPv4(ip); } else { return IPParser.parseIPv6(ip); } @@ -20,6 +22,10 @@ IPParser.parseIPv6 = function parseIPv6(ip) { return ipv6Buffer(IPAddress.parseIPv6(ip)); }; +IPParser.parseIPv4_Mapped_IPv6 = function parseIPv4_Mapped_IPv6(ip){ + return ipv4Buffer(IPAddress.parseIPv4_Mapped_IPv6(ip)); +} + function ipv4Buffer(groups) { var arr = new Buffer(4); arr.fill(0); diff --git a/package.json b/package.json index d9bd74c..484e5ab 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "big-integer": ">=1.1.5", - "ip-address": "4.0.0" + "ip-address": "4.2.0" }, "devDependencies": { "istanbul": "^0.3.13", From fe3ab140588fa6c16ab6972b955e4f063779f162 Mon Sep 17 00:00:00 2001 From: Fedot Praslov Date: Wed, 14 Oct 2015 18:18:26 +0300 Subject: [PATCH 2/5] parseIPv4_Mapped_IPv6 -> parseIPv4MappedIPv6 (naming conventions) --- lib/IPAddress.js | 2 +- lib/IPParser.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/IPAddress.js b/lib/IPAddress.js index 05fff68..4d7159c 100644 --- a/lib/IPAddress.js +++ b/lib/IPAddress.js @@ -19,7 +19,7 @@ exports.parseIPv6 = function parseIPv6(ip) { return v6Address.parsedAddress; }; -exports.parseIPv4_Mapped_IPv6 = function parseIPv4_Mapped_IPv6(ip){ +exports.parseIPv4MappedIPv6 = function parseIPv4MappedIPv6(ip){ var v6Address = new IPv6.Address(ip); if (!v6Address.isValid() || !v6Address.is4()){ throw new Error("Invalid IPv4-mapped IPv6 address"); diff --git a/lib/IPParser.js b/lib/IPParser.js index 6e5c83c..acc332f 100644 --- a/lib/IPParser.js +++ b/lib/IPParser.js @@ -7,7 +7,7 @@ module.exports = IPParser; function IPParser(ip) { if (ip.indexOf('.') !== -1) { if (ip.indexOf('::') !== -1){ - return IPParser.parseIPv4_Mapped_IPv6(ip) + return IPParser.parseIPv4MappedIPv6(ip) } else return IPParser.parseIPv4(ip); } else { return IPParser.parseIPv6(ip); @@ -22,8 +22,8 @@ IPParser.parseIPv6 = function parseIPv6(ip) { return ipv6Buffer(IPAddress.parseIPv6(ip)); }; -IPParser.parseIPv4_Mapped_IPv6 = function parseIPv4_Mapped_IPv6(ip){ - return ipv4Buffer(IPAddress.parseIPv4_Mapped_IPv6(ip)); +IPParser.parseIPv4MappedIPv6 = function parseIPv4MappedIPv6(ip){ + return ipv4Buffer(IPAddress.parseIPv4MappedIPv6(ip)); } function ipv4Buffer(groups) { From 84dfd7ea6632590498b8544eefe389f00a1f99b6 Mon Sep 17 00:00:00 2001 From: Fedot Praslov Date: Wed, 14 Oct 2015 18:23:27 +0300 Subject: [PATCH 3/5] IPv4-mapped IPv6 addresses should be accepted at either form 0:0:0:0:0:FFFF:222.1.41.90 or ::FFFF:222.1.41.90 --- lib/IPParser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/IPParser.js b/lib/IPParser.js index acc332f..313a820 100644 --- a/lib/IPParser.js +++ b/lib/IPParser.js @@ -6,7 +6,7 @@ module.exports = IPParser; function IPParser(ip) { if (ip.indexOf('.') !== -1) { - if (ip.indexOf('::') !== -1){ + if (ip.indexOf(':') !== -1){ return IPParser.parseIPv4MappedIPv6(ip) } else return IPParser.parseIPv4(ip); } else { From a3e72ab6c61679a075c6addf86568ec558e35592 Mon Sep 17 00:00:00 2001 From: Fedot Praslov Date: Wed, 14 Oct 2015 18:58:03 +0300 Subject: [PATCH 4/5] Changing IPv6 test to not check IPv5-Mapped IPv6 Addresses --- test/test-ipparser.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/test-ipparser.js b/test/test-ipparser.js index db674c6..70bbf23 100644 --- a/test/test-ipparser.js +++ b/test/test-ipparser.js @@ -38,9 +38,10 @@ ipParseTest('IPv6', function run(it) { t.end(); }); - it('should throw exception on invalid ipv4 formats', function should(t) { + it('should throw exception on invalid ipv6 formats', function should(t) { t.verifyParseThrows('myipaddress'); - t.verifyParseThrows('::ffff:192.0.2.128'); + t.verifyParseThrows('2001:0db8:85a3:00000000:8a2e:0370:7334'); + t.verifyParseThrows('2001:db8:85a3:8a2e:370:7334'); t.end(); }); }); From a2032b8d35b7bb2d81ec216cb917f2d3ed92d2d3 Mon Sep 17 00:00:00 2001 From: Fedot Praslov Date: Wed, 14 Oct 2015 18:58:46 +0300 Subject: [PATCH 5/5] Adding test for IPv4-Mapped IPv6 --- test/test-ipparser.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test-ipparser.js b/test/test-ipparser.js index 70bbf23..3b1615d 100644 --- a/test/test-ipparser.js +++ b/test/test-ipparser.js @@ -45,3 +45,17 @@ ipParseTest('IPv6', function run(it) { t.end(); }); }); + +ipParseTest('IPv4-Mapped IPv6', function run(it) { + it('should successfully parse correct formats', function should(t) { + t.verifyParse('::ffff:192.0.2.128', new Buffer([0xc0, 0x00, 0x02, 0x80])); + t.verifyParse('0:0:0:0:0:FFFF:222.1.41.90', new Buffer([0xde, 0x01, 0x29, 0x5a])); + t.end(); + }); + + it('should throw exception on invalid IPv6 address with Embedded IPv4 address', function should(t) { + t.verifyParseThrows(':192.0.2.128'); + t.verifyParseThrows('::ffff:192.0.2.128:'); + t.end(); + }); +});