sqreen 1.18.2-java → 1.19.0-java

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 (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