lib/contrast/agent/assess/policy/propagator/substitution.rb in contrast-agent-3.15.0 vs lib/contrast/agent/assess/policy/propagator/substitution.rb in contrast-agent-3.16.0
- old
+ new
@@ -49,20 +49,27 @@
self_tracked = Contrast::Agent::Assess::Tracker.tracked?(source)
args = preshift.args[1]
incoming_tracked = args && determine_tracked(args)
return ret unless self_tracked || incoming_tracked
+ parent_events = []
if block
block_sub(self_tracked, source, ret)
elsif args.is_a?(String)
- string_sub(self_tracked, preshift, ret, args, incoming_tracked, global)
+ string_sub(parent_events, self_tracked, preshift, ret, args, incoming_tracked, global)
elsif args.is_a?(Hash)
hash_sub(self_tracked, source, ret)
else # Enumerator, only for gsub
- pattern_gsub(preshift, ret)
+ pattern_gsub(parent_events, preshift, ret)
end
- string_build_event(patcher, preshift, ret)
+
+ if self_tracked
+ source_properties = Contrast::Agent::Assess::Tracker.properties(source)
+ parent_event = source_properties&.event
+ parent_events.prepend(parent_event) if parent_event
+ end
+ string_build_event(parent_events, patcher, preshift, ret)
rescue StandardError => e
logger.error('Unable to apply gsub propagator', e)
end
ret
end
@@ -82,14 +89,18 @@
else
false
end
end
- def string_sub self_tracked, preshift, ret, incoming, incoming_tracked, global
+ def string_sub parent_events, self_tracked, preshift, ret, incoming, incoming_tracked, global
properties = Contrast::Agent::Assess::Tracker.properties(ret)
return unless properties
+ incoming_properties = Contrast::Agent::Assess::Tracker.properties(incoming)
+ parent_event = incoming_properties&.event
+ parent_events << parent_event if parent_event
+
pattern = preshift.args[0]
source = preshift.object
# We can't efficiently find the places that things were
# copied from regexp / captures. Trading accuracy for
@@ -117,12 +128,12 @@
break unless global
end
properties.delete_tags_at_ranges(ranges)
properties.shift_tags(ranges)
return unless incoming_tracked
+ return unless incoming_properties
- incoming_properties = Contrast::Agent::Assess::Tracker.properties(incoming)
tags = incoming_properties.tag_keys
ranges.each do |range|
tags.each do |tag|
properties.add_tag(tag, range)
end
@@ -137,41 +148,37 @@
def hash_sub self_tracked, source, ret
properties = Contrast::Agent::Assess::Tracker.properties(ret)
properties&.splat_from(source, ret) if self_tracked
end
- def pattern_gsub preshift, ret
+ def pattern_gsub parent_events, preshift, ret
properties = Contrast::Agent::Assess::Tracker.properties(ret)
return unless properties
source = preshift.object
source_properties = Contrast::Agent::Assess::Tracker.properties(source)
return unless source_properties
source_properties.tag_keys.each do |key|
properties.add_tag(key, 0...1)
end
+ parent_event = source_properties.event
+ parent_events << parent_event if parent_event
end
- def string_build_event patcher, preshift, ret
+ def string_build_event parent_events, patcher, preshift, ret
return unless Contrast::Agent::Assess::Tracker.tracked?(ret)
properties = Contrast::Agent::Assess::Tracker.properties(ret)
args = preshift.args
- if args.length > 1
- arg = args[1]
- arg_properties = Contrast::Agent::Assess::Tracker.properties(arg)
- arg_properties&.events&.each do |event|
- properties.events << event
- end
- end
properties.build_event(
patcher,
ret,
preshift.object,
ret,
args,
2)
+ properties.event.instance_variable_set(:@_parent_events, parent_events)
end
end
end
end
end