contrast-agent 6.1.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/contrast/agent/at_exit_hook.rb +2 -1
  3. data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +9 -5
  4. data/lib/contrast/agent/protect/rule/xss.rb +4 -0
  5. data/lib/contrast/agent/reporting/reporter.rb +2 -11
  6. data/lib/contrast/agent/reporting/reporting_events/application_inventory.rb +3 -18
  7. data/lib/contrast/agent/reporting/reporting_events/discovered_route.rb +75 -15
  8. data/lib/contrast/agent/reporting/reporting_events/finding.rb +2 -2
  9. data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +5 -19
  10. data/lib/contrast/agent/reporting/reporting_events/observed_library_usage.rb +6 -22
  11. data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +1 -1
  12. data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +2 -3
  13. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +1 -3
  14. data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +9 -0
  15. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +1 -2
  16. data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -10
  17. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +0 -1
  18. data/lib/contrast/agent/reporting/reporting_utilities/response.rb +60 -2
  19. data/lib/contrast/agent/reporting/reporting_utilities/response_extractor.rb +32 -10
  20. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
  21. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +58 -26
  22. data/lib/contrast/agent/reporting/settings/application_settings.rb +8 -23
  23. data/lib/contrast/agent/reporting/settings/assess_server_feature.rb +27 -33
  24. data/lib/contrast/agent/reporting/settings/bot_blocker.rb +68 -0
  25. data/lib/contrast/agent/reporting/settings/code_exclusion.rb +27 -0
  26. data/lib/contrast/agent/reporting/settings/exclusion_base.rb +33 -0
  27. data/lib/contrast/agent/reporting/settings/exclusions.rb +39 -57
  28. data/lib/contrast/agent/reporting/settings/helpers.rb +56 -0
  29. data/lib/contrast/agent/reporting/settings/input_exclusion.rb +37 -0
  30. data/lib/contrast/agent/reporting/settings/ip_filter.rb +35 -0
  31. data/lib/contrast/agent/reporting/settings/keyword.rb +74 -0
  32. data/lib/contrast/agent/reporting/settings/log_enhancer.rb +65 -0
  33. data/lib/contrast/agent/reporting/settings/protect.rb +4 -2
  34. data/lib/contrast/agent/reporting/settings/protect_server_feature.rb +62 -115
  35. data/lib/contrast/agent/reporting/settings/reaction.rb +11 -2
  36. data/lib/contrast/agent/reporting/settings/rule_definition.rb +63 -0
  37. data/lib/contrast/agent/reporting/settings/sampling.rb +10 -0
  38. data/lib/contrast/agent/reporting/settings/sanitizer.rb +38 -0
  39. data/lib/contrast/agent/reporting/settings/sensitive_data_masking.rb +9 -1
  40. data/lib/contrast/agent/reporting/settings/sensitive_data_masking_rule.rb +7 -0
  41. data/lib/contrast/agent/reporting/settings/server_features.rb +8 -0
  42. data/lib/contrast/agent/reporting/settings/syslog.rb +176 -0
  43. data/lib/contrast/agent/reporting/settings/url_exclusion.rb +42 -0
  44. data/lib/contrast/agent/reporting/settings/validator.rb +17 -0
  45. data/lib/contrast/agent/request_context.rb +4 -0
  46. data/lib/contrast/agent/request_handler.rb +8 -4
  47. data/lib/contrast/agent/static_analysis.rb +4 -8
  48. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions_report.rb +1 -1
  49. data/lib/contrast/agent/thread_watcher.rb +4 -5
  50. data/lib/contrast/agent/version.rb +1 -1
  51. data/lib/contrast/agent.rb +1 -3
  52. data/lib/contrast/api/decorators/application_update.rb +0 -8
  53. data/lib/contrast/api/decorators.rb +0 -1
  54. data/lib/contrast/framework/base_support.rb +5 -4
  55. data/lib/contrast/framework/grape/support.rb +6 -6
  56. data/lib/contrast/framework/manager.rb +2 -4
  57. data/lib/contrast/framework/manager_extend.rb +1 -0
  58. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +2 -1
  59. data/lib/contrast/framework/rails/support.rb +9 -2
  60. data/lib/contrast/framework/sinatra/support.rb +3 -2
  61. data/lib/contrast/logger/aliased_logging.rb +31 -26
  62. data/lib/contrast/utils/response_utils.rb +14 -1
  63. data/lib/contrast/utils/telemetry.rb +9 -0
  64. data/lib/contrast/utils/telemetry_hash.rb +36 -12
  65. data/lib/contrast/utils/telemetry_identifier.rb +8 -0
  66. data/lib/contrast/utils/thread_tracker.rb +26 -9
  67. data/lib/contrast/utils/timer.rb +6 -1
  68. data/lib/contrast.rb +1 -3
  69. metadata +26 -14
  70. data/lib/contrast/api/decorators/library_usage_update.rb +0 -31
@@ -17,7 +17,7 @@ module Contrast
17
17
  # @param data [Object] Any structured data
18
18
  def warn message = nil, exception = nil, data = nil, &block
19
19
  # build Telemetry Exclusion
20
- build_exclusion(ALIASED_WARN, message, exception, data)
20
+ build_exception(ALIASED_WARN, message, exception, data)
21
21
  super(message, exception, data, &block)
22
22
  end
23
23
 
@@ -26,7 +26,7 @@ module Contrast
26
26
  # @param data [Object] Any structured data
27
27
  def error message = nil, exception = nil, data = nil, &block
28
28
  # build Telemetry Exclusion
29
- build_exclusion(ALIASED_ERROR, message, exception, data)
29
+ build_exception(ALIASED_ERROR, message, exception, data)
30
30
  super(message, exception, data, &block)
31
31
  end
32
32
 
@@ -35,35 +35,35 @@ module Contrast
35
35
  # @param data [Object] Any structured data
36
36
  def fatal message = nil, exception = nil, data = nil, &block
37
37
  # build Telemetry Exclusion
38
- build_exclusion(ALIASED_FATAL, message, exception, data)
38
+ build_exception(ALIASED_FATAL, message, exception, data)
39
39
  super(message, exception, data, &block)
40
40
  end
41
41
 
42
42
  private
43
43
 
44
- def build_exclusion _type, _message = nil, _exception = nil, _data = nil
45
- # TODO: RUBY-1698
46
- nil
47
- # start = caller_locations&.find_index { |stack| stack.to_s.include?(type) }
48
- # stack_trace = start ? caller_locations(start + 1, 20) : caller_locations(20, 20)
49
- # stack_frame_type = Contrast::Agent::Telemetry::TelemetryException::Obfuscate.obfuscate_type(
50
- # stack_trace[1].path.delete_prefix(Dir.pwd))
51
- # message_exception_type = Contrast::Agent::Telemetry::TelemetryException::Obfuscate.obfuscate_exception_type(
52
- # exception ? exception.cs__class.to_s : stack_frame_type.split('/').last)
53
- # stack_frame_function = stack_trace[1].label
54
- # key = "#{ stack_frame_type }|#{ stack_frame_function }|#{ message }"
55
- # if TELEMETRY_EXCEPTIONS[key]
56
- # TELEMETRY_EXCEPTIONS.increment(key)
57
- # return
58
- # end
59
- #
60
- # event_message = create_message(stack_frame_function,
61
- # stack_frame_type, message_exception_type,
62
- # data, exception,
63
- # message)
64
- # TELEMETRY_EXCEPTIONS[key] = event_message
65
- # rescue StandardError => e
66
- # debug('Unable to report exception to telemetry', e)
44
+ def build_exception type, message = nil, exception = nil, data = nil
45
+ stack_trace = get_stack_trace(type)
46
+ stack_frame_type = Contrast::Agent::Telemetry::TelemetryException::Obfuscate.obfuscate_type(
47
+ stack_trace[1].path.delete_prefix(Dir.pwd))
48
+ stack_frame_function = stack_trace[1].label
49
+ key = "#{ stack_frame_type }|#{ stack_frame_function }|#{ message }"
50
+ if TELEMETRY_EXCEPTIONS[key]
51
+ TELEMETRY_EXCEPTIONS.increment(key)
52
+ return
53
+ end
54
+
55
+ return if TELEMETRY_EXCEPTIONS.exception_limit?
56
+
57
+ message_exception_type = Contrast::Agent::Telemetry::TelemetryException::Obfuscate.obfuscate_exception_type(
58
+ exception ? exception.cs__class.to_s : stack_frame_type.split('/').last)
59
+
60
+ event_message = create_message(stack_frame_function,
61
+ stack_frame_type, message_exception_type,
62
+ data, exception,
63
+ message)
64
+ TELEMETRY_EXCEPTIONS[key] = event_message
65
+ rescue StandardError => e
66
+ debug('Unable to report exception to telemetry', e)
67
67
  end
68
68
 
69
69
  def create_message stack_frame_function, stack_frame_type, message_exception_type, data, exception, message
@@ -89,6 +89,11 @@ module Contrast
89
89
  message = Contrast::Agent::Telemetry::TelemetryException::Message.build(tags, [message_exception])
90
90
  Contrast::Agent::Telemetry::TelemetryException::Event.new(message)
91
91
  end
92
+
93
+ def get_stack_trace type
94
+ start = caller_locations&.find_index { |stack| stack.to_s.include?(type) }
95
+ start ? caller_locations(start + 1, 20) : caller_locations(20, 20)
96
+ end
92
97
  end
93
98
  end
94
99
  end
@@ -34,7 +34,7 @@ module Contrast
34
34
  # @return [nil, String] the content of the body
35
35
  def extract_body body
36
36
  return unless body
37
- return if defined?(Rack::File) && body.is_a?(Rack::File)
37
+ return if body_is_file?(body)
38
38
 
39
39
  return handle_rack_body_proxy(body) if body.is_a?(Rack::BodyProxy)
40
40
  return extract_body(body.body) if sub_extractable?(body)
@@ -77,6 +77,19 @@ module Contrast
77
77
  obj.to_s
78
78
  end
79
79
  end
80
+
81
+ # After Rack 3.1 gets live - line 88 (Rack::File) will be removed.
82
+ # In 3.1 version, they drop the support for File class and will only support Files class
83
+ #
84
+ # @param body [String, Rack::File, Rack::BodyProxy,
85
+ # ActionDispatch::Response::RackBody, Rack::Response] Something that
86
+ # holds, wraps, or is the body of the Response
87
+ def body_is_file? body
88
+ return true if defined?(Rack::File) && (body.is_a?(Rack::File) || body.is_a?(Rack::File::Iterator))
89
+ return true if defined?(Rack::Files) && (body.is_a?(Rack::Files) || body.is_a?(Rack::Files::Iterator))
90
+
91
+ false
92
+ end
80
93
  end
81
94
  end
82
95
  end
@@ -34,10 +34,16 @@ module Contrast
34
34
  write_mark_file(DIR, FILE, CONFIG_DIR)
35
35
  end
36
36
 
37
+ # The telemetry disclaimer message, set if needed.
38
+ #
39
+ # @return [String]
37
40
  def self.disclaimer
38
41
  @_disclaimer = MESSAGE[:disclaimer]
39
42
  end
40
43
 
44
+ # Determine if telemetry has been explicitly disabled by opt out or has been left running.
45
+ #
46
+ # @return [Boolean]
41
47
  def self.exceptions_enabled?
42
48
  @_exceptions_enabled = telemetry_exceptions_enabled? if @_exceptions_enabled.nil?
43
49
  @_exceptions_enabled
@@ -82,6 +88,9 @@ module Contrast
82
88
  false
83
89
  end
84
90
 
91
+ # Determine if telemetry has been explicitly disabled by opt out or has been left running.
92
+ #
93
+ # @return [Boolean]
85
94
  def telemetry_exceptions_enabled?
86
95
  opts_out_telemetry = return_value(:telemetry_opt_outs).to_s
87
96
  return false if opts_out_telemetry.casecmp?('true') || opts_out_telemetry == '1'
@@ -2,34 +2,58 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/components/logger'
5
+ require 'contrast/agent/telemetry/events/exceptions/telemetry_exception_event'
5
6
 
6
7
  module Contrast
7
8
  module Utils
8
- # This is the TelemetryHash, which will take data type, so we can push freely, without worrying about
9
- # validating the event before that
9
+ # This is the TelemetryHash, which will store Contrast::Agent::Telemetry::TelemetryException::Event, so we can push
10
+ # freely, without worrying about validating the event before that. TelemetryHash has a max size of events,
11
+ # default is 10 events
10
12
  class TelemetryHash < Hash
11
13
  include Contrast::Components::Logger::InstanceMethods
14
+ HASH_SIZE_LIMIT = 10
12
15
 
13
- attr_reader :data_type
14
-
15
- def initialize data_type, *_several_variants
16
- super()
17
- @data_type = data_type
18
- end
19
-
16
+ # Wrapper to set a value in this TelemetryHash only if the provided value is of the data_type for this
17
+ # TelemetryHash or the hash has not reached its limit of for unique keys
18
+ #
19
+ # @param key [Object] the key to which to associate the value
20
+ # @param value [Object] the value to store
21
+ # @return [Object, nil] echo back out the value as the Hash#[]= method does, or nil if not of the expected
22
+ # data_type
20
23
  def []= key, value
24
+ return if exception_limit?
21
25
  return unless valid_value?(value)
22
26
 
23
27
  super(key, value)
24
28
  end
25
29
 
30
+ # Increment the occurrences for the exception object contained in this TelemetryHash
31
+ #
32
+ # @param key [Object] the key to check for the exception stored in this TelemetryHash
26
33
  def increment key
27
- self[key].exceptions[0].increment_occurrences
28
- :incremented!
34
+ value = self[key]
35
+ return unless value&.exceptions&.any?
36
+
37
+ value.exceptions[0].increment_occurrences
29
38
  end
30
39
 
40
+ # Determine if hash has reached exception event limit
41
+ # @return [Boolean]
42
+ def exception_limit?
43
+ unless size < HASH_SIZE_LIMIT
44
+ logger.debug("Number of TelemetryExceptions exceeds limit of #{ HASH_SIZE_LIMIT }")
45
+ return true
46
+ end
47
+ false
48
+ end
49
+
50
+ private
51
+
52
+ # Determine if the given value is valid based on the datatype which this TelemetryHash contains
53
+ # @param value [Object]
54
+ # @return boolean
31
55
  def valid_value? value
32
- unless value.cs__is_a?(data_type)
56
+ unless value.cs__is_a?(Contrast::Agent::Telemetry::TelemetryException::Event)
33
57
  logger.debug('The following key will be omitted', value: value)
34
58
  return false
35
59
  end
@@ -38,6 +38,10 @@ module Contrast
38
38
  @_mac = find_mac(primary) || find_mac
39
39
  end
40
40
 
41
+ # Set and return a Sha256 hash representing this application, based on the mac identifier of this machine and
42
+ # the application name or a Secure UUID if one of them cannot be determined.
43
+ #
44
+ # @return [String]
41
45
  def self.application_id
42
46
  @_application_id ||= begin
43
47
  id = nil
@@ -48,6 +52,10 @@ module Contrast
48
52
  end
49
53
  end
50
54
 
55
+ # Set and return a Sha256 hash representing this agent run, based on the mac identifier of this machine or a
56
+ # Secure UUID if one cannot be determined.
57
+ #
58
+ # @return [String]
51
59
  def self.instance_id
52
60
  @_instance_id ||= Digest::SHA2.new(256).hexdigest(Contrast::Utils::Telemetry::Identifier.mac ||
53
61
  "_#{ SecureRandom.uuid }")
@@ -3,36 +3,53 @@
3
3
 
4
4
  module Contrast
5
5
  module Utils
6
- # ThreadTracker allows tracking of singleton objects across threads
6
+ # ThreadTracker allows tracking of singleton objects across threads. It acts on Thread#[] as that call is
7
+ # fiber-local where as Thread#thread_variables is not.
7
8
  class ThreadTracker
8
- def initialize; end
9
-
10
- # Note about Ruby -- thread#[] is fiber-local,
11
- # #thread_variables is not.
12
-
9
+ # Get the given key to given value in Thread#[] or return default.
10
+ #
11
+ # @param key [Object] key used to reference the value
12
+ # @param default [Object] value to return if not present in Thread#[]
13
+ # @return [Object]
13
14
  def get key, default = nil
14
15
  Thread.current[key] || default
15
16
  end
16
17
 
18
+ # Set the given key to given value in Thread#[].
19
+ #
20
+ # @param key [Object] key used to reference the value
21
+ # @param value [Object] value to store
17
22
  def set key, value
18
23
  Thread.current[key] = value
19
24
  end
20
25
 
26
+ # Remove the given key from the current Thread#[] by setting it to nil.
27
+ #
28
+ # @param key [Object] key of the value to delete
21
29
  def delete key
22
30
  Thread.current[key] = nil
23
31
  end
24
32
 
25
- def lifespan obj
26
- set(:current_context, obj)
27
- response = yield(obj)
33
+ # Wrap the block given with a RequestContext by setting it beforehand and deleting it after.
34
+ #
35
+ # @param context [Contrast::Agent::RequestContext]
36
+ def lifespan context
37
+ set(:current_context, context)
38
+ response = yield(context)
28
39
  delete(:current_context)
29
40
  response
30
41
  end
31
42
 
43
+ # Retrieve the Thread#[] RequestContext
44
+ #
45
+ # @return [Contrast::Agent::RequestContext]
32
46
  def current
33
47
  get(:current_context)
34
48
  end
35
49
 
50
+ # Set the Thread#[] context to the one provided.
51
+ #
52
+ # @param context [Contrast::Agent::RequestContext]
36
53
  def update_current_context context
37
54
  set(:current_context, context)
38
55
  end
@@ -6,14 +6,19 @@ module Contrast
6
6
  # Timer is class that can track state about when an event starts and how long it takes
7
7
  # Also contains utility methods to get time values in milliseconds
8
8
  class Timer
9
- attr_reader :start_ms, :events
9
+ # @return [Integer] the ms of the Time that this instance represents
10
+ attr_reader :start_ms
10
11
 
12
+ # Create a wrapper for the current time
13
+ #
14
+ # @param time [Time]
11
15
  def initialize time = Time.now
12
16
  @start_at = time
13
17
  @start_ms = (@start_at.to_f * 1000).to_i
14
18
  @events = {}
15
19
  end
16
20
 
21
+ # @return [Integer] time, in ms
17
22
  def self.now_ms
18
23
  (Time.now.to_f * 1000).to_i
19
24
  end
data/lib/contrast.rb CHANGED
@@ -66,9 +66,7 @@ module Contrast
66
66
  end
67
67
 
68
68
  module Contrast
69
- TELEMETRY_EXCEPTIONS = if Contrast::Utils::Telemetry.exceptions_enabled?
70
- Contrast::Utils::TelemetryHash.new(Contrast::Agent::Telemetry::TelemetryException::Event)
71
- end
69
+ TELEMETRY_EXCEPTIONS = (Contrast::Utils::TelemetryHash.new if Contrast::Utils::Telemetry.exceptions_enabled?)
72
70
  end
73
71
 
74
72
  # This needs to be required very early, after component interfaces, and before instrumentation attempts
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contrast-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.2
4
+ version: 6.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - galen.palmer@contrastsecurity.com
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: exe
15
15
  cert_chain: []
16
- date: 2022-05-12 00:00:00.000000000 Z
16
+ date: 2022-05-27 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: bundler
@@ -631,22 +631,22 @@ executables:
631
631
  - contrast_service
632
632
  extensions:
633
633
  - ext/cs__common/extconf.rb
634
- - ext/cs__assess_marshal_module/extconf.rb
635
- - ext/cs__assess_kernel/extconf.rb
636
- - ext/cs__assess_string/extconf.rb
637
- - ext/cs__assess_test/extconf.rb
638
634
  - ext/cs__assess_string_interpolation26/extconf.rb
639
- - ext/cs__assess_basic_object/extconf.rb
640
635
  - ext/cs__assess_array/extconf.rb
641
- - ext/cs__assess_regexp/extconf.rb
642
- - ext/cs__contrast_patch/extconf.rb
643
- - ext/cs__assess_hash/extconf.rb
644
- - ext/cs__scope/extconf.rb
636
+ - ext/cs__assess_basic_object/extconf.rb
645
637
  - ext/cs__assess_fiber_track/extconf.rb
646
- - ext/cs__assess_module/extconf.rb
638
+ - ext/cs__assess_hash/extconf.rb
639
+ - ext/cs__assess_marshal_module/extconf.rb
640
+ - ext/cs__assess_yield_track/extconf.rb
641
+ - ext/cs__assess_string/extconf.rb
642
+ - ext/cs__assess_regexp/extconf.rb
647
643
  - ext/cs__os_information/extconf.rb
644
+ - ext/cs__scope/extconf.rb
645
+ - ext/cs__assess_test/extconf.rb
648
646
  - ext/cs__tests/extconf.rb
649
- - ext/cs__assess_yield_track/extconf.rb
647
+ - ext/cs__assess_kernel/extconf.rb
648
+ - ext/cs__assess_module/extconf.rb
649
+ - ext/cs__contrast_patch/extconf.rb
650
650
  extra_rdoc_files: []
651
651
  files:
652
652
  - ".clang-format"
@@ -1057,14 +1057,27 @@ files:
1057
1057
  - lib/contrast/agent/reporting/settings/application_settings.rb
1058
1058
  - lib/contrast/agent/reporting/settings/assess.rb
1059
1059
  - lib/contrast/agent/reporting/settings/assess_server_feature.rb
1060
+ - lib/contrast/agent/reporting/settings/bot_blocker.rb
1061
+ - lib/contrast/agent/reporting/settings/code_exclusion.rb
1062
+ - lib/contrast/agent/reporting/settings/exclusion_base.rb
1060
1063
  - lib/contrast/agent/reporting/settings/exclusions.rb
1064
+ - lib/contrast/agent/reporting/settings/helpers.rb
1065
+ - lib/contrast/agent/reporting/settings/input_exclusion.rb
1066
+ - lib/contrast/agent/reporting/settings/ip_filter.rb
1067
+ - lib/contrast/agent/reporting/settings/keyword.rb
1068
+ - lib/contrast/agent/reporting/settings/log_enhancer.rb
1061
1069
  - lib/contrast/agent/reporting/settings/protect.rb
1062
1070
  - lib/contrast/agent/reporting/settings/protect_server_feature.rb
1063
1071
  - lib/contrast/agent/reporting/settings/reaction.rb
1072
+ - lib/contrast/agent/reporting/settings/rule_definition.rb
1064
1073
  - lib/contrast/agent/reporting/settings/sampling.rb
1074
+ - lib/contrast/agent/reporting/settings/sanitizer.rb
1065
1075
  - lib/contrast/agent/reporting/settings/sensitive_data_masking.rb
1066
1076
  - lib/contrast/agent/reporting/settings/sensitive_data_masking_rule.rb
1067
1077
  - lib/contrast/agent/reporting/settings/server_features.rb
1078
+ - lib/contrast/agent/reporting/settings/syslog.rb
1079
+ - lib/contrast/agent/reporting/settings/url_exclusion.rb
1080
+ - lib/contrast/agent/reporting/settings/validator.rb
1068
1081
  - lib/contrast/agent/request.rb
1069
1082
  - lib/contrast/agent/request_context.rb
1070
1083
  - lib/contrast/agent/request_context_extend.rb
@@ -1118,7 +1131,6 @@ files:
1118
1131
  - lib/contrast/api/decorators/instrumentation_mode.rb
1119
1132
  - lib/contrast/api/decorators/ip_denylist.rb
1120
1133
  - lib/contrast/api/decorators/library.rb
1121
- - lib/contrast/api/decorators/library_usage_update.rb
1122
1134
  - lib/contrast/api/decorators/message.rb
1123
1135
  - lib/contrast/api/decorators/rasp_rule_sample.rb
1124
1136
  - lib/contrast/api/decorators/response_type.rb
@@ -1,31 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/utils/string_utils'
5
-
6
- module Contrast
7
- module Api
8
- module Decorators
9
- # Used to decorate the LibraryUsageUpdate protobuf
10
- module LibraryUsageUpdate
11
- def self.included klass
12
- klass.extend(ClassMethods)
13
- end
14
-
15
- # Used to add class methods to the LibraryUsageUpdate class on inclusion of the decorator
16
- module ClassMethods
17
- def build digest, files
18
- msg = new
19
- msg.hash_code = Contrast::Utils::StringUtils.force_utf8(digest)
20
- files.each do |required_file|
21
- msg.class_names[required_file] = true
22
- end
23
- msg
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
-
31
- Contrast::Api::Dtm::LibraryUsageUpdate.include(Contrast::Api::Decorators::LibraryUsageUpdate)