sqreen 1.18.4-java → 1.19.2-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 (180) 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/attack_blocked.rb +2 -0
  18. data/lib/sqreen/backport.rb +2 -0
  19. data/lib/sqreen/backport/clock_gettime.rb +74 -0
  20. data/lib/sqreen/backport/original_name.rb +2 -0
  21. data/lib/sqreen/binding_accessor.rb +2 -0
  22. data/lib/sqreen/binding_accessor/path_elem.rb +2 -0
  23. data/lib/sqreen/binding_accessor/transforms.rb +8 -1
  24. data/lib/sqreen/call_countable.rb +2 -0
  25. data/lib/sqreen/capped_queue.rb +2 -0
  26. data/lib/sqreen/cb.rb +2 -0
  27. data/lib/sqreen/cb_tree.rb +2 -0
  28. data/lib/sqreen/condition_evaluator.rb +2 -0
  29. data/lib/sqreen/conditionable.rb +2 -0
  30. data/lib/sqreen/configuration.rb +14 -0
  31. data/lib/sqreen/context.rb +2 -0
  32. data/lib/sqreen/default_cb.rb +2 -0
  33. data/lib/sqreen/deferred_logger.rb +2 -0
  34. data/lib/sqreen/deliveries.rb +2 -0
  35. data/lib/sqreen/deliveries/batch.rb +2 -0
  36. data/lib/sqreen/deliveries/simple.rb +2 -0
  37. data/lib/sqreen/dependency.rb +3 -1
  38. data/lib/sqreen/dependency/detector.rb +22 -14
  39. data/lib/sqreen/dependency/libsqreen.rb +4 -0
  40. data/lib/sqreen/dependency/new_relic.rb +2 -0
  41. data/lib/sqreen/dependency/rack.rb +10 -5
  42. data/lib/sqreen/dependency/rails.rb +4 -0
  43. data/lib/sqreen/dependency/sentry.rb +2 -0
  44. data/lib/sqreen/dependency/sinatra.rb +12 -1
  45. data/lib/sqreen/encoding_sanitizer.rb +2 -0
  46. data/lib/sqreen/error_handling_middleware.rb +2 -0
  47. data/lib/sqreen/event.rb +2 -0
  48. data/lib/sqreen/events/attack.rb +2 -0
  49. data/lib/sqreen/events/remote_exception.rb +2 -0
  50. data/lib/sqreen/events/request_record.rb +2 -0
  51. data/lib/sqreen/exception.rb +2 -0
  52. data/lib/sqreen/formatter_with_tid.rb +2 -0
  53. data/lib/sqreen/framework_cb.rb +2 -0
  54. data/lib/sqreen/frameworks.rb +2 -0
  55. data/lib/sqreen/frameworks/generic.rb +2 -0
  56. data/lib/sqreen/frameworks/rails.rb +1 -0
  57. data/lib/sqreen/frameworks/rails3.rb +2 -0
  58. data/lib/sqreen/frameworks/request_recorder.rb +2 -0
  59. data/lib/sqreen/frameworks/sinatra.rb +2 -0
  60. data/lib/sqreen/frameworks/sqreen_test.rb +2 -0
  61. data/lib/sqreen/graft.rb +12 -0
  62. data/lib/sqreen/graft/call.rb +150 -0
  63. data/lib/sqreen/{dependency → graft}/callback.rb +12 -4
  64. data/lib/sqreen/graft/hook.rb +316 -0
  65. data/lib/sqreen/{dependency → graft}/hook_point.rb +152 -33
  66. data/lib/sqreen/graft/hook_point_error.rb +10 -0
  67. data/lib/sqreen/invalid_signature_exception.rb +2 -0
  68. data/lib/sqreen/js.rb +2 -0
  69. data/lib/sqreen/js/call_context.rb +2 -0
  70. data/lib/sqreen/js/context_pool.rb +2 -0
  71. data/lib/sqreen/js/exec_js_runnable.rb +2 -0
  72. data/lib/sqreen/js/execjs_adapter.rb +2 -0
  73. data/lib/sqreen/js/executable_js.rb +2 -0
  74. data/lib/sqreen/js/js_service.rb +2 -0
  75. data/lib/sqreen/js/js_service_adapter.rb +2 -0
  76. data/lib/sqreen/js/mini_racer_adapter.rb +2 -0
  77. data/lib/sqreen/js/mini_racer_executable_js.rb +2 -0
  78. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +2 -0
  79. data/lib/sqreen/legacy.rb +8 -0
  80. data/lib/sqreen/{instrumentation.rb → legacy/instrumentation.rb} +31 -2
  81. data/lib/sqreen/log.rb +2 -0
  82. data/lib/sqreen/log/loggable.rb +28 -0
  83. data/lib/sqreen/logger.rb +2 -0
  84. data/lib/sqreen/metrics.rb +2 -0
  85. data/lib/sqreen/metrics/average.rb +2 -0
  86. data/lib/sqreen/metrics/base.rb +2 -0
  87. data/lib/sqreen/metrics/binning.rb +2 -0
  88. data/lib/sqreen/metrics/collect.rb +2 -0
  89. data/lib/sqreen/metrics/sum.rb +2 -0
  90. data/lib/sqreen/metrics_store.rb +2 -0
  91. data/lib/sqreen/metrics_store/already_registered_metric.rb +2 -0
  92. data/lib/sqreen/metrics_store/unknown_metric.rb +2 -0
  93. data/lib/sqreen/metrics_store/unregistered_metric.rb +2 -0
  94. data/lib/sqreen/middleware.rb +2 -0
  95. data/lib/sqreen/mono_time.rb +2 -0
  96. data/lib/sqreen/node.rb +2 -0
  97. data/lib/sqreen/not_implemented_yet.rb +2 -0
  98. data/lib/sqreen/null_logger.rb +2 -0
  99. data/lib/sqreen/payload_creator.rb +2 -0
  100. data/lib/sqreen/payload_creator/header_section.rb +2 -0
  101. data/lib/sqreen/performance_notifications.rb +2 -0
  102. data/lib/sqreen/performance_notifications/binned_metrics.rb +2 -0
  103. data/lib/sqreen/performance_notifications/log.rb +2 -0
  104. data/lib/sqreen/performance_notifications/log_performance.rb +2 -0
  105. data/lib/sqreen/performance_notifications/metrics.rb +2 -0
  106. data/lib/sqreen/performance_notifications/newrelic.rb +2 -0
  107. data/lib/sqreen/prefix.rb +2 -0
  108. data/lib/sqreen/rails_middleware.rb +2 -0
  109. data/lib/sqreen/remote_command.rb +2 -0
  110. data/lib/sqreen/remote_command/failure_output.rb +5 -0
  111. data/lib/sqreen/rules.rb +2 -0
  112. data/lib/sqreen/rules/attrs.rb +2 -0
  113. data/lib/sqreen/rules/auth_track_cb.rb +2 -0
  114. data/lib/sqreen/rules/binding_accessor_matcher_cb.rb +2 -0
  115. data/lib/sqreen/rules/binding_accessor_metrics.rb +2 -0
  116. data/lib/sqreen/rules/blacklist_ips_cb.rb +2 -0
  117. data/lib/sqreen/rules/count_http_codes.rb +2 -0
  118. data/lib/sqreen/rules/crawler_user_agent_matches_cb.rb +2 -0
  119. data/lib/sqreen/rules/crawler_user_agent_matches_metrics_cb.rb +2 -0
  120. data/lib/sqreen/rules/custom_error_cb.rb +2 -0
  121. data/lib/sqreen/rules/devise_auth_track_cb.rb +2 -0
  122. data/lib/sqreen/rules/devise_signup_track_cb.rb +2 -0
  123. data/lib/sqreen/rules/execjs_cb.rb +2 -0
  124. data/lib/sqreen/rules/headers_insert_cb.rb +7 -0
  125. data/lib/sqreen/rules/matcher_rule.rb +2 -0
  126. data/lib/sqreen/rules/not_found_cb.rb +7 -0
  127. data/lib/sqreen/rules/rails_parameters_cb.rb +2 -0
  128. data/lib/sqreen/rules/record_request_context.rb +2 -0
  129. data/lib/sqreen/rules/regexp_rule_cb.rb +2 -0
  130. data/lib/sqreen/rules/rule_cb.rb +2 -0
  131. data/lib/sqreen/rules/run_req_start_actions.rb +3 -1
  132. data/lib/sqreen/rules/run_user_actions.rb +3 -1
  133. data/lib/sqreen/rules/shell_env_cb.rb +2 -0
  134. data/lib/sqreen/rules/signup_track_cb.rb +2 -0
  135. data/lib/sqreen/rules/update_request_context.rb +2 -0
  136. data/lib/sqreen/rules/url_matches_cb.rb +2 -0
  137. data/lib/sqreen/rules/user_agent_matches_cb.rb +2 -0
  138. data/lib/sqreen/rules/waf_cb.rb +30 -7
  139. data/lib/sqreen/rules/xss_cb.rb +2 -0
  140. data/lib/sqreen/run_when_called_cb.rb +2 -0
  141. data/lib/sqreen/runner.rb +25 -7
  142. data/lib/sqreen/runtime_infos.rb +2 -0
  143. data/lib/sqreen/safe_json.rb +2 -0
  144. data/lib/sqreen/sdk.rb +4 -0
  145. data/lib/sqreen/sensitive_data_redactor.rb +2 -0
  146. data/lib/sqreen/serializer.rb +2 -0
  147. data/lib/sqreen/session.rb +2 -0
  148. data/lib/sqreen/shared_storage.rb +2 -0
  149. data/lib/sqreen/shared_storage23.rb +2 -0
  150. data/lib/sqreen/shrink_wrap.rb +16 -0
  151. data/lib/sqreen/signature_verifier.rb +2 -0
  152. data/lib/sqreen/sinatra_middleware.rb +2 -0
  153. data/lib/sqreen/sqreen_signed_verifier.rb +2 -0
  154. data/lib/sqreen/token_invalid_exception.rb +2 -0
  155. data/lib/sqreen/token_not_found_exception.rb +2 -0
  156. data/lib/sqreen/trie.rb +2 -0
  157. data/lib/sqreen/unauthorized.rb +2 -0
  158. data/lib/sqreen/util.rb +5 -0
  159. data/lib/sqreen/util/capped_array.rb +2 -0
  160. data/lib/sqreen/util/capped_hash.rb +2 -0
  161. data/lib/sqreen/util/capped_string.rb +2 -0
  162. data/lib/sqreen/util/capper.rb +2 -0
  163. data/lib/sqreen/version.rb +3 -1
  164. data/lib/sqreen/waf_error.rb +2 -0
  165. data/lib/sqreen/weave.rb +12 -0
  166. data/lib/sqreen/weave/hardcoded.rb +19 -0
  167. data/lib/sqreen/weave/instrumentor.rb +48 -0
  168. data/lib/sqreen/weave/legacy.rb +12 -0
  169. data/lib/sqreen/weave/legacy/instrumentation.rb +406 -0
  170. data/lib/sqreen/web_server.rb +2 -0
  171. data/lib/sqreen/web_server/generic.rb +2 -0
  172. data/lib/sqreen/web_server/passenger.rb +2 -0
  173. data/lib/sqreen/web_server/puma.rb +2 -0
  174. data/lib/sqreen/web_server/rainbows.rb +2 -0
  175. data/lib/sqreen/web_server/thin.rb +2 -0
  176. data/lib/sqreen/web_server/unicorn.rb +2 -0
  177. data/lib/sqreen/web_server/webrick.rb +2 -0
  178. data/lib/sqreen/worker.rb +2 -0
  179. metadata +26 -7
  180. data/lib/sqreen/dependency/hook.rb +0 -102
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 43b9ddb790f25ff47df2953ec789110bc2273fa02fe632b76c36066da880ad9a
4
- data.tar.gz: 05544de42de06ad978ea9dfe330b330a090eff0ae8661bdfa8509251cf57d9ce
3
+ metadata.gz: a53d1102a76d7218c37306492482b71b5639ee519d085c3fd6aa219bbc3d1b93
4
+ data.tar.gz: cd477f8dbb86292c8c7bfec97b8a658927ded45f594f718250eb6848ba81d731
5
5
  SHA512:
6
- metadata.gz: e3ba0e41808617dddbfc03d2f8807fa8039ad1ad40ac6a8b815082986ac8ef39aae795e1867faa685625c5a048f36a44beb4e29092528f7cb28aa087bd3a8034
7
- data.tar.gz: b7f7b42ea91a2a9ece4e660485dac8aa65c4dfa635241f9e685b3ff855d21f68c091260814a9c7a14f3ecd9c6fe92f03824f084c718e8cb27691569537e5c011
6
+ metadata.gz: b306a201d11156c4e9213a7f0ffa218597c1e59e520b6575476d7e151813364f782f659e7955844023eb3e880d5024058f0ea7eb509b239a93eedda856c3901d
7
+ data.tar.gz: e3c458d1d3625d9d78ff1e1599a1d47297629633537319360da003c61c9d44e4b7832ed828b5adcd15be619b3518eafe061b0fdfa62fc14103f73c49317fc452
@@ -1,3 +1,30 @@
1
+ ## 1.19.2
2
+
3
+ * Handle unexpected rule callback return values more gracefully
4
+ * Fix incorrect return value for 404 native callback
5
+
6
+ ## 1.19.1
7
+
8
+ * Fix LocalJumpError when reaching a Rack app nested in a Rails app
9
+
10
+ ## 1.19.0
11
+
12
+ * Upgrade WAF features via libsqreen 0.6.1
13
+ * Improve time defensiveness in WAF
14
+ * Improve compatibility with APM agents via a new optional instrumentation engine
15
+ * Fix action reloading not being entirely cleared on reload
16
+ * Improve handling of hash symbol keys in some security rules
17
+ * Fix constant resolution scope on agent boot
18
+
19
+ ## 1.18.6
20
+
21
+ * Improve default WAF time budget handling logic
22
+
23
+ ## 1.18.5
24
+
25
+ * Fix type mismatch in WAF time budget handling
26
+ * Improve exception handling for non-WAF errors within WAF
27
+
1
28
  ## 1.18.4
2
29
 
3
30
  * Fix instrumentation conflict when a class defines a send method
@@ -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,16 @@
1
+ # typed: true
2
+ module Sqreen
3
+ module Actions
4
+ # documents the operations an actions index should implement
5
+ class ActionsIndex
6
+ # all actions matching, possibly already expired
7
+ def actions_matching(_key)
8
+ raise 'implement in subclasses'
9
+ end
10
+
11
+ def index(_params, _action)
12
+ raise 'implement in subclasses'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,8 +1,11 @@
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
  # TODO: remove class vars
5
7
 
8
+ require 'sqreen/sdk'
6
9
  require 'sqreen/exception'
7
10
 
8
11
  module Sqreen
@@ -75,16 +78,7 @@ module Sqreen
75
78
  subclasses.keys
76
79
  end
77
80
 
78
- # all actions matching, possibly already expired
79
- def actions_matching(_key)
80
- raise 'implement in singletons of subclasses'
81
- end
82
-
83
- def index(_params, _action)
84
- raise 'implement in singletons of subclasses'
85
- end
86
-
87
- def clear
81
+ def new_index
88
82
  raise 'implement in singletons of subclasses'
89
83
  end
90
84
 
@@ -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: 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,30 +8,8 @@ require 'sqreen/actions/ip_ranges_index'
6
8
  module Sqreen
7
9
  module Actions
8
10
  module IpRangeIndexedActionClass
9
- include IpRangesIndex
10
-
11
- def actions_matching(client_ip)
12
- matching_actions client_ip
13
- end
14
-
15
- def index(params, action)
16
- ranges = parse_ip_ranges params
17
-
18
- ranges.each do |r|
19
- add_prefix r, action
20
- end
21
- end
22
-
23
- private
24
-
25
- # returns array of prefixes in string form
26
- def parse_ip_ranges(params)
27
- ranges = params['ip_cidr']
28
- unless ranges && ranges.is_a?(Array) && !ranges.empty?
29
- raise 'no non-empty ip_cidr array present'
30
- end
31
-
32
- ranges
11
+ def new_index
12
+ IpRangesIndex.new
33
13
  end
34
14
  end
35
15
  end
@@ -1,22 +1,30 @@
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
  require 'ipaddr'
7
+ require 'sqreen/actions/actions_index'
5
8
  require 'sqreen/trie'
6
9
  require 'sqreen/prefix'
7
10
 
8
11
  module Sqreen
9
12
  module Actions
10
- module IpRangesIndex
11
- def add_prefix(prefix_str, data)
12
- @trie_v4 ||= Sqreen::Trie.new
13
- @trie_v6 ||= Sqreen::Trie.new(nil, nil, Socket::AF_INET6)
14
- prefix = Sqreen::Prefix.from_str(prefix_str, data)
15
- trie = prefix.family == Socket::AF_INET6 ? @trie_v6 : @trie_v4
16
- trie.insert prefix
13
+ class IpRangesIndex < ActionsIndex
14
+ def initialize
15
+ @trie_v4 = Sqreen::Trie.new
16
+ @trie_v6 = Sqreen::Trie.new(nil, nil, Socket::AF_INET6)
17
+ end
18
+
19
+ def index(params, action)
20
+ ranges = parse_ip_ranges params
21
+
22
+ ranges.each do |r|
23
+ add_prefix r, action
24
+ end
17
25
  end
18
26
 
19
- def matching_actions(client_ip)
27
+ def actions_matching(client_ip)
20
28
  parsed_ip = IPAddr.new(client_ip.gsub(/%[^%\/]+/, ''))
21
29
  trie = parsed_ip.family == Socket::AF_INET6 ? @trie_v6 : @trie_v4
22
30
  return [] unless trie
@@ -27,9 +35,22 @@ module Sqreen
27
35
  found.map(&:data)
28
36
  end
29
37
 
30
- def clear
31
- @trie_v4 = Sqreen::Trie.new
32
- @trie_v6 = Sqreen::Trie.new(nil, nil, Socket::AF_INET6)
38
+ private
39
+
40
+ # returns array of prefixes in string form
41
+ def parse_ip_ranges(params)
42
+ ranges = params['ip_cidr']
43
+ unless ranges && ranges.is_a?(Array) && !ranges.empty?
44
+ raise 'no non-empty ip_cidr array present'
45
+ end
46
+
47
+ ranges
48
+ end
49
+
50
+ def add_prefix(prefix_str, data)
51
+ prefix = Sqreen::Prefix.from_str(prefix_str, data)
52
+ trie = prefix.family == Socket::AF_INET6 ? @trie_v6 : @trie_v4
53
+ trie.insert prefix
33
54
  end
34
55
  end
35
56
  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,24 +1,43 @@
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
  module Sqreen
5
7
  module Actions
6
- # Where the currently loaded actions are stored. Singleton
8
+ # Where the actions are stored
9
+ # The current ones are stored in Repository.current
7
10
  class Repository
8
- include Singleton
11
+ def initialize
12
+ @indexes = Hash[Base.known_subclasses.map do |clazz|
13
+ [clazz.type_name, clazz.new_index]
14
+ end]
15
+ end
9
16
 
10
17
  def add(params, action)
11
- action.class.index(params || {}, action)
18
+ @indexes[action.class.type_name].index(params || {}, action)
12
19
  end
13
20
 
14
- def get(action_class, key)
15
- action_class = Base.get_type_class(action_class) unless action_class.class == Class
16
- action_class.actions_matching key
21
+ # type is either a class or a type name
22
+ def get(type, key)
23
+ type = type.type_name if type.class == Class
24
+ @indexes[type].actions_matching key
17
25
  end
18
26
 
19
- def clear
20
- Base.known_subclasses.each(&:clear)
27
+ singleton_class.class_eval do
28
+ attr_reader :current
29
+ def current=(new_inst)
30
+ raise 'nil is unacceptable' if new_inst.nil?
31
+ @current = new_inst
32
+ end
33
+
34
+ def clear
35
+ self.current = Repository.new
36
+ end
21
37
  end
38
+
39
+ # initialize current to empty repository
40
+ clear
22
41
  end
23
42
  end
24
43
  end
@@ -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/exception'
7
+
4
8
  module Sqreen
5
9
  # Implements actions (behavior taken in response to agent signals)
6
10
  module Actions
@@ -1,40 +1,15 @@
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/exception'
6
+ require 'sqreen/actions/users_index'
5
7
 
6
8
  module Sqreen
7
9
  module Actions
8
10
  module UserActionClass
9
- def actions_matching(identity_params)
10
- return [] unless @idx
11
- key = stringify_keys(identity_params)
12
- actions = @idx[key]
13
- actions || []
14
- end
15
-
16
- def index(params, action)
17
- @idx ||= {}
18
- users = params['users']
19
- raise ::Sqreen::Exception, 'nil "users" param for block_user action' if users.nil?
20
- raise ::Sqreen::Exception, '"users" param must be an array' unless users.is_a? Array
21
-
22
- users.each do |u|
23
- @idx[u] ||= []
24
- @idx[u] << action
25
- end
26
- end
27
-
28
- def clear
29
- @idx = {}
30
- end
31
-
32
- private
33
-
34
- def stringify_keys(hash)
35
- Hash[
36
- hash.map { |k, v| [k.to_s, v] }
37
- ]
11
+ def new_index
12
+ UsersIndex.new
38
13
  end
39
14
  end
40
15
  end
@@ -0,0 +1,35 @@
1
+ # typed: true
2
+ require 'sqreen/actions/actions_index'
3
+
4
+ module Sqreen
5
+ module Actions
6
+ class UsersIndex < ActionsIndex
7
+ def actions_matching(identity_params)
8
+ return [] unless @idx
9
+ key = stringify_keys(identity_params)
10
+ actions = @idx[key]
11
+ actions || []
12
+ end
13
+
14
+ def index(params, action)
15
+ @idx ||= {}
16
+ users = params['users']
17
+ raise ::Sqreen::Exception, 'nil "users" param for block_user action' if users.nil?
18
+ raise ::Sqreen::Exception, '"users" param must be an array' unless users.is_a? Array
19
+
20
+ users.each do |u|
21
+ @idx[u] ||= []
22
+ @idx[u] << action
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def stringify_keys(hash)
29
+ Hash[
30
+ hash.map { |k, v| [k.to_s, v] }
31
+ ]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,8 +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
6
  require 'sqreen/version'
5
- require 'sqreen/instrumentation'
6
7
  require 'sqreen/session'
7
8
  require 'sqreen/runner'
8
9
  require 'sqreen/log'
@@ -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: strong
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -0,0 +1,74 @@
1
+ # typed: ignore
2
+
3
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
+
6
+ require 'sqreen/backport'
7
+
8
+ module Sqreen
9
+ module Backport
10
+ module ClockGettime
11
+ class << self
12
+ def supported?
13
+ Process.respond_to?(:clock_gettime)
14
+ end
15
+ end
16
+
17
+ unless supported?
18
+ require 'ffi'
19
+
20
+ class Timespec < FFI::Struct
21
+ layout :tv_sec => :time_t, :tv_nsec => :long
22
+ end
23
+
24
+ module LibC
25
+ extend FFI::Library
26
+ ffi_lib FFI::Library::LIBC
27
+
28
+ # TODO: FFI::NotFoundError
29
+
30
+ if RUBY_PLATFORM =~ /darwin/
31
+ attach_function :mach_absolute_time, [], :uint64
32
+ end
33
+
34
+ attach_function :clock_gettime, [:int, :pointer], :int
35
+ end
36
+
37
+ module Constants
38
+ case RUBY_PLATFORM
39
+ when /darwin/
40
+ CLOCK_REALTIME = 0
41
+ CLOCK_MONOTONIC = 6
42
+ CLOCK_PROCESS_CPUTIME_ID = 12
43
+ CLOCK_THERAD_CPUTIME_ID = 16
44
+ when /linux/
45
+ CLOCK_REALTIME = 0
46
+ CLOCK_MONOTONIC = 1
47
+ CLOCK_PROCESS_CPUTIME_ID = 2
48
+ CLOCK_THREAD_CPUTIME_ID = 3
49
+ end
50
+ end
51
+
52
+ def clock_gettime(clock_id, unit = :float_second)
53
+ unless unit == :float_second
54
+ raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
55
+ end
56
+
57
+ t = Timespec.new
58
+ ret = LibC.clock_gettime(clock_id, t.pointer)
59
+
60
+ raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
61
+
62
+ t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ unless Sqreen::Backport::ClockGettime.supported?
70
+ Process.instance_eval do
71
+ extend Sqreen::Backport::ClockGettime
72
+ include Sqreen::Backport::ClockGettime::Constants
73
+ end
74
+ end