From 0cea94a82ef277092897a03446f6e6fccba90d53 Mon Sep 17 00:00:00 2001
From: Felix Frank <Felix.Frank@Alumni.TU-Berlin.de>
Date: Tue, 29 Mar 2016 01:59:54 +0200
Subject: catch StandardError rather than the gratuitous Exception

---
 lib/puppet/parser/functions/hash.rb         | 2 +-
 lib/puppet/parser/functions/parsejson.rb    | 2 +-
 lib/puppet/parser/functions/parseyaml.rb    | 2 +-
 lib/puppet/parser/functions/validate_cmd.rb | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

(limited to 'lib/puppet/parser')

diff --git a/lib/puppet/parser/functions/hash.rb b/lib/puppet/parser/functions/hash.rb
index 8cc4823..89d0e07 100644
--- a/lib/puppet/parser/functions/hash.rb
+++ b/lib/puppet/parser/functions/hash.rb
@@ -29,7 +29,7 @@ Would return: {'a'=>1,'b'=>2,'c'=>3}
       # This is to make it compatible with older version of Ruby ...
       array  = array.flatten
       result = Hash[*array]
-    rescue Exception
+    rescue StandardError
       raise(Puppet::ParseError, 'hash(): Unable to compute ' +
         'hash from array given')
     end
diff --git a/lib/puppet/parser/functions/parsejson.rb b/lib/puppet/parser/functions/parsejson.rb
index b4af40e..f7c2896 100644
--- a/lib/puppet/parser/functions/parsejson.rb
+++ b/lib/puppet/parser/functions/parsejson.rb
@@ -15,7 +15,7 @@ be returned if the parsing of YAML string have failed.
 
     begin
       PSON::load(arguments[0]) || arguments[1]
-    rescue Exception => e
+    rescue StandardError => e
       if arguments[1]
         arguments[1]
       else
diff --git a/lib/puppet/parser/functions/parseyaml.rb b/lib/puppet/parser/functions/parseyaml.rb
index 66d0413..9e84055 100644
--- a/lib/puppet/parser/functions/parseyaml.rb
+++ b/lib/puppet/parser/functions/parseyaml.rb
@@ -16,7 +16,7 @@ be returned if the parsing of YAML string have failed.
 
     begin
       YAML::load(arguments[0]) || arguments[1]
-    rescue Exception => e
+    rescue StandardError => e
       if arguments[1]
         arguments[1]
       else
diff --git a/lib/puppet/parser/functions/validate_cmd.rb b/lib/puppet/parser/functions/validate_cmd.rb
index 5df3c60..685162b 100644
--- a/lib/puppet/parser/functions/validate_cmd.rb
+++ b/lib/puppet/parser/functions/validate_cmd.rb
@@ -53,7 +53,7 @@ module Puppet::Parser::Functions
     rescue Puppet::ExecutionFailure => detail
       msg += "\n#{detail}"
       raise Puppet::ParseError, msg
-    rescue Exception => detail
+    rescue StandardError => detail
       msg += "\n#{detail.class.name} #{detail}"
       raise Puppet::ParseError, msg
     ensure
-- 
cgit v1.2.3


From 5639828bffd1beb0e44e59554e17c1a891924145 Mon Sep 17 00:00:00 2001
From: David Schmitt <david.schmitt@puppetlabs.com>
Date: Thu, 7 Apr 2016 11:47:42 +0100
Subject: (maint) also catch Psych::SyntaxError

Psych::SyntaxError is a RuntimeException. This still needs to
catch that. This was uncovered by the recent move to catch StandardError
rather than the catchall Exception that was here before.
---
 lib/puppet/parser/functions/parseyaml.rb | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

(limited to 'lib/puppet/parser')

diff --git a/lib/puppet/parser/functions/parseyaml.rb b/lib/puppet/parser/functions/parseyaml.rb
index 9e84055..ba9d98a 100644
--- a/lib/puppet/parser/functions/parseyaml.rb
+++ b/lib/puppet/parser/functions/parseyaml.rb
@@ -16,7 +16,10 @@ be returned if the parsing of YAML string have failed.
 
     begin
       YAML::load(arguments[0]) || arguments[1]
-    rescue StandardError => e
+      # in ruby 1.9.3 Psych::SyntaxError is a RuntimeException
+      # this still needs to catch that and work also on rubies that
+      # do not have Psych available.
+    rescue StandardError, Psych::SyntaxError => e
       if arguments[1]
         arguments[1]
       else
-- 
cgit v1.2.3


From 44596e73da1b157ea931d5111f842e108ca203bb Mon Sep 17 00:00:00 2001
From: Alex Tomlins <alex@tomlins.org.uk>
Date: Thu, 7 Apr 2016 22:22:17 +0100
Subject: (MODULES-3246) Fix concat with Hash arguments.

85d5ead Updated the concat function so that it wouldn't modify the
original array. A side-effect of this change is that it now always calls
`Array()` on the second argument. If thit is a Hash, this results in
`to_a` being called on the hash, which converts it to an array or
tuples. This is undesired.

Update the behaviour so that it doesn't (indirectly) call `to_a` on
anything, instead test for the type of the argument, wrapping it in an
array if it's not already an array.
---
 lib/puppet/parser/functions/concat.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'lib/puppet/parser')

diff --git a/lib/puppet/parser/functions/concat.rb b/lib/puppet/parser/functions/concat.rb
index 618e62d..91edb4e 100644
--- a/lib/puppet/parser/functions/concat.rb
+++ b/lib/puppet/parser/functions/concat.rb
@@ -31,7 +31,7 @@ Would result in:
     arguments.shift
 
     arguments.each do |x|
-      result = result + Array(x)
+      result = result + (x.is_a?(Array) ? x : [x])
     end
 
     return result
-- 
cgit v1.2.3


From bfe6cf68b3b09f5927ec8f12f6661f45e9c1be58 Mon Sep 17 00:00:00 2001
From: Joseph Yaworski <joseph.yaworski@fireeye.com>
Date: Mon, 28 Mar 2016 13:18:28 -0400
Subject: Add validate_email_address function

---
 lib/puppet/parser/functions/is_email_address.rb    | 21 +++++++++++++++
 .../parser/functions/validate_email_address.rb     | 31 ++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 lib/puppet/parser/functions/is_email_address.rb
 create mode 100644 lib/puppet/parser/functions/validate_email_address.rb

(limited to 'lib/puppet/parser')

diff --git a/lib/puppet/parser/functions/is_email_address.rb b/lib/puppet/parser/functions/is_email_address.rb
new file mode 100644
index 0000000..ab8d075
--- /dev/null
+++ b/lib/puppet/parser/functions/is_email_address.rb
@@ -0,0 +1,21 @@
+#
+# is_email_address.rb
+#
+
+module Puppet::Parser::Functions
+  newfunction(:is_email_address, type: :rvalue, doc: <<-EOS
+Returns true if the string passed to this function is a valid email address.
+    EOS
+             ) do |arguments|
+    if arguments.size != 1
+      raise(Puppet::ParseError, 'is_email_address(): Wrong number of arguments '\
+        "given #{arguments.size} for 1")
+    end
+
+    # Taken from http://emailregex.com/ (simpler regex)
+    valid_email_regex = %r{\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z}
+    return (arguments[0] =~ valid_email_regex) == 0
+  end
+end
+
+# vim: set ts=2 sw=2 et :
diff --git a/lib/puppet/parser/functions/validate_email_address.rb b/lib/puppet/parser/functions/validate_email_address.rb
new file mode 100644
index 0000000..63f59a7
--- /dev/null
+++ b/lib/puppet/parser/functions/validate_email_address.rb
@@ -0,0 +1,31 @@
+module Puppet::Parser::Functions
+  newfunction(:validate_email_address, doc: <<-ENDHEREDOC
+    Validate that all values passed are valid email addresses.
+    Fail compilation if any value fails this check.
+    The following values will pass:
+    $my_email = "waldo@gmail.com"
+    validate_email_address($my_email)
+    validate_email_address("bob@gmail.com", "alice@gmail.com", $my_email)
+
+    The following values will fail, causing compilation to abort:
+    $some_array = [ 'bad_email@/d/efdf.com' ]
+    validate_email_address($some_array)
+    ENDHEREDOC
+             ) do |args|
+    rescuable_exceptions = [ArgumentError]
+
+    if args.empty?
+      raise Puppet::ParseError, "validate_email_address(): wrong number of arguments (#{args.length}; must be > 0)"
+    end
+
+    args.each do |arg|
+      raise Puppet::ParseError, "#{arg.inspect} is not a string." unless arg.is_a?(String)
+
+      begin
+        raise Puppet::ParseError, "#{arg.inspect} is not a valid email address" unless function_is_email_address([arg])
+      rescue *rescuable_exceptions
+        raise Puppet::ParseError, "#{arg.inspect} is not a valid email address"
+      end
+    end
+  end
+end
-- 
cgit v1.2.3


From 0d46515b57cea60d4d5f1e4d81a75a448a7a73a8 Mon Sep 17 00:00:00 2001
From: Joseph Yaworski <joseph.yaworski@fireeye.com>
Date: Mon, 11 Apr 2016 22:09:24 -0400
Subject: Add support for regular expressions to delete

---
 lib/puppet/parser/functions/delete.rb | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

(limited to 'lib/puppet/parser')

diff --git a/lib/puppet/parser/functions/delete.rb b/lib/puppet/parser/functions/delete.rb
index f548b44..8435163 100644
--- a/lib/puppet/parser/functions/delete.rb
+++ b/lib/puppet/parser/functions/delete.rb
@@ -2,8 +2,6 @@
 # delete.rb
 #
 
-# TODO(Krzysztof Wilczynski): We need to add support for regular expression ...
-
 module Puppet::Parser::Functions
   newfunction(:delete, :type => :rvalue, :doc => <<-EOS
 Deletes all instances of a given element from an array, substring from a
@@ -34,7 +32,7 @@ string, or key from a hash.
     Array(arguments[1]).each do |item|
       case collection
         when Array, Hash
-          collection.delete item
+          collection.delete_if { |coll_item| coll_item =~ %r{#{item}} }
         when String
           collection.gsub! item, ''
         else
-- 
cgit v1.2.3