Skip to content

Commit f5fb86e

Browse files
committed
(PUP-11326) Make regsubst() sensitive-aware
1 parent da7350d commit f5fb86e

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

lib/puppet/functions/regsubst.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
# $i3 = regsubst($ipaddress,'^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$','\\3')
3232
# ```
3333
dispatch :regsubst_string do
34-
param 'Variant[Array[String],String]', :target
34+
param 'Variant[Array[Variant[String,Sensitive[String]]],Variant[String,Sensitive[String]]]', :target
3535
param 'String', :pattern
3636
param 'Variant[String,Hash[String,String]]', :replacement
3737
optional_param 'Optional[Pattern[/^[GEIM]*$/]]', :flags
@@ -68,7 +68,7 @@
6868
# $x = regsubst($ipaddress, /([0-9]+)/, '<\\1>', 'G')
6969
# ```
7070
dispatch :regsubst_regexp do
71-
param 'Variant[Array[String],String]', :target
71+
param 'Variant[Array[Variant[String,Sensitive[String]]],Variant[String,Sensitive[String]]]', :target
7272
param 'Variant[Regexp,Type[Regexp]]', :pattern
7373
param 'Variant[String,Hash[String,String]]', :replacement
7474
optional_param 'Pattern[/^G?$/]', :flags
@@ -96,7 +96,20 @@ def regsubst_regexp(target, pattern, replacement, flags = nil)
9696
end
9797

9898
def inner_regsubst(target, re, replacement, op)
99-
target.respond_to?(op) ? target.send(op, re, replacement) : target.collect { |e| e.send(op, re, replacement) }
99+
if target.is_a?(Array)
100+
# this is an Array
101+
target.map do |item|
102+
inner_regsubst(item, re, replacement, op)
103+
end
104+
elsif target.respond_to?(:unwrap)
105+
# this is a Sensitive
106+
target = target.unwrap
107+
target = target.respond_to?(op) ? target.send(op, re, replacement) : target.collect { |e| e.send(op, re, replacement) }
108+
Puppet::Pops::Types::PSensitiveType::Sensitive.new(target)
109+
else
110+
# this should be a String
111+
target.respond_to?(op) ? target.send(op, re, replacement) : target.collect { |e| e.send(op, re, replacement) }
112+
end
100113
end
101114
private :inner_regsubst
102115
end

spec/unit/functions/regsubst_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,19 @@ def regsubst(*args)
111111
end
112112

113113
end
114+
115+
context 'when using a Target of Type sensitive String' do
116+
it 'should process it' do
117+
expect(regsubst(Puppet::Pops::Types::PSensitiveType::Sensitive.new('very secret'), 'very', 'top')).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
118+
end
119+
end
120+
121+
context 'when using a Target of Type Array with mixed String and sensitive String' do
122+
it 'should process it' do
123+
my_array = ['very down', Puppet::Pops::Types::PSensitiveType::Sensitive.new('very secret')]
124+
expect(regsubst(my_array, 'very', 'top')).to be_a(Array)
125+
expect(regsubst(my_array, 'very', 'top')[0]).to eq('top down')
126+
expect(regsubst(my_array, 'very', 'top')[1]).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
127+
end
128+
end
114129
end

0 commit comments

Comments
 (0)