From 14b77eae6d19e94a17a038a8b170b1b0f23cb976 Mon Sep 17 00:00:00 2001
From: Stig Sandbeck Mathisen <ssm@debian.org>
Date: Wed, 9 Nov 2011 09:02:09 +0100
Subject: Check according to rfc1035

Update doc string to match function
---
 lib/puppet/parser/functions/is_domain_name.rb | 30 ++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

(limited to 'lib/puppet')

diff --git a/lib/puppet/parser/functions/is_domain_name.rb b/lib/puppet/parser/functions/is_domain_name.rb
index 4e92939..5826dc0 100644
--- a/lib/puppet/parser/functions/is_domain_name.rb
+++ b/lib/puppet/parser/functions/is_domain_name.rb
@@ -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
-- 
cgit v1.2.3