Last active
November 26, 2016 00:01
-
-
Save pringlized/f79c11325401d76d7a0c38a4c389361d to your computer and use it in GitHub Desktop.
Immediately-Invoked Function Expression (IIFE) for generating & validating IPv4 IP addresses
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var ip = (function() { | |
var _privateIps = [ | |
'10.0.0.0', | |
'10.255.255.255', | |
'172.16.0.0', | |
'172.31.255.255', | |
'192.168.0.0', | |
'192.168.255.255' | |
]; | |
var _publicIps = [ | |
'0.0.0.0', | |
'255.255.255.255', | |
]; | |
// PRIVATE FUNCTIONS | |
this._generateInRange = function(min, max) { | |
return Math.floor(Math.random() * (max - min + 1)) + min; | |
} | |
this._generateOctets = function() { | |
return [_generateInRange(0,255), _generateInRange(0,255), _generateInRange(0,255),_generateInRange(0,255)]; | |
} | |
this._concatenateOctets = function(octets) { | |
var ip = ''; | |
for (var i = 0; i < octets.length; i++) { | |
ip += octets[i]; | |
ip += (i < octets.length - 1) ? '.' : ''; | |
} | |
return ip; | |
} | |
// PUBLIC FUNCTIONS | |
this.isPrivate = function(ip) { | |
return /^10\.|^192\.168\.|^172\.16\.|^172\.17\.|^172\.18\.|^172\.19\.|^172\.20\.|^172\.21\.|^172\.22\.|^172\.23\.|^172\.24\.|^172\.25\.|^172\.26\.|^172\.27\.|^172\.28\.|^172\.29\.|^172\.30\.|^172\.31\./.test(ip); | |
} | |
this.isPublic = function(ip) { | |
return !isPrivate(ip); | |
} | |
this.private = function() { | |
var ip = ''; | |
var networks = [10, 172, 192]; | |
var octets = [networks[_generateInRange(0,2)]]; | |
// generate address | |
switch(octets[0]) { | |
case 10: | |
octets.push(_generateInRange(0, 255), _generateInRange(0, 255), _generateInRange(0, 255)) | |
break; | |
case 172: | |
octets.push(_generateInRange(16, 31), _generateInRange(0, 255), _generateInRange(0, 255)) | |
break; | |
case 192: | |
octets.push(168, _generateInRange(0, 255), _generateInRange(0, 255)); | |
break; | |
default: | |
return ip; | |
} | |
return _concatenateOctets(octets); | |
}; | |
this.public = function() { | |
var ip = ''; | |
octets = _generateOctets(); | |
var privateNetworks = [10, 172, 192]; | |
// regenerate if private network octets were generated | |
while (octets.indexOf(privateNetworks) >= 0) { | |
switch(octets[0]) { | |
case 10: | |
octets = _generateOctets(); | |
break; | |
case 172: | |
if (octets[1] >= 16 || octete[1] <= 31) { | |
octets = _generateOctets(); | |
} | |
break; | |
case 192: | |
if (octets[1] === 168) { | |
octets = _generateOctets(); | |
} | |
break; | |
default: | |
break; | |
} | |
} | |
return _concatenateOctets(octets); | |
} | |
return { | |
private: private, | |
public: public, | |
isPrivate: isPrivate, | |
isPublic: isPublic | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment