The issue is that case/selectors are downcasing the value before it
is compared to the options.
Unfortunately regex are matching in a case sensitive way, which would
make the following manifest fail:
$var = "CaseSensitive"
case $var {
/CaseSensitive/: {
notice("worked")
}
default: {
fail "miserably"
}
}
This patch fixes the issue by making sure the regexp match is done
one the original (not downcased) value, but still doing a case
sensitive match.
Signed-off-by: Brice Figureau <[email protected]>
---
lib/puppet/parser/ast/casestatement.rb | 4 +---
lib/puppet/parser/ast/leaf.rb | 1 +
lib/puppet/parser/ast/selector.rb | 2 --
spec/unit/parser/ast/casestatement.rb | 10 ----------
spec/unit/parser/ast/leaf.rb | 13 +++++++++++++
spec/unit/parser/ast/selector.rb | 10 ----------
6 files changed, 15 insertions(+), 25 deletions(-)
diff --git a/lib/puppet/parser/ast/casestatement.rb
b/lib/puppet/parser/ast/casestatement.rb
index 25b0fc6..64298ca 100644
--- a/lib/puppet/parser/ast/casestatement.rb
+++ b/lib/puppet/parser/ast/casestatement.rb
@@ -12,8 +12,6 @@ class Puppet::Parser::AST
# the first option that matches.
def evaluate(scope)
value = @test.safeevaluate(scope)
- sensitive = Puppet[:casesensitive]
- value = value.downcase if ! sensitive and
value.respond_to?(:downcase)
retvalue = nil
found = false
@@ -22,7 +20,7 @@ class Puppet::Parser::AST
default = nil
@options.each do |option|
option.eachopt do |opt|
- return option.safeevaluate(scope) if
opt.evaluate_match(value, scope, :file => file, :line => line, :sensitive =>
sensitive)
+ return option.safeevaluate(scope) if
opt.evaluate_match(value, scope, :file => file, :line => line, :sensitive =>
Puppet[:casesensitive])
end
default = option if option.default?
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index c8ac6f7..ee7ee02 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -16,6 +16,7 @@ class Puppet::Parser::AST
if ! options[:sensitive] && obj.respond_to?(:downcase)
obj = obj.downcase
end
+ value = value.downcase if not options[:sensitive] and
value.respond_to?(:downcase)
obj == value
end
diff --git a/lib/puppet/parser/ast/selector.rb
b/lib/puppet/parser/ast/selector.rb
index 84bc2a7..ce834b6 100644
--- a/lib/puppet/parser/ast/selector.rb
+++ b/lib/puppet/parser/ast/selector.rb
@@ -17,8 +17,6 @@ class Puppet::Parser::AST
sensitive = Puppet[:casesensitive]
- paramvalue = paramvalue.downcase if not sensitive and
paramvalue.respond_to?(:downcase)
-
default = nil
unless @values.instance_of? AST::ASTArray or @values.instance_of?
Array
diff --git a/spec/unit/parser/ast/casestatement.rb
b/spec/unit/parser/ast/casestatement.rb
index 554e295..657648e 100755
--- a/spec/unit/parser/ast/casestatement.rb
+++ b/spec/unit/parser/ast/casestatement.rb
@@ -28,16 +28,6 @@ describe Puppet::Parser::AST::CaseStatement do
@casestmt.evaluate(@scope)
end
- it "should downcase the evaluated test value if allowed" do
- Puppet.stubs(:[]).with(:casesensitive).returns(false)
- value = stub 'test'
- @test.stubs(:safeevaluate).with(@scope).returns(value)
-
- value.expects(:downcase)
-
- @casestmt.evaluate(@scope)
- end
-
it "should scan each option" do
@options.expects(:each).multiple_yields(@option1, @option2)
diff --git a/spec/unit/parser/ast/leaf.rb b/spec/unit/parser/ast/leaf.rb
index fecfba3..62ebc2a 100755
--- a/spec/unit/parser/ast/leaf.rb
+++ b/spec/unit/parser/ast/leaf.rb
@@ -33,6 +33,13 @@ describe Puppet::Parser::AST::Leaf do
@leaf.evaluate_match("value", @scope, :insensitive => true)
end
+
+ it "should downcase the parameter value if wanted" do
+ parameter = stub 'parameter'
+ parameter.expects(:downcase).returns("value")
+
+ @leaf.evaluate_match(parameter, @scope, :insensitive => true)
+ end
end
describe "when converting to string" do
@@ -123,6 +130,12 @@ describe Puppet::Parser::AST::Regex do
@regex.evaluate_match("value", @scope)
end
+ it "should not downcase the paramater value" do
+ @value.expects(:match).with("VaLuE")
+
+ @regex.evaluate_match("VaLuE", @scope)
+ end
+
it "should set ephemeral scope vars if there is a match" do
@scope.expects(:ephemeral_from).with(true, nil, nil)
diff --git a/spec/unit/parser/ast/selector.rb b/spec/unit/parser/ast/selector.rb
index 2ba83ad..f9a1efe 100755
--- a/spec/unit/parser/ast/selector.rb
+++ b/spec/unit/parser/ast/selector.rb
@@ -40,16 +40,6 @@ describe Puppet::Parser::AST::Selector do
@selector.evaluate(@scope)
end
- it "should downcase the evaluated param value if allowed" do
- Puppet.stubs(:[]).with(:casesensitive).returns(false)
- value = stub 'param'
- @param.stubs(:safeevaluate).with(@scope).returns(value)
-
- value.expects(:downcase)
-
- @selector.evaluate(@scope)
- end
-
it "should scan each option" do
@values.expects(:each).multiple_yields(@value1, @value2)
--
1.6.6.1
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.