summaryrefslogtreecommitdiff
path: root/src/node_modules/validator/es/lib/isIP.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
committerMinteck <contact@minteck.org>2021-12-21 16:52:28 +0100
commit46e43f4bde4a35785b4997b81e86cd19f046b69b (patch)
treec53c2f826f777f9d6b2d249dab556feb72a6c3a6 /src/node_modules/validator/es/lib/isIP.js
downloadlangdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.gz
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.tar.bz2
langdetect-46e43f4bde4a35785b4997b81e86cd19f046b69b.zip
Commit
Diffstat (limited to 'src/node_modules/validator/es/lib/isIP.js')
-rw-r--r--src/node_modules/validator/es/lib/isIP.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/node_modules/validator/es/lib/isIP.js b/src/node_modules/validator/es/lib/isIP.js
new file mode 100644
index 0000000..9280d87
--- /dev/null
+++ b/src/node_modules/validator/es/lib/isIP.js
@@ -0,0 +1,124 @@
+import assertString from './util/assertString';
+/**
+11.3. Examples
+
+ The following addresses
+
+ fe80::1234 (on the 1st link of the node)
+ ff02::5678 (on the 5th link of the node)
+ ff08::9abc (on the 10th organization of the node)
+
+ would be represented as follows:
+
+ fe80::1234%1
+ ff02::5678%5
+ ff08::9abc%10
+
+ (Here we assume a natural translation from a zone index to the
+ <zone_id> part, where the Nth zone of any scope is translated into
+ "N".)
+
+ If we use interface names as <zone_id>, those addresses could also be
+ represented as follows:
+
+ fe80::1234%ne0
+ ff02::5678%pvc1.3
+ ff08::9abc%interface10
+
+ where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
+ to the 5th link, and "interface10" belongs to the 10th organization.
+ * * */
+
+var ipv4Maybe = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
+var ipv6Block = /^[0-9A-F]{1,4}$/i;
+export default function isIP(str) {
+ var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+ assertString(str);
+ version = String(version);
+
+ if (!version) {
+ return isIP(str, 4) || isIP(str, 6);
+ } else if (version === '4') {
+ if (!ipv4Maybe.test(str)) {
+ return false;
+ }
+
+ var parts = str.split('.').sort(function (a, b) {
+ return a - b;
+ });
+ return parts[3] <= 255;
+ } else if (version === '6') {
+ var addressAndZone = [str]; // ipv6 addresses could have scoped architecture
+ // according to https://tools.ietf.org/html/rfc4007#section-11
+
+ if (str.includes('%')) {
+ addressAndZone = str.split('%');
+
+ if (addressAndZone.length !== 2) {
+ // it must be just two parts
+ return false;
+ }
+
+ if (!addressAndZone[0].includes(':')) {
+ // the first part must be the address
+ return false;
+ }
+
+ if (addressAndZone[1] === '') {
+ // the second part must not be empty
+ return false;
+ }
+ }
+
+ var blocks = addressAndZone[0].split(':');
+ var foundOmissionBlock = false; // marker to indicate ::
+ // At least some OS accept the last 32 bits of an IPv6 address
+ // (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says
+ // that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,
+ // and '::a.b.c.d' is deprecated, but also valid.
+
+ var foundIPv4TransitionBlock = isIP(blocks[blocks.length - 1], 4);
+ var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;
+
+ if (blocks.length > expectedNumberOfBlocks) {
+ return false;
+ } // initial or final ::
+
+
+ if (str === '::') {
+ return true;
+ } else if (str.substr(0, 2) === '::') {
+ blocks.shift();
+ blocks.shift();
+ foundOmissionBlock = true;
+ } else if (str.substr(str.length - 2) === '::') {
+ blocks.pop();
+ blocks.pop();
+ foundOmissionBlock = true;
+ }
+
+ for (var i = 0; i < blocks.length; ++i) {
+ // test for a :: which can not be at the string start/end
+ // since those cases have been handled above
+ if (blocks[i] === '' && i > 0 && i < blocks.length - 1) {
+ if (foundOmissionBlock) {
+ return false; // multiple :: in address
+ }
+
+ foundOmissionBlock = true;
+ } else if (foundIPv4TransitionBlock && i === blocks.length - 1) {// it has been checked before that the last
+ // block is a valid IPv4 address
+ } else if (!ipv6Block.test(blocks[i])) {
+ return false;
+ }
+ }
+
+ if (foundOmissionBlock) {
+ return blocks.length >= 1;
+ }
+
+ return blocks.length === expectedNumberOfBlocks;
+ }
+
+ return false;
+} \ No newline at end of file