sqreen 1.20.4.beta1 → 1.21.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/lib/sqreen/condition_evaluator.rb +8 -2
  4. data/lib/sqreen/deliveries/batch.rb +8 -1
  5. data/lib/sqreen/ecosystem.rb +123 -0
  6. data/lib/sqreen/ecosystem/databases/database_connection_data.rb +23 -0
  7. data/lib/sqreen/ecosystem/databases/mongo.rb +39 -0
  8. data/lib/sqreen/ecosystem/databases/mysql.rb +54 -0
  9. data/lib/sqreen/ecosystem/databases/postgres.rb +51 -0
  10. data/lib/sqreen/ecosystem/databases/redis.rb +36 -0
  11. data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
  12. data/lib/sqreen/ecosystem/exception_reporting.rb +28 -0
  13. data/lib/sqreen/ecosystem/http/net_http.rb +50 -0
  14. data/lib/sqreen/ecosystem/http/rack_request.rb +39 -0
  15. data/lib/sqreen/ecosystem/loggable.rb +13 -0
  16. data/lib/sqreen/ecosystem/messaging/bunny.rb +61 -0
  17. data/lib/sqreen/ecosystem/messaging/kafka.rb +70 -0
  18. data/lib/sqreen/ecosystem/messaging/kinesis.rb +66 -0
  19. data/lib/sqreen/ecosystem/messaging/sqs.rb +68 -0
  20. data/lib/sqreen/ecosystem/module_api.rb +30 -0
  21. data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
  22. data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
  23. data/lib/sqreen/ecosystem/module_api/message_producer.rb +57 -0
  24. data/lib/sqreen/ecosystem/module_api/signal_producer.rb +24 -0
  25. data/lib/sqreen/ecosystem/module_api/tracing.rb +45 -0
  26. data/lib/sqreen/ecosystem/module_api/tracing/client_data.rb +31 -0
  27. data/lib/sqreen/ecosystem/module_api/tracing/consumer_data.rb +13 -0
  28. data/lib/sqreen/ecosystem/module_api/tracing/messaging_data.rb +35 -0
  29. data/lib/sqreen/ecosystem/module_api/tracing/producer_data.rb +13 -0
  30. data/lib/sqreen/ecosystem/module_api/tracing/server_data.rb +27 -0
  31. data/lib/sqreen/ecosystem/module_api/tracing_id_generation.rb +16 -0
  32. data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
  33. data/lib/sqreen/ecosystem/module_registry.rb +48 -0
  34. data/lib/sqreen/ecosystem/tracing/modules/client.rb +35 -0
  35. data/lib/sqreen/ecosystem/tracing/modules/consumer.rb +35 -0
  36. data/lib/sqreen/ecosystem/tracing/modules/determine_ip.rb +28 -0
  37. data/lib/sqreen/ecosystem/tracing/modules/producer.rb +35 -0
  38. data/lib/sqreen/ecosystem/tracing/modules/server.rb +30 -0
  39. data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
  40. data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
  41. data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
  42. data/lib/sqreen/ecosystem/tracing/signals/tracing_consumer.rb +56 -0
  43. data/lib/sqreen/ecosystem/tracing/signals/tracing_producer.rb +56 -0
  44. data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
  45. data/lib/sqreen/ecosystem/tracing_broker.rb +101 -0
  46. data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
  47. data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
  48. data/lib/sqreen/ecosystem/util/call_writers_from_init.rb +13 -0
  49. data/lib/sqreen/ecosystem_integration.rb +81 -0
  50. data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
  51. data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
  52. data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +58 -0
  53. data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
  54. data/lib/sqreen/events/request_record.rb +0 -1
  55. data/lib/sqreen/frameworks/generic.rb +15 -1
  56. data/lib/sqreen/frameworks/request_recorder.rb +2 -0
  57. data/lib/sqreen/graft/call.rb +9 -0
  58. data/lib/sqreen/graft/hook.rb +5 -3
  59. data/lib/sqreen/graft/hook_point.rb +17 -10
  60. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +2 -0
  61. data/lib/sqreen/legacy/old_event_submission_strategy.rb +9 -2
  62. data/lib/sqreen/remote_command.rb +3 -0
  63. data/lib/sqreen/rules.rb +7 -3
  64. data/lib/sqreen/rules/custom_error_cb.rb +3 -3
  65. data/lib/sqreen/rules/waf_cb.rb +3 -3
  66. data/lib/sqreen/runner.rb +19 -5
  67. data/lib/sqreen/session.rb +2 -0
  68. data/lib/sqreen/signals/conversions.rb +6 -1
  69. data/lib/sqreen/version.rb +1 -1
  70. data/lib/sqreen/weave/legacy/instrumentation.rb +38 -19
  71. metadata +57 -11
  72. data/lib/sqreen/encoding_sanitizer.rb +0 -27
@@ -23,6 +23,7 @@ module Sqreen
23
23
  :ips_whitelist => :change_whitelisted_ips,
24
24
  :get_bundle => :upload_bundle,
25
25
  :performance_budget => :change_performance_budget,
26
+ :tracing_enable => :tracing_enable,
26
27
  }.freeze
27
28
 
28
29
  attr_reader :uuid
@@ -40,6 +41,8 @@ module Sqreen
40
41
  begin
41
42
  output = runner.send(KNOWN_COMMANDS[@name], *@params, context_infos)
42
43
  rescue => e
44
+ Sqreen.log.warn { "Command failed with #{e}" }
45
+ Sqreen.log.debug { e.backtrace.map { |x| " #{x}" }.join("\n") }
43
46
  Sqreen::RemoteException.record(e)
44
47
  return { :status => false, :reason => "error: #{e.inspect}" }
45
48
  end
@@ -120,9 +120,13 @@ module Sqreen
120
120
 
121
121
  cb_class = ExecJSCB if js
122
122
 
123
- if cbname && Rules.const_defined?(cbname)
124
- # Only load callbacks from sqreen
125
- cb_class = Rules.const_get(cbname)
123
+ if cbname
124
+ cb_class = if cbname.include?('::')
125
+ # Only load callbacks from sqreen
126
+ Rules.walk_const_get(cbname) if cbname.start_with?('::Sqreen::', 'Sqreen::')
127
+ else
128
+ Rules.const_get(cbname) if Rules.const_defined?(cbname) # rubocop:disable Style/IfInsideElse
129
+ end
126
130
  end
127
131
 
128
132
  if cb_class.nil?
@@ -55,12 +55,12 @@ module Sqreen
55
55
  end
56
56
 
57
57
  def respond_page
58
- page = open(File.join(File.dirname(__FILE__), '../attack_detected.html'))
58
+ @page ||= File.open(File.join(File.dirname(__FILE__), '../attack_detected.html'), 'rb', &:read)
59
59
  headers = {
60
60
  'Content-Type' => 'text/html',
61
- 'Content-Length' => page.size.to_s,
61
+ 'Content-Length' => @page.size.to_s,
62
62
  }
63
- [@status_code, headers, page]
63
+ [@status_code, headers, [@page]]
64
64
  end
65
65
  end
66
66
  end
@@ -11,7 +11,7 @@ require 'sqreen/safe_json'
11
11
  require 'sqreen/exception'
12
12
  require 'sqreen/util/capper'
13
13
  require 'sqreen/dependency/libsqreen'
14
- require 'sqreen/encoding_sanitizer'
14
+ require 'sqreen/kit/string_sanitizer'
15
15
 
16
16
  module Sqreen
17
17
  module Rules
@@ -60,7 +60,7 @@ module Sqreen
60
60
  end
61
61
 
62
62
  # 0 for using defaults (PW_RUN_TIMEOUT)
63
- @max_run_budget_us = (@data['values'].fetch('budget_in_ms', 0) * 1000).to_i
63
+ @max_run_budget_us = (@data['values'].fetch('max_budget_ms', 0) * 1000).to_i
64
64
  @max_run_budget_us = INFINITE_BUDGET_US if @max_run_budget_us >= INFINITE_BUDGET_US
65
65
 
66
66
  Sqreen.log.debug { "Max WAF run budget for #{@waf_rule_name} set to #{@max_run_budget_us} us" }
@@ -82,7 +82,7 @@ module Sqreen
82
82
  waf_args = binding_accessors.each_with_object({}) do |(e, b), h|
83
83
  h[e] = capper.call(b.resolve(*env))
84
84
  end
85
- waf_args = Sqreen::EncodingSanitizer.sanitize(waf_args)
85
+ waf_args = Sqreen::Kit::StringSanitizer.sanitize(waf_args)
86
86
 
87
87
  if budget
88
88
  rem_budget_s = budget - (Sqreen.time - start)
@@ -14,6 +14,7 @@ require 'sqreen/log'
14
14
  require 'sqreen/agent_message'
15
15
  require 'sqreen/rules'
16
16
  require 'sqreen/session'
17
+ require 'sqreen/version'
17
18
  require 'sqreen/remote_command'
18
19
  require 'sqreen/capped_queue'
19
20
  require 'sqreen/metrics_store'
@@ -26,6 +27,7 @@ require 'sqreen/legacy/instrumentation'
26
27
  require 'sqreen/call_countable'
27
28
  require 'sqreen/weave/legacy/instrumentation'
28
29
  require 'sqreen/kit/configuration'
30
+ require 'sqreen/ecosystem_integration'
29
31
 
30
32
  module Sqreen
31
33
  @features = {}
@@ -52,10 +54,6 @@ module Sqreen
52
54
  @queue ||= CappedQueue.new(MAX_QUEUE_LENGTH)
53
55
  end
54
56
 
55
- def update_queue(queue)
56
- @queue = queue
57
- end
58
-
59
57
  def observations_queue
60
58
  @observations_queue ||= CappedQueue.new(MAX_OBS_QUEUE_LENGTH)
61
59
  end
@@ -104,8 +102,8 @@ module Sqreen
104
102
  # we may want to do that in a thread in order to prevent delaying app
105
103
  # startup
106
104
  # set_at_exit do not place a global at_exit (used for testing)
105
+ # @param [Sqreen::Frameworks::GenericFramework] framework
107
106
  def initialize(configuration, framework, set_at_exit = true, session_class = Sqreen::Session)
108
- Sqreen.update_queue(CappedQueue.new(MAX_QUEUE_LENGTH))
109
107
  @logged_out_tried = false
110
108
  @configuration = configuration
111
109
  @framework = framework
@@ -132,6 +130,7 @@ module Sqreen
132
130
  Sqreen::Kit::Configuration.ingestion_url = chosen_endpoints.ingestion.url
133
131
  Sqreen::Kit::Configuration.certificate_store = chosen_endpoints.ingestion.ca_store
134
132
  Sqreen::Kit::Configuration.proxy_url = @proxy_url
133
+ Sqreen::Kit::Configuration.default_source = "sqreen:agent:ruby:#{Sqreen::VERSION}"
135
134
 
136
135
  register_exit_cb if set_at_exit
137
136
 
@@ -168,6 +167,10 @@ module Sqreen
168
167
  end
169
168
  self.features = wanted_features
170
169
 
170
+ @ecosystem_integration = EcosystemIntegration.new(framework, Sqreen.queue)
171
+ framework.req_start_cb = @ecosystem_integration.method(:request_start)
172
+ framework.req_end_cb = @ecosystem_integration.method(:request_end)
173
+
171
174
  # Ensure a deliverer is there unless features have set it first
172
175
  self.deliverer ||= Deliveries::Simple.new(session)
173
176
  context_infos = {}
@@ -268,6 +271,10 @@ module Sqreen
268
271
  rulespack_id, rules = load_rules(context_infos)
269
272
  @framework.instrument_when_ready!(instrumenter, rules)
270
273
  Sqreen.log.info 'Instrumentation set up'
274
+
275
+ # XXX: ecosystem instrumentation should likely be deferred
276
+ # the same way the rest might be
277
+ @ecosystem_integration.init
271
278
  rulespack_id.to_s
272
279
  end
273
280
 
@@ -409,6 +416,13 @@ module Sqreen
409
416
  { :was => prev }
410
417
  end
411
418
 
419
+ # @param [String] tracing_id_prefix
420
+ # @param [Array<Hash{String=>Object}>] sampling_config
421
+ def tracing_enable(tracing_id_prefix, sampling_config, _context_infos = {})
422
+ @ecosystem_integration.handle_tracing_command(tracing_id_prefix, sampling_config)
423
+ { status: true }
424
+ end
425
+
412
426
  def upload_bundle(_context_infos = {})
413
427
  t = Time.now
414
428
  session.post_bundle(RuntimeInfos.dependencies_signature, RuntimeInfos.dependencies)
@@ -249,8 +249,10 @@ module Sqreen
249
249
  end
250
250
  Sqreen.log.info 'Login success.'
251
251
  @session_id = res['session_id']
252
+
252
253
  Kit::Configuration.session_key = @session_id
253
254
  Kit.reset
255
+
254
256
  Sqreen.log.debug { "received session_id #{@session_id}" }
255
257
  Sqreen.logged_in = true
256
258
  res
@@ -118,6 +118,7 @@ module Sqreen
118
118
  signals += req_rec.processed_sdk_calls
119
119
  .select { |h| h[:name] == :track }
120
120
  .map { |h| convert_track(h) }
121
+ signals += (observed[:signals] || [])
121
122
 
122
123
  trace = Kit::Signals::Specialized::HttpTrace.new(
123
124
  actor: Kit::Signals::Actor.new(
@@ -137,7 +138,7 @@ module Sqreen
137
138
  trace
138
139
  end
139
140
 
140
- # @param [Array<Sqreen::Kit::Signals::Signal|Sqreen::Kit::Signals::Trace>] batch
141
+ # @return [Array<Sqreen::Kit::Signals::Signal|Sqreen::Kit::Signals::Trace>]
141
142
  def convert_batch(batch)
142
143
  batch.map do |evt|
143
144
  case evt
@@ -147,6 +148,10 @@ module Sqreen
147
148
  convert_metric_sample(evt)
148
149
  when RequestRecord
149
150
  convert_req_record(evt)
151
+ when Sqreen::Kit::Signals::Signal
152
+ evt
153
+ when Sqreen::Kit::Signals::Trace
154
+ evt
150
155
  else
151
156
  raise NotImplementedError, "Unknown type of event in batch: #{evt}"
152
157
  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.4.beta1'.freeze
7
+ VERSION = '1.21.0'.freeze
8
8
  end
@@ -5,6 +5,7 @@
5
5
 
6
6
  require 'sqreen/weave/legacy'
7
7
  require 'sqreen/weave/budget'
8
+ require 'sqreen/graft/hook'
8
9
  require 'sqreen/graft/hook_point'
9
10
  require 'sqreen/call_countable'
10
11
  require 'sqreen/rules'
@@ -172,8 +173,8 @@ class Sqreen::Weave::Legacy::Instrumentation
172
173
  request_timer.start
173
174
  sqreen_timer = Sqreen::Graft::Timer.new("sqreen")
174
175
  budget = Sqreen::Weave::Budget.current
175
- request_budget_threshold = budget.threshold
176
- request_budget_ratio = budget.ratio
176
+ request_budget_threshold = budget.threshold if budget
177
+ request_budget_ratio = budget.ratio if budget
177
178
  request_budget_is_dynamic = !request_budget_ratio.nil?
178
179
  request_budget = !request_budget_threshold.nil?
179
180
  timed_level = (Sqreen.features['perf_level'] || 1).to_i
@@ -212,12 +213,16 @@ class Sqreen::Weave::Legacy::Instrumentation
212
213
  if request[:timed_level] >= 1
213
214
  request[:timed_callbacks].each do |timer|
214
215
  duration = timer.duration
216
+
215
217
  timer.tag =~ /weave,rule=(.*)$/ && rule = $1
216
- timer.tag =~ /@before/ && whence = 'pre'
217
- timer.tag =~ /@after/ && whence = 'post'
218
- timer.tag =~ /@raised/ && whence = 'failing'
218
+ next unless rule
219
219
 
220
- next unless rule && whence
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
221
226
 
222
227
  metric_name = "sq.#{rule}.#{whence}"
223
228
  metrics_engine.update(metric_name, now, nil, duration * 1000)
@@ -270,12 +275,16 @@ class Sqreen::Weave::Legacy::Instrumentation
270
275
  tallies = Hash.new(0.0)
271
276
  request[:timed_callbacks].each do |timer|
272
277
  duration = timer.duration
278
+
273
279
  timer.tag =~ /weave,rule=(.*)$/ && rule = $1
274
- timer.tag =~ /@before/ && whence = 'pre'
275
- timer.tag =~ /@after/ && whence = 'post'
276
- timer.tag =~ /@raised/ && whence = 'failing'
280
+ next unless rule
277
281
 
278
- next unless rule && whence
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
279
288
 
280
289
  metric_name = "req.sq.#{rule}.#{whence}"
281
290
  tallies[metric_name] += duration
@@ -364,15 +373,25 @@ class Sqreen::Weave::Legacy::Instrumentation
364
373
  end
365
374
  end
366
375
 
367
- case ret[:status]
368
- when :skip, 'skip'
369
- throw(b, b.return(ret[:new_return_value]).break!) if ret.key?(:new_return_value)
370
- when :modify_args, 'modify_args'
371
- throw(b, b.args(ret[:args]))
372
- when :raise, 'raise'
373
- throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
374
- throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
375
- 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)
376
395
  end
377
396
  end
378
397
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.4.beta1
4
+ version: 1.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-14 00:00:00.000000000 Z
11
+ date: 2020-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqreen-backport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.1
33
+ version: 0.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.1
40
+ version: 0.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sq_mini_racer
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -123,7 +123,55 @@ files:
123
123
  - lib/sqreen/dependency/sentry.rb
124
124
  - lib/sqreen/dependency/sinatra.rb
125
125
  - lib/sqreen/deprecation.rb
126
- - lib/sqreen/encoding_sanitizer.rb
126
+ - lib/sqreen/ecosystem.rb
127
+ - lib/sqreen/ecosystem/databases/database_connection_data.rb
128
+ - lib/sqreen/ecosystem/databases/mongo.rb
129
+ - lib/sqreen/ecosystem/databases/mysql.rb
130
+ - lib/sqreen/ecosystem/databases/postgres.rb
131
+ - lib/sqreen/ecosystem/databases/redis.rb
132
+ - lib/sqreen/ecosystem/dispatch_table.rb
133
+ - lib/sqreen/ecosystem/exception_reporting.rb
134
+ - lib/sqreen/ecosystem/http/net_http.rb
135
+ - lib/sqreen/ecosystem/http/rack_request.rb
136
+ - lib/sqreen/ecosystem/loggable.rb
137
+ - lib/sqreen/ecosystem/messaging/bunny.rb
138
+ - lib/sqreen/ecosystem/messaging/kafka.rb
139
+ - lib/sqreen/ecosystem/messaging/kinesis.rb
140
+ - lib/sqreen/ecosystem/messaging/sqs.rb
141
+ - lib/sqreen/ecosystem/module_api.rb
142
+ - lib/sqreen/ecosystem/module_api/event_listener.rb
143
+ - lib/sqreen/ecosystem/module_api/instrumentation.rb
144
+ - lib/sqreen/ecosystem/module_api/message_producer.rb
145
+ - lib/sqreen/ecosystem/module_api/signal_producer.rb
146
+ - lib/sqreen/ecosystem/module_api/tracing.rb
147
+ - lib/sqreen/ecosystem/module_api/tracing/client_data.rb
148
+ - lib/sqreen/ecosystem/module_api/tracing/consumer_data.rb
149
+ - lib/sqreen/ecosystem/module_api/tracing/messaging_data.rb
150
+ - lib/sqreen/ecosystem/module_api/tracing/producer_data.rb
151
+ - lib/sqreen/ecosystem/module_api/tracing/server_data.rb
152
+ - lib/sqreen/ecosystem/module_api/tracing_id_generation.rb
153
+ - lib/sqreen/ecosystem/module_api/transaction_storage.rb
154
+ - lib/sqreen/ecosystem/module_registry.rb
155
+ - lib/sqreen/ecosystem/tracing/modules/client.rb
156
+ - lib/sqreen/ecosystem/tracing/modules/consumer.rb
157
+ - lib/sqreen/ecosystem/tracing/modules/determine_ip.rb
158
+ - lib/sqreen/ecosystem/tracing/modules/producer.rb
159
+ - lib/sqreen/ecosystem/tracing/modules/server.rb
160
+ - lib/sqreen/ecosystem/tracing/sampler.rb
161
+ - lib/sqreen/ecosystem/tracing/sampling_configuration.rb
162
+ - lib/sqreen/ecosystem/tracing/signals/tracing_client.rb
163
+ - lib/sqreen/ecosystem/tracing/signals/tracing_consumer.rb
164
+ - lib/sqreen/ecosystem/tracing/signals/tracing_producer.rb
165
+ - lib/sqreen/ecosystem/tracing/signals/tracing_server.rb
166
+ - lib/sqreen/ecosystem/tracing_broker.rb
167
+ - lib/sqreen/ecosystem/tracing_id_setup.rb
168
+ - lib/sqreen/ecosystem/transaction_storage.rb
169
+ - lib/sqreen/ecosystem/util/call_writers_from_init.rb
170
+ - lib/sqreen/ecosystem_integration.rb
171
+ - lib/sqreen/ecosystem_integration/around_callbacks.rb
172
+ - lib/sqreen/ecosystem_integration/instrumentation_service.rb
173
+ - lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb
174
+ - lib/sqreen/ecosystem_integration/signal_consumption.rb
127
175
  - lib/sqreen/endpoint_testing.rb
128
176
  - lib/sqreen/error_handling_middleware.rb
129
177
  - lib/sqreen/event.rb
@@ -279,9 +327,7 @@ metadata:
279
327
  changelog_uri: https://docs.sqreen.com/ruby/release-notes/
280
328
  source_code_uri: https://github.com/sqreen/ruby-agent
281
329
  bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
282
- post_install_message: |2
283
- This is a Sqreen beta release and may not work in all situations.
284
- Make sure to review CHANGELOG.md for important details.
330
+ post_install_message:
285
331
  rdoc_options: []
286
332
  require_paths:
287
333
  - lib
@@ -292,11 +338,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
292
338
  version: 1.9.3
293
339
  required_rubygems_version: !ruby/object:Gem::Requirement
294
340
  requirements:
295
- - - ">"
341
+ - - ">="
296
342
  - !ruby/object:Gem::Version
297
- version: 1.3.1
343
+ version: '0'
298
344
  requirements: []
299
- rubygems_version: 3.1.2
345
+ rubygems_version: 3.1.4
300
346
  signing_key:
301
347
  specification_version: 4
302
348
  summary: Sqreen Ruby agent
@@ -1,27 +0,0 @@
1
- # typed: true
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
- module Sqreen
7
- class EncodingSanitizer
8
- def self.sanitize(obj)
9
- case obj
10
- when String
11
- sanitize_string(obj)
12
- when Array
13
- obj.map { |e| sanitize(e) }
14
- when Hash
15
- obj.each_with_object({}) { |(k, v), h| h[k] = sanitize(v) }
16
- else
17
- obj
18
- end
19
- end
20
-
21
- def self.sanitize_string(s)
22
- return s if s.encoding.name == 'UTF-8' && s.valid_encoding?
23
-
24
- s.encode('UTF-16', :invalid => :replace, :undef => :replace).encode('UTF-8')
25
- end
26
- end
27
- end