contrast-agent 4.2.0 → 4.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -0
  3. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +22 -10
  4. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +4 -3
  5. data/lib/contrast/agent.rb +5 -1
  6. data/lib/contrast/agent/assess.rb +0 -9
  7. data/lib/contrast/agent/assess/contrast_event.rb +49 -132
  8. data/lib/contrast/agent/assess/contrast_object.rb +54 -0
  9. data/lib/contrast/agent/assess/events/source_event.rb +4 -9
  10. data/lib/contrast/agent/assess/finalizers/hash.rb +7 -0
  11. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +17 -3
  12. data/lib/contrast/agent/assess/policy/patcher.rb +4 -3
  13. data/lib/contrast/agent/assess/policy/policy_node.rb +31 -59
  14. data/lib/contrast/agent/assess/policy/preshift.rb +3 -3
  15. data/lib/contrast/agent/assess/policy/propagation_method.rb +41 -32
  16. data/lib/contrast/agent/assess/policy/propagation_node.rb +12 -24
  17. data/lib/contrast/agent/assess/policy/propagator/append.rb +29 -15
  18. data/lib/contrast/agent/assess/policy/propagator/center.rb +1 -2
  19. data/lib/contrast/agent/assess/policy/propagator/custom.rb +1 -1
  20. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +21 -18
  21. data/lib/contrast/agent/assess/policy/propagator/insert.rb +1 -2
  22. data/lib/contrast/agent/assess/policy/propagator/keep.rb +1 -2
  23. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +3 -2
  24. data/lib/contrast/agent/assess/policy/propagator/next.rb +1 -2
  25. data/lib/contrast/agent/assess/policy/propagator/prepend.rb +1 -2
  26. data/lib/contrast/agent/assess/policy/propagator/remove.rb +2 -4
  27. data/lib/contrast/agent/assess/policy/propagator/replace.rb +1 -2
  28. data/lib/contrast/agent/assess/policy/propagator/reverse.rb +1 -2
  29. data/lib/contrast/agent/assess/policy/propagator/select.rb +3 -4
  30. data/lib/contrast/agent/assess/policy/propagator/splat.rb +25 -17
  31. data/lib/contrast/agent/assess/policy/propagator/split.rb +83 -120
  32. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +41 -25
  33. data/lib/contrast/agent/assess/policy/propagator/trim.rb +3 -7
  34. data/lib/contrast/agent/assess/policy/source_method.rb +2 -14
  35. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +5 -8
  36. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +1 -1
  37. data/lib/contrast/agent/assess/policy/trigger_method.rb +13 -8
  38. data/lib/contrast/agent/assess/policy/trigger_node.rb +28 -7
  39. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +59 -0
  40. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +2 -3
  41. data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +6 -4
  42. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +2 -4
  43. data/lib/contrast/agent/assess/properties.rb +0 -2
  44. data/lib/contrast/agent/assess/property/tagged.rb +56 -32
  45. data/lib/contrast/agent/assess/tracker.rb +16 -18
  46. data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +7 -0
  47. data/lib/contrast/agent/middleware.rb +134 -55
  48. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +4 -0
  49. data/lib/contrast/agent/patching/policy/method_policy.rb +1 -1
  50. data/lib/contrast/agent/patching/policy/patch.rb +4 -4
  51. data/lib/contrast/agent/patching/policy/patch_status.rb +1 -1
  52. data/lib/contrast/agent/patching/policy/patcher.rb +51 -44
  53. data/lib/contrast/agent/patching/policy/trigger_node.rb +5 -2
  54. data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +47 -1
  55. data/lib/contrast/agent/protect/policy/rule_applicator.rb +53 -0
  56. data/lib/contrast/agent/protect/rule/base.rb +63 -14
  57. data/lib/contrast/agent/protect/rule/cmd_injection.rb +3 -3
  58. data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -4
  59. data/lib/contrast/agent/protect/rule/deserialization.rb +4 -1
  60. data/lib/contrast/agent/protect/rule/no_sqli.rb +3 -3
  61. data/lib/contrast/agent/protect/rule/sqli.rb +20 -14
  62. data/lib/contrast/agent/protect/rule/xxe.rb +32 -11
  63. data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +10 -6
  64. data/lib/contrast/agent/reaction_processor.rb +1 -1
  65. data/lib/contrast/agent/request_context.rb +12 -0
  66. data/lib/contrast/agent/response.rb +5 -5
  67. data/lib/contrast/agent/rewriter.rb +3 -3
  68. data/lib/contrast/agent/scope.rb +33 -13
  69. data/lib/contrast/agent/static_analysis.rb +13 -7
  70. data/lib/contrast/agent/thread.rb +1 -1
  71. data/lib/contrast/agent/thread_watcher.rb +20 -5
  72. data/lib/contrast/agent/version.rb +1 -1
  73. data/lib/contrast/api/communication/messaging_queue.rb +18 -21
  74. data/lib/contrast/api/communication/response_processor.rb +8 -1
  75. data/lib/contrast/api/communication/socket_client.rb +22 -14
  76. data/lib/contrast/api/decorators.rb +2 -0
  77. data/lib/contrast/api/decorators/agent_startup.rb +58 -0
  78. data/lib/contrast/api/decorators/application_startup.rb +51 -0
  79. data/lib/contrast/api/decorators/library.rb +1 -0
  80. data/lib/contrast/api/decorators/library_usage_update.rb +1 -0
  81. data/lib/contrast/api/decorators/route_coverage.rb +15 -5
  82. data/lib/contrast/api/decorators/trace_event.rb +58 -42
  83. data/lib/contrast/api/decorators/trace_event_object.rb +11 -3
  84. data/lib/contrast/api/decorators/trace_event_signature.rb +27 -5
  85. data/lib/contrast/api/decorators/user_input.rb +2 -1
  86. data/lib/contrast/common_agent_configuration.rb +1 -1
  87. data/lib/contrast/components/agent.rb +2 -0
  88. data/lib/contrast/components/app_context.rb +4 -22
  89. data/lib/contrast/components/assess.rb +36 -0
  90. data/lib/contrast/components/interface.rb +5 -3
  91. data/lib/contrast/components/sampling.rb +48 -6
  92. data/lib/contrast/components/scope.rb +23 -0
  93. data/lib/contrast/components/settings.rb +8 -7
  94. data/lib/contrast/config/assess_configuration.rb +2 -1
  95. data/lib/contrast/extension/assess/array.rb +1 -2
  96. data/lib/contrast/extension/assess/erb.rb +1 -3
  97. data/lib/contrast/extension/assess/exec_trigger.rb +1 -1
  98. data/lib/contrast/extension/assess/fiber.rb +2 -3
  99. data/lib/contrast/extension/assess/hash.rb +4 -2
  100. data/lib/contrast/extension/assess/kernel.rb +1 -2
  101. data/lib/contrast/extension/assess/marshal.rb +34 -26
  102. data/lib/contrast/extension/assess/regexp.rb +3 -8
  103. data/lib/contrast/extension/assess/string.rb +1 -2
  104. data/lib/contrast/framework/base_support.rb +51 -53
  105. data/lib/contrast/framework/manager.rb +16 -14
  106. data/lib/contrast/framework/rack/patch/session_cookie.rb +1 -1
  107. data/lib/contrast/framework/rack/support.rb +2 -1
  108. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -1
  109. data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +1 -1
  110. data/lib/contrast/framework/rails/rewrite/action_controller_railties_helper_inherited.rb +1 -1
  111. data/lib/contrast/framework/rails/rewrite/active_record_attribute_methods_read.rb +1 -1
  112. data/lib/contrast/framework/rails/rewrite/active_record_time_zone_inherited.rb +1 -1
  113. data/lib/contrast/framework/rails/support.rb +44 -44
  114. data/lib/contrast/framework/sinatra/support.rb +102 -42
  115. data/lib/contrast/logger/application.rb +0 -3
  116. data/lib/contrast/logger/log.rb +31 -15
  117. data/lib/contrast/utils/class_util.rb +3 -1
  118. data/lib/contrast/utils/duck_utils.rb +1 -1
  119. data/lib/contrast/utils/heap_dump_util.rb +103 -87
  120. data/lib/contrast/utils/invalid_configuration_util.rb +21 -12
  121. data/lib/contrast/utils/object_share.rb +3 -3
  122. data/lib/contrast/utils/preflight_util.rb +1 -1
  123. data/lib/contrast/utils/resource_loader.rb +1 -1
  124. data/lib/contrast/utils/sha256_builder.rb +2 -2
  125. data/lib/contrast/utils/string_utils.rb +1 -1
  126. data/lib/contrast/utils/tag_util.rb +9 -13
  127. data/resources/assess/policy.json +12 -18
  128. data/resources/deadzone/policy.json +150 -0
  129. data/resources/protect/policy.json +12 -0
  130. data/ruby-agent.gemspec +60 -19
  131. data/service_executables/VERSION +1 -1
  132. data/service_executables/linux/contrast-service +0 -0
  133. data/service_executables/mac/contrast-service +0 -0
  134. metadata +124 -112
  135. data/lib/contrast/agent/assess/rule.rb +0 -18
  136. data/lib/contrast/agent/assess/rule/base.rb +0 -52
  137. data/lib/contrast/agent/assess/rule/redos.rb +0 -67
  138. data/lib/contrast/framework/sinatra/patch/base.rb +0 -83
  139. data/lib/contrast/framework/sinatra/patch/support.rb +0 -27
  140. data/lib/contrast/utils/prevent_serialization.rb +0 -52
@@ -26,19 +26,9 @@ module Contrast
26
26
  def cs__report_finding rule_id, user_provided_options, call_location
27
27
  with_contrast_scope do
28
28
  finding = Contrast::Api::Dtm::Finding.new
29
- finding.rule_id = rule_id
30
- path = call_location.path
31
- # just get the file name, not the full path
32
- path = path.split(Contrast::Utils::ObjectShare::SLASH).last
33
- session_id = user_provided_options[:key].to_s if user_provided_options
34
-
35
29
  finding.version = Contrast::Agent::Assess::Policy::TriggerMethod::CURRENT_FINDING_VERSION
36
- finding.properties[CS__SESSION_ID] = Contrast::Utils::StringUtils.force_utf8(session_id)
37
- finding.properties[CS__PATH] = Contrast::Utils::StringUtils.force_utf8(path)
38
- file_path = call_location.absolute_path
39
- snippet = file_snippet(file_path, call_location)
40
- finding.properties[CS__SNIPPET] = Contrast::Utils::StringUtils.force_utf8(snippet)
41
-
30
+ finding.rule_id = rule_id
31
+ set_properties(finding, user_provided_options, call_location)
42
32
  hash = Contrast::Utils::HashDigest.generate_config_hash(finding)
43
33
  finding.hash_code = Contrast::Utils::StringUtils.force_utf8(hash)
44
34
  finding.preflight = Contrast::Utils::PreflightUtil.create_preflight(finding)
@@ -50,6 +40,25 @@ module Contrast
50
40
 
51
41
  private
52
42
 
43
+ # Set the properties needed to report and subsequently render this finding on the finding given.
44
+ #
45
+ # @param finding [Contrast::Api::Dtm::Finding] the configuration finding to populate
46
+ # @param user_provided_options [Hash] the configuration value(s) which
47
+ # violated the rule
48
+ # @param call_location [Thread::Backtrace::Location] the location where
49
+ # the bad configuration was set
50
+ def set_properties finding, user_provided_options, call_location
51
+ path = call_location.path
52
+ # just get the file name, not the full path
53
+ path = path.split(Contrast::Utils::ObjectShare::SLASH).last
54
+ session_id = user_provided_options[:key].to_s if user_provided_options
55
+ finding.properties[CS__SESSION_ID] = Contrast::Utils::StringUtils.force_utf8(session_id)
56
+ finding.properties[CS__PATH] = Contrast::Utils::StringUtils.force_utf8(path)
57
+ file_path = call_location.absolute_path
58
+ snippet = file_snippet(file_path, call_location)
59
+ finding.properties[CS__SNIPPET] = Contrast::Utils::StringUtils.force_utf8(snippet)
60
+ end
61
+
53
62
  def file_snippet file_path, call_location
54
63
  idx = call_location&.lineno
55
64
  if file_path && idx && File.exist?(file_path)
@@ -1,13 +1,13 @@
1
1
  # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
- # rubocop:disable Object/Freeze
4
+ # rubocop:disable Security/Object/Freeze
5
5
  module Contrast
6
6
  module Utils
7
7
  # A utility class where a series of commonly used Strings and other
8
8
  # commonly used objects can be store and frozen to prevent unnecessary
9
9
  # duplication.
10
- class ObjectShare
10
+ module ObjectShare
11
11
  # Strings
12
12
  ASTERISK = '*'
13
13
  BACK_SLASH = '\\'
@@ -76,4 +76,4 @@ module Contrast
76
76
  end
77
77
  end
78
78
  end
79
- # rubocop:enable Object/Freeze
79
+ # rubocop:enable Security/Object/Freeze
@@ -4,7 +4,7 @@
4
4
  module Contrast
5
5
  module Utils
6
6
  # Utility for generating preflight message token
7
- class PreflightUtil
7
+ module PreflightUtil
8
8
  def self.create_preflight finding
9
9
  "#{ finding.rule_id },#{ finding.hash_code }"
10
10
  end
@@ -4,7 +4,7 @@
4
4
  module Contrast
5
5
  module Utils
6
6
  # ResourceLoader can attempt to read a file from a predefined resource directory
7
- class ResourceLoader
7
+ module ResourceLoader
8
8
  RESOURCES = 'resources'
9
9
 
10
10
  # __FILE__/../../../resources
@@ -29,8 +29,8 @@ module Contrast
29
29
 
30
30
  # Generate a SHA256 hash of the combined source code of this Gem
31
31
  def sha256 path
32
- return nil unless path
33
- return nil unless File.exist?(path) && !File.directory?(path)
32
+ return unless path
33
+ return unless File.exist?(path) && !File.directory?(path)
34
34
 
35
35
  @sha256_cache[path] ||= Digest::SHA256.file(path).to_s
36
36
  end
@@ -74,7 +74,7 @@ module Contrast
74
74
  # @return [String] a copy of the given String, upper cased, trimmed,
75
75
  # dashes replaced with underscore, and HTTP trimmed
76
76
  def self.normalized_key str
77
- return nil unless str
77
+ return unless str
78
78
 
79
79
  str = str.to_s
80
80
  @_normalized_keys ||= {}
@@ -19,16 +19,15 @@ module Contrast
19
19
 
20
20
  relationship = tag.compare_range(range.start_idx, range.end_idx)
21
21
  case relationship
22
- when Contrast::Agent::Assess::Tag::BELOW
23
22
  # since the tags are ordered, if we're below, nope out
24
- return false
25
- when Contrast::Agent::Assess::Tag::LOW_SPAN
26
- # if we ever get a low span, that means a low part
27
- # won't be covered. there's no need to continue
28
- return false
29
- when Contrast::Agent::Assess::Tag::WITHOUT
30
- # if we ever get a without, that means a low part won't
31
- # be covered. there's no need to continue
23
+ when Contrast::Agent::Assess::Tag::BELOW,
24
+ # if we ever get a low span, that means a low part
25
+ # won't be covered. there's no need to continue
26
+ Contrast::Agent::Assess::Tag::LOW_SPAN,
27
+ # if we ever get a without, that means a low part won't
28
+ # be covered. there's no need to continue
29
+ Contrast::Agent::Assess::Tag::WITHOUT
30
+
32
31
  return false
33
32
  when Contrast::Agent::Assess::Tag::WITHIN
34
33
  # if we're within, then 0 out this tag since it is
@@ -131,10 +130,7 @@ module Contrast
131
130
  smallered = []
132
131
  curr = nil
133
132
  tags.each do |tag|
134
- if curr.nil?
135
- curr = tag
136
- smallered << curr
137
- elsif tag.start_idx <= curr.end_idx
133
+ if curr && tag.start_idx <= curr.end_idx
138
134
  curr.update_end(tag.end_idx) if tag.end_idx > curr.end_idx
139
135
  else
140
136
  curr = tag
@@ -640,7 +640,7 @@
640
640
  "action": "CUSTOM",
641
641
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Substitution",
642
642
  "patch_method": "gsub_tagger",
643
- "source": "O,P",
643
+ "source": "O,P1",
644
644
  "target": "R"
645
645
  }, {
646
646
  "class_name": "String",
@@ -650,7 +650,7 @@
650
650
  "action": "CUSTOM",
651
651
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Substitution",
652
652
  "patch_method": "gsub_tagger",
653
- "source": "O,P",
653
+ "source": "O,P1",
654
654
  "target": "O"
655
655
  }, {
656
656
  "class_name": "String",
@@ -660,7 +660,7 @@
660
660
  "action": "CUSTOM",
661
661
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Substitution",
662
662
  "patch_method": "sub_tagger",
663
- "source": "O,P",
663
+ "source": "O,P1",
664
664
  "target": "R"
665
665
  }, {
666
666
  "class_name": "String",
@@ -670,7 +670,7 @@
670
670
  "action": "CUSTOM",
671
671
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Substitution",
672
672
  "patch_method": "sub_tagger",
673
- "source": "O,P",
673
+ "source": "O,P1",
674
674
  "target": "O"
675
675
  }, {
676
676
  "class_name": "String",
@@ -680,7 +680,7 @@
680
680
  "action": "CUSTOM",
681
681
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Trim",
682
682
  "patch_method": "tr_tagger",
683
- "source": "O,P",
683
+ "source": "O,P1",
684
684
  "target": "R"
685
685
  }, {
686
686
  "class_name": "String",
@@ -690,7 +690,7 @@
690
690
  "action": "CUSTOM",
691
691
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Trim",
692
692
  "patch_method": "tr_tagger",
693
- "source": "O,P",
693
+ "source": "O,P1",
694
694
  "target": "O"
695
695
  }, {
696
696
  "class_name": "String",
@@ -700,7 +700,7 @@
700
700
  "action": "CUSTOM",
701
701
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Trim",
702
702
  "patch_method": "tr_s_tagger",
703
- "source": "O,P",
703
+ "source": "O,P1",
704
704
  "target": "R"
705
705
  }, {
706
706
  "class_name": "String",
@@ -710,7 +710,7 @@
710
710
  "action": "CUSTOM",
711
711
  "patch_class": "Contrast::Agent::Assess::Policy::Propagator::Trim",
712
712
  "patch_method": "tr_s_tagger",
713
- "source": "O,P",
713
+ "source": "O,P1",
714
714
  "target": "O"
715
715
  }, {
716
716
  "class_name": "String",
@@ -984,7 +984,7 @@
984
984
  "action": "CUSTOM",
985
985
  "patch_class": "Contrast::Extension::Assess::KernelPropagator",
986
986
  "patch_method": "sprintf_tagger",
987
- "source": "O,P",
987
+ "source": "O,P1",
988
988
  "target": "R"
989
989
  }, {
990
990
  "class_name":"ActiveRecord::ConnectionAdapters::Quoting",
@@ -1173,26 +1173,20 @@
1173
1173
  "instance_method": true,
1174
1174
  "method_visibility": "public",
1175
1175
  "method_name":"match",
1176
- "source":"P0",
1177
- "trigger_class": "Contrast::Agent::Assess::Rule::Redos",
1178
- "trigger_method": "regexp_complexity_check"
1176
+ "source":"P0"
1179
1177
 
1180
1178
  }, {
1181
1179
  "class_name":"String",
1182
1180
  "instance_method": true,
1183
1181
  "method_visibility": "public",
1184
1182
  "method_name":"=~",
1185
- "source":"O",
1186
- "trigger_class": "Contrast::Agent::Assess::Rule::Redos",
1187
- "trigger_method": "regexp_complexity_check"
1183
+ "source":"O"
1188
1184
  }, {
1189
1185
  "class_name":"Regexp",
1190
1186
  "instance_method": true,
1191
1187
  "method_visibility": "public",
1192
1188
  "method_name":"=~",
1193
- "source":"P0",
1194
- "trigger_class": "Contrast::Agent::Assess::Rule::Redos",
1195
- "trigger_method": "regexp_complexity_check"
1189
+ "source":"P0"
1196
1190
 
1197
1191
  }
1198
1192
  ]
@@ -55,6 +55,156 @@
55
55
  "instance_method":true,
56
56
  "method_visibility": "public",
57
57
  "method_name":"commit_session"
58
+ }, {
59
+ "class_name":"Rack::Session::Abstract::Persisted",
60
+ "instance_method":true,
61
+ "method_visibility": "private",
62
+ "method_name":"session_exists?",
63
+ "code": "https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb#L334"
64
+ }, {
65
+ "class_name":"ActionDispatch::Http::MimeNegotiation",
66
+ "instance_method":true,
67
+ "method_visibility": "public",
68
+ "method_name":"formats",
69
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/mime_negotiation.rb#L63"
70
+ }, {
71
+ "class_name":"ActionDispatch::FileHandler",
72
+ "instance_method":true,
73
+ "method_visibility": "public",
74
+ "method_name":"match?",
75
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/static.rb#L30"
76
+ }, {
77
+ "class_name":"ActionDispatch::Journey::Router",
78
+ "instance_method":true,
79
+ "method_visibility": "private",
80
+ "method_name":"find_routes",
81
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/journey/router.rb#L107"
82
+ }, {
83
+ "class_name":"ActionDispatch::Request",
84
+ "instance_method":true,
85
+ "method_visibility": "public",
86
+ "method_name":"controler_class_for",
87
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/request.rb#L84"
88
+ }, {
89
+ "class_name":"ActionDispatch::Request",
90
+ "instance_method":true,
91
+ "method_visibility": "public",
92
+ "method_name":"engine_script_name=",
93
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/request.rb#L158"
94
+ }, {
95
+ "class_name":"ActionDispatch::Request",
96
+ "instance_method":true,
97
+ "method_visibility": "public",
98
+ "method_name":"remote_ip",
99
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/request.rb#L286"
100
+ }, {
101
+ "class_name":"ActionDispatch::Request",
102
+ "instance_method":true,
103
+ "method_visibility": "public",
104
+ "method_name":"request_id",
105
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/request.rb#L302"
106
+ }, {
107
+ "class_name":"ActionDispatch::Request",
108
+ "instance_method":true,
109
+ "method_visibility": "public",
110
+ "method_name":"local?",
111
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/http/request.rb#L409"
112
+ }, {
113
+ "class_name":"ActionDispatch::Request",
114
+ "instance_method":true,
115
+ "method_visibility": "public",
116
+ "method_name":"cookie_jar",
117
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L11"
118
+ }, {
119
+ "class_name":"ActionDispatch::Request",
120
+ "instance_method":true,
121
+ "method_visibility": "public",
122
+ "method_name":"have_cookie_jar?",
123
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L24"
124
+ }, {
125
+ "class_name":"ActionDispatch::Request",
126
+ "instance_method":true,
127
+ "method_visibility": "public",
128
+ "method_name":"key_generator",
129
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L32"
130
+ }, {
131
+ "class_name":"ActionDispatch::Request",
132
+ "instance_method":true,
133
+ "method_visibility": "public",
134
+ "method_name":"signed_cookie_salt",
135
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L36"
136
+ }, {
137
+ "class_name":"ActionDispatch::Request",
138
+ "instance_method":true,
139
+ "method_visibility": "public",
140
+ "method_name":"encrypted_cookie_salt",
141
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L40"
142
+ }, {
143
+ "class_name":"ActionDispatch::Request",
144
+ "instance_method":true,
145
+ "method_visibility": "public",
146
+ "method_name":"encrypted_signed_cookie_salt",
147
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L44"
148
+ }, {
149
+ "class_name":"ActionDispatch::Request",
150
+ "instance_method":true,
151
+ "method_visibility": "public",
152
+ "method_name":"authenticated_encrypted_cookie_salt",
153
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L48"
154
+ }, {
155
+ "class_name":"ActionDispatch::Request",
156
+ "instance_method":true,
157
+ "method_visibility": "public",
158
+ "method_name":"use_authenticated_cookie_encryption",
159
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L52"
160
+ }, {
161
+ "class_name":"ActionDispatch::Request",
162
+ "instance_method":true,
163
+ "method_visibility": "public",
164
+ "method_name":"encrypted_cookie_cipher",
165
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L56"
166
+ }, {
167
+ "class_name":"ActionDispatch::Request",
168
+ "instance_method":true,
169
+ "method_visibility": "public",
170
+ "method_name":"signed_cookie_digest",
171
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L60"
172
+ }, {
173
+ "class_name":"ActionDispatch::Request",
174
+ "instance_method":true,
175
+ "method_visibility": "public",
176
+ "method_name":"secret_key_base",
177
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L64"
178
+ }, {
179
+ "class_name":"ActionDispatch::Request",
180
+ "instance_method":true,
181
+ "method_visibility": "public",
182
+ "method_name":"cookies_serializer",
183
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L68"
184
+ }, {
185
+ "class_name":"ActionDispatch::Request",
186
+ "instance_method":true,
187
+ "method_visibility": "public",
188
+ "method_name":"cookies_digest",
189
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L72"
190
+ }, {
191
+ "class_name":"ActionDispatch::Request",
192
+ "instance_method":true,
193
+ "method_visibility": "public",
194
+ "method_name":"cookies_rotations",
195
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L76"
196
+ }, {
197
+ "class_name":"ActionDispatch::Request",
198
+ "instance_method":true,
199
+ "method_visibility": "public",
200
+ "method_name":"use_cookies_with_metadata",
201
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/middleware/cookies.rb#L80"
202
+ }, {
203
+ "class_name":"ActionDispatch::Request::Session",
204
+ "instance_method":true,
205
+ "method_visibility": "public",
206
+ "method_name":"exists?",
207
+ "code": "https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/request/session.rb#L201"
58
208
  }
59
209
  ]
60
210
  }
@@ -379,6 +379,18 @@
379
379
  "method_visibility": "public",
380
380
  "applicator_method": "apply_rule__io",
381
381
  "properties": {}
382
+ },{
383
+ "class_name": "Nokogiri::XML::Document",
384
+ "method_name": "parse",
385
+ "instance_method": false,
386
+ "method_visibility": "public",
387
+ "properties": {}
388
+ }, {
389
+ "class_name": "Nokogiri::XML::SAX::Parser",
390
+ "method_name": "parse",
391
+ "instance_method": true,
392
+ "method_visibility": "public",
393
+ "properties": {}
382
394
  },{
383
395
  "class_name": "Nokogiri::XML::SAX::Parser",
384
396
  "method_name": "parse_memory",
data/ruby-agent.gemspec CHANGED
@@ -20,36 +20,77 @@ end
20
20
 
21
21
  # Add those dependencies required to develop or test the Agent
22
22
  def self.add_dev_dependencies spec
23
- spec.add_development_dependency 'amazing_print'
23
+ add_builders(spec)
24
+ add_debuggers(spec)
25
+ add_linters(spec)
26
+ add_specs(spec)
27
+ end
28
+
29
+ # Dependencies used to build the agent during development.
30
+ def self.add_builders spec
24
31
  spec.add_development_dependency 'bundler'
25
- spec.add_development_dependency 'climate_control' # mock ENV
26
- spec.add_development_dependency 'debase'
32
+ spec.add_development_dependency 'rake', '>= 12.3.3'
33
+ spec.add_development_dependency 'rake-compiler', '~> 0'
34
+ end
35
+
36
+ # Dependencies used for local debugging during development.
37
+ def self.add_debuggers spec
38
+ spec.add_development_dependency 'pry'
39
+ spec.add_development_dependency 'ruby-debug-ide'
40
+ end
41
+
42
+ # Dependencies used for framework testing.
43
+ def self.add_frameworks spec
44
+ spec.add_development_dependency 'rails', '>= 3'
45
+ spec.add_development_dependency 'sinatra', '>= 2'
46
+ end
47
+
48
+ # Dependencies used for linting prior to commit.
49
+ def self.add_linters spec
27
50
  spec.add_development_dependency 'debride'
28
- spec.add_development_dependency 'execjs'
29
- spec.add_development_dependency 'factory_bot'
30
- spec.add_development_dependency 'fake_ftp'
31
51
  spec.add_development_dependency 'fasterer'
32
52
  spec.add_development_dependency 'flay'
53
+ add_rubocop(spec)
54
+ end
55
+
56
+ # Dependencies used to run our current RSpec test suite.
57
+ def self.add_specs spec
58
+ add_coverage(spec)
59
+ add_frameworks(spec)
60
+ add_tested_gems(spec)
61
+
62
+ spec.add_development_dependency 'benchmark-ips'
63
+ spec.add_development_dependency 'climate_control' # mock ENV
64
+ spec.add_development_dependency 'factory_bot'
65
+ spec.add_development_dependency 'fake_ftp'
33
66
  spec.add_development_dependency 'openssl'
34
- spec.add_development_dependency 'parser', '~> 2.6'
35
- spec.add_development_dependency 'pry'
36
- spec.add_development_dependency 'rails', '>= 3'
37
- spec.add_development_dependency 'rake', '~> 10.0'
38
- spec.add_development_dependency 'rake-compiler', '~> 0'
39
67
  spec.add_development_dependency 'rspec', '~> 3.0'
40
68
  spec.add_development_dependency 'rspec-benchmark'
41
69
  spec.add_development_dependency 'rspec_junit_formatter', '0.3.0'
42
- spec.add_development_dependency 'rubocop', '0.93.1'
43
- spec.add_development_dependency 'rubocop-performance', '1.8.1'
44
- spec.add_development_dependency 'rubocop-rspec', '1.43.2'
45
- spec.add_development_dependency 'ruby-debug-ide'
46
- spec.add_development_dependency 'simplecov', '~> 0.18'
47
- spec.add_development_dependency 'sinatra', '>= 2'
70
+ end
71
+
72
+ def self.add_coverage spec
73
+ spec.add_development_dependency 'codecov'
74
+ spec.add_development_dependency 'simplecov', '0.20.0'
75
+ end
76
+
77
+ # Dependencies used to run all of our Rubocop during the linting phase.
78
+ def self.add_rubocop spec
79
+ spec.add_development_dependency 'rubocop', '1.6.1'
80
+ spec.add_development_dependency 'rubocop-performance', '1.9.1'
81
+ spec.add_development_dependency 'rubocop-rails', '2.9.1'
82
+ spec.add_development_dependency 'rubocop-rake', '0.5.1'
83
+ spec.add_development_dependency 'rubocop-rspec', '2.1.0'
84
+ end
85
+
86
+ # Dependencies not mocked out during RSpec that we test real code of, beyond just frameworks.
87
+ def self.add_tested_gems spec
88
+ spec.add_development_dependency 'debase'
89
+ spec.add_development_dependency 'execjs'
48
90
  spec.add_development_dependency 'sqlite3', '1.3.9'
49
91
  spec.add_development_dependency 'therubyracer'
50
92
  spec.add_development_dependency 'tilt'
51
93
  spec.add_development_dependency 'xpath'
52
- spec.add_development_dependency 'yarjuf', '~> 2.0'
53
94
  end
54
95
 
55
96
  # Add those dependencies required to run the Agent in customer applications.
@@ -59,7 +100,7 @@ end
59
100
  # corresponding update to the fake gem server data in TeamServer.
60
101
  def self.add_dependencies spec
61
102
  spec.add_dependency 'ougai', '~> 1.8'
62
- spec.add_dependency 'parser', '~> 2.6'
103
+ spec.add_dependency 'parser', '~> 2.6' # TODO: RUBY-714 remove w/ EOL of 2.5
63
104
  spec.add_dependency 'protobuf', '~> 3.10'
64
105
  spec.add_dependency 'rack', '~> 2.0'
65
106
  end