sqreen 1.18.3.beta1 → 1.18.3.beta2

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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -5
  3. data/lib/sqreen/actions.rb +11 -337
  4. data/lib/sqreen/actions/base.rb +110 -0
  5. data/lib/sqreen/actions/block_ip.rb +32 -0
  6. data/lib/sqreen/actions/block_user.rb +44 -0
  7. data/lib/sqreen/actions/ip_range_indexed_action_class.rb +36 -0
  8. data/lib/sqreen/actions/ip_ranges_index.rb +36 -0
  9. data/lib/sqreen/actions/redirect_ip.rb +40 -0
  10. data/lib/sqreen/actions/redirect_user.rb +45 -0
  11. data/lib/sqreen/actions/repository.rb +24 -0
  12. data/lib/sqreen/actions/unknown_action_type.rb +16 -0
  13. data/lib/sqreen/actions/user_action_class.rb +41 -0
  14. data/lib/sqreen/agent.rb +4 -1
  15. data/lib/sqreen/attack_blocked.rb +17 -0
  16. data/lib/sqreen/binding_accessor.rb +9 -102
  17. data/lib/sqreen/binding_accessor/path_elem.rb +8 -0
  18. data/lib/sqreen/binding_accessor/transforms.rb +107 -0
  19. data/lib/sqreen/capped_queue.rb +2 -0
  20. data/lib/sqreen/{callbacks.rb → cb.rb} +1 -53
  21. data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +2 -2
  22. data/lib/sqreen/condition_evaluator.rb +22 -5
  23. data/lib/sqreen/configuration.rb +3 -0
  24. data/lib/sqreen/default_cb.rb +20 -0
  25. data/lib/sqreen/deferred_logger.rb +63 -0
  26. data/lib/sqreen/deliveries.rb +10 -0
  27. data/lib/sqreen/deliveries/batch.rb +7 -1
  28. data/lib/sqreen/deliveries/simple.rb +5 -0
  29. data/lib/sqreen/dependency/rails.rb +4 -0
  30. data/lib/sqreen/dependency/sinatra.rb +4 -0
  31. data/lib/sqreen/error_handling_middleware.rb +30 -0
  32. data/lib/sqreen/event.rb +2 -0
  33. data/lib/sqreen/events/attack.rb +2 -0
  34. data/lib/sqreen/events/request_record.rb +11 -56
  35. data/lib/sqreen/exception.rb +9 -40
  36. data/lib/sqreen/formatter_with_tid.rb +45 -0
  37. data/lib/sqreen/framework_cb.rb +28 -0
  38. data/lib/sqreen/frameworks.rb +7 -0
  39. data/lib/sqreen/frameworks/generic.rb +5 -1
  40. data/lib/sqreen/frameworks/rails.rb +2 -0
  41. data/lib/sqreen/frameworks/request_recorder.rb +3 -0
  42. data/lib/sqreen/frameworks/sinatra.rb +2 -0
  43. data/lib/sqreen/frameworks/sqreen_test.rb +2 -0
  44. data/lib/sqreen/instrumentation.rb +5 -5
  45. data/lib/sqreen/invalid_signature_exception.rb +8 -0
  46. data/lib/{sqreen-alt.rb → sqreen/js.rb} +6 -1
  47. data/lib/sqreen/js/call_context.rb +10 -0
  48. data/lib/sqreen/js/context_pool.rb +60 -0
  49. data/lib/sqreen/js/exec_js_runnable.rb +20 -0
  50. data/lib/sqreen/js/execjs_adapter.rb +6 -47
  51. data/lib/sqreen/js/executable_js.rb +12 -0
  52. data/lib/sqreen/js/js_service.rb +2 -22
  53. data/lib/sqreen/js/js_service_adapter.rb +18 -0
  54. data/lib/sqreen/js/mini_racer_adapter.rb +6 -180
  55. data/lib/sqreen/js/mini_racer_executable_js.rb +142 -0
  56. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +47 -0
  57. data/lib/sqreen/log.rb +8 -188
  58. data/lib/sqreen/logger.rb +83 -0
  59. data/lib/sqreen/metrics_store.rb +3 -11
  60. data/lib/sqreen/metrics_store/already_registered_metric.rb +11 -0
  61. data/lib/sqreen/metrics_store/unknown_metric.rb +11 -0
  62. data/lib/sqreen/metrics_store/unregistered_metric.rb +11 -0
  63. data/lib/sqreen/middleware.rb +0 -44
  64. data/lib/sqreen/mono_time.rb +2 -0
  65. data/lib/sqreen/node.rb +44 -0
  66. data/lib/sqreen/not_implemented_yet.rb +8 -0
  67. data/lib/sqreen/null_logger.rb +24 -0
  68. data/lib/sqreen/payload_creator.rb +2 -19
  69. data/lib/sqreen/payload_creator/header_section.rb +28 -0
  70. data/lib/sqreen/prefix.rb +33 -0
  71. data/lib/sqreen/rails_middleware.rb +14 -0
  72. data/lib/sqreen/remote_command.rb +1 -8
  73. data/lib/sqreen/remote_command/failure_output.rb +11 -0
  74. data/lib/sqreen/rules.rb +32 -2
  75. data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +0 -0
  76. data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +2 -2
  77. data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +4 -8
  78. data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +1 -1
  79. data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +3 -2
  80. data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +2 -2
  81. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +1 -1
  82. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +1 -1
  83. data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +1 -1
  84. data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +2 -2
  85. data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +2 -2
  86. data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +49 -50
  87. data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +1 -1
  88. data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +2 -2
  89. data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +2 -2
  90. data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +1 -1
  91. data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +1 -1
  92. data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +1 -1
  93. data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +2 -2
  94. data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +4 -2
  95. data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +1 -1
  96. data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +1 -1
  97. data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +2 -2
  98. data/lib/sqreen/{rules_callbacks → rules}/update_request_context.rb +1 -1
  99. data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +1 -1
  100. data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +1 -1
  101. data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +7 -3
  102. data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +10 -7
  103. data/lib/sqreen/run_when_called_cb.rb +21 -0
  104. data/lib/sqreen/sensitive_data_redactor.rb +111 -0
  105. data/lib/sqreen/signature_verifier.rb +20 -0
  106. data/lib/sqreen/sinatra_middleware.rb +14 -0
  107. data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +5 -17
  108. data/lib/sqreen/token_invalid_exception.rb +8 -0
  109. data/lib/sqreen/token_not_found_exception.rb +9 -0
  110. data/lib/sqreen/trie.rb +3 -64
  111. data/lib/sqreen/unauthorized.rb +8 -0
  112. data/lib/sqreen/util.rb +2 -0
  113. data/lib/sqreen/util/capped_array.rb +30 -0
  114. data/lib/sqreen/util/capped_hash.rb +36 -0
  115. data/lib/sqreen/util/capped_string.rb +22 -0
  116. data/lib/sqreen/util/capper.rb +57 -0
  117. data/lib/sqreen/version.rb +1 -1
  118. data/lib/sqreen/waf_error.rb +18 -0
  119. metadata +85 -36
  120. data/lib/sqreen/rules_callbacks.rb +0 -36
  121. data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
@@ -1,6 +1,8 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
+ # TODO: move to Sqreen::Time
5
+
4
6
  module Sqreen
5
7
  has_mono_time = begin
6
8
  Process.clock_gettime Process::CLOCK_MONOTONIC
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ # TODO: move to Sqreen::IP::Trie
5
+
6
+ module Sqreen
7
+ # bit starts at 0 (most significant)
8
+ Node = Struct.new(:bit, :prefix, :l, :r, :parent) do
9
+ def initialize(*args)
10
+ super
11
+ raise ArgumentError, 'no bit given' if bit.nil?
12
+ end
13
+
14
+ def empty?
15
+ prefix.nil?
16
+ end
17
+
18
+ # cover the whole tree
19
+ def walk(max_bits, empty_nodes = false)
20
+ xstack = Array.new(max_bits + 1)
21
+ sidx = 0 # stack index
22
+ xhead = self
23
+ xcur = xhead
24
+ until xcur.nil?
25
+ yield xcur unless xcur.empty? && !empty_nodes
26
+
27
+ if xcur.l
28
+ if xcur.r
29
+ xstack[sidx] = xcur.r
30
+ sidx += 1
31
+ end
32
+ xcur = xcur.l
33
+ elsif xcur.r
34
+ xcur = xcur.r
35
+ elsif sidx.nonzero?
36
+ sidx -= 1
37
+ xcur = xstack[sidx]
38
+ else
39
+ xcur = nil
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,8 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ require 'sqreen/exception'
5
+
6
+ module Sqreen
7
+ class NotImplementedYet < Sqreen::Exception; end
8
+ end
@@ -0,0 +1,24 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ require 'singleton'
5
+
6
+ module Sqreen
7
+ class NullLogger
8
+ include Singleton
9
+
10
+ def debug(_msg = nil); end
11
+
12
+ def info(_msg = nil); end
13
+
14
+ def warn(_msg = nil); end
15
+
16
+ def error(_msg = nil); end
17
+
18
+ def fatal(_msg = nil); end
19
+
20
+ def add(_severity, _msg = nil); end
21
+
22
+ def formatter=(_); end
23
+ end
24
+ end
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'sqreen/runtime_infos'
5
5
  require 'sqreen/events/remote_exception'
6
+ require 'sqreen/payload_creator/header_section'
6
7
 
7
8
  module Sqreen
8
9
  # Create a payload from a given query
@@ -116,26 +117,8 @@ module Sqreen
116
117
  Sqreen::RemoteException.record(e)
117
118
  end
118
119
 
119
- # object that default to call on framework header
120
- class HeaderSection
121
- def initialize(framework)
122
- @framework = framework
123
- end
124
-
125
- def [](value)
126
- if %w[rack_client_ip rails_client_ip ip_headers].include?(value)
127
- return @framework.send(value)
128
- end
129
- @framework.header(value)
130
- end
131
-
132
- def ip_headers
133
- @framework.ip_headers
134
- end
135
- end
136
-
137
120
  def section_headers(framework)
138
- HeaderSection.new(framework)
121
+ Sqreen::PayloadCreator::HeaderSection.new(framework)
139
122
  end
140
123
  end
141
124
  end
@@ -0,0 +1,28 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ require 'sqreen/runtime_infos'
5
+ require 'sqreen/events/remote_exception'
6
+ require 'sqreen/payload_creator/header_section'
7
+
8
+ module Sqreen
9
+ class PayloadCreator
10
+ # object that default to call on framework header
11
+ class HeaderSection
12
+ def initialize(framework)
13
+ @framework = framework
14
+ end
15
+
16
+ def [](value)
17
+ if %w[rack_client_ip rails_client_ip ip_headers].include?(value)
18
+ return @framework.send(value)
19
+ end
20
+ @framework.header(value)
21
+ end
22
+
23
+ def ip_headers
24
+ @framework.ip_headers
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ require 'ipaddr'
5
+
6
+ # TODO: move to Sqreen::IP
7
+
8
+ module Sqreen
9
+ Prefix = Struct.new(:family, :bitlen, :address, :data) do # addr is integer
10
+ def initialize(*args)
11
+ super
12
+ raise ArgumentError, 'no family given' unless family
13
+ raise ArgumentError, 'no bitlen given' unless bitlen
14
+ raise ArgumentError, 'no address given' unless address
15
+ end
16
+
17
+ def matches?(address, family)
18
+ raise 'family mismatch' unless family == self.family
19
+ shift_amount = (family == Socket::AF_INET ? 32 : 128) - bitlen
20
+ (address ^ self.address) >> shift_amount == 0
21
+ end
22
+ end
23
+
24
+ def Prefix.from_str(str, data = nil)
25
+ ip_addr = IPAddr.new(str)
26
+ bitlen = if str =~ /\/(\d+)$/
27
+ $~[1].to_i
28
+ else
29
+ ip_addr.family == Socket::AF_INET6 ? 128 : 32
30
+ end
31
+ Prefix.new(ip_addr.family, bitlen, ip_addr.to_i, data)
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
+ # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
+
4
+ module Sqreen
5
+ class RailsMiddleware
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'sqreen/log'
5
5
  require 'sqreen/events/remote_exception'
6
+ require 'sqreen/remote_command/failure_output'
6
7
 
7
8
  module Sqreen
8
9
  # Execute and sanitize remote commands
@@ -21,14 +22,6 @@ module Sqreen
21
22
  :performance_budget => :change_performance_budget,
22
23
  }.freeze
23
24
 
24
- # wraps output returned by a command that should also result in status: false
25
- class FailureOutput
26
- attr_reader :wrapped_output
27
- def initialize(output)
28
- @wrapped_output = output
29
- end
30
- end
31
-
32
25
  attr_reader :uuid
33
26
 
34
27
  def initialize(json_desc)
@@ -0,0 +1,11 @@
1
+ module Sqreen
2
+ class RemoteCommand
3
+ # wraps output returned by a command that should also result in status: false
4
+ class FailureOutput
5
+ attr_reader :wrapped_output
6
+ def initialize(output)
7
+ @wrapped_output = output
8
+ end
9
+ end
10
+ end
11
+ end
data/lib/sqreen/rules.rb CHANGED
@@ -2,9 +2,39 @@
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
4
  require 'sqreen/log'
5
- require 'sqreen/rule_attributes'
6
- require 'sqreen/rules_callbacks'
5
+ require 'sqreen/rules/attrs'
7
6
 
7
+ require 'sqreen/rules/regexp_rule_cb'
8
+ require 'sqreen/rules/matcher_rule'
9
+
10
+ require 'sqreen/rules/record_request_context'
11
+ require 'sqreen/rules/update_request_context'
12
+ require 'sqreen/rules/rails_parameters_cb'
13
+
14
+ require 'sqreen/rules/headers_insert_cb'
15
+ require 'sqreen/rules/blacklist_ips_cb'
16
+
17
+ require 'sqreen/rules/shell_env_cb'
18
+
19
+ require 'sqreen/rules/url_matches_cb'
20
+ require 'sqreen/rules/user_agent_matches_cb'
21
+ require 'sqreen/rules/crawler_user_agent_matches_cb'
22
+
23
+ require 'sqreen/rules/xss_cb'
24
+ require 'sqreen/rules/execjs_cb'
25
+
26
+ require 'sqreen/rules/binding_accessor_metrics'
27
+ require 'sqreen/rules/binding_accessor_matcher_cb'
28
+ require 'sqreen/rules/count_http_codes'
29
+ require 'sqreen/rules/not_found_cb'
30
+ require 'sqreen/rules/crawler_user_agent_matches_metrics_cb'
31
+ require 'sqreen/rules/auth_track_cb'
32
+ require 'sqreen/rules/signup_track_cb'
33
+ require 'sqreen/rules/devise_auth_track_cb'
34
+ require 'sqreen/rules/devise_signup_track_cb'
35
+
36
+ require 'sqreen/rules/custom_error_cb'
37
+ require 'sqreen/rules/waf_cb'
8
38
 
9
39
  ## Rules
10
40
  #
File without changes
@@ -1,8 +1,8 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_attributes'
5
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/attrs'
5
+ require 'sqreen/rules/rule_cb'
6
6
  require 'sqreen/safe_json'
7
7
 
8
8
  module Sqreen
@@ -1,10 +1,10 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/rule_cb'
5
5
  require 'sqreen/binding_accessor'
6
6
  require 'sqreen/mono_time'
7
- require 'sqreen/rules_callbacks/matcher_rule'
7
+ require 'sqreen/rules/matcher_rule'
8
8
 
9
9
  module Sqreen
10
10
  module Rules
@@ -49,9 +49,7 @@ module Sqreen
49
49
  end
50
50
 
51
51
  def pre(inst, args, budget = nil, &_block)
52
- unless budget.nil?
53
- finish = budget + Sqreen.time
54
- end
52
+ finish = budget + Sqreen.time unless budget.nil?
55
53
  resol_cache = Hash.new do |hash, accessor|
56
54
  hash[accessor] = accessor.resolve(binding, framework, inst, args)
57
55
  end
@@ -62,9 +60,7 @@ module Sqreen
62
60
  next unless val.respond_to?(:each)
63
61
  next if val.respond_to?(:seek)
64
62
  val.each do |v|
65
- if !budget.nil? && Sqreen.time > finish
66
- return nil
67
- end
63
+ return nil if !budget.nil? && Sqreen.time > finish
68
64
  next if !v.is_a?(String) || (!matcher.min_size.nil? && v.size < matcher.min_size)
69
65
  next if v.size > MAX_LENGTH
70
66
  next if matcher.match(v).nil?
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/rule_cb'
5
5
  require 'sqreen/binding_accessor'
6
6
  require 'sqreen/events/remote_exception'
7
7
 
@@ -2,8 +2,9 @@
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
4
  require 'sqreen/trie'
5
+ require 'sqreen/prefix'
5
6
 
6
- require 'sqreen/rule_callback'
7
+ require 'sqreen/rules/rule_cb'
7
8
 
8
9
  module Sqreen
9
10
  module Rules
@@ -46,7 +47,7 @@ module Sqreen
46
47
  def find_blacklisted_ip(rip)
47
48
  begin
48
49
  ipa = IPAddr.new(rip)
49
- rescue
50
+ rescue StandardError
50
51
  Sqreen.log.info "invalid IP address given by framework: #{rip}"
51
52
  return nil
52
53
  end
@@ -1,8 +1,8 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_attributes'
5
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/attrs'
5
+ require 'sqreen/rules/rule_cb'
6
6
  require 'sqreen/safe_json'
7
7
 
8
8
  module Sqreen
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rules_callbacks/matcher_rule'
4
+ require 'sqreen/rules/matcher_rule'
5
5
  require 'sqreen/frameworks'
6
6
 
7
7
  module Sqreen
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rules_callbacks/matcher_rule'
4
+ require 'sqreen/rules/matcher_rule'
5
5
  require 'sqreen/frameworks'
6
6
 
7
7
  module Sqreen
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/rule_cb'
5
5
  require 'sqreen/exception'
6
6
 
7
7
  module Sqreen
@@ -1,8 +1,8 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_attributes'
5
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/attrs'
5
+ require 'sqreen/rules/rule_cb'
6
6
  require 'sqreen/safe_json'
7
7
 
8
8
  module Sqreen
@@ -1,8 +1,8 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
- require 'sqreen/rule_attributes'
5
- require 'sqreen/rule_callback'
4
+ require 'sqreen/rules/attrs'
5
+ require 'sqreen/rules/rule_cb'
6
6
  require 'sqreen/safe_json'
7
7
 
8
8
  module Sqreen
@@ -1,11 +1,10 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
3
 
4
-
5
4
  require 'sqreen/js/js_service'
6
5
 
7
- require 'sqreen/rule_attributes'
8
- require 'sqreen/rule_callback'
6
+ require 'sqreen/rules/attrs'
7
+ require 'sqreen/rules/rule_cb'
9
8
  require 'sqreen/condition_evaluator'
10
9
  require 'sqreen/binding_accessor'
11
10
  require 'sqreen/events/remote_exception'
@@ -14,7 +13,6 @@ module Sqreen
14
13
  module Rules
15
14
  # Exec js callbacks
16
15
  class ExecJSCB < RuleCB
17
-
18
16
  class << self
19
17
  # @return [Sqreen::Js::JsService]
20
18
  def js_service
@@ -77,7 +75,7 @@ module Sqreen
77
75
  when NilClass
78
76
  false
79
77
  when Hash
80
- ret.keys.each do |k|
78
+ ret.keys.each do |k| # rubocop:disable Performance/HashEachMethods
81
79
  ret[(begin
82
80
  k.to_sym
83
81
  rescue StandardError
@@ -119,7 +117,6 @@ module Sqreen
119
117
 
120
118
  # XXX: budgets was not subtracted from
121
119
  call_callback(name, budget, inst, new_ba_args, args, rv)
122
-
123
120
  rescue StandardError => e
124
121
  Sqreen.log.warn { "Caught JS callback exception: #{e.inspect}" }
125
122
  Sqreen.log.debug e.backtrace
@@ -127,10 +124,11 @@ module Sqreen
127
124
  nil
128
125
  end
129
126
 
130
-
131
- def self.build_accessors(reqs)
132
- reqs.map do |req|
133
- BindingAccessor.new(req, true)
127
+ class << self
128
+ def build_accessors(reqs)
129
+ reqs.map do |req|
130
+ BindingAccessor.new(req, true)
131
+ end
134
132
  end
135
133
  end
136
134
 
@@ -176,10 +174,10 @@ module Sqreen
176
174
  next unless haystack_idx
177
175
 
178
176
  arguments[haystack_idx] = ArgumentFilter.hash_val_included(
179
- arguments[needed_idx],
180
- arguments[haystack_idx],
181
- min_length.to_i,
182
- MAX_DEPTH
177
+ arguments[needed_idx],
178
+ arguments[haystack_idx],
179
+ min_length.to_i,
180
+ MAX_DEPTH
183
181
  )
184
182
  end
185
183
 
@@ -193,7 +191,7 @@ module Sqreen
193
191
  next unless args_or_func.is_a?(Array)
194
192
  args_bas = args_or_func[0..-2] unless args_or_func.empty?
195
193
  @ba_expressions[name] =
196
- ExecJSCB.build_accessors(args_bas).map(&:expression)
194
+ ExecJSCB.build_accessors(args_bas).map(&:expression)
197
195
  end
198
196
  end
199
197
 
@@ -212,47 +210,48 @@ module Sqreen
212
210
  end
213
211
  end
214
212
 
215
- def self.hash_val_included(needed, haystack, min_length = 8, max_depth = 20)
216
- new_obj = {}
217
- insert = []
218
- to_do = haystack.map { |k, v| [new_obj, k, v, 0] }
219
- until to_do.empty?
220
- where, key, value, deepness = to_do.pop
221
- safe_key = key.is_a?(Integer) ? key : key.to_s
222
- if value.is_a?(Hash) && deepness < max_depth
223
- val = {}
224
- insert << [where, safe_key, val]
225
- to_do += value.map { |k, v| [val, k, v, deepness + 1] }
226
- elsif value.is_a?(Array) && deepness < max_depth
227
- val = []
228
- insert << [where, safe_key, val]
229
- i = -1
230
- to_do += value.map { |v| [val, i += 1, v, deepness + 1] }
231
- elsif deepness >= max_depth # if we are after max_depth don't try to filter
232
- insert << [where, safe_key, value]
233
- else
234
- v = value.to_s
235
- if v.size >= min_length && ConditionEvaluator.str_include?(needed.to_s, v)
236
- case where
237
- when Array
238
- where << value
239
- else
240
- where[safe_key] = value
213
+ class << self
214
+ def hash_val_included(needed, haystack, min_length = 8, max_depth = 20)
215
+ new_obj = {}
216
+ insert = []
217
+ to_do = haystack.map { |k, v| [new_obj, k, v, 0] }
218
+ until to_do.empty?
219
+ where, key, value, deepness = to_do.pop
220
+ safe_key = key.is_a?(Integer) ? key : key.to_s
221
+ if value.is_a?(Hash) && deepness < max_depth
222
+ val = {}
223
+ insert << [where, safe_key, val]
224
+ to_do += value.map { |k, v| [val, k, v, deepness + 1] }
225
+ elsif value.is_a?(Array) && deepness < max_depth
226
+ val = []
227
+ insert << [where, safe_key, val]
228
+ i = -1
229
+ to_do += value.map { |v| [val, i += 1, v, deepness + 1] }
230
+ elsif deepness >= max_depth # if we are after max_depth don't try to filter
231
+ insert << [where, safe_key, value]
232
+ else
233
+ v = value.to_s
234
+ if v.size >= min_length && ConditionEvaluator.str_include?(needed.to_s, v)
235
+ case where
236
+ when Array
237
+ where << value
238
+ else
239
+ where[safe_key] = value
240
+ end
241
241
  end
242
242
  end
243
243
  end
244
- end
245
- insert.reverse.each do |wh, ikey, ival|
246
- case wh
247
- when Array
248
- wh << ival unless ival.respond_to?(:empty?) && ival.empty?
249
- else
250
- wh[ikey] = ival unless ival.respond_to?(:empty?) && ival.empty?
244
+ insert.reverse.each do |wh, ikey, ival|
245
+ case wh
246
+ when Array
247
+ wh << ival unless ival.respond_to?(:empty?) && ival.empty?
248
+ else
249
+ wh[ikey] = ival unless ival.respond_to?(:empty?) && ival.empty?
250
+ end
251
251
  end
252
+ new_obj
252
253
  end
253
- new_obj
254
254
  end
255
255
  end
256
256
  end
257
257
  end
258
-