tcell_agent 2.7.0 → 2.7.1

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tcell_agent/agent.rb +1 -2
  3. data/lib/tcell_agent/instrumentation.rb +0 -192
  4. data/lib/tcell_agent/policies/policies_manager.rb +1 -17
  5. data/lib/tcell_agent/policies/policy_polling.rb +1 -2
  6. data/lib/tcell_agent/policies/policy_types.rb +0 -1
  7. data/lib/tcell_agent/rails/database.rb +49 -0
  8. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +1 -1
  9. data/lib/tcell_agent/rails/railties/tcell_agent_database_railties.rb +81 -0
  10. data/lib/tcell_agent/rails/railties/tcell_agent_railties.rb +0 -1
  11. data/lib/tcell_agent/rails/routes.rb +0 -8
  12. data/lib/tcell_agent/rust/libtcellagent-alpine.so +0 -0
  13. data/lib/tcell_agent/rust/libtcellagent-x64.dll +0 -0
  14. data/lib/tcell_agent/rust/libtcellagent.dylib +0 -0
  15. data/lib/tcell_agent/rust/libtcellagent.so +0 -0
  16. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +0 -17
  17. data/lib/tcell_agent/version.rb +1 -1
  18. data/lib/tcell_agent.rb +5 -3
  19. data/spec/lib/tcell_agent/policies/policies_manager_spec.rb +5 -16
  20. data/spec/lib/tcell_agent/rails/database.rb +60 -0
  21. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +2 -2
  22. data/spec/support/force_logger_mocking.rb +0 -8
  23. metadata +6 -16
  24. data/lib/tcell_agent/policies/dataloss_policy.rb +0 -304
  25. data/lib/tcell_agent/rails/dlp/process_request.rb +0 -83
  26. data/lib/tcell_agent/rails/dlp.rb +0 -410
  27. data/lib/tcell_agent/rails/dlp_handler.rb +0 -63
  28. data/lib/tcell_agent/sensor_events/dlp.rb +0 -53
  29. data/lib/tcell_agent/sinatra.rb +0 -38
  30. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +0 -222
  31. data/spec/lib/tcell_agent/rails/dlp_spec.rb +0 -1040
  32. data/spec/lib/tcell_agent/rails/logger_spec.rb +0 -169
  33. data/spec/lib/tcell_agent/sensor_events/dlp_spec.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e91769037e5364f7091d874a750f24b45ba340baaf71725e13794815ec09de9
4
- data.tar.gz: 5773afa03451d699bef82efbd611c12bbfc7383770b140b34ab7be77d012faf2
3
+ metadata.gz: 60417237022f31c4843ffb12a013c385b35ffc40adc299947e53bb3fb44dcce7
4
+ data.tar.gz: b6231f1628e83d4f4ead9c277786dc0b8c57160f518e701f58ab357b9fa4b223
5
5
  SHA512:
6
- metadata.gz: 0fb4d5b36eb03da7e193245a32955e1f140f711d0e757a4aa9c0ead48774e00fb5f9dd8772506f90dea288d20303211a56c67312a2b6df6c583467891d524e7e
7
- data.tar.gz: 22f2b41bf88d49f6f4bd3b32cf3d27b734f8488d93f85e1b7f785ee9c03b5b868b4d7b2ad67e3fe3fdbd667fe10d20fd11a94d2c37dc7b1ca5f81e6087177b0e
6
+ metadata.gz: '08f8ed5ffa676d80512a5ef821aae44bb59037a59c0cf4639acac0ce690805f26c4249f4639780088230d9cd050c3148af0b8de6c797f431f1cec9f4f8e39440'
7
+ data.tar.gz: 60fe10b0f131c50f2e69e4d27199ba53a8ab5f708e578f51793ef09346b6a965c32b807f3f6aa57eb0b704495e254a6cf16f1df6f9318e1f9db0f4ffa8e0b96f
@@ -89,8 +89,7 @@ module TCellAgent
89
89
  policies_and_enablements = result['new_policies_and_enablements'] || {}
90
90
 
91
91
  @policies_manager.process_policy_json(
92
- policies_and_enablements['enablements'],
93
- policies_and_enablements['policies']
92
+ policies_and_enablements['enablements']
94
93
  )
95
94
 
96
95
  @policy_polling = PolicyPolling.new(@policies_manager, @native_agent)
@@ -1,65 +1,11 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
  require 'tcell_agent/configuration'
3
3
  require 'tcell_agent/version'
4
- require 'date'
5
- require 'cgi'
6
4
 
7
5
  module TCellAgent
8
6
  module Instrumentation
9
7
  TCELL_ID = 'tcell.request_data'.freeze
10
8
 
11
- class ContextFilter
12
- attr_accessor :type
13
- attr_accessor :rule
14
- attr_accessor :context
15
- attr_accessor :parameter
16
- attr_accessor :database
17
- attr_accessor :schema
18
- attr_accessor :table
19
- attr_accessor :field
20
-
21
- DATABASE = 'db'.freeze
22
- REQUEST = 'request'.freeze
23
-
24
- def for_request(context, parameter, rule)
25
- self.type = ContextFilter::REQUEST
26
- self.context = context
27
- self.parameter = parameter
28
- self.rule = rule
29
- self
30
- end
31
-
32
- def create_hash_value
33
- "#{type}#{context}#{parameter}#{database}#{schema}#{table}#{field}#{rule}".hash
34
- end
35
-
36
- def eql?(other)
37
- hash == other.hash
38
- end
39
-
40
- def hash
41
- create_hash_value
42
- end
43
-
44
- def for_database(database, schema, table, field, rule)
45
- self.type = ContextFilter::DATABASE
46
- self.database = database
47
- self.schema = schema
48
- self.table = table
49
- self.field = field
50
- self.rule = rule
51
- self
52
- end
53
-
54
- def for_request(context, parameter, rule) # rubocop:disable Lint/DuplicateMethods
55
- self.type = ContextFilter::REQUEST
56
- self.context = context
57
- self.parameter = parameter
58
- self.rule = rule
59
- self
60
- end
61
- end
62
-
63
9
  class TCellData
64
10
  attr_accessor :transaction_id, :session_id, :hmac_session_id, :user_id,
65
11
  :password, :route_id, :path, :uri, :fullpath, :context_filters_by_term,
@@ -68,150 +14,12 @@ module TCellAgent
68
14
  :referrer, :csrf_exception_name, :sql_exceptions, :database_result_sizes,
69
15
  :reverse_proxy_header_value
70
16
 
71
- def self.filterx(sanitize_string, event_flag, replace_flag, term)
72
- send_event = false
73
- sanitize_string.gsub!(term) do |m|
74
- if replace_flag
75
- m = '[redacted]'
76
- send_event = true
77
- elsif event_flag
78
- # m = "[hash]"
79
- send_event = true
80
- end
81
- m
82
- end
83
- send_event
84
- end
85
-
86
17
  def initialize
87
18
  @patches_blocking_triggered = false
88
- @context_filters_by_term = Hash.new { |h, k| h[k] = Set.new }
89
19
  @sql_exceptions = []
90
20
  @database_result_sizes = []
91
21
  end
92
22
 
93
- def valid_term?(term)
94
- return true if !term.nil? && term != '' && term.to_s.length >= 5
95
-
96
- false
97
- end
98
-
99
- def add_response_db_filter(term, action_obj, database, schema, table, field)
100
- return unless valid_term?(term)
101
-
102
- context_filters_by_term[term.to_s].add(ContextFilter.new.for_database(database, schema, table, field, action_obj))
103
- end
104
-
105
- def add_filter_for_request_parameter(term, rule, parameter_name)
106
- return unless valid_term?(term)
107
-
108
- context_filters_by_term[term.to_s].add(ContextFilter.new.for_request('form', parameter_name, rule))
109
- end
110
-
111
- def add_filter_for_header_value(term, rule, header_name)
112
- return unless valid_term?(term)
113
-
114
- context_filters_by_term[term.to_s].add(ContextFilter.new.for_request('header', header_name, rule))
115
- end
116
-
117
- def add_filter_for_cookie_value(term, rule, cookie_name)
118
- return unless valid_term?(term)
119
-
120
- context_filters_by_term[term.to_s].add(ContextFilter.new.for_request('cookie', cookie_name, rule))
121
- end
122
-
123
- def filter_body!(body)
124
- dlp_policy = TCellAgent.policy(TCellAgent::PolicyTypes::DATALOSS)
125
- if dlp_policy && session_id
126
- session_id_actions = dlp_policy.get_actions_for_session_id
127
- if session_id_actions
128
- send_flag = TCellData.filterx(body, session_id_actions.body_event, session_id_actions.body_redact, session_id)
129
- if send_flag
130
- TCellAgent.send_event(
131
- TCellAgent::SensorEvents::DlpEvent.new(
132
- route_id,
133
- uri,
134
- TCellAgent::SensorEvents::DlpEvent::FOUND_IN_BODY,
135
- session_id_actions.action_id
136
- ).for_framework(TCellAgent::SensorEvents::DlpEvent::FRAMEWORK_VARIABLE_SESSION_ID)
137
- )
138
-
139
- end
140
- end
141
- end
142
- context_filters_by_term.sort_by { |term, _context_filters| -term.length }.each do |term, context_filters|
143
- replace_filters = (context_filters.select { |context_filter| context_filter.rule.body_redact == true })
144
- event_filters = (context_filters.select { |context_filter| (context_filter.rule.body_redact != true && context_filter.rule.body_event == true) })
145
- send_flag = TCellData.filterx(body, !event_filters.empty?, !replace_filters.empty?, term)
146
- send_flag ||= TCellData.filterx(body, !event_filters.empty?, !replace_filters.empty?, CGI.escapeHTML(term))
147
- next unless send_flag
148
-
149
- (replace_filters + event_filters).each do |filter|
150
- base_event = TCellAgent::SensorEvents::DlpEvent.new(
151
- route_id,
152
- uri,
153
- TCellAgent::SensorEvents::DlpEvent::FOUND_IN_BODY,
154
- filter.rule.action_id
155
- )
156
- if filter.type == ContextFilter::DATABASE
157
- TCellAgent.send_event(
158
- base_event.for_database(filter.database, filter.schema, filter.table, filter.field)
159
- )
160
- elsif filter.type == ContextFilter::REQUEST
161
- TCellAgent.send_event(
162
- base_event.for_request(filter.context, filter.parameter)
163
- )
164
- end
165
- end
166
- end
167
- body
168
- end
169
-
170
- def filter_log(log_msg)
171
- dlp_policy = TCellAgent.policy(TCellAgent::PolicyTypes::DATALOSS)
172
- if dlp_policy && session_id
173
- session_id_actions = dlp_policy.get_actions_for_session_id
174
- if session_id_actions
175
- send_flag = TCellData.filterx(log_msg, session_id_actions.log_event, session_id_actions.log_redact, session_id)
176
- if send_flag
177
- TCellAgent.send_event(
178
- TCellAgent::SensorEvents::DlpEvent.new(
179
- route_id,
180
- uri,
181
- TCellAgent::SensorEvents::DlpEvent::FOUND_IN_LOG,
182
- session_id_actions.action_id
183
- ).for_framework(TCellAgent::SensorEvents::DlpEvent::FRAMEWORK_VARIABLE_SESSION_ID)
184
- )
185
- end
186
- end
187
- end
188
- context_filters_by_term.sort_by { |term, _context_filters| -term.length }.each do |term, context_filters|
189
- replace_filters = (context_filters.select { |context_filter| context_filter.rule.log_redact == true })
190
- event_filters = (context_filters.select { |context_filter| (context_filter.rule.log_redact != true && context_filter.rule.log_event == true) })
191
- send_flag = TCellData.filterx(log_msg, !event_filters.empty?, !replace_filters.empty?, term)
192
- next unless send_flag
193
-
194
- (replace_filters + event_filters).each do |filter|
195
- base_event = TCellAgent::SensorEvents::DlpEvent.new(
196
- route_id,
197
- uri,
198
- TCellAgent::SensorEvents::DlpEvent::FOUND_IN_LOG,
199
- filter.rule.action_id
200
- )
201
- if filter.type == ContextFilter::DATABASE
202
- TCellAgent.send_event(
203
- base_event.for_database(filter.database, filter.schema, filter.table, filter.field)
204
- )
205
- elsif filter.type == ContextFilter::REQUEST
206
- TCellAgent.send_event(
207
- base_event.for_request(filter.context, filter.parameter)
208
- )
209
- end
210
- end
211
- end
212
- log_msg
213
- end
214
-
215
23
  def to_s
216
24
  "<#{self.class.name} transaction_id: #{transaction_id} session_id: #{session_id} " \
217
25
  "hmac_session_id: #{hmac_session_id} user_id: #{user_id} route_id: #{route_id} " \
@@ -4,7 +4,6 @@ require 'tcell_agent/policies/policy_types'
4
4
 
5
5
  require 'tcell_agent/policies/appfirewall_policy'
6
6
  require 'tcell_agent/policies/command_injection_policy'
7
- require 'tcell_agent/policies/dataloss_policy'
8
7
  require 'tcell_agent/policies/headers_policy'
9
8
  require 'tcell_agent/policies/http_redirect_policy'
10
9
  require 'tcell_agent/policies/js_agent_policy'
@@ -39,22 +38,9 @@ module TCellAgent
39
38
  @native_agent, enablements
40
39
  )
41
40
  end
42
-
43
- set_dataloss_policy({ 'dlp' => {} })
44
41
  end
45
42
 
46
- def set_dataloss_policy(policies_json)
47
- TCellAgent::Instrumentation.safe_block('Setting DLP policy') do
48
- dlp_api_identifier = TCellAgent::Policies::DataLossPolicy.api_identifier
49
- return unless policies_json.key?(dlp_api_identifier)
50
-
51
- @policies[dlp_api_identifier] = TCellAgent::Policies::DataLossPolicy.new(
52
- policies_json[dlp_api_identifier]
53
- )
54
- end
55
- end
56
-
57
- def process_policy_json(enablements, policies_json)
43
+ def process_policy_json(enablements)
58
44
  return if enablements.nil? || enablements == {}
59
45
 
60
46
  RUST_POLICY_CLASSES.each do |policy_class|
@@ -62,8 +48,6 @@ module TCellAgent
62
48
  @native_agent, enablements
63
49
  )
64
50
  end
65
-
66
- set_dataloss_policy(policies_json)
67
51
  end
68
52
  end
69
53
  end
@@ -42,8 +42,7 @@ module TCellAgent
42
42
  result = native_agent.poll_new_policies
43
43
  policies_and_enablements = result['new_policies_and_enablements'] || {}
44
44
  @policies_manager.process_policy_json(
45
- policies_and_enablements['enablements'],
46
- policies_and_enablements['policies']
45
+ policies_and_enablements['enablements']
47
46
  )
48
47
  rescue StandardError => e
49
48
  module_logger.error("Error in polling policies: #{e.message}")
@@ -2,7 +2,6 @@ module TCellAgent
2
2
  class PolicyTypes
3
3
  HTTPREDIRECT = 'http-redirect'.freeze
4
4
  LOGINFRAUD = 'login'.freeze
5
- DATALOSS = 'dlp'.freeze
6
5
  APPSENSOR = 'appsensor'.freeze
7
6
  PATCHES = 'patches'.freeze
8
7
  COMMANDINJECTION = 'cmdi'.freeze
@@ -0,0 +1,49 @@
1
+ # See the file "LICENSE" for the full license governing this code.
2
+
3
+ require 'rails'
4
+ require 'tcell_agent/agent'
5
+ require 'tcell_agent/rails/middleware/context_middleware'
6
+ require 'tcell_agent/instrumentation'
7
+
8
+ require 'thread'
9
+
10
+ module TCellAgent
11
+ module Instrumentation
12
+ module Rails
13
+ module Database
14
+ def self.push_exception(message, result)
15
+ appfirewall_policy = TCellAgent.policy(TCellAgent::PolicyTypes::APPSENSOR)
16
+
17
+ return unless appfirewall_policy.enabled
18
+
19
+ request_env = TCellAgent::Instrumentation::Rails::Middleware::ContextMiddleware::THREADS.fetch(
20
+ Thread.current.object_id, {}
21
+ )
22
+
23
+ tcell_data = request_env[TCellAgent::Instrumentation::TCELL_ID]
24
+
25
+ return unless tcell_data && result.is_a?(ActiveRecord::StatementInvalid)
26
+
27
+ tcell_data.sql_exceptions.push(
28
+ { 'exception_name' => result.class.name, 'exception_payload' => message }
29
+ )
30
+ end
31
+
32
+ def self.inspect_result_size(results)
33
+ return if results.empty?
34
+
35
+ if TCellAgent.configuration.should_instrument? &&
36
+ TCellAgent.configuration.should_intercept_requests?
37
+
38
+ request_env = TCellAgent::Instrumentation::Rails::Middleware::ContextMiddleware::THREADS.fetch(Thread.current.object_id, {})
39
+ tcell_context = request_env[TCellAgent::Instrumentation::TCELL_ID]
40
+
41
+ if tcell_context
42
+ tcell_context.database_result_sizes.push(results.size)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -77,7 +77,7 @@ module TCellAgent
77
77
  end
78
78
 
79
79
  def _handle_appsensor_js_agent(request, response)
80
- TCellAgent::Instrumentation.safe_block('Handling AppSensor, JS Agent, and DLP') do
80
+ TCellAgent::Instrumentation.safe_block('Handling AppSensor and JSAgent') do
81
81
  status_code, response_headers, response_body = response
82
82
 
83
83
  js_agent_handler, script_insert =
@@ -0,0 +1,81 @@
1
+ require 'tcell_agent/rails/database'
2
+
3
+ class TCellAgentDatabaseRailtie < Rails::Railtie
4
+ initializer 'activeservice.autoload', :after => :set_autoload_paths do |_app|
5
+ if defined?(ActiveRecord)
6
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
7
+ alias_method :tcell_translate_exception, :translate_exception
8
+
9
+ if RUBY_VERSION.start_with?('3') || RUBY_VERSION.start_with?('2.7')
10
+ def translate_exception(*args, **kwargs, &block)
11
+ result = tcell_translate_exception(*args, **kwargs, &block)
12
+
13
+ TCellAgent::Instrumentation.safe_block('Set sql_exception_detected in meta') do
14
+ TCellAgent::Instrumentation::Rails::Database.push_exception(kwargs.fetch(:message, ''), result)
15
+ end
16
+
17
+ result
18
+ end
19
+ else
20
+ def translate_exception(*args, &block)
21
+ result = tcell_translate_exception(*args, &block)
22
+
23
+ TCellAgent::Instrumentation.safe_block('Set sql_exception_detected in meta') do
24
+ args_copy = Array.new(args)
25
+ _ = args_copy.shift
26
+ message = args_copy.shift
27
+
28
+ if message.is_a? Hash
29
+ TCellAgent::Instrumentation::Rails::Database.push_exception(message.fetch(:message, ''), result)
30
+ else
31
+ TCellAgent::Instrumentation::Rails::Database.push_exception(message, result)
32
+ end
33
+ end
34
+
35
+ result
36
+ end
37
+ end
38
+ end
39
+
40
+ ActiveRecord::Calculations.module_eval do
41
+ alias_method :tcell_pluck, :pluck
42
+ def pluck(*column_names)
43
+ results = tcell_pluck(*column_names)
44
+
45
+ TCellAgent::Instrumentation.safe_block('Checking for unusual database result size on pluck') do
46
+ TCellAgent::Instrumentation::Rails::Database.inspect_result_size(results)
47
+ end
48
+
49
+ results
50
+ end
51
+ end
52
+
53
+ ActiveRecord::Querying.module_eval do
54
+ if RUBY_VERSION.start_with?('3')
55
+ alias_method :tcell_find_by_sql, :find_by_sql
56
+ def find_by_sql(*args, **kwargs, &block)
57
+ results = tcell_find_by_sql(*args, **kwargs, &block)
58
+
59
+ TCellAgent::Instrumentation.safe_block('Checking for unusual database result size on find_by_sql') do
60
+ TCellAgent::Instrumentation::Rails::Database.inspect_result_size(results)
61
+ end
62
+
63
+ results
64
+ end
65
+
66
+ elsif RUBY_VERSION.start_with?('2')
67
+ alias_method :tcell_find_by_sql, :find_by_sql
68
+ def find_by_sql(*args, &block)
69
+ results = tcell_find_by_sql(*args, &block)
70
+
71
+ TCellAgent::Instrumentation.safe_block('Checking for unusual database result size on find_by_sql') do
72
+ TCellAgent::Instrumentation::Rails::Database.inspect_result_size(results)
73
+ end
74
+
75
+ results
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -9,7 +9,6 @@ require 'tcell_agent/rails/middleware/context_middleware'
9
9
 
10
10
  require 'tcell_agent/rails/routes'
11
11
  require 'tcell_agent/rails/settings_reporter'
12
- require 'tcell_agent/rails/dlp'
13
12
  require 'tcell_agent/rails/csrf_exception'
14
13
 
15
14
  require 'cgi'
@@ -1,8 +1,6 @@
1
1
  require 'tcell_agent/patches'
2
2
  require 'tcell_agent/rails/routes/grape'
3
3
  require 'tcell_agent/rails/routes/route_id'
4
- require 'tcell_agent/rails/dlp/process_request'
5
-
6
4
  require 'json'
7
5
 
8
6
  module TCellAgent
@@ -146,8 +144,6 @@ module TCellAgent
146
144
  if TCellAgent::Instrumentation::Patches.block?(request)
147
145
  return head(403)
148
146
  end
149
-
150
- TCellAgent::DLP.handle_request_dlp_parameters(request)
151
147
  end
152
148
 
153
149
  yield
@@ -201,8 +197,6 @@ module TCellAgent
201
197
  if TCellAgent::Instrumentation::Patches.block?(req)
202
198
  return [403, {}, []]
203
199
  end
204
-
205
- TCellAgent::DLP.handle_request_dlp_parameters(req)
206
200
  end
207
201
 
208
202
  tcell_serve(req)
@@ -230,8 +224,6 @@ module TCellAgent
230
224
  if TCellAgent::Instrumentation::Patches.block?(tcell_request)
231
225
  return [403, {}, []]
232
226
  end
233
-
234
- TCellAgent::DLP.handle_request_dlp_parameters(tcell_request)
235
227
  end
236
228
 
237
229
  tcell_call(env)
Binary file
@@ -15,23 +15,6 @@ module TCellAgent
15
15
  h[0...h.length / 2]
16
16
  end
17
17
 
18
- def self.strip_values_query_string(query)
19
- params = CGI.parse(query)
20
- params.each do |param_name, param_values|
21
- next if param_values.nil? || param_values.empty?
22
-
23
- params[param_name] = ['']
24
- end
25
- params.map { |k, v| "#{k}=#{v.join(',')}" }.join('&')
26
- end
27
-
28
- def self.strip_uri_values(uri_string)
29
- uri = URI(uri_string)
30
- query = uri.query
31
- uri.query = strip_values_query_string(query) if query
32
- uri.to_s
33
- end
34
-
35
18
  def self.get_hmac_key
36
19
  return TCellAgent.configuration.hmac_key if TCellAgent.configuration.hmac_key
37
20
  return TCellAgent.configuration.app_id if TCellAgent.configuration.app_id
@@ -1,5 +1,5 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
3
  module TCellAgent
4
- VERSION = '2.7.0'.freeze
4
+ VERSION = '2.7.1'.freeze
5
5
  end
data/lib/tcell_agent.rb CHANGED
@@ -12,7 +12,9 @@ unless TCellAgent.configuration.disable_all
12
12
 
13
13
  require 'tcell_agent/instrument_servers'
14
14
  require 'tcell_agent/hooks/login_fraud'
15
- require 'tcell_agent/rails/railties/tcell_agent_railties' if defined?(Rails)
16
- # sinatra used to be supported, but dropped support due to no customers using it
17
- # require 'tcell_agent/sinatra' if defined?(Sinatra)
15
+
16
+ if defined?(Rails)
17
+ require 'tcell_agent/rails/railties/tcell_agent_railties' if defined?(Rails)
18
+ require 'tcell_agent/rails/railties/tcell_agent_database_railties'
19
+ end
18
20
  end
@@ -4,7 +4,7 @@ module TCellAgent
4
4
  describe PoliciesManager do
5
5
  before(:all) do
6
6
  assert_policy_state = proc do |policies, state|
7
- expect(policies.keys.size).to eq(10)
7
+ expect(policies.keys.size).to eq(9)
8
8
 
9
9
  policies.each_value do |policy|
10
10
  next if policy.instance_of?(TCellAgent::Policies::LoginPolicy)
@@ -51,21 +51,21 @@ module TCellAgent
51
51
 
52
52
  context 'nil enablements' do
53
53
  it 'all policies should remain disabled' do
54
- @policies_manager.process_policy_json(nil, {})
54
+ @policies_manager.process_policy_json(nil)
55
55
  @assert_all_policies_disabled.call(@policies_manager.policies)
56
56
  end
57
57
  end
58
58
 
59
59
  context 'empty enablements' do
60
60
  it 'all policies should remain disabled' do
61
- @policies_manager.process_policy_json({}, {})
61
+ @policies_manager.process_policy_json({})
62
62
  @assert_all_policies_disabled.call(@policies_manager.policies)
63
63
  end
64
64
  end
65
65
 
66
66
  context 'empty enablements' do
67
67
  it 'all policies should remain disabled' do
68
- @policies_manager.process_policy_json({}, {})
68
+ @policies_manager.process_policy_json({})
69
69
  @assert_all_policies_disabled.call(@policies_manager.policies)
70
70
  end
71
71
  end
@@ -83,18 +83,7 @@ module TCellAgent
83
83
  'login_success_enabled' => true,
84
84
  'login_failed_enabled' => true
85
85
  }
86
- policies_json = {
87
- 'dlp' => {
88
- 'policy_id' => 'policy-id',
89
- 'version' => 1,
90
- 'data' => {
91
- 'data_discovery' => {
92
- 'database_enabled' => true
93
- }
94
- }
95
- }
96
- }
97
- @policies_manager.process_policy_json(enablements, policies_json)
86
+ @policies_manager.process_policy_json(enablements)
98
87
  @assert_all_policies_enabled.call(@policies_manager.policies)
99
88
  end
100
89
  end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ require 'active_record'
4
+ require 'tcell_agent/rails/railties/tcell_agent_database_railties'
5
+
6
+ describe '.find_by_sql' do
7
+ before(:all) do
8
+ TCellAgentDatabaseRailtie.initializers[0].run
9
+ end
10
+
11
+ context 'testing function arguments' do
12
+ it 'accepts args' do
13
+ klass = Class.new.extend(ActiveRecord::Querying)
14
+
15
+ expect(klass).to receive(:find_by_sql).and_call_original
16
+ expect(klass).to receive(:find_by_sql).and_call_original
17
+ expect(klass).to receive(:tcell_find_by_sql).and_call_original
18
+ expect(klass).to receive(:tcell_find_by_sql).and_call_original
19
+
20
+ expect do
21
+ klass.find_by_sql('SELECT * FROM table')
22
+ end.to raise_error(NameError)
23
+
24
+ expect do
25
+ klass.find_by_sql('SELECT * FROM table', [1])
26
+ end.to raise_error(NameError)
27
+ end
28
+
29
+ context 'ruby 2' do
30
+ it 'accepts args and kwargs', :if => RUBY_VERSION.start_with?('2') do
31
+ klass = Class.new.extend(ActiveRecord::Querying)
32
+
33
+ expect(klass).to receive(:find_by_sql).and_call_original
34
+ expect(klass).to receive(:tcell_find_by_sql).and_call_original
35
+
36
+ expect do
37
+ klass.find_by_sql('SELECT * FROM table', [1], { :preparable => true })
38
+ end.to raise_error(NameError)
39
+ end
40
+ end
41
+
42
+ context 'ruby 3' do
43
+ it 'accepts args and kwargs', :if => RUBY_VERSION.start_with?('3') do
44
+ klass = Class.new.extend(ActiveRecord::Querying)
45
+
46
+ expect(klass).to receive(:find_by_sql).and_call_original
47
+ expect(klass).to receive(:find_by_sql).and_call_original
48
+ expect(klass).to receive(:tcell_find_by_sql).and_call_original
49
+ expect(klass).to receive(:tcell_find_by_sql).and_call_original
50
+
51
+ expect do
52
+ klass.find_by_sql('SELECT * FROM table', [1], :preparable => true)
53
+ end.to raise_error(NameError)
54
+ expect do
55
+ klass.find_by_sql('SELECT * FROM table', [1], **{ :preparable => true })
56
+ end.to raise_error(NameError)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -121,7 +121,7 @@ module TCellAgent
121
121
  end
122
122
 
123
123
  context 'that should be processed' do
124
- it 'should call js and dlp procs as well as calculate content length' do
124
+ it 'should call js procs as well as calculate content length' do
125
125
  js_agent_insertion_proc = double('js_agent_insertion_proc')
126
126
  tcell_body_proxy = TCellBodyProxy.new(
127
127
  Rack::BodyProxy.new(['some content']) {},
@@ -168,7 +168,7 @@ module TCellAgent
168
168
  end
169
169
 
170
170
  context 'that should be processed' do
171
- it 'should call js and dlp procs as well as calculate content length' do
171
+ it 'should call js procs as well as calculate content length' do
172
172
  body_chunk = 'some content'
173
173
  js_agent_insertion_proc = double('js_agent_insertion_proc')
174
174
  tcell_body_proxy = TCellBodyProxy.new(