sqreen 1.18.2-java → 1.18.3-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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/LICENSE +3 -0
  4. data/lib/sqreen/actions.rb +11 -337
  5. data/lib/sqreen/actions/base.rb +110 -0
  6. data/lib/sqreen/actions/block_ip.rb +32 -0
  7. data/lib/sqreen/actions/block_user.rb +44 -0
  8. data/lib/sqreen/actions/ip_range_indexed_action_class.rb +36 -0
  9. data/lib/sqreen/actions/ip_ranges_index.rb +36 -0
  10. data/lib/sqreen/actions/redirect_ip.rb +40 -0
  11. data/lib/sqreen/actions/redirect_user.rb +45 -0
  12. data/lib/sqreen/actions/repository.rb +24 -0
  13. data/lib/sqreen/actions/unknown_action_type.rb +16 -0
  14. data/lib/sqreen/actions/user_action_class.rb +41 -0
  15. data/lib/sqreen/agent.rb +4 -1
  16. data/lib/sqreen/attack_blocked.rb +17 -0
  17. data/lib/sqreen/binding_accessor.rb +9 -102
  18. data/lib/sqreen/binding_accessor/path_elem.rb +8 -0
  19. data/lib/sqreen/binding_accessor/transforms.rb +107 -0
  20. data/lib/sqreen/capped_queue.rb +2 -0
  21. data/lib/sqreen/{callbacks.rb → cb.rb} +1 -53
  22. data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +2 -2
  23. data/lib/sqreen/condition_evaluator.rb +22 -5
  24. data/lib/sqreen/configuration.rb +5 -0
  25. data/lib/sqreen/default_cb.rb +20 -0
  26. data/lib/sqreen/deferred_logger.rb +63 -0
  27. data/lib/sqreen/deliveries.rb +10 -0
  28. data/lib/sqreen/deliveries/batch.rb +7 -1
  29. data/lib/sqreen/deliveries/simple.rb +5 -0
  30. data/lib/sqreen/dependency/detector.rb +1 -1
  31. data/lib/sqreen/dependency/libsqreen.rb +28 -0
  32. data/lib/sqreen/dependency/rails.rb +4 -0
  33. data/lib/sqreen/dependency/sinatra.rb +47 -14
  34. data/lib/sqreen/error_handling_middleware.rb +30 -0
  35. data/lib/sqreen/event.rb +2 -0
  36. data/lib/sqreen/events/attack.rb +2 -0
  37. data/lib/sqreen/events/request_record.rb +11 -56
  38. data/lib/sqreen/exception.rb +9 -40
  39. data/lib/sqreen/formatter_with_tid.rb +45 -0
  40. data/lib/sqreen/framework_cb.rb +28 -0
  41. data/lib/sqreen/frameworks.rb +7 -0
  42. data/lib/sqreen/frameworks/generic.rb +20 -2
  43. data/lib/sqreen/frameworks/rails.rb +2 -0
  44. data/lib/sqreen/frameworks/request_recorder.rb +3 -0
  45. data/lib/sqreen/frameworks/sinatra.rb +2 -0
  46. data/lib/sqreen/frameworks/sqreen_test.rb +2 -0
  47. data/lib/sqreen/instrumentation.rb +5 -5
  48. data/lib/sqreen/invalid_signature_exception.rb +8 -0
  49. data/lib/{sqreen-alt.rb → sqreen/js.rb} +6 -1
  50. data/lib/sqreen/js/call_context.rb +10 -0
  51. data/lib/sqreen/js/context_pool.rb +60 -0
  52. data/lib/sqreen/js/exec_js_runnable.rb +20 -0
  53. data/lib/sqreen/js/execjs_adapter.rb +6 -47
  54. data/lib/sqreen/js/executable_js.rb +12 -0
  55. data/lib/sqreen/js/js_service.rb +2 -22
  56. data/lib/sqreen/js/js_service_adapter.rb +18 -0
  57. data/lib/sqreen/js/mini_racer_adapter.rb +6 -180
  58. data/lib/sqreen/js/mini_racer_executable_js.rb +142 -0
  59. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +47 -0
  60. data/lib/sqreen/log.rb +8 -188
  61. data/lib/sqreen/logger.rb +83 -0
  62. data/lib/sqreen/metrics_store.rb +3 -11
  63. data/lib/sqreen/metrics_store/already_registered_metric.rb +11 -0
  64. data/lib/sqreen/metrics_store/unknown_metric.rb +11 -0
  65. data/lib/sqreen/metrics_store/unregistered_metric.rb +11 -0
  66. data/lib/sqreen/middleware.rb +0 -34
  67. data/lib/sqreen/mono_time.rb +2 -0
  68. data/lib/sqreen/node.rb +44 -0
  69. data/lib/sqreen/not_implemented_yet.rb +8 -0
  70. data/lib/sqreen/null_logger.rb +24 -0
  71. data/lib/sqreen/payload_creator.rb +2 -19
  72. data/lib/sqreen/payload_creator/header_section.rb +28 -0
  73. data/lib/sqreen/prefix.rb +33 -0
  74. data/lib/sqreen/rails_middleware.rb +14 -0
  75. data/lib/sqreen/remote_command.rb +1 -8
  76. data/lib/sqreen/remote_command/failure_output.rb +11 -0
  77. data/lib/sqreen/rules.rb +32 -2
  78. data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +0 -0
  79. data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +2 -2
  80. data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +4 -8
  81. data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +1 -1
  82. data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +3 -2
  83. data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +2 -2
  84. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +1 -1
  85. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +1 -1
  86. data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +1 -1
  87. data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +2 -2
  88. data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +2 -2
  89. data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +49 -50
  90. data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +1 -1
  91. data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +2 -2
  92. data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +2 -2
  93. data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +1 -1
  94. data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +1 -1
  95. data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +1 -1
  96. data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +2 -2
  97. data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +4 -2
  98. data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +1 -1
  99. data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +1 -1
  100. data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +2 -2
  101. data/lib/sqreen/rules/update_request_context.rb +20 -0
  102. data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +1 -1
  103. data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +1 -1
  104. data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +10 -14
  105. data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +10 -7
  106. data/lib/sqreen/run_when_called_cb.rb +21 -0
  107. data/lib/sqreen/runtime_infos.rb +2 -9
  108. data/lib/sqreen/sensitive_data_redactor.rb +111 -0
  109. data/lib/sqreen/signature_verifier.rb +20 -0
  110. data/lib/sqreen/sinatra_middleware.rb +14 -0
  111. data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +5 -17
  112. data/lib/sqreen/token_invalid_exception.rb +8 -0
  113. data/lib/sqreen/token_not_found_exception.rb +9 -0
  114. data/lib/sqreen/trie.rb +3 -64
  115. data/lib/sqreen/unauthorized.rb +8 -0
  116. data/lib/sqreen/util.rb +2 -0
  117. data/lib/sqreen/util/capped_array.rb +33 -0
  118. data/lib/sqreen/util/capped_hash.rb +39 -0
  119. data/lib/sqreen/util/capped_string.rb +24 -0
  120. data/lib/sqreen/util/capper.rb +65 -0
  121. data/lib/sqreen/version.rb +1 -1
  122. data/lib/sqreen/waf_error.rb +18 -0
  123. metadata +87 -35
  124. data/lib/sqreen/rules_callbacks.rb +0 -35
  125. data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
@@ -1,23 +1,15 @@
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/exception'
5
4
  require 'sqreen/metrics'
6
5
  require 'sqreen/mono_time'
6
+ require 'sqreen/metrics_store/unknown_metric'
7
+ require 'sqreen/metrics_store/unregistered_metric'
8
+ require 'sqreen/metrics_store/already_registered_metric'
7
9
 
8
10
  module Sqreen
9
11
  # This store and register metrics
10
12
  class MetricsStore
11
- # When a metric is not yet created
12
- class UnregisteredMetric < Sqreen::Exception
13
- end
14
- # When the metric is unknown
15
- class UnknownMetric < Sqreen::Exception
16
- end
17
- # When this name as already been declared with another kind
18
- class AlreadyRegisteredMetric < Sqreen::Exception
19
- end
20
-
21
13
  # definition keys
22
14
  NAME_KEY = 'name'.freeze
23
15
  KIND_KEY = 'kind'.freeze
@@ -0,0 +1,11 @@
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 MetricsStore
8
+ class AlreadyRegisteredMetric < Sqreen::Exception
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
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 MetricsStore
8
+ class UnknownMetric < Sqreen::Exception
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
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 MetricsStore
8
+ class UnregisteredMetric < Sqreen::Exception
9
+ end
10
+ end
11
+ end
@@ -11,38 +11,4 @@ module Sqreen
11
11
  @app.call(env)
12
12
  end
13
13
  end
14
-
15
- class ErrorHandlingMiddleware
16
- def initialize(app)
17
- @app = app
18
- end
19
-
20
- def call(env)
21
- @app.call(env)
22
- rescue => e
23
- sqreen_attack = nil
24
- if e.is_a?(Sqreen::AttackBlocked)
25
- sqreen_attack = e
26
- elsif e.respond_to?(:original_exception) &&
27
- e.original_exception.is_a?(Sqreen::AttackBlocked)
28
- sqreen_attack = e.original_exception
29
- end
30
-
31
- if sqreen_attack && sqreen_attack.redirect_url
32
- return [303, { 'Location' => sqreen_attack.redirect_url }, ['']]
33
- else
34
- raise
35
- end
36
- end
37
- end
38
-
39
- class RailsMiddleware
40
- def initialize(app)
41
- @app = app
42
- end
43
-
44
- def call(env)
45
- @app.call(env)
46
- end
47
- end
48
14
  end
@@ -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
@@ -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
  #
@@ -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