sqreen 1.20.0 → 1.20.4

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/lib/sqreen/actions/block_user.rb +1 -1
  4. data/lib/sqreen/actions/redirect_ip.rb +1 -1
  5. data/lib/sqreen/actions/redirect_user.rb +1 -1
  6. data/lib/sqreen/agent_message.rb +20 -0
  7. data/lib/sqreen/attack_detected.html +1 -2
  8. data/lib/sqreen/ca.crt +24 -0
  9. data/lib/sqreen/condition_evaluator.rb +8 -2
  10. data/lib/sqreen/configuration.rb +5 -3
  11. data/lib/sqreen/deferred_logger.rb +50 -14
  12. data/lib/sqreen/deprecation.rb +38 -0
  13. data/lib/sqreen/endpoint_testing.rb +184 -0
  14. data/lib/sqreen/events/request_record.rb +0 -1
  15. data/lib/sqreen/frameworks/generic.rb +9 -0
  16. data/lib/sqreen/frameworks/rails.rb +0 -7
  17. data/lib/sqreen/frameworks/request_recorder.rb +2 -0
  18. data/lib/sqreen/graft/call.rb +76 -18
  19. data/lib/sqreen/graft/callback.rb +1 -1
  20. data/lib/sqreen/graft/hook.rb +187 -85
  21. data/lib/sqreen/graft/hook_point.rb +1 -1
  22. data/lib/sqreen/legacy/instrumentation.rb +22 -10
  23. data/lib/sqreen/legacy/old_event_submission_strategy.rb +2 -1
  24. data/lib/sqreen/log.rb +3 -2
  25. data/lib/sqreen/log/loggable.rb +2 -1
  26. data/lib/sqreen/logger.rb +24 -0
  27. data/lib/sqreen/metrics_store.rb +11 -0
  28. data/lib/sqreen/null_logger.rb +22 -0
  29. data/lib/sqreen/remote_command.rb +1 -0
  30. data/lib/sqreen/rules.rb +8 -4
  31. data/lib/sqreen/rules/blacklist_ips_cb.rb +2 -2
  32. data/lib/sqreen/rules/custom_error_cb.rb +3 -3
  33. data/lib/sqreen/rules/rule_cb.rb +2 -0
  34. data/lib/sqreen/rules/waf_cb.rb +3 -3
  35. data/lib/sqreen/runner.rb +64 -9
  36. data/lib/sqreen/session.rb +17 -11
  37. data/lib/sqreen/version.rb +1 -1
  38. data/lib/sqreen/weave/budget.rb +46 -0
  39. data/lib/sqreen/weave/legacy/instrumentation.rb +194 -103
  40. data/lib/sqreen/worker.rb +6 -2
  41. metadata +9 -7
  42. data/lib/sqreen/encoding_sanitizer.rb +0 -27
@@ -50,7 +50,7 @@ module Sqreen
50
50
 
51
51
  attr_accessor :request_compression
52
52
 
53
- def initialize(server_url, token, app_name = nil, proxy_url = nil)
53
+ def initialize(server_url, cert_store, token, app_name = nil, proxy_url = nil)
54
54
  @token = token
55
55
  @app_name = app_name
56
56
  @session_id = nil
@@ -73,12 +73,7 @@ module Sqreen
73
73
  @http = Net::HTTP.new(uri.host, uri.port, *proxy_params)
74
74
  @http.use_ssl = use_ssl
75
75
  @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if ENV['SQREEN_SSL_NO_VERIFY'] # for testing
76
- if use_ssl
77
- cert_file = File.join(File.dirname(__FILE__), 'ca.crt')
78
- cert_store = OpenSSL::X509::Store.new
79
- cert_store.add_file cert_file
80
- @http.cert_store = cert_store
81
- end
76
+ @http.cert_store = cert_store if use_ssl
82
77
  self.use_signals = false
83
78
  end
84
79
 
@@ -240,10 +235,7 @@ module Sqreen
240
235
  end
241
236
 
242
237
  def login(framework)
243
- headers = {
244
- 'x-api-key' => @token,
245
- 'x-app-name' => @app_name || framework.application_name,
246
- }.reject { |k, v| v == nil }
238
+ headers = prelogin_auth_headers(framework)
247
239
 
248
240
  Sqreen.log.warn "Using app name: #{headers['x-app-name']}"
249
241
 
@@ -312,6 +304,11 @@ module Sqreen
312
304
  @evt_sub_strategy.post_batch(events)
313
305
  end
314
306
 
307
+ def post_agent_message(framework, agent_message)
308
+ headers = prelogin_auth_headers(framework)
309
+ post('app_agent_message', agent_message.to_h, headers, 0)
310
+ end
311
+
315
312
  # Perform agent logout
316
313
  # @param retrying [Boolean] whether to try again on error
317
314
  def logout(retrying = true)
@@ -325,5 +322,14 @@ module Sqreen
325
322
  Sqreen.logged_in = false
326
323
  disconnect
327
324
  end
325
+
326
+ private
327
+
328
+ def prelogin_auth_headers(framework)
329
+ {
330
+ 'x-api-key' => @token,
331
+ 'x-app-name' => @app_name || framework.application_name,
332
+ }.reject { |_k, v| v == nil }
333
+ end
328
334
  end
329
335
  end
@@ -4,5 +4,5 @@
4
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
5
 
6
6
  module Sqreen
7
- VERSION = '1.20.0'.freeze
7
+ VERSION = '1.20.4'.freeze
8
8
  end
@@ -0,0 +1,46 @@
1
+ # typed: false
2
+
3
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
+
6
+ require 'sqreen/log/loggable'
7
+ require 'sqreen/weave'
8
+
9
+ class Sqreen::Weave::Budget
10
+ include Sqreen::Log::Loggable
11
+
12
+ def initialize(threshold, ratio = nil)
13
+ @threshold = threshold
14
+ @ratio = ratio
15
+ end
16
+
17
+ def static?
18
+ threshold && !ratio
19
+ end
20
+
21
+ def dynamic?
22
+ threshold && ratio
23
+ end
24
+
25
+ attr_reader :threshold
26
+ attr_reader :ratio
27
+
28
+ def to_h
29
+ { threshold: threshold, ratio: ratio }
30
+ end
31
+
32
+ class << self
33
+ attr_reader :current
34
+
35
+ def update(opts = nil)
36
+ Sqreen::Weave.logger.info("budget update:#{opts.inspect}")
37
+
38
+ return @current = nil if opts.nil? || opts.empty?
39
+
40
+ threshold = opts[:threshold]
41
+ ratio = opts[:ratio]
42
+
43
+ @current = new(threshold, ratio)
44
+ end
45
+ end
46
+ end
@@ -4,10 +4,13 @@
4
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
5
 
6
6
  require 'sqreen/weave/legacy'
7
+ require 'sqreen/weave/budget'
8
+ require 'sqreen/graft/hook'
7
9
  require 'sqreen/graft/hook_point'
8
10
  require 'sqreen/call_countable'
9
11
  require 'sqreen/rules'
10
12
  require 'sqreen/rules/record_request_context'
13
+ require 'sqreen/sqreen_signed_verifier'
11
14
 
12
15
  class Sqreen::Weave::Legacy::Instrumentation
13
16
  attr_accessor :metrics_engine
@@ -60,6 +63,27 @@ class Sqreen::Weave::Legacy::Instrumentation
60
63
  'options' => opts[:perf_metric_percent] || { 'base' => 1.3, 'factor' => 1.0 },
61
64
  )
62
65
 
66
+ metrics_engine.create_metric(
67
+ 'name' => 'req.sq.hook.overhead',
68
+ 'period' => 60,
69
+ 'kind' => 'Binning',
70
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
71
+ )
72
+
73
+ metrics_engine.create_metric(
74
+ 'name' => 'sq.hook.overhead',
75
+ 'period' => 60,
76
+ 'kind' => 'Binning',
77
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
78
+ )
79
+
80
+ metrics_engine.create_metric(
81
+ 'name' => 'sq.shrinkwrap',
82
+ 'period' => 60,
83
+ 'kind' => 'Binning',
84
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
85
+ )
86
+
63
87
  Sqreen.thread_cpu_time? && metrics_engine.create_metric(
64
88
  'name' => 'sq_thread_cpu_pct',
65
89
  'period' => opts[:period] || 60,
@@ -84,6 +108,15 @@ class Sqreen::Weave::Legacy::Instrumentation
84
108
 
85
109
  ### set up rule signature verifier
86
110
  verifier = nil
111
+ if Sqreen.features['rules_signature'] &&
112
+ Sqreen.config_get(:rules_verify_signature) == true &&
113
+ !defined?(::JRUBY_VERSION)
114
+ verifier = Sqreen::SqreenSignedVerifier.new
115
+ Sqreen::Weave.logger.debug('Rules signature enabled')
116
+ else
117
+ Sqreen::Weave.logger.debug('Rules signature disabled')
118
+ end
119
+
87
120
  ### force clean instrumentation callback list
88
121
  @hooks = []
89
122
  ### for each rule description
@@ -94,6 +127,25 @@ class Sqreen::Weave::Legacy::Instrumentation
94
127
  next unless rule_callback
95
128
  ### attach framework to callback
96
129
  rule_callback.framework = framework
130
+ ## create metric
131
+ Sqreen::Weave.logger.debug { "Adding rule metric: #{rule_callback}" }
132
+ [:pre, :post, :failing].each do |whence|
133
+ next unless rule_callback.send(:"#{whence}?")
134
+ metric_name = "sq.#{rule['name']}.#{whence}"
135
+ metrics_engine.create_metric(
136
+ 'name' => metric_name,
137
+ 'period' => 60,
138
+ 'kind' => 'Binning',
139
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
140
+ )
141
+ metric_name = "req.sq.#{rule['name']}.#{whence}"
142
+ metrics_engine.create_metric(
143
+ 'name' => metric_name,
144
+ 'period' => 60,
145
+ 'kind' => 'Binning',
146
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
147
+ )
148
+ end
97
149
  ### install callback, observing priority
98
150
  Sqreen::Weave.logger.debug { "Adding rule callback: #{rule_callback}" }
99
151
  @hooks << add_callback("weave,rule=#{rule['name']}", rule_callback, strategy)
@@ -107,30 +159,43 @@ class Sqreen::Weave::Legacy::Instrumentation
107
159
  end
108
160
 
109
161
  metrics_engine = self.metrics_engine
162
+
110
163
  request_hook = Sqreen::Graft::Hook['Sqreen::ShrinkWrap#call', strategy]
111
164
  @hooks << request_hook
112
165
  request_hook.add do
113
166
  before('wave,meta,request', rank: -100000, mandatory: true) do |_call|
114
167
  next unless Sqreen.instrumentation_ready
115
168
 
116
- uuid = SecureRandom.uuid
117
- now = Sqreen::Graft::Timer.read
169
+ # shrinkwrap_timer = Sqreen::Graft::Timer.new('weave,shrinkwrap')
170
+ # shrinkwrap_timer.start
171
+
172
+ request_timer = Sqreen::Graft::Timer.new("request")
173
+ request_timer.start
174
+ sqreen_timer = Sqreen::Graft::Timer.new("sqreen")
175
+ budget = Sqreen::Weave::Budget.current
176
+ request_budget_threshold = budget.threshold if budget
177
+ request_budget_ratio = budget.ratio if budget
178
+ request_budget_is_dynamic = !request_budget_ratio.nil?
179
+ request_budget = !request_budget_threshold.nil?
180
+ timed_level = (Sqreen.features['perf_level'] || 1).to_i
181
+ Sqreen::Weave.logger.debug { "request budget: #{budget.to_h} timed.level: #{timed_level}" } if Sqreen::Weave.logger.debug?
182
+
118
183
  Thread.current[:sqreen_http_request] = {
119
- uuid: uuid,
120
- start_time: now,
121
- time_budget: Sqreen.performance_budget,
184
+ request_timer: request_timer,
185
+ sqreen_timer: sqreen_timer,
122
186
  time_budget_expended: false,
123
- timer: Sqreen::Graft::Timer.new("request_#{uuid}"),
187
+ time_budget_threshold: request_budget_threshold,
188
+ time_budget_dynamic: request_budget_is_dynamic,
189
+ time_budget_ratio: request_budget_ratio,
190
+ time_budget: request_budget,
124
191
  timed_callbacks: [],
125
192
  timed_hooks: [],
126
- timed_hooks_before: [],
127
- timed_hooks_after: [],
128
- timed_hooks_raised: [],
129
- timed_hooks_ensured: [],
193
+ timed_level: timed_level,
130
194
  skipped_callbacks: [],
195
+ # timed_shrinkwrap: shrinkwrap_timer,
131
196
  }
132
197
 
133
- Sqreen::Weave.logger.debug { "request.uuid: #{uuid}" }
198
+ # shrinkwrap_timer.stop
134
199
  end
135
200
 
136
201
  ensured('weave,meta,request', rank: 100000, mandatory: true) do |_call|
@@ -138,105 +203,118 @@ class Sqreen::Weave::Legacy::Instrumentation
138
203
 
139
204
  next if request.nil?
140
205
 
206
+ # shrinkwrap_timer = request[:timed_shrinkwrap]
207
+ # shrinkwrap_timer.start
208
+
141
209
  Thread.current[:sqreen_http_request] = nil
142
- now = Sqreen::Graft::Timer.read
143
- utc_now = Time.now.utc
144
-
145
- request[:timed_callbacks].each do |timer|
146
- duration = timer.duration
147
- # stop = now
148
- # start = now - duration
149
- timer.tag =~ /weave,rule=(.*)$/ && rule = $1
150
- timer.tag =~ /@before/ && whence = 'pre'
151
- timer.tag =~ /@after/ && whence = 'post'
152
- timer.tag =~ /@raised/ && whence = 'failing'
153
-
154
- next unless rule && whence
155
-
156
- # Sqreen::PerformanceNotifications.notify(rule, whence, start, stop)
157
- # => BinnedMetrics
158
- metric_name = "sq.#{rule}.#{whence}"
159
- unless metrics_engine.metric?(metric_name)
160
- metrics_engine.create_metric(
161
- 'name' => metric_name,
162
- 'period' => 60,
163
- 'kind' => 'Binning',
164
- 'options' => { 'base' => 2.0, 'factor' => 0.1 },
165
- )
210
+ request_timer = request[:request_timer]
211
+ now = request_timer.stop
212
+
213
+ if request[:timed_level] >= 1
214
+ request[:timed_callbacks].each do |timer|
215
+ duration = timer.duration
216
+
217
+ timer.tag =~ /weave,rule=(.*)$/ && rule = $1
218
+ next unless rule
219
+
220
+ whence = case timer.tag
221
+ when /@before/ then 'pre'
222
+ when /@after/ then 'post'
223
+ when /@raised/ then 'failing'
224
+ end
225
+ next unless whence
226
+
227
+ metric_name = "sq.#{rule}.#{whence}"
228
+ metrics_engine.update(metric_name, now, nil, duration * 1000)
229
+ # Sqreen.observations_queue.push([metric_name, nil, duration * 1000, utc_now])
166
230
  end
167
- metrics_engine.update(metric_name, now, nil, duration * 1000)
168
- end
169
231
 
170
- metric_name = 'sq.hooks_pre.pre'
171
- duration = request[:timed_hooks_before].sum(&:duration)
172
- unless metrics_engine.metric?(metric_name)
173
- metrics_engine.create_metric(
174
- 'name' => metric_name,
175
- 'period' => 60,
176
- 'kind' => 'Binning',
177
- 'options' => { 'base' => 2.0, 'factor' => 0.1 },
178
- )
179
- end
180
- metrics_engine.update(metric_name, now, nil, duration * 1000)
181
-
182
- metric_name = 'sq.hooks_post.post'
183
- duration = request[:timed_hooks_after].sum(&:duration)
184
- unless metrics_engine.metric?(metric_name)
185
- metrics_engine.create_metric(
186
- 'name' => metric_name,
187
- 'period' => 60,
188
- 'kind' => 'Binning',
189
- 'options' => { 'base' => 2.0, 'factor' => 0.1 },
190
- )
191
- end
192
- metrics_engine.update(metric_name, now, nil, duration * 1000)
193
-
194
- metric_name = 'sq.hooks_failing.failing'
195
- duration = request[:timed_hooks_raised].sum(&:duration)
196
- unless metrics_engine.metric?(metric_name)
197
- metrics_engine.create_metric(
198
- 'name' => metric_name,
199
- 'period' => 60,
200
- 'kind' => 'Binning',
201
- 'options' => { 'base' => 2.0, 'factor' => 0.1 },
202
- )
232
+ request[:timed_hooks].each do |timer|
233
+ duration = timer.duration
234
+ metrics_engine.update('sq.hook.overhead', now, nil, duration * 1000)
235
+ # Sqreen.observations_queue.push(['sq.hook.overhead', nil, duration * 1000, utc_now])
236
+ end
203
237
  end
204
- metrics_engine.update(metric_name, now, nil, duration * 1000)
205
238
 
206
- skipped = request[:skipped_callbacks].map(&:name)
207
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} callback.skipped.size: #{skipped.count} callback.skipped: [#{skipped.join(', ')}]" }
208
- timer = request[:timer]
209
- total = timer.duration
210
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} timer.total: #{'%.03fus' % (total * 1_000_000)} timer.size: #{timer.size}" }
211
- timings = request[:timed_callbacks].map(&:to_s)
212
- total = request[:timed_callbacks].sum(&:duration)
213
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} callback.total: #{'%.03fus' % (total * 1_000_000)} callback.timings: [#{timings.join(', ')}]" }
214
- timings = request[:timed_hooks].map(&:to_s)
215
- total = request[:timed_hooks].sum(&:duration)
216
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} hook.total: #{'%.03fus' % (total * 1_000_000)} hook.timings: [#{timings.join(', ')}]" }
239
+ sqreen_timer = request[:sqreen_timer]
240
+ total = sqreen_timer.duration
241
+ Sqreen::Weave.logger.debug { "request sqreen_timer.total: #{'%.03fus' % (total * 1_000_000)}" } if Sqreen::Weave.logger.debug?
242
+ total = request_timer.duration
243
+ Sqreen::Weave.logger.debug { "request request_timer.total: #{'%.03fus' % (total * 1_000_000)}" } if Sqreen::Weave.logger.debug?
244
+
245
+ if request[:timed_level] >= 2
246
+ skipped = request[:skipped_callbacks].map(&:name)
247
+ Sqreen::Weave.logger.debug { "request callback.skipped.count: #{skipped.count}" } if Sqreen::Weave.logger.debug?
248
+ timings = request[:timed_callbacks].map(&:to_s)
249
+ total = request[:timed_callbacks].sum(&:duration)
250
+ Sqreen::Weave.logger.debug { "request callback.total: #{'%.03fus' % (total * 1_000_000)} callback.count: #{timings.count}" } if Sqreen::Weave.logger.debug?
251
+ timings = request[:timed_hooks].map(&:to_s)
252
+ total = request[:timed_hooks].sum(&:duration)
253
+ Sqreen::Weave.logger.debug { "request hook.total: #{'%.03fus' % (total * 1_000_000)} hook.count: #{timings.count}" } if Sqreen::Weave.logger.debug?
254
+ end
217
255
 
218
256
  skipped = request[:skipped_callbacks].map(&:name)
219
257
  skipped_rule_name = skipped.first && skipped.first =~ /weave,rule=(.*)$/ && $1
220
- Sqreen.observations_queue.push(['request_overtime', skipped_rule_name, 1, utc_now]) if skipped_rule_name
258
+ metrics_engine.update('request_overtime', now, skipped_rule_name, 1) if skipped_rule_name
259
+ # Sqreen.observations_queue.push(['request_overtime', skipped_rule_name, 1, utc_now]) if skipped_rule_name
221
260
 
222
- sqreen_request_duration = total
223
- Sqreen.observations_queue.push(['sq', nil, sqreen_request_duration * 1000, utc_now])
261
+ sqreen_request_duration = sqreen_timer.duration
262
+ metrics_engine.update('sq', now, nil, sqreen_request_duration * 1000)
263
+ # Sqreen.observations_queue.push(['sq', nil, sqreen_request_duration * 1000, utc_now])
224
264
 
225
- request_duration = now - request[:start_time]
226
- Sqreen.observations_queue.push(['req', nil, request_duration * 1000, utc_now])
265
+ request_duration = request_timer.duration
266
+ metrics_engine.update('req', now, nil, request_duration * 1000)
267
+ # Sqreen.observations_queue.push(['req', nil, request_duration * 1000, utc_now])
227
268
 
228
269
  sqreen_request_ratio = (sqreen_request_duration * 100.0) / (request_duration - sqreen_request_duration)
229
- Sqreen.observations_queue.push(['pct', nil, sqreen_request_ratio, utc_now])
270
+ metrics_engine.update('pct', now, nil, sqreen_request_ratio)
271
+ # Sqreen.observations_queue.push(['pct', nil, sqreen_request_ratio, utc_now])
272
+ Sqreen::Weave.logger.debug { "request sqreen_timer.ratio: #{'%.03f' % (sqreen_request_ratio / 100.0)}" } if Sqreen::Weave.logger.debug?
273
+
274
+ if request[:timed_level] >= 2
275
+ tallies = Hash.new(0.0)
276
+ request[:timed_callbacks].each do |timer|
277
+ duration = timer.duration
278
+
279
+ timer.tag =~ /weave,rule=(.*)$/ && rule = $1
280
+ next unless rule
281
+
282
+ whence = case timer.tag
283
+ when /@before/ then 'pre'
284
+ when /@after/ then 'post'
285
+ when /@raised/ then 'failing'
286
+ end
287
+ next unless whence
288
+
289
+ metric_name = "req.sq.#{rule}.#{whence}"
290
+ tallies[metric_name] += duration
291
+ end
292
+ tallies.each do |metric_name, duration|
293
+ metrics_engine.update(metric_name, now, nil, duration * 1000)
294
+ # Sqreen.observations_queue.push([metric_name, nil, duration * 1000, utc_now])
295
+ end
296
+
297
+ duration = request[:timed_hooks].sum(&:duration)
298
+ metrics_engine.update('req.sq.hook.overhead', now, nil, duration * 1000)
299
+ # Sqreen.observations_queue.push(['req.sq.hook.overhead', nil, duration * 1000, utc_now])
300
+ end
301
+
302
+ # shrinkwrap_timer.stop
303
+
304
+ # duration = shrinkwrap_timer.duration
305
+ # metrics_engine.update('sq.shrinkwrap', now, nil, duration * 1000)
230
306
  end
231
307
  end.install
232
308
 
233
309
  ### globally declare instrumentation ready
234
310
  Sqreen.instrumentation_ready = true
311
+ Sqreen::Weave.logger.info { "Instrumentation activated" }
235
312
  end
236
313
 
237
314
  # needed by Sqreen::Runner
238
315
  def remove_all_callbacks
239
316
  Sqreen.instrumentation_ready = false
317
+ Sqreen::Weave.logger.info { "Instrumentation deactivated" }
240
318
 
241
319
  loop do
242
320
  hook = @hooks.pop
@@ -253,6 +331,15 @@ class Sqreen::Weave::Legacy::Instrumentation
253
331
  klass = callback.klass
254
332
  method = callback.method
255
333
 
334
+ if (call_count = ENV['SQREEN_DEBUG_CALL_COUNT'])
335
+ call_count = JSON.parse(call_count)
336
+ if callback.respond_to?(:rule_name) && call_count.key?(callback.rule_name)
337
+ count = call_count[callback.rule_name]
338
+ Sqreen::Weave.logger.debug { "override rule: #{callback.rule_name} call_count: #{count.inspect}" }
339
+ callback.instance_eval { @call_count_interval = call_count[callback.rule_name] }
340
+ end
341
+ end
342
+
256
343
  if Sqreen::Graft::HookPoint.new("#{klass}.#{method}").exist?
257
344
  hook_point = "#{klass}.#{method}"
258
345
  elsif Sqreen::Graft::HookPoint.new("#{klass}##{method}").exist?
@@ -275,7 +362,6 @@ class Sqreen::Weave::Legacy::Instrumentation
275
362
  a = call.args
276
363
  r = call.remaining
277
364
 
278
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i}" }
279
365
  begin
280
366
  ret = callback.pre(i, a, r)
281
367
  rescue StandardError => e
@@ -286,17 +372,26 @@ class Sqreen::Weave::Legacy::Instrumentation
286
372
  Sqreen::RemoteException.record(e)
287
373
  end
288
374
  end
289
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i} => return=#{ret.inspect}" }
290
375
 
291
- case ret[:status]
292
- when :skip, 'skip'
293
- throw(b, b.return(ret[:new_return_value]).break!) if ret.key?(:new_return_value)
294
- when :modify_args, 'modify_args'
295
- throw(b, b.args(ret[:args]))
296
- when :raise, 'raise'
297
- throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
298
- throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
299
- end unless ret.nil? || !ret.is_a?(Hash)
376
+ next if ret.nil? || !ret.is_a?(Hash)
377
+
378
+ throw_val =
379
+ case ret[:status]
380
+ when :skip, 'skip'
381
+ b.return(ret[:new_return_value]).break! if ret.key?(:new_return_value)
382
+ when :modify_args, 'modify_args'
383
+ b.args(ret[:args])
384
+ when :raise, 'raise'
385
+ if ret.key?(:exception)
386
+ b.raise(ret[:exception])
387
+ else
388
+ b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required."))
389
+ end
390
+ end
391
+
392
+ next unless throw_val
393
+ throw_val.break! if ret[:skip_rem_cbs]
394
+ throw(b, throw_val)
300
395
  end
301
396
  end
302
397
 
@@ -309,7 +404,6 @@ class Sqreen::Weave::Legacy::Instrumentation
309
404
  a = call.args
310
405
  r = call.remaining
311
406
 
312
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i}" }
313
407
  begin
314
408
  ret = callback.post(v, i, a, r)
315
409
  rescue StandardError => e
@@ -320,7 +414,6 @@ class Sqreen::Weave::Legacy::Instrumentation
320
414
  Sqreen::RemoteException.record(e)
321
415
  end
322
416
  end
323
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i} => return=#{ret.inspect}" }
324
417
 
325
418
  case ret[:status]
326
419
  when :override, 'override'
@@ -341,7 +434,6 @@ class Sqreen::Weave::Legacy::Instrumentation
341
434
  a = call.args
342
435
  r = call.remaining
343
436
 
344
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i}" }
345
437
  begin
346
438
  ret = callback.failing(e, i, a, r)
347
439
  rescue StandardError => e
@@ -352,7 +444,6 @@ class Sqreen::Weave::Legacy::Instrumentation
352
444
  Sqreen::RemoteException.record(e)
353
445
  end
354
446
  end
355
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" }
356
447
 
357
448
  throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
358
449