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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/LICENSE +3 -0
- data/lib/sqreen.rb +2 -0
- data/lib/sqreen/actions.rb +13 -337
- data/lib/sqreen/actions/actions_index.rb +16 -0
- data/lib/sqreen/actions/base.rb +104 -0
- data/lib/sqreen/actions/block_ip.rb +34 -0
- data/lib/sqreen/actions/block_user.rb +46 -0
- data/lib/sqreen/actions/ip_range_indexed_action_class.rb +16 -0
- data/lib/sqreen/actions/ip_ranges_index.rb +57 -0
- data/lib/sqreen/actions/redirect_ip.rb +42 -0
- data/lib/sqreen/actions/redirect_user.rb +47 -0
- data/lib/sqreen/actions/repository.rb +43 -0
- data/lib/sqreen/actions/unknown_action_type.rb +20 -0
- data/lib/sqreen/actions/user_action_class.rb +16 -0
- data/lib/sqreen/actions/users_index.rb +35 -0
- data/lib/sqreen/agent.rb +6 -2
- data/lib/sqreen/attack_blocked.rb +19 -0
- data/lib/sqreen/backport.rb +2 -0
- data/lib/sqreen/backport/clock_gettime.rb +74 -0
- data/lib/sqreen/backport/original_name.rb +2 -0
- data/lib/sqreen/binding_accessor.rb +11 -102
- data/lib/sqreen/binding_accessor/path_elem.rb +10 -0
- data/lib/sqreen/binding_accessor/transforms.rb +114 -0
- data/lib/sqreen/call_countable.rb +2 -0
- data/lib/sqreen/capped_queue.rb +4 -0
- data/lib/sqreen/{callbacks.rb → cb.rb} +3 -53
- data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +4 -2
- data/lib/sqreen/condition_evaluator.rb +24 -5
- data/lib/sqreen/conditionable.rb +2 -0
- data/lib/sqreen/configuration.rb +19 -0
- data/lib/sqreen/context.rb +2 -0
- data/lib/sqreen/default_cb.rb +22 -0
- data/lib/sqreen/deferred_logger.rb +65 -0
- data/lib/sqreen/deliveries.rb +12 -0
- data/lib/sqreen/deliveries/batch.rb +9 -1
- data/lib/sqreen/deliveries/simple.rb +7 -0
- data/lib/sqreen/dependency.rb +3 -1
- data/lib/sqreen/dependency/detector.rb +22 -14
- data/lib/sqreen/dependency/libsqreen.rb +32 -0
- data/lib/sqreen/dependency/new_relic.rb +2 -0
- data/lib/sqreen/dependency/rack.rb +10 -5
- data/lib/sqreen/dependency/rails.rb +8 -0
- data/lib/sqreen/dependency/sentry.rb +2 -0
- data/lib/sqreen/dependency/sinatra.rb +58 -14
- data/lib/sqreen/encoding_sanitizer.rb +2 -0
- data/lib/sqreen/error_handling_middleware.rb +32 -0
- data/lib/sqreen/event.rb +4 -0
- data/lib/sqreen/events/attack.rb +4 -0
- data/lib/sqreen/events/remote_exception.rb +2 -0
- data/lib/sqreen/events/request_record.rb +13 -56
- data/lib/sqreen/exception.rb +11 -40
- data/lib/sqreen/formatter_with_tid.rb +47 -0
- data/lib/sqreen/framework_cb.rb +30 -0
- data/lib/sqreen/frameworks.rb +9 -0
- data/lib/sqreen/frameworks/generic.rb +22 -2
- data/lib/sqreen/frameworks/rails.rb +3 -0
- data/lib/sqreen/frameworks/rails3.rb +2 -0
- data/lib/sqreen/frameworks/request_recorder.rb +5 -0
- data/lib/sqreen/frameworks/sinatra.rb +4 -0
- data/lib/sqreen/frameworks/sqreen_test.rb +4 -0
- data/lib/sqreen/graft.rb +12 -0
- data/lib/sqreen/graft/call.rb +150 -0
- data/lib/sqreen/{dependency → graft}/callback.rb +12 -4
- data/lib/sqreen/graft/hook.rb +316 -0
- data/lib/sqreen/{dependency → graft}/hook_point.rb +152 -33
- data/lib/sqreen/graft/hook_point_error.rb +10 -0
- data/lib/sqreen/invalid_signature_exception.rb +10 -0
- data/lib/sqreen/js.rb +11 -0
- data/lib/sqreen/js/call_context.rb +12 -0
- data/lib/sqreen/js/context_pool.rb +62 -0
- data/lib/sqreen/js/exec_js_runnable.rb +22 -0
- data/lib/sqreen/js/execjs_adapter.rb +8 -47
- data/lib/sqreen/js/executable_js.rb +14 -0
- data/lib/sqreen/js/js_service.rb +4 -22
- data/lib/sqreen/js/js_service_adapter.rb +20 -0
- data/lib/sqreen/js/mini_racer_adapter.rb +8 -180
- data/lib/sqreen/js/mini_racer_executable_js.rb +144 -0
- data/lib/sqreen/js/thread_local_exec_js_runnable.rb +49 -0
- data/lib/{sqreen-alt.rb → sqreen/legacy.rb} +5 -1
- data/lib/sqreen/{instrumentation.rb → legacy/instrumentation.rb} +44 -15
- data/lib/sqreen/log.rb +10 -188
- data/lib/sqreen/log/loggable.rb +28 -0
- data/lib/sqreen/logger.rb +85 -0
- data/lib/sqreen/metrics.rb +2 -0
- data/lib/sqreen/metrics/average.rb +2 -0
- data/lib/sqreen/metrics/base.rb +2 -0
- data/lib/sqreen/metrics/binning.rb +2 -0
- data/lib/sqreen/metrics/collect.rb +2 -0
- data/lib/sqreen/metrics/sum.rb +2 -0
- data/lib/sqreen/metrics_store.rb +5 -11
- data/lib/sqreen/metrics_store/already_registered_metric.rb +13 -0
- data/lib/sqreen/metrics_store/unknown_metric.rb +13 -0
- data/lib/sqreen/metrics_store/unregistered_metric.rb +13 -0
- data/lib/sqreen/middleware.rb +2 -34
- data/lib/sqreen/mono_time.rb +4 -0
- data/lib/sqreen/node.rb +46 -0
- data/lib/sqreen/not_implemented_yet.rb +10 -0
- data/lib/sqreen/null_logger.rb +26 -0
- data/lib/sqreen/payload_creator.rb +4 -19
- data/lib/sqreen/payload_creator/header_section.rb +30 -0
- data/lib/sqreen/performance_notifications.rb +2 -0
- data/lib/sqreen/performance_notifications/binned_metrics.rb +2 -0
- data/lib/sqreen/performance_notifications/log.rb +2 -0
- data/lib/sqreen/performance_notifications/log_performance.rb +2 -0
- data/lib/sqreen/performance_notifications/metrics.rb +2 -0
- data/lib/sqreen/performance_notifications/newrelic.rb +2 -0
- data/lib/sqreen/prefix.rb +35 -0
- data/lib/sqreen/rails_middleware.rb +16 -0
- data/lib/sqreen/remote_command.rb +3 -8
- data/lib/sqreen/remote_command/failure_output.rb +16 -0
- data/lib/sqreen/rules.rb +34 -2
- data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +2 -0
- data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +4 -2
- data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +6 -8
- data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +3 -1
- data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +5 -2
- data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +4 -2
- data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +4 -2
- data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +4 -2
- data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +51 -50
- data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +8 -1
- data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +4 -2
- data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +7 -2
- data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +3 -1
- data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +3 -1
- data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +4 -2
- data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +7 -3
- data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +4 -2
- data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +4 -2
- data/lib/sqreen/rules/update_request_context.rb +22 -0
- data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +3 -1
- data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +41 -21
- data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +12 -7
- data/lib/sqreen/run_when_called_cb.rb +23 -0
- data/lib/sqreen/runner.rb +25 -7
- data/lib/sqreen/runtime_infos.rb +4 -9
- data/lib/sqreen/safe_json.rb +2 -0
- data/lib/sqreen/sdk.rb +4 -0
- data/lib/sqreen/sensitive_data_redactor.rb +113 -0
- data/lib/sqreen/serializer.rb +2 -0
- data/lib/sqreen/session.rb +2 -0
- data/lib/sqreen/shared_storage.rb +2 -0
- data/lib/sqreen/shared_storage23.rb +2 -0
- data/lib/sqreen/shrink_wrap.rb +16 -0
- data/lib/sqreen/signature_verifier.rb +22 -0
- data/lib/sqreen/sinatra_middleware.rb +16 -0
- data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +7 -17
- data/lib/sqreen/token_invalid_exception.rb +10 -0
- data/lib/sqreen/token_not_found_exception.rb +11 -0
- data/lib/sqreen/trie.rb +5 -64
- data/lib/sqreen/unauthorized.rb +10 -0
- data/lib/sqreen/util.rb +7 -0
- data/lib/sqreen/util/capped_array.rb +35 -0
- data/lib/sqreen/util/capped_hash.rb +41 -0
- data/lib/sqreen/util/capped_string.rb +26 -0
- data/lib/sqreen/util/capper.rb +67 -0
- data/lib/sqreen/version.rb +3 -1
- data/lib/sqreen/waf_error.rb +20 -0
- data/lib/sqreen/weave.rb +12 -0
- data/lib/sqreen/weave/hardcoded.rb +19 -0
- data/lib/sqreen/weave/instrumentor.rb +48 -0
- data/lib/sqreen/weave/legacy.rb +12 -0
- data/lib/sqreen/weave/legacy/instrumentation.rb +406 -0
- data/lib/sqreen/web_server.rb +2 -0
- data/lib/sqreen/web_server/generic.rb +2 -0
- data/lib/sqreen/web_server/passenger.rb +2 -0
- data/lib/sqreen/web_server/puma.rb +2 -0
- data/lib/sqreen/web_server/rainbows.rb +2 -0
- data/lib/sqreen/web_server/thin.rb +2 -0
- data/lib/sqreen/web_server/unicorn.rb +2 -0
- data/lib/sqreen/web_server/webrick.rb +2 -0
- data/lib/sqreen/worker.rb +2 -0
- metadata +105 -39
- data/lib/sqreen/dependency/hook.rb +0 -102
- data/lib/sqreen/rules_callbacks.rb +0 -35
- data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
data/lib/sqreen/agent.rb
CHANGED
|
@@ -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
|
data/lib/sqreen/backport.rb
CHANGED
|
@@ -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,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
|
-
|
|
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
|
|
265
|
+
end
|
|
357
266
|
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
|
data/lib/sqreen/capped_queue.rb
CHANGED
|
@@ -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 '
|
|
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
|