sqreen 1.8.1-java → 1.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0d21819fc61334f99a9277d24b75cf6a3019aa9
4
- data.tar.gz: 6c519d9a9bd3844a3f13e84f5dca8bc8d37e3723
3
+ metadata.gz: a7d88eb10dd8c68391cac146381b6a011819cf6c
4
+ data.tar.gz: e965922d7adac842200919bea4861eaf291de2d9
5
5
  SHA512:
6
- metadata.gz: b9ade91bab2590b8734a471f6178e7cf4442de4f41ddd7a5988b4eabcef4f59e0c8c2da44461aa9102b90a2f6ace3026a239499b6bc140447681ea19521886bd
7
- data.tar.gz: 639df4701229c9f58e57c6000e3fc26069d2a6ae86a91295f089851e47e1564d23d819a1eabcf94443ba838126f617276539efe7ad09d11795cb47888710ebd0
6
+ metadata.gz: 496245abe34c72c16c3653033b7a8667174001de778d55d68cc7ce4f9c06f672dda656203ec4acc7b961fa96e89c8c5feed5901a75ab9ab35f11ddfa70d7bd31
7
+ data.tar.gz: 421564e3bebc03c43562a3713a27cec7bb8b3ec79769a2af1ddf5b7ff1b1daefe7b3f4e6cd9113e0d6e8924668750ef56dfef5abd993d4d46f9f98d70c89cce2
@@ -30,7 +30,7 @@ module Sqreen
30
30
  # @params value [Object] object to find
31
31
  # @params hash [Hash] Hash to search into
32
32
  # @params min_value_size [Fixnum] to compare against
33
- def self.hash_val_include?(value, hash, min_value_size, rem = 10)
33
+ def self.hash_val_include?(value, hash, min_value_size, rem = 20)
34
34
  return true if rem <= 0
35
35
  vals = hash
36
36
  vals = hash.values if hash.is_a?(Hash)
@@ -64,16 +64,25 @@ module Sqreen
64
64
 
65
65
  # Sourced from rack:Request#trusted_proxy?
66
66
  TRUSTED_PROXIES = /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/i
67
+ LOCALHOST = /\A127\.0\.0\.1\Z|\A::1\Z|\Alocalhost\Z|\Aunix\Z|\Aunix:/i
67
68
 
68
69
  # What is the current client IP
69
70
  def client_ip
70
71
  req = request
71
72
  return nil unless req
73
+ # Look for an external address being forwarded
72
74
  forwarded = req.env['HTTP_X_FORWARDED_FOR']
73
75
  ips = split_ip_addresses(forwarded)
74
76
  last = ips.find { |ip| (ip !~ TRUSTED_PROXIES) && valid_ip?(ip) }
75
77
  return last unless last.nil?
76
- req.env['REMOTE_ADDR']
78
+ # Else fall back to declared remote addr
79
+ r = req.env['REMOTE_ADDR']
80
+ # If this is localhost get the last hop before
81
+ if !ips.empty? && r =~ LOCALHOST
82
+ last = ips.find { |ip| (ip !~ LOCALHOST) && valid_ip?(ip) }
83
+ return last unless last.nil?
84
+ end
85
+ r
77
86
  end
78
87
 
79
88
  # Get a header by name
@@ -9,7 +9,9 @@ end
9
9
 
10
10
  require 'execjs'
11
11
 
12
+ require 'sqreen/rule_attributes'
12
13
  require 'sqreen/rule_callback'
14
+ require 'sqreen/condition_evaluator'
13
15
  require 'sqreen/binding_accessor'
14
16
  require 'sqreen/events/remote_exception'
15
17
 
@@ -19,7 +21,8 @@ module Sqreen
19
21
  class ExecJSCB < RuleCB
20
22
  def initialize(klass, method, rule_hash)
21
23
  super(klass, method, rule_hash)
22
- callbacks = @rule['callbacks']
24
+ callbacks = @rule[Attrs::CALLBACKS]
25
+ @conditions = @rule.fetch(Attrs::CONDITIONS, {})
23
26
 
24
27
  if callbacks['pre'].nil? &&
25
28
  callbacks['post'].nil? &&
@@ -61,6 +64,48 @@ module Sqreen
61
64
  call_callback('failing', inst, args, rv)
62
65
  end
63
66
 
67
+ def self.hash_val_included(needed, haystack, min_length = 8, max_depth = 20)
68
+ new_obj = {}
69
+ insert = []
70
+ to_do = haystack.map { |k, v| [new_obj, k, v, 0] }
71
+ until to_do.empty?
72
+ where, key, value, deepness = to_do.pop
73
+ safe_key = key.kind_of?(Integer) ? key : key.to_s
74
+ if value.is_a?(Hash) && deepness < max_depth
75
+ val = {}
76
+ insert << [where, safe_key, val]
77
+ to_do += value.map { |k, v| [val, k, v, deepness + 1] }
78
+ elsif value.is_a?(Array) && deepness < max_depth
79
+ val = []
80
+ insert << [where, safe_key, val]
81
+ i = -1
82
+ to_do += value.map { |v| [val, i += 1, v, deepness + 1] }
83
+ elsif deepness >= max_depth # if we are after max_depth don't try to filter
84
+ insert << [where, safe_key, value]
85
+ else
86
+ v = value.to_s
87
+ if v.size >= min_length && ConditionEvaluator.str_include?(needed.to_s, v)
88
+ case where
89
+ when Array
90
+ where << value
91
+ else
92
+ where[safe_key] = value
93
+ end
94
+ end
95
+ end
96
+ end
97
+ insert.reverse.each do |wh, ikey, ival|
98
+ case wh
99
+ when Array
100
+ wh << ival unless ival.empty?
101
+ else
102
+ wh[ikey] = ival unless ival.empty?
103
+ end
104
+ end
105
+
106
+ new_obj
107
+ end
108
+
64
109
  protected
65
110
 
66
111
  def record_and_continue?(ret)
@@ -92,6 +137,7 @@ module Sqreen
92
137
  arguments = (args_override || @argument_requirements[name]).map do |accessor|
93
138
  accessor.resolve(binding, framework, inst, args, @data, rv)
94
139
  end
140
+ arguments = restrict(name, arguments) if @conditions.key?(name)
95
141
  Sqreen.log.debug { [name, arguments].inspect }
96
142
  ret = @compiled.call(name, *arguments)
97
143
  unless record_and_continue?(ret)
@@ -110,6 +156,41 @@ module Sqreen
110
156
  nil
111
157
  end
112
158
 
159
+ def each_hash_val_include(condition, depth = 10)
160
+ return if depth <= 0
161
+ condition.each do |key, values|
162
+ if key == ConditionEvaluator::HASH_INC_OPERATOR
163
+ yield values
164
+ else
165
+ values.map do |v|
166
+ each_hash_val_include(v, depth - 1) { |vals| yield vals } if v.is_a?(Hash)
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ def restrict(cbname, arguments)
173
+ condition = @conditions[cbname]
174
+ return arguments if condition.nil? or @argument_requirements[cbname].nil?
175
+
176
+ each_hash_val_include(condition) do |needle, haystack, min_length|
177
+ # We could actually run the binding accessor expression here.
178
+ needed_idx = @argument_requirements[cbname].map(&:expression).index(needle)
179
+ next unless needed_idx
180
+
181
+ haystack_idx = @argument_requirements[cbname].map(&:expression).index(haystack)
182
+ next unless haystack_idx
183
+
184
+ arguments[haystack_idx] = ExecJSCB.hash_val_included(
185
+ arguments[needed_idx],
186
+ arguments[haystack_idx],
187
+ min_length.to_i
188
+ )
189
+ end
190
+
191
+ arguments
192
+ end
193
+
113
194
  def build_accessor(reqs)
114
195
  reqs.map do |req|
115
196
  BindingAccessor.new(req, true)
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
2
  # Please refer to our terms for more information: https://www.sqreen.io/terms.html
3
3
  module Sqreen
4
- VERSION = '1.8.1'.freeze
4
+ VERSION = '1.8.2'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.8.2
5
5
  platform: java
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-09 00:00:00.000000000 Z
11
+ date: 2017-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: execjs