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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -5
- data/lib/sqreen/actions.rb +11 -337
- data/lib/sqreen/actions/base.rb +110 -0
- data/lib/sqreen/actions/block_ip.rb +32 -0
- data/lib/sqreen/actions/block_user.rb +44 -0
- data/lib/sqreen/actions/ip_range_indexed_action_class.rb +36 -0
- data/lib/sqreen/actions/ip_ranges_index.rb +36 -0
- data/lib/sqreen/actions/redirect_ip.rb +40 -0
- data/lib/sqreen/actions/redirect_user.rb +45 -0
- data/lib/sqreen/actions/repository.rb +24 -0
- data/lib/sqreen/actions/unknown_action_type.rb +16 -0
- data/lib/sqreen/actions/user_action_class.rb +41 -0
- data/lib/sqreen/agent.rb +4 -1
- data/lib/sqreen/attack_blocked.rb +17 -0
- data/lib/sqreen/binding_accessor.rb +9 -102
- data/lib/sqreen/binding_accessor/path_elem.rb +8 -0
- data/lib/sqreen/binding_accessor/transforms.rb +107 -0
- data/lib/sqreen/capped_queue.rb +2 -0
- data/lib/sqreen/{callbacks.rb → cb.rb} +1 -53
- data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +2 -2
- data/lib/sqreen/condition_evaluator.rb +22 -5
- data/lib/sqreen/configuration.rb +3 -0
- data/lib/sqreen/default_cb.rb +20 -0
- data/lib/sqreen/deferred_logger.rb +63 -0
- data/lib/sqreen/deliveries.rb +10 -0
- data/lib/sqreen/deliveries/batch.rb +7 -1
- data/lib/sqreen/deliveries/simple.rb +5 -0
- data/lib/sqreen/dependency/rails.rb +4 -0
- data/lib/sqreen/dependency/sinatra.rb +4 -0
- data/lib/sqreen/error_handling_middleware.rb +30 -0
- data/lib/sqreen/event.rb +2 -0
- data/lib/sqreen/events/attack.rb +2 -0
- data/lib/sqreen/events/request_record.rb +11 -56
- data/lib/sqreen/exception.rb +9 -40
- data/lib/sqreen/formatter_with_tid.rb +45 -0
- data/lib/sqreen/framework_cb.rb +28 -0
- data/lib/sqreen/frameworks.rb +7 -0
- data/lib/sqreen/frameworks/generic.rb +5 -1
- data/lib/sqreen/frameworks/rails.rb +2 -0
- data/lib/sqreen/frameworks/request_recorder.rb +3 -0
- data/lib/sqreen/frameworks/sinatra.rb +2 -0
- data/lib/sqreen/frameworks/sqreen_test.rb +2 -0
- data/lib/sqreen/instrumentation.rb +5 -5
- data/lib/sqreen/invalid_signature_exception.rb +8 -0
- data/lib/{sqreen-alt.rb → sqreen/js.rb} +6 -1
- data/lib/sqreen/js/call_context.rb +10 -0
- data/lib/sqreen/js/context_pool.rb +60 -0
- data/lib/sqreen/js/exec_js_runnable.rb +20 -0
- data/lib/sqreen/js/execjs_adapter.rb +6 -47
- data/lib/sqreen/js/executable_js.rb +12 -0
- data/lib/sqreen/js/js_service.rb +2 -22
- data/lib/sqreen/js/js_service_adapter.rb +18 -0
- data/lib/sqreen/js/mini_racer_adapter.rb +6 -180
- data/lib/sqreen/js/mini_racer_executable_js.rb +142 -0
- data/lib/sqreen/js/thread_local_exec_js_runnable.rb +47 -0
- data/lib/sqreen/log.rb +8 -188
- data/lib/sqreen/logger.rb +83 -0
- data/lib/sqreen/metrics_store.rb +3 -11
- data/lib/sqreen/metrics_store/already_registered_metric.rb +11 -0
- data/lib/sqreen/metrics_store/unknown_metric.rb +11 -0
- data/lib/sqreen/metrics_store/unregistered_metric.rb +11 -0
- data/lib/sqreen/middleware.rb +0 -44
- data/lib/sqreen/mono_time.rb +2 -0
- data/lib/sqreen/node.rb +44 -0
- data/lib/sqreen/not_implemented_yet.rb +8 -0
- data/lib/sqreen/null_logger.rb +24 -0
- data/lib/sqreen/payload_creator.rb +2 -19
- data/lib/sqreen/payload_creator/header_section.rb +28 -0
- data/lib/sqreen/prefix.rb +33 -0
- data/lib/sqreen/rails_middleware.rb +14 -0
- data/lib/sqreen/remote_command.rb +1 -8
- data/lib/sqreen/remote_command/failure_output.rb +11 -0
- data/lib/sqreen/rules.rb +32 -2
- data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +0 -0
- data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +4 -8
- data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +1 -1
- data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +3 -2
- data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +2 -2
- data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +49 -50
- data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +2 -2
- data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +1 -1
- data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +1 -1
- data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +4 -2
- data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +1 -1
- data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +2 -2
- data/lib/sqreen/{rules_callbacks → rules}/update_request_context.rb +1 -1
- data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +1 -1
- data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +7 -3
- data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +10 -7
- data/lib/sqreen/run_when_called_cb.rb +21 -0
- data/lib/sqreen/sensitive_data_redactor.rb +111 -0
- data/lib/sqreen/signature_verifier.rb +20 -0
- data/lib/sqreen/sinatra_middleware.rb +14 -0
- data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +5 -17
- data/lib/sqreen/token_invalid_exception.rb +8 -0
- data/lib/sqreen/token_not_found_exception.rb +9 -0
- data/lib/sqreen/trie.rb +3 -64
- data/lib/sqreen/unauthorized.rb +8 -0
- data/lib/sqreen/util.rb +2 -0
- data/lib/sqreen/util/capped_array.rb +30 -0
- data/lib/sqreen/util/capped_hash.rb +36 -0
- data/lib/sqreen/util/capped_string.rb +22 -0
- data/lib/sqreen/util/capper.rb +57 -0
- data/lib/sqreen/version.rb +1 -1
- data/lib/sqreen/waf_error.rb +18 -0
- metadata +85 -36
- data/lib/sqreen/rules_callbacks.rb +0 -36
- data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
data/lib/sqreen/mono_time.rb
CHANGED
data/lib/sqreen/node.rb
ADDED
@@ -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,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)
|
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/
|
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/
|
5
|
-
require 'sqreen/
|
4
|
+
require 'sqreen/rules/attrs'
|
5
|
+
require 'sqreen/rules/rule_cb'
|
6
6
|
require 'sqreen/safe_json'
|
7
7
|
|
8
8
|
module Sqreen
|
data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb}
RENAMED
@@ -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/
|
4
|
+
require 'sqreen/rules/rule_cb'
|
5
5
|
require 'sqreen/binding_accessor'
|
6
6
|
require 'sqreen/mono_time'
|
7
|
-
require 'sqreen/
|
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/
|
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/
|
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/
|
5
|
-
require 'sqreen/
|
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/
|
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/
|
4
|
+
require 'sqreen/rules/matcher_rule'
|
5
5
|
require 'sqreen/frameworks'
|
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/
|
5
|
-
require 'sqreen/
|
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/
|
5
|
-
require 'sqreen/
|
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/
|
8
|
-
require 'sqreen/
|
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
|
-
|
132
|
-
|
133
|
-
|
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
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
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
|
-
|
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
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
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
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
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
|
-
|