You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					91 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					91 lines
				
				2.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								var reIpv4FirstPass = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var reSubnetString = /\/\d{1,3}(?=%|$)/
							 | 
						||
| 
								 | 
							
								var reForwardSlash = /\//
							 | 
						||
| 
								 | 
							
								var reZone = /%.*$/
							 | 
						||
| 
								 | 
							
								var reBadCharacters = /([^0-9a-f:/%])/i
							 | 
						||
| 
								 | 
							
								var reBadAddress = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/i
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function validate4 (input) {
							 | 
						||
| 
								 | 
							
								  if (!(reIpv4FirstPass.test(input))) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var parts = input.split('.')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (parts.length !== 4) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (parts[0][0] === '0' && parts[0].length > 1) return false
							 | 
						||
| 
								 | 
							
								  if (parts[1][0] === '0' && parts[1].length > 1) return false
							 | 
						||
| 
								 | 
							
								  if (parts[2][0] === '0' && parts[2].length > 1) return false
							 | 
						||
| 
								 | 
							
								  if (parts[3][0] === '0' && parts[3].length > 1) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var n0 = Number(parts[0])
							 | 
						||
| 
								 | 
							
								  var n1 = Number(parts[1])
							 | 
						||
| 
								 | 
							
								  var n2 = Number(parts[2])
							 | 
						||
| 
								 | 
							
								  var n3 = Number(parts[3])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (n0 >= 0 && n0 < 256 && n1 >= 0 && n1 < 256 && n2 >= 0 && n2 < 256 && n3 >= 0 && n3 < 256)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function validate6 (input) {
							 | 
						||
| 
								 | 
							
								  var withoutSubnet = input.replace(reSubnetString, '')
							 | 
						||
| 
								 | 
							
								  var hasSubnet = (input.length !== withoutSubnet.length)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // FIXME: this should probably be an option in the future
							 | 
						||
| 
								 | 
							
								  if (hasSubnet) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!hasSubnet) {
							 | 
						||
| 
								 | 
							
								    if (reForwardSlash.test(input)) return false
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var withoutZone = withoutSubnet.replace(reZone, '')
							 | 
						||
| 
								 | 
							
								  var lastPartSeparator = withoutZone.lastIndexOf(':')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (lastPartSeparator === -1) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var lastPart = withoutZone.substring(lastPartSeparator + 1)
							 | 
						||
| 
								 | 
							
								  var hasV4Part = validate4(lastPart)
							 | 
						||
| 
								 | 
							
								  var address = (hasV4Part ? withoutZone.substring(0, lastPartSeparator + 1) + '1234:5678' : withoutZone)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (reBadCharacters.test(address)) return false
							 | 
						||
| 
								 | 
							
								  if (reBadAddress.test(address)) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var halves = address.split('::')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (halves.length > 2) return false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (halves.length === 2) {
							 | 
						||
| 
								 | 
							
								    var first = (halves[0] === '' ? [] : halves[0].split(':'))
							 | 
						||
| 
								 | 
							
								    var last = (halves[1] === '' ? [] : halves[1].split(':'))
							 | 
						||
| 
								 | 
							
								    var remainingLength = 8 - (first.length + last.length)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (remainingLength <= 0) return false
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    if (address.split(':').length !== 8) return false
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return true
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function validate (input) {
							 | 
						||
| 
								 | 
							
								  return validate4(input) || validate6(input)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function validator (options) {
							 | 
						||
| 
								 | 
							
								  if (!options) options = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (options.version === 4) return validate4
							 | 
						||
| 
								 | 
							
								  if (options.version === 6) return validate6
							 | 
						||
| 
								 | 
							
								  if (options.version == null) return validate
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  throw new Error('Unknown version: ' + options.version)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports['__all_regexes__'] = [
							 | 
						||
| 
								 | 
							
								  reIpv4FirstPass,
							 | 
						||
| 
								 | 
							
								  reSubnetString,
							 | 
						||
| 
								 | 
							
								  reForwardSlash,
							 | 
						||
| 
								 | 
							
								  reZone,
							 | 
						||
| 
								 | 
							
								  reBadCharacters,
							 | 
						||
| 
								 | 
							
								  reBadAddress
							 | 
						||
| 
								 | 
							
								]
							 |