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