sqreen 1.18.2-java → 1.19.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/LICENSE +3 -0
  4. data/lib/sqreen.rb +2 -0
  5. data/lib/sqreen/actions.rb +13 -337
  6. data/lib/sqreen/actions/actions_index.rb +16 -0
  7. data/lib/sqreen/actions/base.rb +104 -0
  8. data/lib/sqreen/actions/block_ip.rb +34 -0
  9. data/lib/sqreen/actions/block_user.rb +46 -0
  10. data/lib/sqreen/actions/ip_range_indexed_action_class.rb +16 -0
  11. data/lib/sqreen/actions/ip_ranges_index.rb +57 -0
  12. data/lib/sqreen/actions/redirect_ip.rb +42 -0
  13. data/lib/sqreen/actions/redirect_user.rb +47 -0
  14. data/lib/sqreen/actions/repository.rb +43 -0
  15. data/lib/sqreen/actions/unknown_action_type.rb +20 -0
  16. data/lib/sqreen/actions/user_action_class.rb +16 -0
  17. data/lib/sqreen/actions/users_index.rb +35 -0
  18. data/lib/sqreen/agent.rb +6 -2
  19. data/lib/sqreen/attack_blocked.rb +19 -0
  20. data/lib/sqreen/backport.rb +2 -0
  21. data/lib/sqreen/backport/clock_gettime.rb +74 -0
  22. data/lib/sqreen/backport/original_name.rb +2 -0
  23. data/lib/sqreen/binding_accessor.rb +11 -102
  24. data/lib/sqreen/binding_accessor/path_elem.rb +10 -0
  25. data/lib/sqreen/binding_accessor/transforms.rb +114 -0
  26. data/lib/sqreen/call_countable.rb +2 -0
  27. data/lib/sqreen/capped_queue.rb +4 -0
  28. data/lib/sqreen/{callbacks.rb → cb.rb} +3 -53
  29. data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +4 -2
  30. data/lib/sqreen/condition_evaluator.rb +24 -5
  31. data/lib/sqreen/conditionable.rb +2 -0
  32. data/lib/sqreen/configuration.rb +19 -0
  33. data/lib/sqreen/context.rb +2 -0
  34. data/lib/sqreen/default_cb.rb +22 -0
  35. data/lib/sqreen/deferred_logger.rb +65 -0
  36. data/lib/sqreen/deliveries.rb +12 -0
  37. data/lib/sqreen/deliveries/batch.rb +9 -1
  38. data/lib/sqreen/deliveries/simple.rb +7 -0
  39. data/lib/sqreen/dependency.rb +3 -1
  40. data/lib/sqreen/dependency/detector.rb +22 -14
  41. data/lib/sqreen/dependency/libsqreen.rb +32 -0
  42. data/lib/sqreen/dependency/new_relic.rb +2 -0
  43. data/lib/sqreen/dependency/rack.rb +10 -5
  44. data/lib/sqreen/dependency/rails.rb +8 -0
  45. data/lib/sqreen/dependency/sentry.rb +2 -0
  46. data/lib/sqreen/dependency/sinatra.rb +58 -14
  47. data/lib/sqreen/encoding_sanitizer.rb +2 -0
  48. data/lib/sqreen/error_handling_middleware.rb +32 -0
  49. data/lib/sqreen/event.rb +4 -0
  50. data/lib/sqreen/events/attack.rb +4 -0
  51. data/lib/sqreen/events/remote_exception.rb +2 -0
  52. data/lib/sqreen/events/request_record.rb +13 -56
  53. data/lib/sqreen/exception.rb +11 -40
  54. data/lib/sqreen/formatter_with_tid.rb +47 -0
  55. data/lib/sqreen/framework_cb.rb +30 -0
  56. data/lib/sqreen/frameworks.rb +9 -0
  57. data/lib/sqreen/frameworks/generic.rb +22 -2
  58. data/lib/sqreen/frameworks/rails.rb +3 -0
  59. data/lib/sqreen/frameworks/rails3.rb +2 -0
  60. data/lib/sqreen/frameworks/request_recorder.rb +5 -0
  61. data/lib/sqreen/frameworks/sinatra.rb +4 -0
  62. data/lib/sqreen/frameworks/sqreen_test.rb +4 -0
  63. data/lib/sqreen/graft.rb +12 -0
  64. data/lib/sqreen/graft/call.rb +150 -0
  65. data/lib/sqreen/{dependency → graft}/callback.rb +12 -4
  66. data/lib/sqreen/graft/hook.rb +316 -0
  67. data/lib/sqreen/{dependency → graft}/hook_point.rb +152 -33
  68. data/lib/sqreen/graft/hook_point_error.rb +10 -0
  69. data/lib/sqreen/invalid_signature_exception.rb +10 -0
  70. data/lib/sqreen/js.rb +11 -0
  71. data/lib/sqreen/js/call_context.rb +12 -0
  72. data/lib/sqreen/js/context_pool.rb +62 -0
  73. data/lib/sqreen/js/exec_js_runnable.rb +22 -0
  74. data/lib/sqreen/js/execjs_adapter.rb +8 -47
  75. data/lib/sqreen/js/executable_js.rb +14 -0
  76. data/lib/sqreen/js/js_service.rb +4 -22
  77. data/lib/sqreen/js/js_service_adapter.rb +20 -0
  78. data/lib/sqreen/js/mini_racer_adapter.rb +8 -180
  79. data/lib/sqreen/js/mini_racer_executable_js.rb +144 -0
  80. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +49 -0
  81. data/lib/{sqreen-alt.rb → sqreen/legacy.rb} +5 -1
  82. data/lib/sqreen/{instrumentation.rb → legacy/instrumentation.rb} +44 -15
  83. data/lib/sqreen/log.rb +10 -188
  84. data/lib/sqreen/log/loggable.rb +28 -0
  85. data/lib/sqreen/logger.rb +85 -0
  86. data/lib/sqreen/metrics.rb +2 -0
  87. data/lib/sqreen/metrics/average.rb +2 -0
  88. data/lib/sqreen/metrics/base.rb +2 -0
  89. data/lib/sqreen/metrics/binning.rb +2 -0
  90. data/lib/sqreen/metrics/collect.rb +2 -0
  91. data/lib/sqreen/metrics/sum.rb +2 -0
  92. data/lib/sqreen/metrics_store.rb +5 -11
  93. data/lib/sqreen/metrics_store/already_registered_metric.rb +13 -0
  94. data/lib/sqreen/metrics_store/unknown_metric.rb +13 -0
  95. data/lib/sqreen/metrics_store/unregistered_metric.rb +13 -0
  96. data/lib/sqreen/middleware.rb +2 -34
  97. data/lib/sqreen/mono_time.rb +4 -0
  98. data/lib/sqreen/node.rb +46 -0
  99. data/lib/sqreen/not_implemented_yet.rb +10 -0
  100. data/lib/sqreen/null_logger.rb +26 -0
  101. data/lib/sqreen/payload_creator.rb +4 -19
  102. data/lib/sqreen/payload_creator/header_section.rb +30 -0
  103. data/lib/sqreen/performance_notifications.rb +2 -0
  104. data/lib/sqreen/performance_notifications/binned_metrics.rb +2 -0
  105. data/lib/sqreen/performance_notifications/log.rb +2 -0
  106. data/lib/sqreen/performance_notifications/log_performance.rb +2 -0
  107. data/lib/sqreen/performance_notifications/metrics.rb +2 -0
  108. data/lib/sqreen/performance_notifications/newrelic.rb +2 -0
  109. data/lib/sqreen/prefix.rb +35 -0
  110. data/lib/sqreen/rails_middleware.rb +16 -0
  111. data/lib/sqreen/remote_command.rb +3 -8
  112. data/lib/sqreen/remote_command/failure_output.rb +16 -0
  113. data/lib/sqreen/rules.rb +34 -2
  114. data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +2 -0
  115. data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +4 -2
  116. data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +6 -8
  117. data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +3 -1
  118. data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +5 -2
  119. data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +4 -2
  120. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +3 -1
  121. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +3 -1
  122. data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +3 -1
  123. data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +4 -2
  124. data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +4 -2
  125. data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +51 -50
  126. data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +8 -1
  127. data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +4 -2
  128. data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +7 -2
  129. data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +3 -1
  130. data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +3 -1
  131. data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +3 -1
  132. data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +4 -2
  133. data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +7 -3
  134. data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +4 -2
  135. data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +3 -1
  136. data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +4 -2
  137. data/lib/sqreen/rules/update_request_context.rb +22 -0
  138. data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +3 -1
  139. data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +3 -1
  140. data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +41 -21
  141. data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +12 -7
  142. data/lib/sqreen/run_when_called_cb.rb +23 -0
  143. data/lib/sqreen/runner.rb +25 -7
  144. data/lib/sqreen/runtime_infos.rb +4 -9
  145. data/lib/sqreen/safe_json.rb +2 -0
  146. data/lib/sqreen/sdk.rb +4 -0
  147. data/lib/sqreen/sensitive_data_redactor.rb +113 -0
  148. data/lib/sqreen/serializer.rb +2 -0
  149. data/lib/sqreen/session.rb +2 -0
  150. data/lib/sqreen/shared_storage.rb +2 -0
  151. data/lib/sqreen/shared_storage23.rb +2 -0
  152. data/lib/sqreen/shrink_wrap.rb +16 -0
  153. data/lib/sqreen/signature_verifier.rb +22 -0
  154. data/lib/sqreen/sinatra_middleware.rb +16 -0
  155. data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +7 -17
  156. data/lib/sqreen/token_invalid_exception.rb +10 -0
  157. data/lib/sqreen/token_not_found_exception.rb +11 -0
  158. data/lib/sqreen/trie.rb +5 -64
  159. data/lib/sqreen/unauthorized.rb +10 -0
  160. data/lib/sqreen/util.rb +7 -0
  161. data/lib/sqreen/util/capped_array.rb +35 -0
  162. data/lib/sqreen/util/capped_hash.rb +41 -0
  163. data/lib/sqreen/util/capped_string.rb +26 -0
  164. data/lib/sqreen/util/capper.rb +67 -0
  165. data/lib/sqreen/version.rb +3 -1
  166. data/lib/sqreen/waf_error.rb +20 -0
  167. data/lib/sqreen/weave.rb +12 -0
  168. data/lib/sqreen/weave/hardcoded.rb +19 -0
  169. data/lib/sqreen/weave/instrumentor.rb +48 -0
  170. data/lib/sqreen/weave/legacy.rb +12 -0
  171. data/lib/sqreen/weave/legacy/instrumentation.rb +406 -0
  172. data/lib/sqreen/web_server.rb +2 -0
  173. data/lib/sqreen/web_server/generic.rb +2 -0
  174. data/lib/sqreen/web_server/passenger.rb +2 -0
  175. data/lib/sqreen/web_server/puma.rb +2 -0
  176. data/lib/sqreen/web_server/rainbows.rb +2 -0
  177. data/lib/sqreen/web_server/thin.rb +2 -0
  178. data/lib/sqreen/web_server/unicorn.rb +2 -0
  179. data/lib/sqreen/web_server/webrick.rb +2 -0
  180. data/lib/sqreen/worker.rb +2 -0
  181. metadata +105 -39
  182. data/lib/sqreen/dependency/hook.rb +0 -102
  183. data/lib/sqreen/rules_callbacks.rb +0 -35
  184. data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
@@ -1,14 +1,18 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
4
6
  require 'sqreen/version'
5
- require 'sqreen/instrumentation'
6
7
  require 'sqreen/session'
7
8
  require 'sqreen/runner'
8
- require 'sqreen/callbacks'
9
9
  require 'sqreen/log'
10
10
  require 'sqreen/exception'
11
11
  require 'sqreen/configuration'
12
+ require 'sqreen/cb'
13
+ require 'sqreen/default_cb'
14
+ require 'sqreen/run_when_called_cb'
15
+ require 'sqreen/framework_cb'
12
16
  require 'sqreen/events/attack'
13
17
  require 'sqreen/sdk'
14
18
  require 'sqreen/dependency/detector'
@@ -0,0 +1,19 @@
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
+ require 'sqreen/exception'
7
+
8
+ module Sqreen
9
+ # This exception name is particularly important since it is often seen by
10
+ # Sqreen users when watching their logs. It should not raise any concern to
11
+ # them.
12
+ class AttackBlocked < Sqreen::Exception
13
+ attr_accessor :redirect_url
14
+
15
+ def log_message(msg)
16
+ Sqreen.log.warn(msg)
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,5 @@
1
+ # typed: strong
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -0,0 +1,74 @@
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,3 +1,5 @@
1
+ # typed: false
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -1,14 +1,17 @@
1
+ # typed: false
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
4
6
  require 'strscan'
5
7
  require 'sqreen/exception'
6
- require 'set'
8
+
9
+ require 'sqreen/binding_accessor/path_elem'
10
+ require 'sqreen/binding_accessor/transforms'
7
11
 
8
12
  module Sqreen
9
13
  # the value located at the given binding
10
14
  class BindingAccessor
11
- PathElem = Struct.new(:kind, :value)
12
15
  attr_reader :path, :expression, :final_transform, :transform_args
13
16
 
14
17
  # Expression to be accessed
@@ -67,6 +70,7 @@ module Sqreen
67
70
  CONSTANT_KIND = 'constant'.freeze
68
71
  METHOD_KIND = 'method'.freeze
69
72
  INDEX_KIND = 'index'.freeze
73
+ NIL_KIND = 'nil'.freeze
70
74
  SQREEN_VAR_KIND = 'sqreen-variable'.freeze
71
75
 
72
76
  if binding.respond_to?(:local_variable_get)
@@ -101,6 +105,8 @@ module Sqreen
101
105
  current_value.send(component[:value])
102
106
  when INDEX_KIND
103
107
  current_value[component[:value]]
108
+ when NIL_KIND
109
+ current_value
104
110
  when SQREEN_VAR_KIND
105
111
  resolve_sqreen_variable(component[:value], *env)
106
112
  else
@@ -176,6 +182,8 @@ module Sqreen
176
182
  PathElem.new(SYMBOL_KIND, @scan[1].to_sym)
177
183
  elsif @scan.scan(/'((?:\\.|[^\\'])*)'/)
178
184
  PathElem.new(STRING_KIND, @scan[1])
185
+ elsif @scan.scan(/nil/)
186
+ PathElem.new(NIL_KIND, nil)
179
187
  end
180
188
  end
181
189
 
@@ -248,110 +256,11 @@ module Sqreen
248
256
  end
249
257
  end
250
258
 
251
- # Available final transformations
252
- module Transforms
253
- def flat_keys(value, max_iter = 1000)
254
- return nil if value.nil?
255
- seen = Set.new
256
- look_into = [value]
257
- keys = []
258
- idx = 0
259
- until look_into.empty? || max_iter <= idx
260
- idx += 1
261
- val = look_into.pop
262
- next unless seen.add?(val.object_id)
263
- case val
264
- when Hash
265
- keys.concat(val.keys)
266
- look_into.concat(val.values)
267
- when Array
268
- look_into.concat(val)
269
- else
270
- next if val.respond_to?(:seek)
271
- val.each { |v| look_into << v } if val.respond_to?(:each)
272
- end
273
- end
274
- keys
275
- end
276
-
277
- def flat_values(value, max_iter = 1000)
278
- return nil if value.nil?
279
- seen = Set.new
280
- look_into = [value]
281
- values = []
282
- idx = 0
283
- until look_into.empty? || max_iter <= idx
284
- idx += 1
285
- val = look_into.shift
286
- next unless seen.add?(val.object_id)
287
- case val
288
- when Hash
289
- look_into.concat(val.values)
290
- when Array
291
- look_into.concat(val)
292
- else
293
- next if val.respond_to?(:seek)
294
- if val.respond_to?(:each)
295
- val.each { |v| look_into << v }
296
- else
297
- values << val
298
- end
299
- end
300
- end
301
- values
302
- end
303
-
304
- def concat_keys_and_values(value, max_size = nil)
305
- return nil if value.nil?
306
- values = Set.new
307
- max_size = max_size.to_i if max_size
308
- res = ''
309
- descend(value) do |x|
310
- next unless values.add?(x)
311
- x = x.to_s
312
- return res if max_size && res.size + x.size + 1 > max_size
313
- res << "\n" unless res.empty?
314
- res << x
315
- end
316
- res
317
- end
318
-
319
- private
320
-
321
- def descend(value, max_iter = 1000)
322
- seen = Set.new
323
- look_into = [value]
324
- idx = 0
325
- until look_into.empty? || max_iter <= idx
326
- idx += 1
327
- val = look_into.pop
328
-
329
- case val
330
- when Hash
331
- next unless seen.add?(val.object_id)
332
- look_into.concat(val.keys)
333
- look_into.concat(val.values)
334
- when Array
335
- next unless seen.add?(val.object_id)
336
- look_into.concat(val)
337
- else
338
- next if val.respond_to?(:seek)
339
- if val.respond_to?(:each)
340
- next unless seen.add?(val.object_id)
341
- val.each { |v| look_into << v }
342
- else
343
- yield val
344
- end
345
- end
346
- end
347
- end
348
- end # end module Transforms
349
-
350
259
  include Transforms
351
260
  KNOWN_TRANSFORMS = Transforms.public_instance_methods.map(&:to_s)
352
261
 
353
262
  def transform(value)
354
263
  send(@final_transform, value, *@transform_args) if @final_transform
355
264
  end
356
- end # end class BindingAccessor
265
+ end
357
266
  end
@@ -0,0 +1,10 @@
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 BindingAccessor
8
+ PathElem = Struct.new(:kind, :value)
9
+ end
10
+ end
@@ -0,0 +1,114 @@
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
+ require 'set'
7
+
8
+ module Sqreen
9
+ class BindingAccessor
10
+ # Available final transformations
11
+ module Transforms
12
+ def flat_keys(value, max_iter = 1000)
13
+ return nil if value.nil?
14
+ seen = Set.new
15
+ look_into = [value]
16
+ keys = []
17
+ idx = 0
18
+ until look_into.empty? || max_iter <= idx
19
+ idx += 1
20
+ val = look_into.pop
21
+ next unless seen.add?(val.object_id)
22
+ case val
23
+ when Hash
24
+ # convert symbols are converted to strings (ARB-60)
25
+ keys.concat(val.keys.map { |x| sym_to_s(x) })
26
+ look_into.concat(val.values)
27
+ when Array
28
+ look_into.concat(val)
29
+ else
30
+ next if val.respond_to?(:seek)
31
+ val.each { |v| look_into << v } if val.respond_to?(:each)
32
+ end
33
+ end
34
+ keys
35
+ end
36
+
37
+ def flat_values(value, max_iter = 1000)
38
+ return nil if value.nil?
39
+ seen = Set.new
40
+ look_into = [value]
41
+ values = []
42
+ idx = 0
43
+ until look_into.empty? || max_iter <= idx
44
+ idx += 1
45
+ val = look_into.shift
46
+ next unless seen.add?(val.object_id)
47
+ case val
48
+ when Hash
49
+ look_into.concat(val.values)
50
+ when Array
51
+ look_into.concat(val)
52
+ else
53
+ next if val.respond_to?(:seek)
54
+ if val.respond_to?(:each)
55
+ val.each { |v| look_into << v }
56
+ else
57
+ values << val
58
+ end
59
+ end
60
+ end
61
+ values
62
+ end
63
+
64
+ def concat_keys_and_values(value, max_size = nil)
65
+ return nil if value.nil?
66
+ values = Set.new
67
+ max_size = max_size.to_i if max_size
68
+ res = ''
69
+ descend(value) do |x|
70
+ next unless values.add?(x)
71
+ x = x.to_s
72
+ return res if max_size && res.size + x.size + 1 > max_size
73
+ res << "\n" unless res.empty?
74
+ res << x
75
+ end
76
+ res
77
+ end
78
+
79
+ private
80
+
81
+ def sym_to_s(value)
82
+ value.is_a?(Symbol) ? value.to_s : value
83
+ end
84
+
85
+ def descend(value, max_iter = 1000)
86
+ seen = Set.new
87
+ look_into = [value]
88
+ idx = 0
89
+ until look_into.empty? || max_iter <= idx
90
+ idx += 1
91
+ val = look_into.pop
92
+
93
+ case val
94
+ when Hash
95
+ next unless seen.add?(val.object_id)
96
+ look_into.concat(val.keys)
97
+ look_into.concat(val.values)
98
+ when Array
99
+ next unless seen.add?(val.object_id)
100
+ look_into.concat(val)
101
+ else
102
+ next if val.respond_to?(:seek)
103
+ if val.respond_to?(:each)
104
+ next unless seen.add?(val.object_id)
105
+ val.each { |v| look_into << v }
106
+ else
107
+ yield val
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,3 +1,5 @@
1
+ # typed: false
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -1,6 +1,10 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ require 'sqreen/log'
7
+
4
8
  module Sqreen
5
9
  # A simple size limited queue.
6
10
  # When trying to enqueue more than the capacity
@@ -1,12 +1,12 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
4
- require 'set'
5
- require 'sqreen/shared_storage'
6
+ require 'sqreen/exception'
6
7
  require 'sqreen/log'
7
8
 
8
9
  module Sqreen
9
-
10
10
  class CB
11
11
  # Callback class.
12
12
  #
@@ -87,54 +87,4 @@ module Sqreen
87
87
  nil
88
88
  end
89
89
  end
90
- # target_method, position, callback, callback class
91
-
92
- class DefaultCB < CB
93
- def pre(_inst, args, _budget = nil, &_block)
94
- Sqreen.log.debug "<< #{@klass} #{@method} #{Thread.current}"
95
- Sqreen.log.debug args.join ' '
96
- # log params
97
- end
98
-
99
- def post(_rv, _inst, _args, _budget = nil, &_block)
100
- # log "#{rv}"
101
- Sqreen.log.debug ">> #{@klass} #{@method} #{Thread.current}"
102
- end
103
- end
104
-
105
- class RunWhenCalledCB < CB
106
- def initialize(klass, method, &block)
107
- super(klass, method)
108
-
109
- raise 'missing block' unless block_given?
110
- @block = block
111
- end
112
-
113
- def pre(_inst, _args, _budget = nil, &_block)
114
- # FIXME: implement this removal
115
- @remove_me = true
116
- @block.call
117
- end
118
- end
119
-
120
- # Framework-aware callback
121
- class FrameworkCB < CB
122
- attr_accessor :framework
123
-
124
- def whitelisted?
125
- whitelisted = SharedStorage.get(:whitelisted)
126
- return whitelisted unless whitelisted.nil?
127
- framework && !framework.whitelisted_match.nil?
128
- end
129
-
130
- # Record a metric observation
131
- # @param category [String] Name of the metric observed
132
- # @param key [String] aggregation key
133
- # @param observation [Object] data observed
134
- # @param at [Time] time when observation was made
135
- def record_observation(category, key, observation, at = Time.now.utc)
136
- return unless framework
137
- framework.observe(:observations, [category, key, observation, at], [], false)
138
- end
139
- end
140
90
  end