sqreen 1.18.6-java → 1.20.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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/lib/sqreen/actions.rb +2 -0
  4. data/lib/sqreen/actions/actions_index.rb +16 -0
  5. data/lib/sqreen/actions/base.rb +4 -10
  6. data/lib/sqreen/actions/block_ip.rb +2 -0
  7. data/lib/sqreen/actions/block_user.rb +2 -0
  8. data/lib/sqreen/actions/ip_range_indexed_action_class.rb +4 -24
  9. data/lib/sqreen/actions/ip_ranges_index.rb +32 -11
  10. data/lib/sqreen/actions/redirect_ip.rb +2 -0
  11. data/lib/sqreen/actions/redirect_user.rb +2 -0
  12. data/lib/sqreen/actions/repository.rb +27 -8
  13. data/lib/sqreen/actions/unknown_action_type.rb +4 -0
  14. data/lib/sqreen/actions/user_action_class.rb +5 -30
  15. data/lib/sqreen/actions/users_index.rb +35 -0
  16. data/lib/sqreen/agent.rb +2 -1
  17. data/lib/sqreen/aggregated_metric.rb +25 -0
  18. data/lib/sqreen/attack_blocked.rb +2 -0
  19. data/lib/sqreen/binding_accessor.rb +2 -0
  20. data/lib/sqreen/binding_accessor/path_elem.rb +2 -0
  21. data/lib/sqreen/binding_accessor/transforms.rb +8 -1
  22. data/lib/sqreen/call_countable.rb +2 -0
  23. data/lib/sqreen/capped_queue.rb +2 -0
  24. data/lib/sqreen/cb.rb +2 -0
  25. data/lib/sqreen/cb_tree.rb +2 -0
  26. data/lib/sqreen/condition_evaluator.rb +2 -0
  27. data/lib/sqreen/conditionable.rb +2 -0
  28. data/lib/sqreen/configuration.rb +19 -1
  29. data/lib/sqreen/context.rb +2 -0
  30. data/lib/sqreen/default_cb.rb +2 -0
  31. data/lib/sqreen/deferred_logger.rb +2 -0
  32. data/lib/sqreen/deliveries.rb +2 -0
  33. data/lib/sqreen/deliveries/batch.rb +6 -1
  34. data/lib/sqreen/deliveries/simple.rb +6 -0
  35. data/lib/sqreen/dependency.rb +3 -1
  36. data/lib/sqreen/dependency/detector.rb +22 -14
  37. data/lib/sqreen/dependency/libsqreen.rb +4 -0
  38. data/lib/sqreen/dependency/new_relic.rb +2 -0
  39. data/lib/sqreen/dependency/rack.rb +10 -5
  40. data/lib/sqreen/dependency/rails.rb +4 -0
  41. data/lib/sqreen/dependency/sentry.rb +2 -0
  42. data/lib/sqreen/dependency/sinatra.rb +12 -1
  43. data/lib/sqreen/encoding_sanitizer.rb +2 -0
  44. data/lib/sqreen/error_handling_middleware.rb +2 -0
  45. data/lib/sqreen/event.rb +9 -5
  46. data/lib/sqreen/events/attack.rb +25 -18
  47. data/lib/sqreen/events/remote_exception.rb +2 -22
  48. data/lib/sqreen/events/request_record.rb +17 -70
  49. data/lib/sqreen/exception.rb +2 -0
  50. data/lib/sqreen/formatter_with_tid.rb +2 -0
  51. data/lib/sqreen/framework_cb.rb +2 -0
  52. data/lib/sqreen/frameworks.rb +2 -0
  53. data/lib/sqreen/frameworks/generic.rb +2 -0
  54. data/lib/sqreen/frameworks/rails.rb +1 -0
  55. data/lib/sqreen/frameworks/rails3.rb +2 -0
  56. data/lib/sqreen/frameworks/request_recorder.rb +15 -2
  57. data/lib/sqreen/frameworks/sinatra.rb +2 -0
  58. data/lib/sqreen/frameworks/sqreen_test.rb +2 -0
  59. data/lib/sqreen/graft.rb +12 -0
  60. data/lib/sqreen/graft/call.rb +150 -0
  61. data/lib/sqreen/{dependency → graft}/callback.rb +12 -4
  62. data/lib/sqreen/graft/hook.rb +316 -0
  63. data/lib/sqreen/{dependency → graft}/hook_point.rb +152 -33
  64. data/lib/sqreen/graft/hook_point_error.rb +10 -0
  65. data/lib/sqreen/invalid_signature_exception.rb +2 -0
  66. data/lib/sqreen/js.rb +2 -0
  67. data/lib/sqreen/js/call_context.rb +2 -0
  68. data/lib/sqreen/js/context_pool.rb +2 -0
  69. data/lib/sqreen/js/exec_js_runnable.rb +2 -0
  70. data/lib/sqreen/js/execjs_adapter.rb +2 -0
  71. data/lib/sqreen/js/executable_js.rb +2 -0
  72. data/lib/sqreen/js/js_service.rb +2 -0
  73. data/lib/sqreen/js/js_service_adapter.rb +2 -0
  74. data/lib/sqreen/js/mini_racer_adapter.rb +2 -0
  75. data/lib/sqreen/js/mini_racer_executable_js.rb +2 -0
  76. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +2 -0
  77. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  78. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  79. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  80. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  81. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  82. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  83. data/lib/sqreen/{backport.rb → legacy.rb} +3 -2
  84. data/lib/sqreen/{instrumentation.rb → legacy/instrumentation.rb} +31 -2
  85. data/lib/sqreen/legacy/old_event_submission_strategy.rb +221 -0
  86. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  87. data/lib/sqreen/log.rb +2 -0
  88. data/lib/sqreen/log/loggable.rb +28 -0
  89. data/lib/sqreen/logger.rb +2 -0
  90. data/lib/sqreen/metrics.rb +2 -0
  91. data/lib/sqreen/metrics/average.rb +2 -0
  92. data/lib/sqreen/metrics/base.rb +5 -0
  93. data/lib/sqreen/metrics/binning.rb +2 -0
  94. data/lib/sqreen/metrics/collect.rb +2 -0
  95. data/lib/sqreen/metrics/sum.rb +2 -0
  96. data/lib/sqreen/metrics_store.rb +24 -12
  97. data/lib/sqreen/metrics_store/already_registered_metric.rb +2 -0
  98. data/lib/sqreen/metrics_store/unknown_metric.rb +2 -0
  99. data/lib/sqreen/metrics_store/unregistered_metric.rb +2 -0
  100. data/lib/sqreen/middleware.rb +2 -0
  101. data/lib/sqreen/mono_time.rb +2 -0
  102. data/lib/sqreen/node.rb +2 -0
  103. data/lib/sqreen/not_implemented_yet.rb +2 -0
  104. data/lib/sqreen/null_logger.rb +2 -0
  105. data/lib/sqreen/payload_creator.rb +2 -0
  106. data/lib/sqreen/payload_creator/header_section.rb +2 -0
  107. data/lib/sqreen/performance_notifications.rb +2 -0
  108. data/lib/sqreen/performance_notifications/binned_metrics.rb +10 -2
  109. data/lib/sqreen/performance_notifications/log.rb +2 -0
  110. data/lib/sqreen/performance_notifications/log_performance.rb +2 -0
  111. data/lib/sqreen/performance_notifications/metrics.rb +2 -0
  112. data/lib/sqreen/performance_notifications/newrelic.rb +2 -0
  113. data/lib/sqreen/prefix.rb +2 -0
  114. data/lib/sqreen/rails_middleware.rb +2 -0
  115. data/lib/sqreen/remote_command.rb +2 -0
  116. data/lib/sqreen/remote_command/failure_output.rb +5 -0
  117. data/lib/sqreen/rules.rb +6 -2
  118. data/lib/sqreen/rules/attrs.rb +2 -0
  119. data/lib/sqreen/rules/auth_track_cb.rb +2 -0
  120. data/lib/sqreen/rules/binding_accessor_matcher_cb.rb +2 -0
  121. data/lib/sqreen/rules/binding_accessor_metrics.rb +2 -0
  122. data/lib/sqreen/rules/blacklist_ips_cb.rb +2 -0
  123. data/lib/sqreen/rules/count_http_codes.rb +2 -0
  124. data/lib/sqreen/rules/crawler_user_agent_matches_cb.rb +2 -0
  125. data/lib/sqreen/rules/crawler_user_agent_matches_metrics_cb.rb +2 -0
  126. data/lib/sqreen/rules/custom_error_cb.rb +2 -0
  127. data/lib/sqreen/rules/devise_auth_track_cb.rb +2 -0
  128. data/lib/sqreen/rules/devise_signup_track_cb.rb +2 -0
  129. data/lib/sqreen/rules/execjs_cb.rb +2 -0
  130. data/lib/sqreen/rules/headers_insert_cb.rb +7 -0
  131. data/lib/sqreen/rules/matcher_rule.rb +2 -0
  132. data/lib/sqreen/rules/not_found_cb.rb +7 -0
  133. data/lib/sqreen/rules/rails_parameters_cb.rb +2 -0
  134. data/lib/sqreen/rules/record_request_context.rb +2 -0
  135. data/lib/sqreen/rules/regexp_rule_cb.rb +2 -0
  136. data/lib/sqreen/rules/rule_cb.rb +4 -0
  137. data/lib/sqreen/rules/run_req_start_actions.rb +3 -1
  138. data/lib/sqreen/rules/run_user_actions.rb +3 -1
  139. data/lib/sqreen/rules/shell_env_cb.rb +2 -0
  140. data/lib/sqreen/rules/signup_track_cb.rb +2 -0
  141. data/lib/sqreen/rules/update_request_context.rb +2 -0
  142. data/lib/sqreen/rules/url_matches_cb.rb +2 -0
  143. data/lib/sqreen/rules/user_agent_matches_cb.rb +2 -0
  144. data/lib/sqreen/rules/waf_cb.rb +41 -16
  145. data/lib/sqreen/rules/xss_cb.rb +2 -0
  146. data/lib/sqreen/run_when_called_cb.rb +2 -0
  147. data/lib/sqreen/runner.rb +68 -12
  148. data/lib/sqreen/runtime_infos.rb +2 -0
  149. data/lib/sqreen/safe_json.rb +2 -0
  150. data/lib/sqreen/sdk.rb +4 -0
  151. data/lib/sqreen/sensitive_data_redactor.rb +21 -31
  152. data/lib/sqreen/serializer.rb +2 -0
  153. data/lib/sqreen/session.rb +41 -37
  154. data/lib/sqreen/shared_storage.rb +2 -0
  155. data/lib/sqreen/shared_storage23.rb +2 -0
  156. data/lib/sqreen/shrink_wrap.rb +16 -0
  157. data/lib/sqreen/signals/conversions.rb +283 -0
  158. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  159. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  160. data/lib/sqreen/signature_verifier.rb +2 -0
  161. data/lib/sqreen/sinatra_middleware.rb +2 -0
  162. data/lib/sqreen/sqreen_signed_verifier.rb +2 -0
  163. data/lib/sqreen/token_invalid_exception.rb +2 -0
  164. data/lib/sqreen/token_not_found_exception.rb +2 -0
  165. data/lib/sqreen/trie.rb +2 -0
  166. data/lib/sqreen/unauthorized.rb +2 -0
  167. data/lib/sqreen/util.rb +5 -0
  168. data/lib/sqreen/util/capped_array.rb +2 -0
  169. data/lib/sqreen/util/capped_hash.rb +2 -0
  170. data/lib/sqreen/util/capped_string.rb +2 -0
  171. data/lib/sqreen/util/capper.rb +2 -0
  172. data/lib/sqreen/version.rb +3 -1
  173. data/lib/sqreen/waf_error.rb +2 -0
  174. data/lib/sqreen/weave.rb +12 -0
  175. data/lib/sqreen/weave/hardcoded.rb +19 -0
  176. data/lib/sqreen/weave/instrumentor.rb +48 -0
  177. data/lib/sqreen/weave/legacy.rb +12 -0
  178. data/lib/sqreen/weave/legacy/instrumentation.rb +406 -0
  179. data/lib/sqreen/web_server.rb +2 -0
  180. data/lib/sqreen/web_server/generic.rb +2 -0
  181. data/lib/sqreen/web_server/passenger.rb +2 -0
  182. data/lib/sqreen/web_server/puma.rb +2 -0
  183. data/lib/sqreen/web_server/rainbows.rb +2 -0
  184. data/lib/sqreen/web_server/thin.rb +2 -0
  185. data/lib/sqreen/web_server/unicorn.rb +2 -0
  186. data/lib/sqreen/web_server/webrick.rb +2 -0
  187. data/lib/sqreen/worker.rb +2 -0
  188. metadata +65 -9
  189. data/lib/sqreen/backport/original_name.rb +0 -86
  190. data/lib/sqreen/dependency/hook.rb +0 -102
@@ -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: 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
 
@@ -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
 
@@ -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: 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: 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
 
@@ -36,8 +38,16 @@ module Sqreen
36
38
  :default => false, :convert => :to_bool },
37
39
  { :env => :SQREEN_LIBSQREEN, :name => :libsqreen,
38
40
  :default => true, :convert => :to_bool },
39
- { :env => :SQREEN_URL, :name => :url,
41
+ { :env => :SQREEN_WEAVE, :name => :weave,
42
+ :default => true, :convert => :to_bool },
43
+ { :env => :SQREEN_WEAVE_STRATEGY, :name => :weave_strategy,
44
+ :default => :prepend, :convert => :to_sym },
45
+ { :env => :SQREEN_URL, :name => :url,
40
46
  :default => 'https://back.sqreen.io' },
47
+ { :env => :SQREEN_INGESTION_URL, :name => :ingestion_url,
48
+ :default => 'https://ingestion.sqreen.com/' },
49
+ { :env => :SQREEN_PROXY_URL, :name => :proxy_url,
50
+ :default => nil },
41
51
  { :env => :SQREEN_TOKEN, :name => :token,
42
52
  :default => nil },
43
53
  { :env => :SQREEN_APP_NAME, :name => :app_name,
@@ -83,6 +93,10 @@ module Sqreen
83
93
  str.to_i
84
94
  end
85
95
 
96
+ def self.to_sym(value)
97
+ value.to_sym
98
+ end
99
+
86
100
  # Class to access configurations variables
87
101
  # This try to load environment by different ways.
88
102
  # 1. By file:
@@ -206,5 +220,9 @@ module Sqreen
206
220
  def to_int(value)
207
221
  Sqreen::to_int(value)
208
222
  end
223
+
224
+ def to_sym(value)
225
+ Sqreen::to_sym(value)
226
+ end
209
227
  end
210
228
  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
 
@@ -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
 
@@ -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: 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
 
@@ -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
 
@@ -6,6 +8,7 @@
6
8
  # TODO: Sqreen::RequestRecord => sqreen/events
7
9
  # TODO: Sqreen.time
8
10
 
11
+ require 'sqreen/aggregated_metric'
9
12
  require 'sqreen/events/attack'
10
13
  require 'sqreen/events/remote_exception'
11
14
  require 'sqreen/mono_time'
@@ -89,9 +92,11 @@ module Sqreen
89
92
  def event_key(event)
90
93
  case event
91
94
  when Sqreen::Attack
92
- "att-#{event.type}"
95
+ "att-#{event.rule_name}"
93
96
  when Sqreen::RemoteException
94
97
  "rex-#{event.klass}"
98
+ when Sqreen::AggregatedMetric
99
+ "agg-metric"
95
100
  end
96
101
  end
97
102
  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
 
@@ -5,6 +7,7 @@
5
7
  # TODO: Sqreen::RemoteException => sqreen/events
6
8
  # TODO: Sqreen::RequestRecord => sqreen/events
7
9
 
10
+ require 'sqreen/log/loggable'
8
11
  require 'sqreen/events/attack'
9
12
  require 'sqreen/events/remote_exception'
10
13
  require 'sqreen/events/request_record'
@@ -13,6 +16,7 @@ module Sqreen
13
16
  module Deliveries
14
17
  # Simple delivery method that directly call session on event
15
18
  class Simple
19
+ include Log::Loggable
16
20
  attr_accessor :session
17
21
 
18
22
  def initialize(session)
@@ -27,6 +31,8 @@ module Sqreen
27
31
  session.post_sqreen_exception(event)
28
32
  when Sqreen::RequestRecord
29
33
  session.post_request_record(event)
34
+ when Sqreen::AggregatedMetric
35
+ logger.warn 'Delivery of metrics using signals is not supported with simple delivery'
30
36
  else
31
37
  session.post_event(event)
32
38
  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
 
@@ -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_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
@@ -1,6 +1,10 @@
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
+ require 'sqreen/dependency'
7
+
4
8
  module Sqreen
5
9
  module Dependency
6
10
  module LibSqreen
@@ -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?
@@ -1,6 +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
 
6
+ require 'sqreen/shrink_wrap'
4
7
  require 'sqreen/middleware'
5
8
  require 'sqreen/error_handling_middleware'
6
9
  require 'sqreen/rails_middleware'
@@ -27,6 +30,7 @@ module Sqreen
27
30
  def insert_sqreen_middlewares
28
31
  Sqreen.log.debug { 'Inserting Sqreen middlewares for Rails' }
29
32
  app = ::Rails.application
33
+ app.middleware.insert(0, Sqreen::ShrinkWrap)
30
34
  app.middleware.insert_after(::Rack::Runtime, Sqreen::Middleware)
31
35
  app.middleware.insert_after(::ActionDispatch::DebugExceptions, Sqreen::RailsMiddleware)
32
36
  app.middleware.insert_after(::ActionDispatch::DebugExceptions, Sqreen::ErrorHandlingMiddleware)
@@ -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,6 +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
 
6
+ require 'sqreen/shrink_wrap'
4
7
  require 'sqreen/middleware'
5
8
  require 'sqreen/error_handling_middleware'
6
9
  require 'sqreen/sinatra_middleware'
@@ -33,7 +36,7 @@ module Sqreen
33
36
  end
34
37
  end
35
38
 
36
- insert_middleware(builder, Sqreen::Middleware, args, block) do |p, u|
39
+ insert_middleware(builder, Sqreen::ShrinkWrap, args, block) do |p, u|
37
40
  if (i = middlewares(builder).index(::Sinatra::ExtendedRack))
38
41
  u.insert(i, p)
39
42
  else
@@ -41,6 +44,14 @@ module Sqreen
41
44
  end
42
45
  end
43
46
 
47
+ insert_middleware(builder, Sqreen::Middleware, args, block) do |p, u|
48
+ if (i = middlewares(builder).index(::Sinatra::ExtendedRack))
49
+ u.insert(i, p)
50
+ else
51
+ u.insert(1, p)
52
+ end
53
+ end
54
+
44
55
  insert_middleware(builder, Sqreen::SinatraMiddleware, args, block) do |p, u|
45
56
  if ::Sqreen::Dependency.const_exist?('Rack::PostBodyContentTypeParser') && (i = middlewares(builder).index(::Rack::PostBodyContentTypeParser))
46
57
  u.insert(i + 1, p)
@@ -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
 
@@ -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: 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,17 +8,19 @@
6
8
  module Sqreen
7
9
  # Master interface for point in time events (e.g. Attack, RemoteException)
8
10
  class Event
11
+ # @return [Hash]
9
12
  attr_reader :payload
13
+
14
+ # @return [Time]
15
+ attr_accessor :time # writer used only in tests
16
+
10
17
  def initialize(payload)
11
18
  @payload = payload
12
- end
13
-
14
- def to_hash
15
- payload.to_hash
19
+ @time = Time.now.utc
16
20
  end
17
21
 
18
22
  def to_s
19
- "<#{self.class.name}: #{to_hash}>"
23
+ "<#{self.class.name}: #{payload.to_hash}>"
20
24
  end
21
25
  end
22
26
  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
 
@@ -9,6 +11,8 @@ module Sqreen
9
11
  # Attack
10
12
  # When creating a new attack, it gets automatically pushed to the event's
11
13
  # queue.
14
+ # XXX: TURNS OUT THIS CLASS IS ACTUALLY NOT USED ANYMORE
15
+ # Framework.observe is used instead with unstructured attack details
12
16
  class Attack < Event
13
17
  def self.record(payload)
14
18
  attack = Attack.new(payload)
@@ -24,11 +28,31 @@ module Sqreen
24
28
  payload['rule']['rulespack_id']
25
29
  end
26
30
 
27
- def type
31
+ def rule_name
28
32
  return nil unless payload['rule']
29
33
  payload['rule']['name']
30
34
  end
31
35
 
36
+ def test?
37
+ return nil unless payload['rule']
38
+ payload['rule']['test'] ? true : false
39
+ end
40
+
41
+ def beta?
42
+ return nil unless payload['rule']
43
+ payload['rule']['beta'] ? true : false
44
+ end
45
+
46
+ def block?
47
+ return nil unless payload['rule']
48
+ payload['rule']['block'] ? true : false
49
+ end
50
+
51
+ def attack_type
52
+ return nil unless payload['rule']
53
+ payload['rule']['attack_type']
54
+ end
55
+
32
56
  def time
33
57
  return nil unless payload['local']
34
58
  payload['local']['time']
@@ -42,22 +66,5 @@ module Sqreen
42
66
  def enqueue
43
67
  Sqreen.queue.push(self)
44
68
  end
45
-
46
- def to_hash
47
- res = {}
48
- rule_p = payload['rule']
49
- request_p = payload['request']
50
- res[:rule_name] = rule_p['name'] if rule_p && rule_p['name']
51
- res[:rulespack_id] = rule_p['rulespack_id'] if rule_p && rule_p['rulespack_id']
52
- res[:test] = rule_p['test'] if rule_p && rule_p['test']
53
- res[:infos] = payload['infos'] if payload['infos']
54
- res[:time] = time if time
55
- res[:client_ip] = request_p[:addr] if request_p && request_p[:addr]
56
- res[:request] = request_p if request_p
57
- res[:params] = payload['params'] if payload['params']
58
- res[:context] = payload['context'] if payload['context']
59
- res[:headers] = payload['headers'] if payload['headers']
60
- res
61
- end
62
69
  end
63
70
  end