Merge branch 'bug/2.2.x/is_domain_name' into 2.2.x
* bug/2.2.x/is_domain_name: Check according to rfc1035 Add additional domain name tests (maint) Memoize scope in domain_name spec Closes pull request GH-24
This commit is contained in:
commit
a03d8cda18
2 changed files with 49 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -6,51 +6,63 @@ describe "the is_domain_name function" do
|
|||
Puppet::Parser::Functions.autoloader.loadall
|
||||
end
|
||||
|
||||
before :each do
|
||||
@scope = Puppet::Parser::Scope.new
|
||||
end
|
||||
let(:scope) { Puppet::Parser::Scope.new }
|
||||
|
||||
it "should exist" do
|
||||
Puppet::Parser::Functions.function("is_domain_name").should == "function_is_domain_name"
|
||||
end
|
||||
|
||||
it "should raise a ParseError if there is less than 1 arguments" do
|
||||
lambda { @scope.function_is_domain_name([]) }.should( raise_error(Puppet::ParseError))
|
||||
lambda { scope.function_is_domain_name([]) }.should( raise_error(Puppet::ParseError))
|
||||
end
|
||||
|
||||
it "should return true if a valid short domain name" do
|
||||
result = scope.function_is_domain_name(["x.com"])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should return true if the domain is ." do
|
||||
result = scope.function_is_domain_name(["."])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should return true if the domain is x.com." do
|
||||
result = scope.function_is_domain_name(["x.com."])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should return true if a valid domain name" do
|
||||
result = @scope.function_is_domain_name(["foo.bar.com"])
|
||||
result = scope.function_is_domain_name(["foo.bar.com"])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should allow domain parts to start with numbers" do
|
||||
result = @scope.function_is_domain_name(["3foo.2bar.com"])
|
||||
result = scope.function_is_domain_name(["3foo.2bar.com"])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should allow domain to end with a dot" do
|
||||
result = @scope.function_is_domain_name(["3foo.2bar.com."])
|
||||
result = scope.function_is_domain_name(["3foo.2bar.com."])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should allow a single part domain" do
|
||||
result = @scope.function_is_domain_name(["orange"])
|
||||
result = scope.function_is_domain_name(["orange"])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should return false if domain parts start with hyphens" do
|
||||
result = @scope.function_is_domain_name(["-3foo.2bar.com"])
|
||||
result = scope.function_is_domain_name(["-3foo.2bar.com"])
|
||||
result.should(be_false)
|
||||
end
|
||||
|
||||
it "should return true if domain contains hyphens" do
|
||||
result = @scope.function_is_domain_name(["3foo-bar.2bar-fuzz.com"])
|
||||
result = scope.function_is_domain_name(["3foo-bar.2bar-fuzz.com"])
|
||||
result.should(be_true)
|
||||
end
|
||||
|
||||
it "should return false if domain name contains spaces" do
|
||||
result = @scope.function_is_domain_name(["not valid"])
|
||||
result = scope.function_is_domain_name(["not valid"])
|
||||
result.should(be_false)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue