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.

Reply via email to