sqreen 1.19.2 → 1.21.0.beta2

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 (77) 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/deliveries/batch.rb +12 -2
  9. data/lib/sqreen/deliveries/simple.rb +4 -0
  10. data/lib/sqreen/ecosystem.rb +96 -0
  11. data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
  12. data/lib/sqreen/ecosystem/exception_reporting.rb +26 -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/module_api.rb +30 -0
  17. data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
  18. data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
  19. data/lib/sqreen/ecosystem/module_api/message_producer.rb +51 -0
  20. data/lib/sqreen/ecosystem/module_api/signal_producer.rb +24 -0
  21. data/lib/sqreen/ecosystem/module_api/tracing.rb +45 -0
  22. data/lib/sqreen/ecosystem/module_api/tracing/client_data.rb +31 -0
  23. data/lib/sqreen/ecosystem/module_api/tracing/server_data.rb +27 -0
  24. data/lib/sqreen/ecosystem/module_api/tracing_id_generation.rb +16 -0
  25. data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
  26. data/lib/sqreen/ecosystem/module_registry.rb +44 -0
  27. data/lib/sqreen/ecosystem/redis/redis_connection.rb +43 -0
  28. data/lib/sqreen/ecosystem/tracing/modules/client.rb +31 -0
  29. data/lib/sqreen/ecosystem/tracing/modules/server.rb +30 -0
  30. data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
  31. data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
  32. data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
  33. data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
  34. data/lib/sqreen/ecosystem/tracing_broker.rb +101 -0
  35. data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
  36. data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
  37. data/lib/sqreen/ecosystem/util/call_writers_from_init.rb +13 -0
  38. data/lib/sqreen/ecosystem_integration.rb +81 -0
  39. data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
  40. data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
  41. data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +58 -0
  42. data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
  43. data/lib/sqreen/endpoint_testing.rb +184 -0
  44. data/lib/sqreen/event.rb +7 -5
  45. data/lib/sqreen/events/attack.rb +23 -18
  46. data/lib/sqreen/events/remote_exception.rb +0 -22
  47. data/lib/sqreen/events/request_record.rb +15 -70
  48. data/lib/sqreen/frameworks/generic.rb +15 -1
  49. data/lib/sqreen/frameworks/request_recorder.rb +13 -2
  50. data/lib/sqreen/graft/call.rb +9 -0
  51. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  52. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  53. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  54. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  55. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  56. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  57. data/lib/sqreen/legacy/old_event_submission_strategy.rb +227 -0
  58. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  59. data/lib/sqreen/log/loggable.rb +1 -1
  60. data/lib/sqreen/metrics/base.rb +3 -0
  61. data/lib/sqreen/metrics_store.rb +22 -12
  62. data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
  63. data/lib/sqreen/remote_command.rb +3 -0
  64. data/lib/sqreen/rules.rb +4 -2
  65. data/lib/sqreen/rules/rule_cb.rb +2 -0
  66. data/lib/sqreen/rules/waf_cb.rb +13 -10
  67. data/lib/sqreen/runner.rb +94 -13
  68. data/lib/sqreen/sensitive_data_redactor.rb +19 -31
  69. data/lib/sqreen/session.rb +53 -43
  70. data/lib/sqreen/signals/conversions.rb +288 -0
  71. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  72. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  73. data/lib/sqreen/version.rb +1 -1
  74. metadata +83 -10
  75. data/lib/sqreen/backport.rb +0 -9
  76. data/lib/sqreen/backport/clock_gettime.rb +0 -74
  77. 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.21.0.beta2'.freeze
8
8
  end
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.21.0.beta2
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-02 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
@@ -95,7 +122,41 @@ files:
95
122
  - lib/sqreen/dependency/rails.rb
96
123
  - lib/sqreen/dependency/sentry.rb
97
124
  - lib/sqreen/dependency/sinatra.rb
125
+ - lib/sqreen/ecosystem.rb
126
+ - lib/sqreen/ecosystem/dispatch_table.rb
127
+ - lib/sqreen/ecosystem/exception_reporting.rb
128
+ - lib/sqreen/ecosystem/http/net_http.rb
129
+ - lib/sqreen/ecosystem/http/rack_request.rb
130
+ - lib/sqreen/ecosystem/loggable.rb
131
+ - lib/sqreen/ecosystem/module_api.rb
132
+ - lib/sqreen/ecosystem/module_api/event_listener.rb
133
+ - lib/sqreen/ecosystem/module_api/instrumentation.rb
134
+ - lib/sqreen/ecosystem/module_api/message_producer.rb
135
+ - lib/sqreen/ecosystem/module_api/signal_producer.rb
136
+ - lib/sqreen/ecosystem/module_api/tracing.rb
137
+ - lib/sqreen/ecosystem/module_api/tracing/client_data.rb
138
+ - lib/sqreen/ecosystem/module_api/tracing/server_data.rb
139
+ - lib/sqreen/ecosystem/module_api/tracing_id_generation.rb
140
+ - lib/sqreen/ecosystem/module_api/transaction_storage.rb
141
+ - lib/sqreen/ecosystem/module_registry.rb
142
+ - lib/sqreen/ecosystem/redis/redis_connection.rb
143
+ - lib/sqreen/ecosystem/tracing/modules/client.rb
144
+ - lib/sqreen/ecosystem/tracing/modules/server.rb
145
+ - lib/sqreen/ecosystem/tracing/sampler.rb
146
+ - lib/sqreen/ecosystem/tracing/sampling_configuration.rb
147
+ - lib/sqreen/ecosystem/tracing/signals/tracing_client.rb
148
+ - lib/sqreen/ecosystem/tracing/signals/tracing_server.rb
149
+ - lib/sqreen/ecosystem/tracing_broker.rb
150
+ - lib/sqreen/ecosystem/tracing_id_setup.rb
151
+ - lib/sqreen/ecosystem/transaction_storage.rb
152
+ - lib/sqreen/ecosystem/util/call_writers_from_init.rb
153
+ - lib/sqreen/ecosystem_integration.rb
154
+ - lib/sqreen/ecosystem_integration/around_callbacks.rb
155
+ - lib/sqreen/ecosystem_integration/instrumentation_service.rb
156
+ - lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb
157
+ - lib/sqreen/ecosystem_integration/signal_consumption.rb
98
158
  - lib/sqreen/encoding_sanitizer.rb
159
+ - lib/sqreen/endpoint_testing.rb
99
160
  - lib/sqreen/error_handling_middleware.rb
100
161
  - lib/sqreen/event.rb
101
162
  - lib/sqreen/events/attack.rb
@@ -129,8 +190,16 @@ files:
129
190
  - lib/sqreen/js/mini_racer_adapter.rb
130
191
  - lib/sqreen/js/mini_racer_executable_js.rb
131
192
  - lib/sqreen/js/thread_local_exec_js_runnable.rb
193
+ - lib/sqreen/kit/signals/specialized/aggregated_metric.rb
194
+ - lib/sqreen/kit/signals/specialized/attack.rb
195
+ - lib/sqreen/kit/signals/specialized/binning_metric.rb
196
+ - lib/sqreen/kit/signals/specialized/http_trace.rb
197
+ - lib/sqreen/kit/signals/specialized/sdk_track_call.rb
198
+ - lib/sqreen/kit/signals/specialized/sqreen_exception.rb
132
199
  - lib/sqreen/legacy.rb
133
200
  - lib/sqreen/legacy/instrumentation.rb
201
+ - lib/sqreen/legacy/old_event_submission_strategy.rb
202
+ - lib/sqreen/legacy/waf_redactions.rb
134
203
  - lib/sqreen/log.rb
135
204
  - lib/sqreen/log/loggable.rb
136
205
  - lib/sqreen/logger.rb
@@ -201,6 +270,9 @@ files:
201
270
  - lib/sqreen/shared_storage.rb
202
271
  - lib/sqreen/shared_storage23.rb
203
272
  - lib/sqreen/shrink_wrap.rb
273
+ - lib/sqreen/signals/conversions.rb
274
+ - lib/sqreen/signals/http_trace_redaction.rb
275
+ - lib/sqreen/signals/signals_submission_strategy.rb
204
276
  - lib/sqreen/signature_verifier.rb
205
277
  - lib/sqreen/sinatra_middleware.rb
206
278
  - lib/sqreen/sqreen_signed_verifier.rb
@@ -238,7 +310,9 @@ metadata:
238
310
  changelog_uri: https://docs.sqreen.com/ruby/release-notes/
239
311
  source_code_uri: https://github.com/sqreen/ruby-agent
240
312
  bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
241
- post_install_message:
313
+ post_install_message: |2
314
+ This is a Sqreen beta release and may not work in all situations.
315
+ Make sure to review CHANGELOG.md for important details.
242
316
  rdoc_options: []
243
317
  require_paths:
244
318
  - lib
@@ -249,12 +323,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
249
323
  version: 1.9.3
250
324
  required_rubygems_version: !ruby/object:Gem::Requirement
251
325
  requirements:
252
- - - ">="
326
+ - - ">"
253
327
  - !ruby/object:Gem::Version
254
- version: '0'
328
+ version: 1.3.1
255
329
  requirements: []
256
- rubyforge_project:
257
- rubygems_version: 2.7.7
330
+ rubygems_version: 3.1.2
258
331
  signing_key:
259
332
  specification_version: 4
260
333
  summary: Sqreen Ruby agent
@@ -1,9 +0,0 @@
1
- # typed: strong
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
- module Backport
8
- end
9
- end
@@ -1,74 +0,0 @@
1
- # typed: ignore
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/backport'
7
-
8
- module Sqreen
9
- module Backport
10
- module ClockGettime
11
- class << self
12
- def supported?
13
- Process.respond_to?(:clock_gettime)
14
- end
15
- end
16
-
17
- unless supported?
18
- require 'ffi'
19
-
20
- class Timespec < FFI::Struct
21
- layout :tv_sec => :time_t, :tv_nsec => :long
22
- end
23
-
24
- module LibC
25
- extend FFI::Library
26
- ffi_lib FFI::Library::LIBC
27
-
28
- # TODO: FFI::NotFoundError
29
-
30
- if RUBY_PLATFORM =~ /darwin/
31
- attach_function :mach_absolute_time, [], :uint64
32
- end
33
-
34
- attach_function :clock_gettime, [:int, :pointer], :int
35
- end
36
-
37
- module Constants
38
- case RUBY_PLATFORM
39
- when /darwin/
40
- CLOCK_REALTIME = 0
41
- CLOCK_MONOTONIC = 6
42
- CLOCK_PROCESS_CPUTIME_ID = 12
43
- CLOCK_THERAD_CPUTIME_ID = 16
44
- when /linux/
45
- CLOCK_REALTIME = 0
46
- CLOCK_MONOTONIC = 1
47
- CLOCK_PROCESS_CPUTIME_ID = 2
48
- CLOCK_THREAD_CPUTIME_ID = 3
49
- end
50
- end
51
-
52
- def clock_gettime(clock_id, unit = :float_second)
53
- unless unit == :float_second
54
- raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
55
- end
56
-
57
- t = Timespec.new
58
- ret = LibC.clock_gettime(clock_id, t.pointer)
59
-
60
- raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
61
-
62
- t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
63
- end
64
- end
65
- end
66
- end
67
- end
68
-
69
- unless Sqreen::Backport::ClockGettime.supported?
70
- Process.instance_eval do
71
- extend Sqreen::Backport::ClockGettime
72
- include Sqreen::Backport::ClockGettime::Constants
73
- end
74
- end
@@ -1,88 +0,0 @@
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
- module Sqreen
7
- module Backport
8
- module OriginalName
9
- HAS_UNBOUND_METHOD_ORIGINAL_NAME = ::UnboundMethod.instance_methods(false).include?(:original_name)
10
- HAS_METHOD_ORIGINAL_NAME = ::Method.instance_methods(false).include?(:original_name)
11
-
12
- def original_name
13
- self.class.get_original_name(owner, original_name_key) || self.original_name = name
14
- end
15
-
16
- private
17
-
18
- def original_name=(name)
19
- self.class.set_original_name(owner, original_name_key, name)
20
- end
21
-
22
- def original_name_key
23
- return hash if is_a?(::UnboundMethod)
24
-
25
- owner.instance_method(name).hash
26
- end
27
-
28
- class << self
29
- def supported?
30
- !::Kernel.const_defined?(:JRUBY_VERSION) && HAS_UNBOUND_METHOD_ORIGINAL_NAME && HAS_METHOD_ORIGINAL_NAME
31
- end
32
-
33
- def included(klass)
34
- klass.extend(ClassMethods)
35
- end
36
-
37
- def prepended(klass)
38
- klass.extend(ClassMethods)
39
- end
40
- end
41
-
42
- class Store < ::Hash; end
43
-
44
- module ClassMethods
45
- def original_names(owner)
46
- owner.instance_eval { @__sqreen_backport_original_names ||= Store.new }
47
- end
48
-
49
- def get_original_name(owner, key)
50
- original_names(owner)[key]
51
- end
52
-
53
- def set_original_name(owner, key, name)
54
- original_names(owner)[key] ||= name
55
- end
56
- end
57
- end
58
- end
59
- end
60
-
61
- class UnboundMethod
62
- if Sqreen::Backport::OriginalName::HAS_UNBOUND_METHOD_ORIGINAL_NAME
63
- prepend Sqreen::Backport::OriginalName
64
- else
65
- include Sqreen::Backport::OriginalName
66
- end
67
- end unless Sqreen::Backport::OriginalName.supported?
68
-
69
- class Method
70
- if Sqreen::Backport::OriginalName::HAS_METHOD_ORIGINAL_NAME
71
- prepend Sqreen::Backport::OriginalName
72
- else
73
- include Sqreen::Backport::OriginalName
74
- end
75
- end unless Sqreen::Backport::OriginalName.supported?
76
-
77
- class Module
78
- alias_method(:alias_method_without_original_name, :alias_method)
79
-
80
- def alias_method_with_original_name(newname, oldname)
81
- alias_method_without_original_name(newname, oldname).tap do
82
- instance_method(newname).send(:original_name=, :"#{oldname}")
83
- end
84
- end
85
-
86
- alias_method_with_original_name(:alias_method_without_original_name, :alias_method)
87
- alias_method_with_original_name(:alias_method, :alias_method_with_original_name)
88
- end unless Sqreen::Backport::OriginalName.supported?