]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
Check according to rfc1035
authorStig Sandbeck Mathisen <ssm@debian.org>
Wed, 9 Nov 2011 08:02:09 +0000 (09:02 +0100)
committerJeff McCune <jeff@puppetlabs.com>
Thu, 12 Jan 2012 03:17:03 +0000 (19:17 -0800)
Update doc string to match function

lib/puppet/parser/functions/is_domain_name.rb

index 4e9293972b9d4805d4abfb3710ef6024345e38b0..5826dc0d9a37e53ad63954923863f8ee7986744d 100644 (file)
@@ -4,7 +4,7 @@
 
 module Puppet::Parser::Functions
   newfunction(:is_domain_name, :type => :rvalue, :doc => <<-EOS
-Returns true if the string passed to this function is a valid IP address. Support for IPv4 and IPv6 address types is included.
+Returns true if the string passed to this function is a syntactically correct domain name.
     EOS
   ) do |arguments|
 
@@ -15,11 +15,31 @@ Returns true if the string passed to this function is a valid IP address. Suppor
 
     domain = arguments[0]
 
-    if domain =~ /^(([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.?$/ then
-      return true
-    else
-      return false
+    # Limits (rfc1035, 3.1)
+    domain_max_length=255
+    label_min_length=1
+    label_max_length=63
+
+    # Allow ".", it is the top level domain
+    return true if domain == '.'
+
+    # Remove the final dot, if present.
+    domain.chomp!('.')
+
+    # Check the whole domain
+    return false if domain.empty?
+    return false if domain.length > domain_max_length
+
+    # Check each label in the domain
+    labels = domain.split('.')
+    vlabels = labels.each do |label|
+      break if label.length < label_min_length
+      break if label.length > label_max_length
+      break if label[-1..-1] == '-'
+      break if label[0..0] == '-'
+      break unless /^[a-z\d-]+$/i.match(label)
     end
+    return vlabels == labels
 
   end
 end