Skip to content

Commit 52849da

Browse files
authored
Merge pull request #9064 from m0dular/PUP-11846
(PUP-11846) Handle unprocessed, deferred sensitive
2 parents c8bba06 + 274aa08 commit 52849da

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

lib/puppet/pops/evaluator/deferred_resolver.rb

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ def initialize(proc)
99
end
1010

1111
def resolve
12-
@proc.call
12+
val = @proc.call
13+
# Deferred sensitive values will be marked as such in resolve_futures()
14+
if val.is_a?(Puppet::Pops::Types::PSensitiveType::Sensitive)
15+
val.unwrap
16+
else
17+
val
18+
end
1319
end
1420
end
1521

@@ -87,8 +93,12 @@ def resolve_futures(catalog)
8793
#
8894
if resolved.is_a?(Puppet::Pops::Types::PSensitiveType::Sensitive)
8995
resolved = resolved.unwrap
90-
unless r.sensitive_parameters.include?(k.to_sym)
91-
r.sensitive_parameters = (r.sensitive_parameters + [k.to_sym]).freeze
96+
mark_sensitive_parameters(r, k)
97+
# If the value is a DeferredValue and it has an argument of type PSensitiveType, mark it as sensitive
98+
# The DeferredValue.resolve method will unwrap it during catalog application
99+
elsif resolved.is_a?(Puppet::Pops::Evaluator::DeferredValue)
100+
if v.arguments.any? {|arg| arg.is_a?(Puppet::Pops::Types::PSensitiveType)}
101+
mark_sensitive_parameters(r, k)
92102
end
93103
end
94104
overrides[ k ] = resolved
@@ -97,6 +107,13 @@ def resolve_futures(catalog)
97107
end
98108
end
99109

110+
def mark_sensitive_parameters(r, k)
111+
unless r.sensitive_parameters.include?(k.to_sym)
112+
r.sensitive_parameters = (r.sensitive_parameters + [k.to_sym]).freeze
113+
end
114+
end
115+
private :mark_sensitive_parameters
116+
100117
def resolve(x)
101118
if x.class == @deferred_class
102119
resolve_future(x)

spec/integration/application/apply_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,5 +755,19 @@ def bogus()
755755
.and output(/Notify\[runs before file\]/).to_stdout
756756
.and output(/Validation of File.* failed: You cannot specify more than one of content, source, target/).to_stderr
757757
end
758+
759+
it "applies deferred sensitive file content" do
760+
manifest = <<~END
761+
file { '#{deferred_file}':
762+
ensure => file,
763+
content => Deferred('new', [Sensitive, "hello\n"])
764+
}
765+
END
766+
apply.command_line.args = ['-e', manifest]
767+
expect {
768+
apply.run
769+
}.to exit_with(0)
770+
.and output(/ensure: changed \[redacted\] to \[redacted\]/).to_stdout
771+
end
758772
end
759773
end

0 commit comments

Comments
 (0)