contrast-agent 4.9.1 → 4.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.rspec_parallel +6 -0
  4. data/ext/cs__contrast_patch/cs__contrast_patch.c +0 -1
  5. data/ext/cs__contrast_patch/cs__contrast_patch.h +0 -2
  6. data/lib/contrast/agent/assess/contrast_event.rb +0 -1
  7. data/lib/contrast/agent/assess/finalizers/hash.rb +0 -1
  8. data/lib/contrast/agent/assess/policy/patcher.rb +0 -1
  9. data/lib/contrast/agent/assess/policy/policy_scanner.rb +0 -2
  10. data/lib/contrast/agent/assess/policy/preshift.rb +8 -5
  11. data/lib/contrast/agent/assess/policy/propagation_method.rb +100 -57
  12. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +0 -2
  13. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +31 -11
  14. data/lib/contrast/agent/assess/policy/propagator/split.rb +3 -2
  15. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +1 -0
  16. data/lib/contrast/agent/assess/policy/rewriter_patch.rb +0 -1
  17. data/lib/contrast/agent/assess/policy/source_method.rb +13 -17
  18. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +0 -1
  19. data/lib/contrast/agent/assess/policy/trigger_method.rb +59 -83
  20. data/lib/contrast/agent/assess/property/evented.rb +2 -1
  21. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +0 -1
  22. data/lib/contrast/agent/disable_reaction.rb +1 -1
  23. data/lib/contrast/agent/exclusion_matcher.rb +0 -4
  24. data/lib/contrast/agent/inventory/database_config.rb +117 -0
  25. data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +5 -4
  26. data/lib/contrast/agent/inventory/policy/datastores.rb +2 -2
  27. data/lib/contrast/agent/middleware.rb +1 -0
  28. data/lib/contrast/agent/patching/policy/after_load_patch.rb +3 -0
  29. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +18 -12
  30. data/lib/contrast/agent/patching/policy/module_policy.rb +2 -4
  31. data/lib/contrast/agent/patching/policy/patch.rb +5 -0
  32. data/lib/contrast/agent/patching/policy/patch_status.rb +3 -7
  33. data/lib/contrast/agent/patching/policy/patcher.rb +8 -8
  34. data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +1 -1
  35. data/lib/contrast/agent/protect/rule/no_sqli.rb +7 -53
  36. data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +137 -0
  37. data/lib/contrast/agent/protect/rule/sqli.rb +7 -70
  38. data/lib/contrast/agent/reaction_processor.rb +1 -1
  39. data/lib/contrast/agent/request.rb +5 -2
  40. data/lib/contrast/agent/request_context.rb +19 -22
  41. data/lib/contrast/agent/static_analysis.rb +1 -1
  42. data/lib/contrast/agent/tracepoint_hook.rb +6 -1
  43. data/lib/contrast/agent/version.rb +1 -1
  44. data/lib/contrast/api/communication/messaging_queue.rb +12 -6
  45. data/lib/contrast/api/communication/service_lifecycle.rb +4 -1
  46. data/lib/contrast/api/communication/socket_client.rb +4 -4
  47. data/lib/contrast/api/decorators/agent_startup.rb +4 -4
  48. data/lib/contrast/api/decorators/application_startup.rb +6 -5
  49. data/lib/contrast/api/decorators/route_coverage.rb +24 -1
  50. data/lib/contrast/components/agent.rb +5 -2
  51. data/lib/contrast/components/assess.rb +6 -3
  52. data/lib/contrast/components/base.rb +2 -2
  53. data/lib/contrast/components/config.rb +1 -0
  54. data/lib/contrast/components/contrast_service.rb +4 -2
  55. data/lib/contrast/components/logger.rb +13 -8
  56. data/lib/contrast/components/scope.rb +9 -28
  57. data/lib/contrast/config/base_configuration.rb +14 -6
  58. data/lib/contrast/configuration.rb +19 -15
  59. data/lib/contrast/extension/assess/array.rb +1 -11
  60. data/lib/contrast/extension/assess/eval_trigger.rb +0 -20
  61. data/lib/contrast/extension/assess/fiber.rb +0 -11
  62. data/lib/contrast/extension/assess/hash.rb +0 -10
  63. data/lib/contrast/extension/assess/kernel.rb +1 -10
  64. data/lib/contrast/extension/assess/marshal.rb +3 -11
  65. data/lib/contrast/extension/assess/regexp.rb +0 -11
  66. data/lib/contrast/extension/assess/string.rb +1 -26
  67. data/lib/contrast/extension/extension.rb +61 -0
  68. data/lib/contrast/extension/protect/kernel.rb +0 -10
  69. data/lib/contrast/framework/grape/support.rb +174 -0
  70. data/lib/contrast/framework/manager.rb +42 -6
  71. data/lib/contrast/framework/rack/support.rb +1 -1
  72. data/lib/contrast/framework/rails/patch/assess_configuration.rb +0 -1
  73. data/lib/contrast/framework/rails/patch/support.rb +6 -3
  74. data/lib/contrast/framework/rails/railtie.rb +1 -1
  75. data/lib/contrast/framework/rails/rewrite/active_record_named.rb +1 -0
  76. data/lib/contrast/framework/rails/support.rb +60 -13
  77. data/lib/contrast/framework/sinatra/support.rb +1 -1
  78. data/lib/contrast/logger/log.rb +89 -15
  79. data/lib/contrast/utils/io_util.rb +1 -1
  80. data/lib/contrast/utils/ruby_ast_rewriter.rb +16 -13
  81. data/lib/contrast/utils/tag_util.rb +2 -1
  82. data/resources/assess/policy.json +197 -2
  83. data/resources/deadzone/policy.json +10 -0
  84. data/ruby-agent.gemspec +10 -1
  85. metadata +78 -12
  86. data/lib/contrast/utils/inventory_util.rb +0 -113
@@ -9,7 +9,7 @@ module Contrast
9
9
  # Because communication between the Agent/Service and TeamServer can only be initiated by outbound connections
10
10
  # from the Agent/Service, we must provide a mechanism for the TeamServer to direct the Agent to take a specific
11
11
  # action. This action is referred to as a Reaction. This class is how we handle those Reaction messages.
12
- class ReactionProcessor
12
+ module ReactionProcessor
13
13
  extend Contrast::Components::Logger::InstanceMethods
14
14
 
15
15
  # Process the given Reactions from the application settings based on what
@@ -183,8 +183,11 @@ module Contrast
183
183
  res[prefix] = Contrast::Utils::ObjectShare::EMPTY_STRING if prefix
184
184
  res
185
185
  when Enumerable
186
- res = val.each_with_index.each_with_object({}) do |(v, i), hash|
187
- hash.merge! normalize_params(v, prefix: "#{ prefix }[#{ i }]")
186
+ idx = 0
187
+ res = {}
188
+ while idx < val.size
189
+ res.merge! normalize_params(val[idx], prefix: "#{ prefix }[#{ idx }]")
190
+ idx += 1
188
191
  end
189
192
  res[prefix] = Contrast::Utils::ObjectShare::EMPTY_STRING if prefix
190
193
  res
@@ -4,15 +4,14 @@
4
4
  require 'contrast/utils/timer'
5
5
  require 'contrast/agent/request'
6
6
  require 'contrast/agent/response'
7
- require 'contrast/utils/inventory_util'
7
+ require 'contrast/agent/inventory/database_config'
8
8
  require 'contrast/components/logger'
9
9
  require 'contrast/components/scope'
10
10
 
11
11
  module Contrast
12
12
  module Agent
13
- # This class acts to encapsulate information about the currently executed
14
- # request, making it available to the Agent for the duration of the request
15
- # in a standardized and normalized format which the Agent understands.
13
+ # This class acts to encapsulate information about the currently executed request, making it available to the Agent
14
+ # for the duration of the request in a standardized and normalized format which the Agent understands.
16
15
  #
17
16
  # @attr_reader timer [Contrast::Utils::Timer] when the context was created
18
17
  # @attr_reader logging_hash [Hash] context used to log the request
@@ -85,9 +84,11 @@ module Contrast
85
84
  @sample_response
86
85
  end
87
86
 
88
- # Convert the discovered route for this request to appropriate forms and
89
- # disseminate it to those locations where it is necessary for our route
90
- # coverage and finding vulnerability discovery features to function.
87
+ # Convert the discovered route for this request to appropriate forms and disseminate it to those locations
88
+ # where it is necessary for our route coverage and finding vulnerability discovery features to function.
89
+ #
90
+ # @param route [Contrast::Api::Dtm::RouteCoverage, nil] the route of the current request, as determined from the
91
+ # framework
91
92
  def append_route_coverage route
92
93
  return unless route
93
94
 
@@ -108,8 +109,8 @@ module Contrast
108
109
  # Collect the results for the given rule with the given action
109
110
  #
110
111
  # @param rule [String] the id of the rule to which the results apply
111
- # @param response_type [Symbol] the result of the response, matching a
112
- # value of Contrast::Api::Dtm::AttackResult::ResponseType
112
+ # @param response_type [Symbol] the result of the response, matching a value of
113
+ # Contrast::Api::Dtm::AttackResult::ResponseType
113
114
  # @return [Array<Contrast::Api::Dtm::AttackResult>]
114
115
  def results_for rule, response_type = nil
115
116
  if response_type.nil?
@@ -145,10 +146,9 @@ module Contrast
145
146
  false
146
147
  end
147
148
 
148
- # NOTE: this method is only used as a backstop if Speedracer sends Input Evaluations
149
- # when the protect state indicates a security exception should be thrown. This method
150
- # ensures that the attack reports are generated. Normally these should be generated on
151
- # Speedracer for any attacks detected during prefilter.
149
+ # NOTE: this method is only used as a backstop if Speedracer sends Input Evaluations when the protect state
150
+ # indicates a security exception should be thrown. This method ensures that the attack reports are generated.
151
+ # Normally these should be generated on Speedracer for any attacks detected during prefilter.
152
152
  #
153
153
  # @param agent_settings [Contrast::Api::Settings::AgentSettings]
154
154
  def handle_protect_state agent_settings
@@ -165,9 +165,8 @@ module Contrast
165
165
  raise Contrast::SecurityException.new(nil, (state.security_message || 'Blocking suspicious behavior'))
166
166
  end
167
167
 
168
- # append anything we've learned to the request seen message
169
- # this is the sum-total of all inventory information that has
170
- # been accumulated since the last request
168
+ # append anything we've learned to the request seen message this is the sum-total of all inventory information
169
+ # that has been accumulated since the last request
171
170
  def extract_after rack_response
172
171
  @response = Contrast::Agent::Response.new(rack_response)
173
172
  activity.http_response = @response.dtm if @sample_response
@@ -185,14 +184,13 @@ module Contrast
185
184
 
186
185
  def reset_activity
187
186
  @activity = Contrast::Api::Dtm::Activity.new(http_request: request.dtm)
188
- @server_activity = Contrast::Api::Dtm::ServerActivity.new # it doesn't look like this is ever actually used?
187
+ @server_activity = Contrast::Api::Dtm::ServerActivity.new
189
188
  @observed_route = Contrast::Api::Dtm::ObservedRoute.new
190
189
  end
191
190
 
192
191
  private
193
192
 
194
- # Generate attack results directly from any evaluations on the
195
- # agent settings object.
193
+ # Generate attack results directly from any evaluations on the agent settings object.
196
194
  #
197
195
  # @param agent_settings [Contrast::Api::Settings::AgentSettings]
198
196
  def build_attack_results agent_settings
@@ -207,9 +205,8 @@ module Contrast
207
205
  logger.debug('Building attack result from Contrast Service input analysis result', result: ia_result.inspect)
208
206
 
209
207
  attack_result = if rule.mode == :BLOCK
210
- # special case for rules (like reflected xss)
211
- # that used to have an infilter / block
212
- # mode but now are just block at perimeter
208
+ # special case for rules (like reflected xss) that used to have an infilter / block mode
209
+ # but now are just block at perimeter
213
210
  rule.build_attack_with_match(self, ia_result, attack_results_by_rule[rule_id],
214
211
  ia_result.value)
215
212
  else
@@ -28,7 +28,7 @@ module Contrast
28
28
 
29
29
  app_update_msg = Contrast::Api::Dtm::ApplicationUpdate.build
30
30
 
31
- Contrast::Utils::InventoryUtil.append_db_config(app_update_msg)
31
+ Contrast::Agent::Inventory::DatabaseConfig.append_db_config(app_update_msg)
32
32
  Contrast::Agent.messaging_queue.send_event_eventually(app_update_msg)
33
33
  end
34
34
 
@@ -35,10 +35,15 @@ module Contrast
35
35
  path = tracepoint_event.path
36
36
  return if path&.include?('contrast')
37
37
 
38
+ Contrast::Agent.framework_manager.register_late_framework(loaded_module)
38
39
  Contrast::Agent::Inventory::DependencyUsageAnalysis.instance.associate_file(path) if path
39
40
  Contrast::Agent::Patching::Policy::Patcher.patch_specific_module(loaded_module)
40
- Contrast::Agent::Assess::Policy::RewriterPatch.rewrite_interpolation(loaded_module) if RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
41
+ if RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
42
+ Contrast::Agent::Assess::Policy::RewriterPatch.rewrite_interpolation(loaded_module)
43
+ end
41
44
  Contrast::Agent::Assess::Policy::PolicyScanner.scan(tracepoint_event)
45
+ rescue StandardError => e
46
+ logger.error('Unable to complete TracePoint analysis', e, module: loaded_module)
42
47
  end
43
48
  end
44
49
  end
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Contrast
5
5
  module Agent
6
- VERSION = '4.9.1'
6
+ VERSION = '4.10.0'
7
7
  end
8
8
  end
@@ -11,10 +11,9 @@ module Contrast
11
11
  class MessagingQueue < Contrast::Agent::WorkerThread
12
12
  include Contrast::Components::Logger::InstanceMethods
13
13
 
14
- attr_reader :queue, :speedracer
14
+ attr_reader :speedracer
15
15
 
16
16
  def initialize
17
- @queue = Queue.new
18
17
  @speedracer = Contrast::Api::Communication::Speedracer.new
19
18
  super
20
19
  end
@@ -28,6 +27,10 @@ module Contrast
28
27
  speedracer.return_response(event)
29
28
  end
30
29
 
30
+ def queue
31
+ @_queue ||= Queue.new
32
+ end
33
+
31
34
  # Use this to add a message to the queue and process the response internally
32
35
  def send_event_eventually event
33
36
  if ::Contrast::AGENT.disabled?
@@ -42,7 +45,6 @@ module Contrast
42
45
  speedracer.ensure_startup!
43
46
  return if running?
44
47
 
45
- @queue ||= Queue.new
46
48
  @_thread = Contrast::Agent::Thread.new do
47
49
  loop do
48
50
  event = queue.pop
@@ -58,13 +60,17 @@ module Contrast
58
60
  logger.debug('Started background sending thread.')
59
61
  end
60
62
 
63
+ def delete_queue!
64
+ @_queue&.clear
65
+ @_queue&.close
66
+ @_queue = nil
67
+ end
68
+
61
69
  def stop!
62
70
  return unless running?
63
71
 
64
72
  super
65
- @queue&.clear
66
- @queue&.close
67
- @queue = nil
73
+ delete_queue!
68
74
  end
69
75
  end
70
76
  end
@@ -6,10 +6,13 @@ require 'contrast/components/logger'
6
6
  module Contrast
7
7
  module Api
8
8
  module Communication
9
- # Handles local service startup
9
+ # Handles local service startup. As this should only ever be invoked by the Speedracer class, which includes
10
+ # this, all methods here are private.
10
11
  module ServiceLifecycle
11
12
  include Contrast::Components::Logger::InstanceMethods
12
13
 
14
+ private
15
+
13
16
  def attempt_local_service_startup
14
17
  zombie_check
15
18
  service_starter_thread.join(5)
@@ -37,8 +37,7 @@ module Contrast
37
37
  log_connection
38
38
  if ::Contrast::CONTRAST_SERVICE.use_tcp?
39
39
  Contrast::Api::Communication::TcpSocket.new(
40
- ::Contrast::CONTRAST_SERVICE.host, ::Contrast::CONTRAST_SERVICE.port
41
- )
40
+ ::Contrast::CONTRAST_SERVICE.host, ::Contrast::CONTRAST_SERVICE.port)
42
41
  else
43
42
  Contrast::Api::Communication::UnixSocket.new(::Contrast::CONTRAST_SERVICE.socket_path)
44
43
  end
@@ -61,8 +60,9 @@ module Contrast
61
60
 
62
61
  # Or something is not set.
63
62
  logger.warn(
64
- log_connection_error_msg, host: ::Contrast::CONTRAST_SERVICE.host, port: ::Contrast::CONTRAST_SERVICE.port
65
- )
63
+ log_connection_error_msg,
64
+ host: ::Contrast::CONTRAST_SERVICE.host,
65
+ port: ::Contrast::CONTRAST_SERVICE.port)
66
66
  end
67
67
 
68
68
  # If our connection isn't built properly, we need to warn the user. This builds out the context specific
@@ -41,11 +41,11 @@ module Contrast
41
41
  #
42
42
  # @param msg [Contrast::Api::Dtm::AgentStartup]
43
43
  def config! msg
44
- msg.version = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.version
45
- msg.environment = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.environment
46
- msg.server_tags = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.tags
44
+ msg.version = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.version
45
+ msg.server_tags = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.tags
46
+ msg.library_tags = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.inventory.tags
47
+ msg.environment = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.server.environment
47
48
  msg.application_tags = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.tags
48
- msg.library_tags = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.inventory.tags
49
49
  end
50
50
  end
51
51
  end
@@ -24,11 +24,12 @@ module Contrast
24
24
  # @return [Contrast::Api::Dtm::ApplicationCreate]
25
25
  def build
26
26
  msg = new
27
- msg.app_version = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.version.to_s
28
- msg.code = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.code
29
- msg.group = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.group
30
- msg.metadata = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.metadata
31
- msg.mode = Contrast::Api::Dtm::InstrumentationMode.build
27
+ msg.code = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.code
28
+ msg.group = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.group
29
+ msg.metadata = Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.metadata
30
+ msg.mode = Contrast::Api::Dtm::InstrumentationMode.build
31
+ msg.app_version =
32
+ Contrast::Utils::StringUtils.protobuf_format ::Contrast::CONFIG.root.application.version.to_s # rubocop:disable Layout/AssignmentIndentation Layout/FirstArgumentIndentation:
32
33
  session!(msg)
33
34
  msg
34
35
  end
@@ -46,7 +46,7 @@ module Contrast
46
46
  #
47
47
  # @param controller [::Sinatra::Base] the route's final controller.
48
48
  # @param method [String] GET, PUT, POST, etc...
49
- # @param method [::Mustermann::Sinatra] the pattern that was matched in routing.
49
+ # @param pattern [::Mustermann::Sinatra] the pattern that was matched in routing.
50
50
  # @param url [String, nil] use url from string instead matched pattern.
51
51
  # @return [Contrast::Api::Dtm::RouteCoverage]
52
52
  def from_sinatra_route controller, method, pattern, url = nil
@@ -59,6 +59,29 @@ module Contrast
59
59
  msg.url = Contrast::Utils::StringUtils.force_utf8(safe_url)
60
60
  msg
61
61
  end
62
+
63
+ # Convert Grape route data to dtm message.
64
+ #
65
+ # @param controller [::Grape::API] the route's final controller.
66
+ # @param method [String] GET, PUT, POST, etc...
67
+ # @param url [String, nil] use url from string instead matched pattern.
68
+ # @param pattern [String, Grape::Router::Route] the pattern that was matched in routing.
69
+ # @return [Contrast::Api::Dtm::RouteCoverage]
70
+ def from_grape_controller controller, method, pattern, url = nil
71
+ if pattern.cs__is_a?(Grape::Router::Route)
72
+ safe_pattern = pattern.pattern&.path&.to_s
73
+ safe_url = source_or_string(url || safe_pattern)
74
+ else
75
+ safe_pattern = source_or_string(pattern)
76
+ safe_url = source_or_string(url || pattern)
77
+ end
78
+
79
+ msg = new
80
+ msg.route = "#{ controller }##{ method } #{ safe_pattern }"
81
+ msg.verb = Contrast::Utils::StringUtils.force_utf8(method)
82
+ msg.url = Contrast::Utils::StringUtils.force_utf8(safe_url)
83
+ msg
84
+ end
62
85
  end
63
86
  end
64
87
  end
@@ -54,7 +54,9 @@ module Contrast
54
54
  end
55
55
 
56
56
  def interpolation_enabled?
57
- @_interpolation_enabled = !false?(::Contrast::CONFIG.root.agent.ruby.interpolate) if @_interpolation_enabled.nil?
57
+ if @_interpolation_enabled.nil?
58
+ @_interpolation_enabled = !false?(::Contrast::CONFIG.root.agent.ruby.interpolate)
59
+ end
58
60
  @_interpolation_enabled
59
61
  end
60
62
 
@@ -69,7 +71,8 @@ module Contrast
69
71
  status:
70
72
  ::Contrast::CONFIG.root.agent.ruby.exceptions.override_status || 403,
71
73
  message:
72
- ::Contrast::CONFIG.root.agent.ruby.exceptions.override_message || Contrast::Utils::ObjectShare::OVERRIDE_MESSAGE
74
+ ::Contrast::CONFIG.root.agent.ruby.exceptions.override_message ||
75
+ Contrast::Utils::ObjectShare::OVERRIDE_MESSAGE
73
76
  }
74
77
  end
75
78
 
@@ -5,7 +5,6 @@ require 'contrast/components/base'
5
5
  require 'contrast/components/config'
6
6
  require 'contrast/components/settings'
7
7
 
8
-
9
8
  module Contrast
10
9
  module Components
11
10
  module Assess
@@ -78,7 +77,9 @@ module Contrast
78
77
  end
79
78
 
80
79
  def track_frozen_sources?
81
- @_track_frozen_sources = !false?(::Contrast::CONFIG.root.agent.ruby.track_frozen_sources) if @_track_frozen_sources.nil?
80
+ if @_track_frozen_sources.nil?
81
+ @_track_frozen_sources = !false?(::Contrast::CONFIG.root.agent.ruby.track_frozen_sources)
82
+ end
82
83
  @_track_frozen_sources
83
84
  end
84
85
 
@@ -93,7 +94,9 @@ module Contrast
93
94
 
94
95
  def disabled_rules
95
96
  # TODO: RUBY-903
96
- ::Contrast::CONFIG.root.assess&.rules&.disabled_rules || ::Contrast::SETTINGS.assess_state.disabled_assess_rules || []
97
+ ::Contrast::CONFIG.root.assess&.rules&.disabled_rules ||
98
+ ::Contrast::SETTINGS.assess_state.disabled_assess_rules ||
99
+ []
97
100
  end
98
101
 
99
102
  private
@@ -18,7 +18,7 @@ module Contrast
18
18
  return true if config_param == false
19
19
  return false unless config_param.cs__is_a?(String)
20
20
 
21
- Contrast::Utils::ObjectShare::FALSE.casecmp?(config_param)
21
+ config_param.downcase == Contrast::Utils::ObjectShare::FALSE
22
22
  end
23
23
 
24
24
  # use this to determine if the configuration value is literally boolean
@@ -33,7 +33,7 @@ module Contrast
33
33
  return true if config_param == true
34
34
  return false unless config_param.cs__is_a?(String)
35
35
 
36
- Contrast::Utils::ObjectShare::TRUE.casecmp?(config_param)
36
+ config_param.downcase == Contrast::Utils::ObjectShare::TRUE
37
37
  end
38
38
  end
39
39
  end
@@ -44,6 +44,7 @@ module Contrast
44
44
 
45
45
  def valid?
46
46
  @_valid = validate(log: false) if @_valid.nil?
47
+ @_valid
47
48
  end
48
49
 
49
50
  def invalid?
@@ -32,11 +32,13 @@ module Contrast
32
32
  end
33
33
 
34
34
  def host
35
- @_host ||= (::Contrast::CONFIG.root.agent.service.host || Contrast::Config::ServiceConfiguration::DEFAULT_HOST).to_s
35
+ @_host ||=
36
+ (::Contrast::CONFIG.root.agent.service.host || Contrast::Config::ServiceConfiguration::DEFAULT_HOST).to_s
36
37
  end
37
38
 
38
39
  def port
39
- @_port ||= (::Contrast::CONFIG.root.agent.service.port || Contrast::Config::ServiceConfiguration::DEFAULT_PORT).to_i
40
+ @_port ||=
41
+ (::Contrast::CONFIG.root.agent.service.port || Contrast::Config::ServiceConfiguration::DEFAULT_PORT).to_i
40
42
  end
41
43
 
42
44
  def socket_path
@@ -6,20 +6,25 @@ require 'contrast/components/base'
6
6
 
7
7
  module Contrast
8
8
  module Components
9
- module Logger
10
- module InstanceMethods #:nodoc:
9
+ module Logger # :nodoc:
10
+ module InstanceMethods # :nodoc:
11
11
  def logger
12
12
  Contrast::Logger::Log.instance.logger
13
13
  end
14
+
15
+ def add_trace_perf_logging_for sym, custom_message = nil
16
+ logger.add_trace_perf_logging(self, sym, custom_message)
17
+ end
18
+ end
19
+
20
+ class << self
21
+ def add_trace_log_timing_for clazz, method_name, custom_message = nil
22
+ Contrast::Logger::Log.instance.add_method_to_trace_timing(clazz, method_name, custom_message)
23
+ end
14
24
  end
15
- ClassMethods = InstanceMethods
16
25
 
17
- # A wrapper build around the Common Agent Configuration project to allow
18
- # for access of the values contained in its
19
- # parent_configuration_spec.yaml.
20
- # Specifically, this allows for querying the state of the Agent Logger.
21
26
  class Interface
22
- include Contrast::Components::ComponentBase
27
+ include InstanceMethods
23
28
  end
24
29
  end
25
30
  end