Skip to content

Commit 8fcce5c

Browse files
authored
Merge pull request #8799 from cocker-cc/Make_regsubst_sensitive-aware
(PUP-11326) Make regsubst() sensitive-aware
2 parents 3068b8f + 0bf1a6b commit 8fcce5c

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

lib/puppet/functions/regsubst.rb

+22-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
# $i3 = regsubst($ipaddress,'^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$','\\3')
3030
# ```
3131
dispatch :regsubst_string do
32-
param 'Variant[Array[String],String]', :target
32+
param 'Variant[Array[Variant[String,Sensitive[String]]],Sensitive[Array[Variant[String,Sensitive[String]]]],Variant[String,Sensitive[String]]]', :target
3333
param 'String', :pattern
3434
param 'Variant[String,Hash[String,String]]', :replacement
3535
optional_param 'Optional[Pattern[/^[GEIM]*$/]]', :flags
@@ -59,7 +59,7 @@
5959
# $x = regsubst($ipaddress, /([0-9]+)/, '<\\1>', 'G')
6060
# ```
6161
dispatch :regsubst_regexp do
62-
param 'Variant[Array[String],String]', :target
62+
param 'Variant[Array[Variant[String,Sensitive[String]]],Sensitive[Array[Variant[String,Sensitive[String]]]],Variant[String,Sensitive[String]]]', :target
6363
param 'Variant[Regexp,Type[Regexp]]', :pattern
6464
param 'Variant[String,Hash[String,String]]', :replacement
6565
optional_param 'Pattern[/^G?$/]', :flags
@@ -94,7 +94,26 @@ def regsubst_regexp(target, pattern, replacement, flags = nil)
9494
end
9595

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

spec/unit/functions/regsubst_spec.rb

+30
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,34 @@ 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+
result = regsubst(Puppet::Pops::Types::PSensitiveType::Sensitive.new('very secret'), 'very', 'top')
118+
expect(result).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
119+
expect(result.unwrap).to eq("top secret")
120+
end
121+
end
122+
123+
context 'when using a Target of Type Array with mixed String and sensitive String' do
124+
it 'should process it' do
125+
my_array = ['very down', Puppet::Pops::Types::PSensitiveType::Sensitive.new('very secret')]
126+
expect(regsubst(my_array, 'very', 'top')).to be_a(Array)
127+
expect(regsubst(my_array, 'very', 'top')[0]).to eq('top down')
128+
result = regsubst(my_array, 'very', 'top')[1]
129+
expect(result).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
130+
expect(result.unwrap).to eq('top secret')
131+
end
132+
end
133+
134+
context 'when using a Target of Type Sensitive Array with mixed String and sensitive String' do
135+
it 'should process it' do
136+
my_array = Puppet::Pops::Types::PSensitiveType::Sensitive.new(['very down', Puppet::Pops::Types::PSensitiveType::Sensitive.new('very secret')])
137+
expect(regsubst(my_array, 'very', 'top')).to be_a(Array)
138+
expect(regsubst(my_array, 'very', 'top')[0]).to eq('top down')
139+
result = regsubst(my_array, 'very', 'top')[1]
140+
expect(result).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
141+
expect(result.unwrap).to eq('top secret')
142+
end
143+
end
114144
end

0 commit comments

Comments
 (0)