sqreen 1.19.2 → 1.20.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/lib/sqreen/agent_message.rb +20 -0
  4. data/lib/sqreen/aggregated_metric.rb +25 -0
  5. data/lib/sqreen/attack_detected.html +1 -2
  6. data/lib/sqreen/ca.crt +24 -0
  7. data/lib/sqreen/configuration.rb +10 -4
  8. data/lib/sqreen/deferred_logger.rb +4 -0
  9. data/lib/sqreen/deliveries/batch.rb +4 -1
  10. data/lib/sqreen/deliveries/simple.rb +4 -0
  11. data/lib/sqreen/endpoint_testing.rb +184 -0
  12. data/lib/sqreen/event.rb +7 -5
  13. data/lib/sqreen/events/attack.rb +23 -18
  14. data/lib/sqreen/events/remote_exception.rb +0 -22
  15. data/lib/sqreen/events/request_record.rb +15 -70
  16. data/lib/sqreen/frameworks/request_recorder.rb +13 -2
  17. data/lib/sqreen/graft/call.rb +32 -19
  18. data/lib/sqreen/graft/callback.rb +1 -1
  19. data/lib/sqreen/graft/hook.rb +97 -116
  20. data/lib/sqreen/graft/hook_point.rb +1 -1
  21. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  22. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  23. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  24. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  25. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  26. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  27. data/lib/sqreen/legacy/instrumentation.rb +10 -10
  28. data/lib/sqreen/legacy/old_event_submission_strategy.rb +221 -0
  29. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  30. data/lib/sqreen/log/loggable.rb +2 -1
  31. data/lib/sqreen/logger.rb +4 -0
  32. data/lib/sqreen/metrics/base.rb +3 -0
  33. data/lib/sqreen/metrics_store.rb +22 -12
  34. data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
  35. data/lib/sqreen/rules.rb +4 -2
  36. data/lib/sqreen/rules/rule_cb.rb +2 -0
  37. data/lib/sqreen/rules/waf_cb.rb +13 -10
  38. data/lib/sqreen/runner.rb +75 -8
  39. data/lib/sqreen/sensitive_data_redactor.rb +19 -31
  40. data/lib/sqreen/session.rb +51 -43
  41. data/lib/sqreen/signals/conversions.rb +283 -0
  42. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  43. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  44. data/lib/sqreen/version.rb +1 -1
  45. data/lib/sqreen/weave/legacy/instrumentation.rb +62 -49
  46. metadata +45 -7
  47. data/lib/sqreen/backport.rb +0 -9
  48. data/lib/sqreen/backport/clock_gettime.rb +0 -74
  49. data/lib/sqreen/backport/original_name.rb +0 -88
@@ -0,0 +1,111 @@
1
+ require 'json'
2
+ require 'sqreen/kit/loggable'
3
+ require 'sqreen/kit/signals/specialized/http_trace'
4
+
5
+ module Sqreen
6
+ module Signals
7
+ module HttpTraceRedaction
8
+ class << self
9
+ include Sqreen::Kit::Loggable
10
+
11
+ # @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
12
+ # @param [Sqreen::SensitiveDataRedactor] redactor
13
+ def redact_trace!(trace, redactor)
14
+ return unless redactor
15
+ # redact headers (keys unsafe)
16
+ # @type [Sqreen::Kit::Signals::Context::HttpContext]
17
+ http_context = trace.context
18
+
19
+ all_redacted = []
20
+
21
+ # Redact headers; save redacted values
22
+ # headers are encoded as [key, value], not a hash, so
23
+ # they require some transformation
24
+ orig_headers = http_context.headers
25
+ if orig_headers
26
+ headers = orig_headers.map { |(k, v)| { k => v } }
27
+ headers, redacted = redactor.redact(headers)
28
+ http_context.headers = headers.map(&:first)
29
+ all_redacted += redacted
30
+ end
31
+
32
+ # Redact params; save redacted values
33
+ Kit::Signals::Context::HttpContext::PARAMS_ATTRS.each do |attr|
34
+ value = http_context.public_send(attr)
35
+ next unless value
36
+ value, redacted = redactor.redact(value)
37
+ all_redacted += redacted
38
+ http_context.public_send(:"#{attr}=", value)
39
+ end
40
+
41
+ all_redacted = all_redacted.uniq.map(&:downcase)
42
+
43
+ # Redact attacks and exceptions
44
+ # XXX: no redaction for infos in attacks/exceptions except for WAF data
45
+ # Is this the correct behavior?
46
+ redact_attacks!(trace, redactor, all_redacted)
47
+ redact_exceptions!(trace, redactor, all_redacted)
48
+ end
49
+
50
+ private
51
+
52
+ # @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
53
+ # @param [Sqreen::SensitiveDataRedactor] redactor
54
+ # Redacts WAF data according to specific rules therefor
55
+ # Redacts infos according to general rules
56
+ def redact_attacks!(trace, redactor, redacted_data)
57
+ trace.data.each do |signal|
58
+ next unless signal.is_a?(Kit::Signals::Specialized::Attack)
59
+ # @type [Sqreen::Kit::Signals::Specialized::Attack::Payload] payload
60
+ payload = signal.payload
61
+ next unless payload.infos
62
+
63
+ if payload.infos[:waf_data]
64
+ redact_waf_attack_data!(payload.infos, redacted_data)
65
+ end
66
+ payload.infos, = redactor.redact(payload.infos)
67
+ end
68
+ end
69
+
70
+ def redact_exceptions!(trace, redactor, redacted_data)
71
+ trace.data.each do |signal|
72
+ next unless signal.is_a?(Kit::Signals::Specialized::SqreenException)
73
+ infos = signal.infos
74
+ next unless infos
75
+
76
+ redact_waf_exception_data!(signal.infos, redacted_data) if signal.infos[:waf]
77
+ signal.infos, = redactor.redact(infos)
78
+ end
79
+ end
80
+
81
+ # @param [Hash] infos from WAF attack
82
+ def redact_waf_attack_data!(infos, redacted_data)
83
+ begin
84
+ parsed = JSON.parse(infos[:waf_data])
85
+ rescue JSON::JSONError => e
86
+ logger.warn("waf_data is not valid json: #{e.message}")
87
+ return
88
+ end
89
+ redacted = parsed.each do |w|
90
+ next unless (filters = w['filter'])
91
+
92
+ filters.each do |f|
93
+ next unless (v = f['resolved_value'])
94
+ next unless redacted_data.include?(v.downcase)
95
+
96
+ f['match_status'] = SensitiveDataRedactor::MASK
97
+ f['resolved_value'] = SensitiveDataRedactor::MASK
98
+ end
99
+ end
100
+ infos[:waf_data] = JSON.dump(redacted)
101
+ end
102
+
103
+ # see https://github.com/sqreen/TechDoc/blob/master/content/specs/spec000022-waf-data-sanitization.md#changes-to-the-agents
104
+ def redact_waf_exception_data!(infos, redacted_data)
105
+ return if redacted_data.empty?
106
+ infos[:waf].delete(:args)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,78 @@
1
+ require 'sqreen/aggregated_metric'
2
+ require 'sqreen/kit'
3
+ require 'sqreen/kit/string_sanitizer'
4
+ require 'sqreen/signals/conversions'
5
+ require 'sqreen/log/loggable'
6
+
7
+ module Sqreen
8
+ module Signals
9
+ # see also Sqreen::Legacy::OldEventSubmissionStrategy
10
+ # usage in Sqreen:Session
11
+ class SignalsSubmissionStrategy
12
+ include Sqreen::Log::Loggable
13
+
14
+ # @param [Array<Sqreen::AggregatedMetric>] metrics
15
+ def post_metrics(metrics)
16
+ return if metrics.nil? || metrics.empty?
17
+
18
+ guarded 'Failed to serialize or submit aggregated metrics' do
19
+ batch = metrics.map do |m|
20
+ Conversions.convert_metric_sample(m)
21
+ end
22
+ client.report_batch(batch)
23
+ end
24
+ end
25
+
26
+ # @param _attack [Sqreen::Attack]
27
+ # XXX: unused
28
+ def post_attack(_attack)
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # @param request_record [Sqreen::RequestRecord]
33
+ def post_request_record(request_record)
34
+ guarded 'Failed to serialize or submit request record' do
35
+ trace = Conversions.convert_req_record(request_record)
36
+ append_sanitizing_filter(trace)
37
+ client.report_trace(trace)
38
+ end
39
+ end
40
+
41
+ # Post an exception to Sqreen for analysis
42
+ # @param exception [RemoteException] Exception and context to be sent over
43
+ def post_sqreen_exception(exception)
44
+ guarded 'Failed to serialize or submit exception', false do
45
+ data = Conversions.convert_exception(exception)
46
+ append_sanitizing_filter(data)
47
+ client.report_signal(data)
48
+ end
49
+ end
50
+
51
+ def post_batch(events)
52
+ guarded 'Failed to serialize or submit batch of events' do
53
+ batch = Conversions.convert_batch(events)
54
+ batch.each { |sig_or_trace| append_sanitizing_filter(sig_or_trace) }
55
+ client.report_batch(batch)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def append_sanitizing_filter(sig_or_trace)
62
+ sig_or_trace.append_to_h_filter Kit::StringSanitizer.method(:sanitize)
63
+ end
64
+
65
+ # we don't want exceptions to propagate and kill the worker thread
66
+ def guarded(msg, report = true)
67
+ yield
68
+ rescue StandardError => e
69
+ logger.warn "#{msg}: #{e.message}\n#{e.backtrace.map { |x| " #{x}" }.join("\n")}"
70
+ post_sqreen_exception(RemoteException.new(e)) if report
71
+ end
72
+
73
+ def client
74
+ Sqreen::Kit.auth_signals_client
75
+ end
76
+ end
77
+ end
78
+ 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.19.2'.freeze
7
+ VERSION = '1.20.3'.freeze
8
8
  end
@@ -8,6 +8,7 @@ require 'sqreen/graft/hook_point'
8
8
  require 'sqreen/call_countable'
9
9
  require 'sqreen/rules'
10
10
  require 'sqreen/rules/record_request_context'
11
+ require 'sqreen/sqreen_signed_verifier'
11
12
 
12
13
  class Sqreen::Weave::Legacy::Instrumentation
13
14
  attr_accessor :metrics_engine
@@ -60,6 +61,27 @@ class Sqreen::Weave::Legacy::Instrumentation
60
61
  'options' => opts[:perf_metric_percent] || { 'base' => 1.3, 'factor' => 1.0 },
61
62
  )
62
63
 
64
+ metrics_engine.create_metric(
65
+ 'name' => 'req_sq_hook_overhead',
66
+ 'period' => 60,
67
+ 'kind' => 'Binning',
68
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
69
+ )
70
+
71
+ metrics_engine.create_metric(
72
+ 'name' => 'sq.hook.overhead',
73
+ 'period' => 60,
74
+ 'kind' => 'Binning',
75
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
76
+ )
77
+
78
+ metrics_engine.create_metric(
79
+ 'name' => 'sq.shrinkwrap',
80
+ 'period' => 60,
81
+ 'kind' => 'Binning',
82
+ 'options' => { 'base' => 2.0, 'factor' => 0.1 },
83
+ )
84
+
63
85
  Sqreen.thread_cpu_time? && metrics_engine.create_metric(
64
86
  'name' => 'sq_thread_cpu_pct',
65
87
  'period' => opts[:period] || 60,
@@ -84,6 +106,15 @@ class Sqreen::Weave::Legacy::Instrumentation
84
106
 
85
107
  ### set up rule signature verifier
86
108
  verifier = nil
109
+ if Sqreen.features['rules_signature'] &&
110
+ Sqreen.config_get(:rules_verify_signature) == true &&
111
+ !defined?(::JRUBY_VERSION)
112
+ verifier = Sqreen::SqreenSignedVerifier.new
113
+ Sqreen::Weave.logger.debug('Rules signature enabled')
114
+ else
115
+ Sqreen::Weave.logger.debug('Rules signature disabled')
116
+ end
117
+
87
118
  ### force clean instrumentation callback list
88
119
  @hooks = []
89
120
  ### for each rule description
@@ -113,6 +144,9 @@ class Sqreen::Weave::Legacy::Instrumentation
113
144
  before('wave,meta,request', rank: -100000, mandatory: true) do |_call|
114
145
  next unless Sqreen.instrumentation_ready
115
146
 
147
+ # shrinkwrap_timer = Sqreen::Graft::Timer.new('weave,shrinkwrap')
148
+ # shrinkwrap_timer.start
149
+
116
150
  uuid = SecureRandom.uuid
117
151
  now = Sqreen::Graft::Timer.read
118
152
  Thread.current[:sqreen_http_request] = {
@@ -123,14 +157,13 @@ class Sqreen::Weave::Legacy::Instrumentation
123
157
  timer: Sqreen::Graft::Timer.new("request_#{uuid}"),
124
158
  timed_callbacks: [],
125
159
  timed_hooks: [],
126
- timed_hooks_before: [],
127
- timed_hooks_after: [],
128
- timed_hooks_raised: [],
129
- timed_hooks_ensured: [],
130
160
  skipped_callbacks: [],
161
+ # timed_shrinkwrap: shrinkwrap_timer,
131
162
  }
132
163
 
133
164
  Sqreen::Weave.logger.debug { "request.uuid: #{uuid}" }
165
+
166
+ # shrinkwrap_timer.stop
134
167
  end
135
168
 
136
169
  ensured('weave,meta,request', rank: 100000, mandatory: true) do |_call|
@@ -138,6 +171,9 @@ class Sqreen::Weave::Legacy::Instrumentation
138
171
 
139
172
  next if request.nil?
140
173
 
174
+ # shrinkwrap_timer = request[:timed_shrinkwrap]
175
+ # shrinkwrap_timer.start
176
+
141
177
  Thread.current[:sqreen_http_request] = nil
142
178
  now = Sqreen::Graft::Timer.read
143
179
  utc_now = Time.now.utc
@@ -167,59 +203,28 @@ class Sqreen::Weave::Legacy::Instrumentation
167
203
  metrics_engine.update(metric_name, now, nil, duration * 1000)
168
204
  end
169
205
 
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
- )
206
+ request[:timed_hooks].each do |timer|
207
+ duration = timer.duration
208
+ metrics_engine.update('sq.hook.overhead', now, nil, duration * 1000)
203
209
  end
204
- metrics_engine.update(metric_name, now, nil, duration * 1000)
205
210
 
206
211
  skipped = request[:skipped_callbacks].map(&:name)
207
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} callback.skipped.size: #{skipped.count} callback.skipped: [#{skipped.join(', ')}]" }
212
+ Sqreen::Weave.logger.debug { "request:#{request[:uuid]} callback.skipped.size: #{skipped.count} callback.skipped: [#{skipped.join(', ')}]" } if Sqreen::Weave.logger.debug?
208
213
  timer = request[:timer]
209
214
  total = timer.duration
210
- Sqreen::Weave.logger.debug { "request:#{request[:uuid]} timer.total: #{'%.03fus' % (total * 1_000_000)} timer.size: #{timer.size}" }
215
+ Sqreen::Weave.logger.debug { "request:#{request[:uuid]} timer.total: #{'%.03fus' % (total * 1_000_000)}" } if Sqreen::Weave.logger.debug?
211
216
  timings = request[:timed_callbacks].map(&:to_s)
212
217
  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(', ')}]" }
218
+ Sqreen::Weave.logger.debug { "request:#{request[:uuid]} callback.total: #{'%.03fus' % (total * 1_000_000)} callback.timings: [#{timings.join(', ')}]" } if Sqreen::Weave.logger.debug?
214
219
  timings = request[:timed_hooks].map(&:to_s)
215
220
  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(', ')}]" }
221
+ Sqreen::Weave.logger.debug { "request:#{request[:uuid]} hook.total: #{'%.03fus' % (total * 1_000_000)} hook.timings: [#{timings.join(', ')}]" } if Sqreen::Weave.logger.debug?
217
222
 
218
223
  skipped = request[:skipped_callbacks].map(&:name)
219
224
  skipped_rule_name = skipped.first && skipped.first =~ /weave,rule=(.*)$/ && $1
220
225
  Sqreen.observations_queue.push(['request_overtime', skipped_rule_name, 1, utc_now]) if skipped_rule_name
221
226
 
222
- sqreen_request_duration = total
227
+ sqreen_request_duration = request[:timed_hooks].sum(&:duration) + request[:timed_callbacks].sum(&:duration)
223
228
  Sqreen.observations_queue.push(['sq', nil, sqreen_request_duration * 1000, utc_now])
224
229
 
225
230
  request_duration = now - request[:start_time]
@@ -227,6 +232,14 @@ class Sqreen::Weave::Legacy::Instrumentation
227
232
 
228
233
  sqreen_request_ratio = (sqreen_request_duration * 100.0) / (request_duration - sqreen_request_duration)
229
234
  Sqreen.observations_queue.push(['pct', nil, sqreen_request_ratio, utc_now])
235
+
236
+ duration = request[:timed_hooks].sum(&:duration)
237
+ metrics_engine.update('req_sq_hook_overhead', now, nil, duration * 1000)
238
+
239
+ # shrinkwrap_timer.stop
240
+
241
+ # duration = shrinkwrap_timer.duration
242
+ # metrics_engine.update('sq.shrinkwrap', now, nil, duration * 1000)
230
243
  end
231
244
  end.install
232
245
 
@@ -275,7 +288,7 @@ class Sqreen::Weave::Legacy::Instrumentation
275
288
  a = call.args
276
289
  r = call.remaining
277
290
 
278
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i}" }
291
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i}" } if Sqreen::Weave.logger.debug?
279
292
  begin
280
293
  ret = callback.pre(i, a, r)
281
294
  rescue StandardError => e
@@ -286,7 +299,7 @@ class Sqreen::Weave::Legacy::Instrumentation
286
299
  Sqreen::RemoteException.record(e)
287
300
  end
288
301
  end
289
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i} => return=#{ret.inspect}" }
302
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#pre instance=#{i} => return=#{ret.inspect}" } if Sqreen::Weave.logger.debug?
290
303
 
291
304
  case ret[:status]
292
305
  when :skip, 'skip'
@@ -309,7 +322,7 @@ class Sqreen::Weave::Legacy::Instrumentation
309
322
  a = call.args
310
323
  r = call.remaining
311
324
 
312
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i}" }
325
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i}" } if Sqreen::Weave.logger.debug?
313
326
  begin
314
327
  ret = callback.post(v, i, a, r)
315
328
  rescue StandardError => e
@@ -320,7 +333,7 @@ class Sqreen::Weave::Legacy::Instrumentation
320
333
  Sqreen::RemoteException.record(e)
321
334
  end
322
335
  end
323
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i} => return=#{ret.inspect}" }
336
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#post instance=#{i} => return=#{ret.inspect}" } if Sqreen::Weave.logger.debug?
324
337
 
325
338
  case ret[:status]
326
339
  when :override, 'override'
@@ -341,7 +354,7 @@ class Sqreen::Weave::Legacy::Instrumentation
341
354
  a = call.args
342
355
  r = call.remaining
343
356
 
344
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i}" }
357
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i}" } if Sqreen::Weave.logger.debug?
345
358
  begin
346
359
  ret = callback.failing(e, i, a, r)
347
360
  rescue StandardError => e
@@ -352,7 +365,7 @@ class Sqreen::Weave::Legacy::Instrumentation
352
365
  Sqreen::RemoteException.record(e)
353
366
  end
354
367
  end
355
- Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" }
368
+ Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" } if Sqreen::Weave.logger.debug?
356
369
 
357
370
  throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
358
371
 
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.2
4
+ version: 1.20.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-03 00:00:00.000000000 Z
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sqreen-backport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqreen-kit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.1
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: sq_mini_racer
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -65,11 +93,10 @@ files:
65
93
  - lib/sqreen/actions/user_action_class.rb
66
94
  - lib/sqreen/actions/users_index.rb
67
95
  - lib/sqreen/agent.rb
96
+ - lib/sqreen/agent_message.rb
97
+ - lib/sqreen/aggregated_metric.rb
68
98
  - lib/sqreen/attack_blocked.rb
69
99
  - lib/sqreen/attack_detected.html
70
- - lib/sqreen/backport.rb
71
- - lib/sqreen/backport/clock_gettime.rb
72
- - lib/sqreen/backport/original_name.rb
73
100
  - lib/sqreen/binding_accessor.rb
74
101
  - lib/sqreen/binding_accessor/path_elem.rb
75
102
  - lib/sqreen/binding_accessor/transforms.rb
@@ -96,6 +123,7 @@ files:
96
123
  - lib/sqreen/dependency/sentry.rb
97
124
  - lib/sqreen/dependency/sinatra.rb
98
125
  - lib/sqreen/encoding_sanitizer.rb
126
+ - lib/sqreen/endpoint_testing.rb
99
127
  - lib/sqreen/error_handling_middleware.rb
100
128
  - lib/sqreen/event.rb
101
129
  - lib/sqreen/events/attack.rb
@@ -129,8 +157,16 @@ files:
129
157
  - lib/sqreen/js/mini_racer_adapter.rb
130
158
  - lib/sqreen/js/mini_racer_executable_js.rb
131
159
  - lib/sqreen/js/thread_local_exec_js_runnable.rb
160
+ - lib/sqreen/kit/signals/specialized/aggregated_metric.rb
161
+ - lib/sqreen/kit/signals/specialized/attack.rb
162
+ - lib/sqreen/kit/signals/specialized/binning_metric.rb
163
+ - lib/sqreen/kit/signals/specialized/http_trace.rb
164
+ - lib/sqreen/kit/signals/specialized/sdk_track_call.rb
165
+ - lib/sqreen/kit/signals/specialized/sqreen_exception.rb
132
166
  - lib/sqreen/legacy.rb
133
167
  - lib/sqreen/legacy/instrumentation.rb
168
+ - lib/sqreen/legacy/old_event_submission_strategy.rb
169
+ - lib/sqreen/legacy/waf_redactions.rb
134
170
  - lib/sqreen/log.rb
135
171
  - lib/sqreen/log/loggable.rb
136
172
  - lib/sqreen/logger.rb
@@ -201,6 +237,9 @@ files:
201
237
  - lib/sqreen/shared_storage.rb
202
238
  - lib/sqreen/shared_storage23.rb
203
239
  - lib/sqreen/shrink_wrap.rb
240
+ - lib/sqreen/signals/conversions.rb
241
+ - lib/sqreen/signals/http_trace_redaction.rb
242
+ - lib/sqreen/signals/signals_submission_strategy.rb
204
243
  - lib/sqreen/signature_verifier.rb
205
244
  - lib/sqreen/sinatra_middleware.rb
206
245
  - lib/sqreen/sqreen_signed_verifier.rb
@@ -253,8 +292,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
292
  - !ruby/object:Gem::Version
254
293
  version: '0'
255
294
  requirements: []
256
- rubyforge_project:
257
- rubygems_version: 2.7.7
295
+ rubygems_version: 3.1.2
258
296
  signing_key:
259
297
  specification_version: 4
260
298
  summary: Sqreen Ruby agent