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
|
@@ -1,3 +1,5 @@
|
|
|
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
|
|
|
@@ -31,7 +33,7 @@ module Sqreen
|
|
|
31
33
|
methods[1] ||= []
|
|
32
34
|
add_to_array(methods[1], cb)
|
|
33
35
|
end
|
|
34
|
-
if cb.failing?
|
|
36
|
+
if cb.failing? # rubocop:disable Style/GuardClause
|
|
35
37
|
methods[2] ||= []
|
|
36
38
|
add_to_array(methods[2], cb)
|
|
37
39
|
end
|
|
@@ -50,7 +52,7 @@ module Sqreen
|
|
|
50
52
|
types[1].delete(cb)
|
|
51
53
|
types[1] = nil if types[1].empty?
|
|
52
54
|
end
|
|
53
|
-
if cb.failing? && types[2]
|
|
55
|
+
if cb.failing? && types[2] # rubocop:disable Style/GuardClause
|
|
54
56
|
types[2].delete(cb)
|
|
55
57
|
types[2] = nil if types[2].empty?
|
|
56
58
|
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
|
|
|
@@ -179,7 +181,7 @@ module Sqreen
|
|
|
179
181
|
return true if exp.empty?
|
|
180
182
|
raise(Sqreen::Exception, 'too deep call detected') if rem <= 0
|
|
181
183
|
exp.all? do |op, values|
|
|
182
|
-
|
|
184
|
+
val_to_res = lambda do |v|
|
|
183
185
|
case v
|
|
184
186
|
when Hash
|
|
185
187
|
evaluate_expr(v, rem - 1, *args)
|
|
@@ -191,27 +193,42 @@ module Sqreen
|
|
|
191
193
|
end
|
|
192
194
|
|
|
193
195
|
arity = OPERATORS_ARITY[op]
|
|
194
|
-
if !arity.nil? &&
|
|
195
|
-
raise(Sqreen::Exception, "bad
|
|
196
|
+
if !arity.nil? && values.size != arity
|
|
197
|
+
raise(Sqreen::Exception, "bad arg count #{values.inspect} (op #{op} wanted #{arity})")
|
|
196
198
|
end
|
|
197
199
|
bool = case op
|
|
198
200
|
when OR_OPERATOR
|
|
199
|
-
|
|
201
|
+
values.reduce(false) do |_, v|
|
|
202
|
+
r = val_to_res.call(v)
|
|
203
|
+
break r if r
|
|
204
|
+
r
|
|
205
|
+
end
|
|
200
206
|
when AND_OPERATOR
|
|
201
|
-
|
|
207
|
+
values.reduce(true) do |_, v|
|
|
208
|
+
r = val_to_res.call(v)
|
|
209
|
+
break r unless r
|
|
210
|
+
r
|
|
211
|
+
end
|
|
202
212
|
when EQ_OPERATOR
|
|
213
|
+
res = values.map(&val_to_res)
|
|
203
214
|
res[0] == res[1]
|
|
204
215
|
when NEQ_OPERATOR
|
|
216
|
+
res = values.map(&val_to_res)
|
|
205
217
|
res[0] != res[1]
|
|
206
218
|
when GT_OPERATOR
|
|
219
|
+
res = values.map(&val_to_res)
|
|
207
220
|
res[0] > res[1]
|
|
208
221
|
when GTE_OPERATOR
|
|
222
|
+
res = values.map(&val_to_res)
|
|
209
223
|
res[0] >= res[1]
|
|
210
224
|
when LT_OPERATOR
|
|
225
|
+
res = values.map(&val_to_res)
|
|
211
226
|
res[0] < res[1]
|
|
212
227
|
when LTE_OPERATOR
|
|
228
|
+
res = values.map(&val_to_res)
|
|
213
229
|
res[0] <= res[1]
|
|
214
230
|
when INC_OPERATOR
|
|
231
|
+
res = values.map(&val_to_res)
|
|
215
232
|
unless res[0].respond_to?(:include?)
|
|
216
233
|
raise(Sqreen::Exception, "no include on res #{res[0].inspect}")
|
|
217
234
|
end
|
|
@@ -221,8 +238,10 @@ module Sqreen
|
|
|
221
238
|
res[0].include?(res[1])
|
|
222
239
|
end
|
|
223
240
|
when HASH_INC_OPERATOR
|
|
241
|
+
res = values.map(&val_to_res)
|
|
224
242
|
ConditionEvaluator.hash_val_include?(res[0], res[1], res[2])
|
|
225
243
|
when HASH_KEY_OPERATOR
|
|
244
|
+
res = values.map(&val_to_res)
|
|
226
245
|
ConditionEvaluator.hash_key_include?(res[0], res[1], res[2])
|
|
227
246
|
else
|
|
228
247
|
# FIXME: this should be check in compile
|
data/lib/sqreen/conditionable.rb
CHANGED
data/lib/sqreen/configuration.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
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
|
|
|
@@ -6,6 +8,9 @@ require 'erb'
|
|
|
6
8
|
require 'sqreen/performance_notifications/newrelic'
|
|
7
9
|
|
|
8
10
|
module Sqreen
|
|
11
|
+
# TODO: remove all referecnes to global such as config_get
|
|
12
|
+
# TODO: move within Sqreen::Configuration
|
|
13
|
+
|
|
9
14
|
@config = nil
|
|
10
15
|
|
|
11
16
|
def self.config_init(framework = nil)
|
|
@@ -31,6 +36,12 @@ module Sqreen
|
|
|
31
36
|
CONFIG_DESCRIPTION = [
|
|
32
37
|
{ :env => :SQREEN_DISABLE, :name => :disable,
|
|
33
38
|
:default => false, :convert => :to_bool },
|
|
39
|
+
{ :env => :SQREEN_LIBSQREEN, :name => :libsqreen,
|
|
40
|
+
:default => true, :convert => :to_bool },
|
|
41
|
+
{ :env => :SQREEN_WEAVE, :name => :weave,
|
|
42
|
+
:default => false, :convert => :to_bool },
|
|
43
|
+
{ :env => :SQREEN_WEAVE_STRATEGY, :name => :weave_strategy,
|
|
44
|
+
:default => :chain, :convert => :to_sym },
|
|
34
45
|
{ :env => :SQREEN_URL, :name => :url,
|
|
35
46
|
:default => 'https://back.sqreen.io' },
|
|
36
47
|
{ :env => :SQREEN_TOKEN, :name => :token,
|
|
@@ -78,6 +89,10 @@ module Sqreen
|
|
|
78
89
|
str.to_i
|
|
79
90
|
end
|
|
80
91
|
|
|
92
|
+
def self.to_sym(value)
|
|
93
|
+
value.to_sym
|
|
94
|
+
end
|
|
95
|
+
|
|
81
96
|
# Class to access configurations variables
|
|
82
97
|
# This try to load environment by different ways.
|
|
83
98
|
# 1. By file:
|
|
@@ -201,5 +216,9 @@ module Sqreen
|
|
|
201
216
|
def to_int(value)
|
|
202
217
|
Sqreen::to_int(value)
|
|
203
218
|
end
|
|
219
|
+
|
|
220
|
+
def to_sym(value)
|
|
221
|
+
Sqreen::to_sym(value)
|
|
222
|
+
end
|
|
204
223
|
end
|
|
205
224
|
end
|
data/lib/sqreen/context.rb
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
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/cb'
|
|
7
|
+
require 'sqreen/log'
|
|
8
|
+
|
|
9
|
+
module Sqreen
|
|
10
|
+
class DefaultCB < CB
|
|
11
|
+
def pre(_inst, args, _budget = nil, &_block)
|
|
12
|
+
Sqreen.log.debug "<< #{@klass} #{@method} #{Thread.current}"
|
|
13
|
+
Sqreen.log.debug args.join ' '
|
|
14
|
+
# log params
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def post(_rv, _inst, _args, _budget = nil, &_block)
|
|
18
|
+
# log "#{rv}"
|
|
19
|
+
Sqreen.log.debug ">> #{@klass} #{@method} #{Thread.current}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
require 'singleton'
|
|
7
|
+
require 'logger'
|
|
8
|
+
require 'sqreen/logger'
|
|
9
|
+
|
|
10
|
+
module Sqreen
|
|
11
|
+
class DeferredLogger
|
|
12
|
+
include Singleton
|
|
13
|
+
|
|
14
|
+
def initialize
|
|
15
|
+
@buffer = StringIO.new
|
|
16
|
+
@logger = ::Logger.new(@buffer)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def debug(msg = nil, &block)
|
|
20
|
+
@logger.debug(msg, &block)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def info(msg = nil, &block)
|
|
24
|
+
@logger.info(msg, &block)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def warn(msg = nil, &block)
|
|
28
|
+
@logger.warn(msg, &block)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def error(msg = nil, &block)
|
|
32
|
+
@logger.error(msg, &block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def fatal(msg = nil, &block)
|
|
36
|
+
@logger.error(msg, &block)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def add(severity, msg = nil, &block)
|
|
40
|
+
send(Sqreen::Logger::SEVERITY_TO_METHOD[severity], msg, &block)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def formatter=(value)
|
|
44
|
+
@logger.formatter = value
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def flush_to(logger)
|
|
48
|
+
logger.instance_eval { @logdev }.write(read).tap { reset }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def read
|
|
54
|
+
@buffer.rewind
|
|
55
|
+
@buffer.read
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def reset
|
|
59
|
+
buffer = StringIO.new
|
|
60
|
+
logger = ::Logger.new(buffer)
|
|
61
|
+
logger.formatter = @logger.formatter
|
|
62
|
+
@buffer, @logger = buffer, logger
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
require 'sqreen/deliveries/simple'
|
|
7
|
+
require 'sqreen/deliveries/batch'
|
|
8
|
+
|
|
9
|
+
module Sqreen
|
|
10
|
+
module Deliveries
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,9 +1,17 @@
|
|
|
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
|
-
|
|
6
|
+
# TODO: Sqreen::Attack => sqreen/events
|
|
7
|
+
# TODO: Sqreen::RemoteException => sqreen/events
|
|
8
|
+
# TODO: Sqreen::RequestRecord => sqreen/events
|
|
9
|
+
# TODO: Sqreen.time
|
|
10
|
+
|
|
11
|
+
require 'sqreen/events/attack'
|
|
5
12
|
require 'sqreen/events/remote_exception'
|
|
6
13
|
require 'sqreen/mono_time'
|
|
14
|
+
require 'sqreen/deliveries/simple'
|
|
7
15
|
|
|
8
16
|
module Sqreen
|
|
9
17
|
module Deliveries
|
|
@@ -1,6 +1,13 @@
|
|
|
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
|
+
# TODO: Sqreen::Attack => sqreen/events
|
|
7
|
+
# TODO: Sqreen::RemoteException => sqreen/events
|
|
8
|
+
# TODO: Sqreen::RequestRecord => sqreen/events
|
|
9
|
+
|
|
10
|
+
require 'sqreen/events/attack'
|
|
4
11
|
require 'sqreen/events/remote_exception'
|
|
5
12
|
require 'sqreen/events/request_record'
|
|
6
13
|
|
data/lib/sqreen/dependency.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
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
|
|
|
@@ -12,7 +14,7 @@ module Sqreen
|
|
|
12
14
|
def self.resolve_const(name)
|
|
13
15
|
raise ArgumentError if name.nil? || name.empty?
|
|
14
16
|
|
|
15
|
-
name.to_s.split('::').inject(Object) { |a, e| a.const_get(e) }
|
|
17
|
+
name.to_s.split('::').inject(Object) { |a, e| a.const_get(e, false) }
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -1,7 +1,9 @@
|
|
|
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
|
-
require 'sqreen/
|
|
6
|
+
require 'sqreen/graft/hook'
|
|
5
7
|
require 'sqreen/dependency/rails'
|
|
6
8
|
require 'sqreen/dependency/sinatra'
|
|
7
9
|
require 'sqreen/dependency/rack'
|
|
@@ -32,28 +34,34 @@ module Sqreen
|
|
|
32
34
|
Sqreen::Dependency::Rails.insert_sqreen_middlewares
|
|
33
35
|
end if Sqreen::Dependency::Rails.required?
|
|
34
36
|
|
|
35
|
-
Sqreen::
|
|
37
|
+
Sqreen::Graft::Hook.add('Rack::Builder#to_app') do
|
|
36
38
|
after do
|
|
37
39
|
Sqreen::Dependency::Rails.inspect_middlewares
|
|
38
40
|
end
|
|
39
41
|
end if Sqreen::Dependency::Rails.required?
|
|
40
42
|
|
|
41
|
-
Sqreen::
|
|
42
|
-
after do |
|
|
43
|
+
Sqreen::Graft::Hook.add('Sinatra::Base.setup_middleware') do
|
|
44
|
+
after do |call|
|
|
45
|
+
args = call.args
|
|
46
|
+
|
|
43
47
|
Sqreen::Dependency::Sinatra.insert_sqreen_middlewares(args.first)
|
|
44
48
|
end
|
|
45
49
|
end.install if Sqreen::Dependency::Sinatra.required?
|
|
46
50
|
|
|
47
|
-
Sqreen::
|
|
48
|
-
after do |
|
|
51
|
+
Sqreen::Graft::Hook.add('Rack::Builder#to_app') do
|
|
52
|
+
after do |call|
|
|
53
|
+
builder = call.instance
|
|
54
|
+
|
|
49
55
|
Sqreen::Dependency::Sinatra.inspect_middlewares(builder)
|
|
50
56
|
end
|
|
51
57
|
end if Sqreen::Dependency::Sinatra.required?
|
|
52
58
|
|
|
53
59
|
# ensure startup of thread in request handling processes
|
|
54
60
|
|
|
55
|
-
Sqreen::
|
|
56
|
-
after do |
|
|
61
|
+
Sqreen::Graft::Hook.add('Rack::Builder#to_app') do
|
|
62
|
+
after do |call|
|
|
63
|
+
callback = call.callback
|
|
64
|
+
|
|
57
65
|
Sqreen.log.debug "[#{Process.pid}] Start mode #{Sqreen::Dependency::Detector.start_mode}"
|
|
58
66
|
if Sqreen::Dependency::Detector.start_mode == :rails || Sqreen::Dependency::Detector.start_mode == :rackup
|
|
59
67
|
|
|
@@ -61,7 +69,7 @@ module Sqreen
|
|
|
61
69
|
Sqreen::Dependency::Rack.on_run(handler) do
|
|
62
70
|
case handler.name
|
|
63
71
|
when 'Rack::Handler::Puma'
|
|
64
|
-
Sqreen::
|
|
72
|
+
Sqreen::Graft::Hook.add('Puma::Launcher#run') do
|
|
65
73
|
before do
|
|
66
74
|
# HACK: Puma master? hack falls apart when not preloading
|
|
67
75
|
# it would think master is not, triggering startup
|
|
@@ -73,12 +81,12 @@ module Sqreen
|
|
|
73
81
|
end
|
|
74
82
|
end
|
|
75
83
|
end
|
|
76
|
-
Sqreen::
|
|
84
|
+
Sqreen::Graft::Hook['Puma::Launcher#run'].install
|
|
77
85
|
when 'Rack::Handler::PhusionPassenger'
|
|
78
86
|
# noop, passenger will start his own separate process
|
|
79
87
|
Sqreen.log.debug "[#{Process.pid}] Passenger will start in standalone process"
|
|
80
88
|
when 'Rack::Handler::Unicorn' # unicorn-rails
|
|
81
|
-
Sqreen::
|
|
89
|
+
Sqreen::Graft::Hook.add('Unicorn::HttpServer.new') do
|
|
82
90
|
before do
|
|
83
91
|
# BUG: detects single process...
|
|
84
92
|
end
|
|
@@ -97,12 +105,12 @@ module Sqreen
|
|
|
97
105
|
end
|
|
98
106
|
end
|
|
99
107
|
|
|
100
|
-
Sqreen::
|
|
108
|
+
Sqreen::Graft::Hook['Rack::Builder#to_app'].install
|
|
101
109
|
|
|
102
|
-
# Sqreen::
|
|
110
|
+
# Sqreen::Graft::Hook.add('Rails::Server#start') do
|
|
103
111
|
# before { }
|
|
104
112
|
# end
|
|
105
|
-
# Sqreen::
|
|
113
|
+
# Sqreen::Graft::Hook['Rails::Server#start'].install
|
|
106
114
|
# /!\ double instrument Rails < Rack => Rails.start_with -> Rails.start_without -> super -> Rack.start_with -> Rails.start_without
|
|
107
115
|
end
|
|
108
116
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
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/dependency'
|
|
7
|
+
|
|
8
|
+
module Sqreen
|
|
9
|
+
module Dependency
|
|
10
|
+
module LibSqreen
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def require_libsqreen
|
|
14
|
+
raise LoadError, 'libsqreen forcefully disabled by configuration' unless Sqreen.config_get('libsqreen')
|
|
15
|
+
require 'libsqreen'
|
|
16
|
+
@libsqreen = true
|
|
17
|
+
rescue LoadError => e
|
|
18
|
+
Sqreen.log.warn("libsqreen gem not required: #{e.message}")
|
|
19
|
+
@libsqreen = false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def required?
|
|
23
|
+
require_libsqreen if @libsqreen.nil?
|
|
24
|
+
Sqreen::Dependency.const_exist?('LibSqreen')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def stub?
|
|
28
|
+
!::LibSqreen.respond_to?(:version)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
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
|
|
|
@@ -7,23 +9,26 @@ module Sqreen
|
|
|
7
9
|
module_function
|
|
8
10
|
|
|
9
11
|
def find_handler(&block)
|
|
10
|
-
Sqreen::
|
|
11
|
-
after do |
|
|
12
|
+
Sqreen::Graft::Hook.add('Rack::Server#server') do
|
|
13
|
+
after do |call|
|
|
14
|
+
callback = call.callback
|
|
15
|
+
server = call.returned
|
|
16
|
+
|
|
12
17
|
block.call(server)
|
|
13
18
|
callback.disable # do this once, :server is a lazy init accessor
|
|
14
19
|
end
|
|
15
20
|
end
|
|
16
|
-
Sqreen::
|
|
21
|
+
Sqreen::Graft::Hook['Rack::Server#server'].install
|
|
17
22
|
end
|
|
18
23
|
|
|
19
24
|
def on_run(handler, &block)
|
|
20
25
|
Sqreen.log.debug "[#{Process.pid}] #{handler.inspect}"
|
|
21
26
|
hookpoint_name = "#{handler.name}.run"
|
|
22
27
|
|
|
23
|
-
Sqreen::
|
|
28
|
+
Sqreen::Graft::Hook.add(hookpoint_name) do
|
|
24
29
|
before { block.call(handler) }
|
|
25
30
|
end
|
|
26
|
-
Sqreen::
|
|
31
|
+
Sqreen::Graft::Hook[hookpoint_name].install
|
|
27
32
|
end
|
|
28
33
|
|
|
29
34
|
def rackup?
|