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,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
- res = values.map do |v|
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? && res.size != arity
195
- raise(Sqreen::Exception, "bad res #{res} (op #{op} wanted #{arity})")
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
- res.any?
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
- res.all?
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
@@ -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,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
@@ -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
 
@@ -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
- require 'sqreen/deliveries/simple'
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
 
@@ -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/dependency/hook'
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::Dependency::Hook.add('Rack::Builder#to_app') do
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::Dependency::Hook.add('Sinatra::Base.setup_default_middleware') do
42
- after do |_, _, _, args|
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::Dependency::Hook.add('Rack::Builder#to_app') do
48
- after do |_, builder|
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::Dependency::Hook.add('Rack::Builder#to_app') do
56
- after do |callback, *|
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::Dependency::Hook.add('Puma::Launcher#run') do
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::Dependency::Hook['Puma::Launcher#run'].install
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::Dependency::Hook.add('Unicorn::HttpServer.new') do
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::Dependency::Hook['Rack::Builder#to_app'].install
108
+ Sqreen::Graft::Hook['Rack::Builder#to_app'].install
101
109
 
102
- # Sqreen::Dependency::Hook.add('Rails::Server#start') do
110
+ # Sqreen::Graft::Hook.add('Rails::Server#start') do
103
111
  # before { }
104
112
  # end
105
- # Sqreen::Dependency::Hook['Rails::Server#start'].install
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
 
@@ -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::Dependency::Hook.add('Rack::Server#server') do
11
- after do |callback, _, server, _|
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::Dependency::Hook['Rack::Server#server'].install
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::Dependency::Hook.add(hookpoint_name) do
28
+ Sqreen::Graft::Hook.add(hookpoint_name) do
24
29
  before { block.call(handler) }
25
30
  end
26
- Sqreen::Dependency::Hook[hookpoint_name].install
31
+ Sqreen::Graft::Hook[hookpoint_name].install
27
32
  end
28
33
 
29
34
  def rackup?