contrast-agent 5.1.0 → 5.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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/ext/cs__assess_kernel/cs__assess_kernel.c +7 -4
  3. data/ext/cs__assess_module/cs__assess_module.c +7 -7
  4. data/ext/cs__common/cs__common.c +4 -0
  5. data/ext/cs__common/cs__common.h +1 -0
  6. data/ext/cs__contrast_patch/cs__contrast_patch.c +52 -27
  7. data/ext/cs__contrast_patch/cs__contrast_patch.h +2 -0
  8. data/ext/cs__scope/cs__scope.c +747 -0
  9. data/ext/cs__scope/cs__scope.h +88 -0
  10. data/ext/cs__scope/extconf.rb +5 -0
  11. data/lib/contrast/agent/assess/contrast_event.rb +20 -13
  12. data/lib/contrast/agent/assess/contrast_object.rb +4 -1
  13. data/lib/contrast/agent/assess/policy/propagation_node.rb +2 -5
  14. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +2 -0
  15. data/lib/contrast/agent/assess/policy/trigger_method.rb +4 -1
  16. data/lib/contrast/agent/assess/rule/response/{autocomplete_rule.rb → auto_complete_rule.rb} +4 -3
  17. data/lib/contrast/agent/assess/rule/response/base_rule.rb +12 -79
  18. data/lib/contrast/agent/assess/rule/response/body_rule.rb +109 -0
  19. data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +157 -0
  20. data/lib/contrast/agent/assess/rule/response/click_jacking_header_rule.rb +26 -0
  21. data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +14 -15
  22. data/lib/contrast/agent/assess/rule/response/csp_header_missing_rule.rb +5 -25
  23. data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +29 -0
  24. data/lib/contrast/agent/assess/rule/response/header_rule.rb +70 -0
  25. data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +12 -36
  26. data/lib/contrast/agent/assess/rule/response/parameters_pollution_rule.rb +2 -1
  27. data/lib/contrast/agent/assess/rule/response/x_content_type_header_rule.rb +26 -0
  28. data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +36 -0
  29. data/lib/contrast/agent/middleware.rb +1 -0
  30. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +1 -3
  31. data/lib/contrast/agent/patching/policy/patch.rb +2 -6
  32. data/lib/contrast/agent/patching/policy/patcher.rb +1 -1
  33. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +94 -0
  34. data/lib/contrast/agent/protect/rule/base.rb +28 -1
  35. data/lib/contrast/agent/protect/rule/base_service.rb +10 -1
  36. data/lib/contrast/agent/protect/rule/cmd_injection.rb +2 -0
  37. data/lib/contrast/agent/protect/rule/deserialization.rb +6 -0
  38. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +5 -1
  39. data/lib/contrast/agent/protect/rule/no_sqli.rb +1 -0
  40. data/lib/contrast/agent/protect/rule/path_traversal.rb +1 -0
  41. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +124 -0
  42. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +121 -0
  43. data/lib/contrast/agent/protect/rule/sqli.rb +33 -0
  44. data/lib/contrast/agent/protect/rule/xxe.rb +4 -0
  45. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +44 -0
  46. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +115 -0
  47. data/lib/contrast/agent/reporting/input_analysis/input_type.rb +44 -0
  48. data/lib/contrast/agent/reporting/input_analysis/score_level.rb +21 -0
  49. data/lib/contrast/agent/reporting/report.rb +1 -0
  50. data/lib/contrast/agent/reporting/reporter.rb +8 -1
  51. data/lib/contrast/agent/reporting/reporting_events/finding.rb +69 -36
  52. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +88 -59
  53. data/lib/contrast/agent/reporting/reporting_events/{finding_object.rb → finding_event_object.rb} +24 -20
  54. data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +39 -0
  55. data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +40 -0
  56. data/lib/contrast/agent/reporting/reporting_events/{finding_signature.rb → finding_event_signature.rb} +29 -24
  57. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +12 -8
  58. data/lib/contrast/agent/reporting/reporting_events/{finding_stack.rb → finding_event_stack.rb} +23 -19
  59. data/lib/contrast/agent/reporting/reporting_events/{finding_taint_range.rb → finding_event_taint_range.rb} +17 -15
  60. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +26 -53
  61. data/lib/contrast/agent/reporting/reporting_events/poll.rb +29 -0
  62. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +5 -4
  63. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +1 -0
  64. data/lib/contrast/agent/reporting/reporting_events/server_activity.rb +1 -1
  65. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +10 -3
  66. data/lib/contrast/agent/reporting/reporting_utilities/endpoints.rb +0 -1
  67. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +1 -0
  68. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +28 -20
  69. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
  70. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +13 -1
  71. data/lib/contrast/agent/request_context.rb +6 -1
  72. data/lib/contrast/agent/request_context_extend.rb +85 -21
  73. data/lib/contrast/agent/scope.rb +102 -107
  74. data/lib/contrast/agent/service_heartbeat.rb +45 -2
  75. data/lib/contrast/agent/version.rb +1 -1
  76. data/lib/contrast/api/decorators/bot_blocker.rb +37 -0
  77. data/lib/contrast/api/decorators/ip_denylist.rb +37 -0
  78. data/lib/contrast/api/decorators/rasp_rule_sample.rb +29 -0
  79. data/lib/contrast/api/decorators/user_input.rb +11 -1
  80. data/lib/contrast/api/decorators/virtual_patch.rb +34 -0
  81. data/lib/contrast/components/logger.rb +5 -0
  82. data/lib/contrast/components/protect.rb +4 -2
  83. data/lib/contrast/components/scope.rb +98 -91
  84. data/lib/contrast/config/agent_configuration.rb +58 -12
  85. data/lib/contrast/config/api_configuration.rb +100 -12
  86. data/lib/contrast/config/api_proxy_configuration.rb +55 -3
  87. data/lib/contrast/config/application_configuration.rb +114 -15
  88. data/lib/contrast/config/assess_configuration.rb +106 -12
  89. data/lib/contrast/config/assess_rules_configuration.rb +44 -3
  90. data/lib/contrast/config/base_configuration.rb +1 -0
  91. data/lib/contrast/config/certification_configuration.rb +74 -3
  92. data/lib/contrast/config/exception_configuration.rb +61 -3
  93. data/lib/contrast/config/heap_dump_configuration.rb +101 -17
  94. data/lib/contrast/config/inventory_configuration.rb +64 -3
  95. data/lib/contrast/config/logger_configuration.rb +46 -3
  96. data/lib/contrast/config/protect_rule_configuration.rb +36 -9
  97. data/lib/contrast/config/protect_rules_configuration.rb +120 -17
  98. data/lib/contrast/config/request_audit_configuration.rb +68 -3
  99. data/lib/contrast/config/ruby_configuration.rb +96 -22
  100. data/lib/contrast/config/sampling_configuration.rb +76 -10
  101. data/lib/contrast/config/server_configuration.rb +56 -11
  102. data/lib/contrast/configuration.rb +6 -3
  103. data/lib/contrast/logger/cef_log.rb +151 -0
  104. data/lib/contrast/utils/hash_digest.rb +14 -6
  105. data/lib/contrast/utils/log_utils.rb +114 -0
  106. data/lib/contrast/utils/middleware_utils.rb +6 -7
  107. data/lib/contrast/utils/net_http_base.rb +12 -9
  108. data/lib/contrast/utils/patching/policy/patch_utils.rb +0 -4
  109. data/lib/contrast.rb +4 -3
  110. data/ruby-agent.gemspec +1 -1
  111. data/service_executables/VERSION +1 -1
  112. data/service_executables/linux/contrast-service +0 -0
  113. data/service_executables/mac/contrast-service +0 -0
  114. metadata +41 -21
  115. data/lib/contrast/agent/assess/rule/response/cachecontrol_rule.rb +0 -184
  116. data/lib/contrast/agent/assess/rule/response/clickjacking_rule.rb +0 -66
  117. data/lib/contrast/agent/assess/rule/response/x_content_type_rule.rb +0 -52
  118. data/lib/contrast/agent/assess/rule/response/x_xss_protection_rule.rb +0 -53
  119. data/lib/contrast/extension/kernel.rb +0 -54
@@ -6,18 +6,112 @@ module Contrast
6
6
  # Common Configuration settings. Those in this section pertain to the
7
7
  # assess functionality of the Agent.
8
8
  class AssessConfiguration < BaseConfiguration
9
- KEYS = {
10
- tags: EMPTY_VALUE,
11
- enable: EMPTY_VALUE,
12
- enable_scan_response: true,
13
- enable_dynamic_sources: true,
14
- sampling: Contrast::Config::SamplingConfiguration,
15
- rules: Contrast::Config::AssessRulesConfiguration,
16
- stacktraces: 'ALL'
17
- }.cs__freeze
18
-
19
- def initialize hsh
20
- super(hsh, KEYS)
9
+ # @return [String, nil]
10
+ attr_reader :tags
11
+
12
+ DEFAULT_STACKTRACES = 'ALL'
13
+
14
+ def initialize hsh = {}
15
+ @enable = traverse_config(hsh, :enable)
16
+ @tags = traverse_config(hsh, :tags)
17
+ @enable_scan_response = traverse_config(hsh, :enable_scan_response)
18
+ @enable_dynamic_sources = traverse_config(hsh, :enable_dynamic_sources)
19
+ @sampling = Contrast::Config::SamplingConfiguration.new(traverse_config(hsh, :sampling))
20
+ @rules = Contrast::Config::AssessRulesConfiguration.new(traverse_config(hsh, :rules))
21
+ @stacktraces = traverse_config(hsh, :stacktraces)
22
+ @configuration_map = {}
23
+ build_configuration_map
24
+ end
25
+
26
+ # @return [Boolean, true]
27
+ def enable
28
+ @enable.nil? ? true : @enable
29
+ end
30
+
31
+ # @return [Boolean, true]
32
+ def enable_scan_response
33
+ @enable_scan_response.nil? ? true : @enable_scan_response
34
+ end
35
+
36
+ # @return [Boolean, true]
37
+ def enable_dynamic_sources
38
+ @enable_dynamic_sources.nil? ? true : @enable_dynamic_sources
39
+ end
40
+
41
+ # @return [Contrast::Config::SamplingConfiguration]
42
+ def sampling
43
+ @sampling ||= Contrast::Config::SamplingConfiguration.new
44
+ end
45
+
46
+ # @return [Contrast::Config::AssessRulesConfiguration]
47
+ def rules
48
+ @rules ||= Contrast::Config::AssessRulesConfiguration.new
49
+ end
50
+
51
+ # @return [String] stacktrace level
52
+ def stacktraces
53
+ @stacktraces ||= DEFAULT_STACKTRACES
54
+ end
55
+
56
+ def enable= value
57
+ self['enable'] = value
58
+ end
59
+
60
+ def tags= value
61
+ self['tags'] = value
62
+ end
63
+
64
+ def enable_scan_response= value
65
+ self['enable_scan_response'] = value
66
+ end
67
+
68
+ def enable_dynamic_sources= value
69
+ self['enable_dynamic_sources'] = value
70
+ end
71
+
72
+ def sampling= value
73
+ self['sampling'] = value
74
+ end
75
+
76
+ def rules= value
77
+ self['rules'] = value
78
+ end
79
+
80
+ def stacktraces= value
81
+ self['stacktraces'] = value
82
+ end
83
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
84
+
85
+ def []= key, value
86
+ instance_variable_set("@#{ key }".to_sym, value)
87
+ @configuration_map[key] = value
88
+ end
89
+
90
+ def [] key
91
+ send(key.to_sym)
92
+ end
93
+
94
+ # Traverse the given entity to build out the configuration graph.
95
+ #
96
+ # The values will be either a hash, indicating internal nodes to
97
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
98
+ # leaf node.
99
+ #
100
+ # The spec_key are the Contrast defined keys based on the instance variables of
101
+ # a given configuration.
102
+ def traverse_config values, spec_key
103
+ internal_nodes = values.cs__respond_to?(:has_key?)
104
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
105
+ val == EMPTY_VALUE ? nil : val
106
+ end
107
+
108
+ def build_configuration_map
109
+ instance_variables.each do |key|
110
+ str_key = key.to_s.tr('@', '')
111
+ next if str_key == 'configuration_map'
112
+
113
+ @configuration_map[str_key] = send(str_key.to_sym)
114
+ end
21
115
  end
22
116
  end
23
117
  end
@@ -6,10 +6,51 @@ module Contrast
6
6
  # Common Configuration settings. Those in this section pertain to the
7
7
  # disabled assess rule functionality of the Agent.
8
8
  class AssessRulesConfiguration < BaseConfiguration
9
- KEYS = { disabled_rules: EMPTY_VALUE }.cs__freeze
9
+ # @return [Array, nil] list of disabled assess rules
10
+ attr_reader :disabled_rules
10
11
 
11
- def initialize hsh
12
- super(hsh, KEYS)
12
+ def initialize hsh = {}
13
+ @disabled_rules = traverse_config(hsh, :disabled_rules)
14
+ @configuration_map = {}
15
+ build_configuration_map
16
+ end
17
+
18
+ def disabled_rules= value
19
+ self['disabled_rules'] = value
20
+ end
21
+
22
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
23
+
24
+ def []= key, value
25
+ instance_variable_set("@#{ key }".to_sym, value)
26
+ @configuration_map[key] = value
27
+ end
28
+
29
+ def [] key
30
+ send(key.to_sym)
31
+ end
32
+
33
+ # Traverse the given entity to build out the configuration graph.
34
+ #
35
+ # The values will be either a hash, indicating internal nodes to
36
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
37
+ # leaf node.
38
+ #
39
+ # The spec_key are the Contrast defined keys based on the instance variables of
40
+ # a given configuration.
41
+ def traverse_config values, spec_key
42
+ internal_nodes = values.cs__respond_to?(:has_key?)
43
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
44
+ val == EMPTY_VALUE ? nil : val
45
+ end
46
+
47
+ def build_configuration_map
48
+ instance_variables.each do |key|
49
+ str_key = key.to_s.tr('@', '')
50
+ next if str_key == 'configuration_map'
51
+
52
+ @configuration_map[str_key] = send(str_key.to_sym)
53
+ end
13
54
  end
14
55
  end
15
56
  end
@@ -30,6 +30,7 @@ module Contrast
30
30
  def assign_value_to_path_array dot_path_array, value
31
31
  current_level = self
32
32
  dot_path_array[0...-1].each do |segment|
33
+ segment = segment.tr('-', '_')
33
34
  current_level = current_level.send(segment) if current_level.cs__respond_to?(segment)
34
35
  end
35
36
  last_entry = dot_path_array[-1]
@@ -5,10 +5,81 @@ module Contrast
5
5
  module Config
6
6
  # Certificate Configuration
7
7
  class CertificationConfiguration < BaseConfiguration
8
- KEYS = { enable: false, ca_file: EMPTY_VALUE, cert_file: EMPTY_VALUE, key_file: EMPTY_VALUE }.cs__freeze
8
+ # @return [String] path to CA Cert file
9
+ attr_reader :ca_file
10
+ # @return [String] path to Certification file
11
+ attr_reader :cert_file
12
+ # @return [String] path to Certification Key file
13
+ attr_reader :key_file
9
14
 
10
- def initialize hsh
11
- super(hsh, KEYS)
15
+ def initialize hsh = {}
16
+ @enable = traverse_config(hsh, :enable)
17
+ @ca_file = traverse_config(hsh, :ca_file)
18
+ @cert_file = traverse_config(hsh, :cert_file)
19
+ @key_file = traverse_config(hsh, :key_file)
20
+ @configuration_map = {}
21
+ build_configuration_map
22
+ end
23
+
24
+ # GETTERS
25
+
26
+ # @return [Boolean]
27
+ def enable
28
+ return false if @enable.nil?
29
+
30
+ @enable
31
+ end
32
+
33
+ # SETTERS
34
+
35
+ def enable= value
36
+ self['enable'] = value
37
+ end
38
+
39
+ def ca_file= value
40
+ self['ca_file'] = value
41
+ end
42
+
43
+ def cert_file= value
44
+ self['cert_file'] = value
45
+ end
46
+
47
+ def key_file= value
48
+ self['key_file'] = value
49
+ end
50
+
51
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
52
+
53
+ def []= key, value
54
+ instance_variable_set("@#{ key }".to_sym, value)
55
+ @configuration_map[key] = value
56
+ end
57
+
58
+ def [] key
59
+ send(key.to_sym)
60
+ end
61
+
62
+ # Traverse the given entity to build out the configuration graph.
63
+ #
64
+ # The values will be either a hash, indicating internal nodes to
65
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
66
+ # leaf node.
67
+ #
68
+ # The spec_key are the Contrast defined keys based on the instance variables of
69
+ # a given configuration.
70
+ def traverse_config values, spec_key
71
+ internal_nodes = values.cs__respond_to?(:has_key?)
72
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
73
+ val == EMPTY_VALUE ? nil : val
74
+ end
75
+
76
+ def build_configuration_map
77
+ instance_variables.each do |key|
78
+ str_key = key.to_s.tr('@', '')
79
+ next if str_key == 'configuration_map'
80
+
81
+ @configuration_map[str_key] = send(str_key.to_sym)
82
+ end
12
83
  end
13
84
  end
14
85
  end
@@ -7,10 +7,68 @@ module Contrast
7
7
  # exception handling in Ruby, allowing for the override of Response Code
8
8
  # and Message when Security Exceptions are raised.
9
9
  class ExceptionConfiguration < BaseConfiguration
10
- KEYS = { capture: EMPTY_VALUE, override_status: EMPTY_VALUE, override_message: EMPTY_VALUE }.cs__freeze
10
+ # @return [Integer] the HTTP status code override
11
+ attr_reader :override_status
12
+ # @return [String] the message text override
13
+ attr_reader :override_message
11
14
 
12
- def initialize hsh
13
- super(hsh, KEYS)
15
+ def initialize hsh = {}
16
+ @capture = traverse_config(hsh, :capture)
17
+ @override_status = traverse_config(hsh, :override_status)
18
+ @override_message = traverse_config(hsh, :override_message)
19
+ @configuration_map = {}
20
+ build_configuration_map
21
+ end
22
+
23
+ # @return [Boolean] default: false
24
+ def capture
25
+ @capture.nil? ? false : @capture
26
+ end
27
+
28
+ def capture= value
29
+ self['capture'] = value
30
+ end
31
+
32
+ def override_status= value
33
+ self['override_status'] = value
34
+ end
35
+
36
+ def override_message= value
37
+ self['override_message'] = value
38
+ end
39
+
40
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
41
+
42
+ def []= key, value
43
+ instance_variable_set("@#{ key }".to_sym, value)
44
+ @configuration_map[key] = value
45
+ end
46
+
47
+ def [] key
48
+ send(key.to_sym)
49
+ end
50
+
51
+ # Traverse the given entity to build out the configuration graph.
52
+ #
53
+ # The values will be either a hash, indicating internal nodes to
54
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
55
+ # leaf node.
56
+ #
57
+ # The spec_key are the Contrast defined keys based on the instance variables of
58
+ # a given configuration.
59
+ def traverse_config values, spec_key
60
+ internal_nodes = values.cs__respond_to?(:has_key?)
61
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
62
+ val == EMPTY_VALUE ? nil : val
63
+ end
64
+
65
+ def build_configuration_map
66
+ instance_variables.each do |key|
67
+ str_key = key.to_s.tr('@', '')
68
+ next if str_key == 'configuration_map'
69
+
70
+ @configuration_map[str_key] = send(str_key.to_sym)
71
+ end
14
72
  end
15
73
  end
16
74
  end
@@ -6,23 +6,107 @@ module Contrast
6
6
  # Common Configuration settings. Those in this section pertain to the
7
7
  # Heap Dump collection functionality of the Agent.
8
8
  class HeapDumpConfiguration < BaseConfiguration
9
- KEYS = {
10
- enable: # should dumps be taken
11
- Contrast::Utils::ObjectShare::FALSE,
12
- path: # dir to which dumps should be
13
- 'contrast_heap_dumps', # saved
14
- delay_ms: # time, in ms, after initialization
15
- 10_000, # to delay before taking dump
16
- window_ms: # ms between each dump
17
- 10_000, #
18
- count: # number of dumps to take
19
- 5, #
20
- clean: # remove temporary objects or not
21
- Contrast::Utils::ObjectShare::FALSE #
22
- }.cs__freeze
23
-
24
- def initialize hsh
25
- super(hsh, KEYS)
9
+ DEFAULT_PATH = 'contrast_heap_dumps' # saved
10
+ DEFAULT_MS = 10_000
11
+ DEFAULT_COUNT = 5
12
+
13
+ def initialize hsh = {}
14
+ @enable = traverse_config(hsh, :enable)
15
+ @path = traverse_config(hsh, :path)
16
+ @delay_ms = traverse_config(hsh, :delay_ms)
17
+ @window_ms = traverse_config(hsh, :window_ms)
18
+ @count = traverse_config(hsh, :count)
19
+ @clean = traverse_config(hsh, :clean)
20
+ @configuration_map = {}
21
+ build_configuration_map
22
+ end
23
+
24
+ # @return [Boolean, false] should dumps be taken
25
+ def enable
26
+ !!@enable
27
+ end
28
+
29
+ # @return [String, DEFAULT_PATH] dir to which dumps should be
30
+ def path
31
+ @path ||= DEFAULT_PATH
32
+ end
33
+
34
+ # @return [Integer, DEFAULT_MS] time, in ms, after initialization
35
+ def delay_ms
36
+ @delay_ms ||= DEFAULT_MS
37
+ end
38
+
39
+ # @return [Integer, DEFAULT_MS] ms between each dump
40
+ def window_ms
41
+ @window_ms ||= DEFAULT_MS
42
+ end
43
+
44
+ # @return [Integer, DEFAULT_MS] number of dumps to take
45
+ def count
46
+ @count ||= DEFAULT_COUNT
47
+ end
48
+
49
+ # @return [Boolean, false] remove temporary objects or not
50
+ def clean
51
+ !!@clean
52
+ end
53
+
54
+ def enable= value
55
+ self['enable'] = value
56
+ end
57
+
58
+ def path= value
59
+ self['path'] = value
60
+ end
61
+
62
+ def delay_ms= value
63
+ self['delay_ms'] = value
64
+ end
65
+
66
+ def window_ms= value
67
+ self['window_ms'] = value
68
+ end
69
+
70
+ def count= value
71
+ self['count'] = value
72
+ end
73
+
74
+ def clean= value
75
+ self['clean'] = value
76
+ end
77
+
78
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
79
+
80
+ def []= key, value
81
+ instance_variable_set("@#{ key }".to_sym, value)
82
+ @configuration_map[key] = value
83
+ end
84
+
85
+ def [] key
86
+ send(key.to_sym)
87
+ end
88
+
89
+ # Traverse the given entity to build out the configuration graph.
90
+ #
91
+ # The values will be either a hash, indicating internal nodes to
92
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
93
+ # leaf node.
94
+ #
95
+ # The spec_key are the Contrast defined keys based on the instance variables of
96
+ # a given configuration.
97
+ def traverse_config values, spec_key
98
+ internal_nodes = values.cs__respond_to?(:has_key?)
99
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
100
+ val == EMPTY_VALUE ? nil : val
101
+ end
102
+
103
+ def build_configuration_map
104
+ instance_variables.each do |key|
105
+ str_key = key.to_s.tr('@', '')
106
+ next if str_key == 'configuration_map'
107
+
108
+ @configuration_map[str_key] = send(str_key.to_sym)
109
+ end
26
110
  end
27
111
  end
28
112
  end
@@ -6,10 +6,71 @@ module Contrast
6
6
  # Common Configuration settings. Those in this section pertain to the
7
7
  # inventory functionality of the Agent.
8
8
  class InventoryConfiguration < BaseConfiguration
9
- KEYS = { enable: true, analyze_libraries: true, tags: EMPTY_VALUE }.cs__freeze
9
+ # @return [Array, nil] tags
10
+ attr_reader :tags
10
11
 
11
- def initialize hsh
12
- super(hsh, KEYS)
12
+ def initialize hsh = {}
13
+ @enable = traverse_config(hsh, :enable)
14
+ @analyze_libraries = traverse_config(hsh, :analyze_libraries)
15
+ @tags = traverse_config(hsh, :tags)
16
+ @configuration_map = {}
17
+ build_configuration_map
18
+ end
19
+
20
+ # @return [Boolean, true]
21
+ def enable
22
+ @enable.nil? ? true : @enable
23
+ end
24
+
25
+ # @return [Boolean, true]
26
+ def analyze_libraries
27
+ @analyze_libraries.nil? ? true : @analyze_libraries
28
+ end
29
+
30
+ def enable= value
31
+ self['enable'] = value
32
+ end
33
+
34
+ def analyze_libraries= value
35
+ self['analyze_libraries'] = value
36
+ end
37
+
38
+ def tags= value
39
+ self['tags'] = value
40
+ end
41
+
42
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
43
+
44
+ def []= key, value
45
+ instance_variable_set("@#{ key }".to_sym, value)
46
+ @configuration_map[key] = value
47
+ end
48
+
49
+ def [] key
50
+ send(key.to_sym)
51
+ end
52
+
53
+ # Traverse the given entity to build out the configuration graph.
54
+ #
55
+ # The values will be either a hash, indicating internal nodes to
56
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
57
+ # leaf node.
58
+ #
59
+ # The spec_key are the Contrast defined keys based on the instance variables of
60
+ # a given configuration.
61
+ def traverse_config values, spec_key
62
+ internal_nodes = values.cs__respond_to?(:has_key?)
63
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
64
+ val == EMPTY_VALUE ? nil : val
65
+ end
66
+
67
+ def build_configuration_map
68
+ instance_variables.each do |key|
69
+ str_key = key.to_s.tr('@', '')
70
+ next if str_key == 'configuration_map'
71
+
72
+ @configuration_map[str_key] = send(str_key.to_sym)
73
+ end
13
74
  end
14
75
  end
15
76
  end
@@ -6,10 +6,53 @@ module Contrast
6
6
  # Common Configuration settings. Those in this section pertain to the
7
7
  # logging in the Agent.
8
8
  class LoggerConfiguration < BaseConfiguration
9
- KEYS = { path: EMPTY_VALUE, level: EMPTY_VALUE, progname: EMPTY_VALUE }.cs__freeze
9
+ # @return [String, nil]
10
+ attr_accessor :path
11
+ # @return [String, nil]
12
+ attr_accessor :level
13
+ # @return [String, nil]
14
+ attr_accessor :progname
10
15
 
11
- def initialize hsh
12
- super(hsh, KEYS)
16
+ def initialize hsh = {}
17
+ @path = traverse_config(hsh, :path)
18
+ @level = traverse_config(hsh, :level)
19
+ @progname = traverse_config(hsh, :progname)
20
+ @configuration_map = {}
21
+ build_configuration_map
22
+ end
23
+
24
+ # TODO: RUBY-1493 MOVE TO BASE CONFIG
25
+
26
+ def []= key, value
27
+ instance_variable_set("@#{ key }".to_sym, value)
28
+ @configuration_map[key] = value
29
+ end
30
+
31
+ def [] key
32
+ send(key.to_sym)
33
+ end
34
+
35
+ # Traverse the given entity to build out the configuration graph.
36
+ #
37
+ # The values will be either a hash, indicating internal nodes to
38
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
39
+ # leaf node.
40
+ #
41
+ # The spec_key are the Contrast defined keys based on the instance variables of
42
+ # a given configuration.
43
+ def traverse_config values, spec_key
44
+ internal_nodes = values.cs__respond_to?(:has_key?)
45
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
46
+ val == EMPTY_VALUE ? nil : val
47
+ end
48
+
49
+ def build_configuration_map
50
+ instance_variables.each do |key|
51
+ str_key = key.to_s.tr('@', '')
52
+ next if str_key == 'configuration_map'
53
+
54
+ @configuration_map[str_key] = send(str_key.to_sym)
55
+ end
13
56
  end
14
57
  end
15
58
  end
@@ -8,15 +8,15 @@ module Contrast
8
8
  # Common Configuration settings. Those in this section pertain to the
9
9
  # rule mode of a single protect rule in the Agent.
10
10
  class ProtectRuleConfiguration < BaseConfiguration
11
- KEYS = {
12
- enable: EMPTY_VALUE,
13
- mode: EMPTY_VALUE,
14
- disable_system_commands: EMPTY_VALUE,
15
- detect_custom_code_accessing_system_files: true
16
- }.cs__freeze
17
-
18
- def initialize hsh
19
- super(hsh, KEYS)
11
+ attr_accessor :enable, :mode, :disable_system_commands, :detect_custom_code_accessing_system_files
12
+
13
+ def initialize hsh = {}
14
+ @enable = traverse_config(hsh, :enable)
15
+ @mode = traverse_config(hsh, :mode)
16
+ @disable_system_commands = traverse_config(hsh, :disable_system_commands)
17
+ @detect_custom_code_accessing_system_files = traverse_config(hsh, :detect_custom_code_accessing_system_files)
18
+ @configuration_map = {}
19
+ build_configuration_map
20
20
  end
21
21
 
22
22
  # To convert the user input mode from config to a standard format used by TS & SR, we need to convert the given
@@ -40,6 +40,33 @@ module Contrast
40
40
  Contrast::Api::Settings::ProtectionRule::Mode::NO_ACTION
41
41
  end
42
42
  end
43
+
44
+ def [] key
45
+ send(key.to_sym)
46
+ end
47
+
48
+ # Traverse the given entity to build out the configuration graph.
49
+ #
50
+ # The values will be either a hash, indicating internal nodes to
51
+ # traverse, or a value to set or the EMPTY_VALUE symbol, indicating a
52
+ # leaf node.
53
+ #
54
+ # The spec_key are the Contrast defined keys based on the instance variables of
55
+ # a given configuration.
56
+ def traverse_config values, spec_key
57
+ internal_nodes = values.cs__respond_to?(:has_key?)
58
+ val = internal_nodes ? value_from_key_config(spec_key, values) : nil
59
+ val == EMPTY_VALUE ? nil : val
60
+ end
61
+
62
+ def build_configuration_map
63
+ instance_variables.each do |key|
64
+ str_key = key.to_s.tr('@', '')
65
+ next if str_key == 'configuration_map'
66
+
67
+ @configuration_map[str_key] = send(str_key.to_sym)
68
+ end
69
+ end
43
70
  end
44
71
  end
45
72
  end