rack-attack 4.3.1 → 5.4.2

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 (64) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +230 -113
  3. data/Rakefile +11 -3
  4. data/bin/setup +8 -0
  5. data/lib/rack/attack.rb +121 -48
  6. data/lib/rack/attack/allow2ban.rb +2 -1
  7. data/lib/rack/attack/{whitelist.rb → blocklist.rb} +2 -3
  8. data/lib/rack/attack/cache.rb +24 -5
  9. data/lib/rack/attack/check.rb +6 -8
  10. data/lib/rack/attack/fail2ban.rb +3 -2
  11. data/lib/rack/attack/path_normalizer.rb +6 -11
  12. data/lib/rack/attack/request.rb +1 -1
  13. data/lib/rack/attack/{blacklist.rb → safelist.rb} +2 -4
  14. data/lib/rack/attack/store_proxy.rb +13 -12
  15. data/lib/rack/attack/store_proxy/dalli_proxy.rb +2 -3
  16. data/lib/rack/attack/store_proxy/mem_cache_proxy.rb +50 -0
  17. data/lib/rack/attack/store_proxy/mem_cache_store_proxy.rb +19 -0
  18. data/lib/rack/attack/store_proxy/redis_cache_store_proxy.rb +35 -0
  19. data/lib/rack/attack/store_proxy/redis_proxy.rb +54 -0
  20. data/lib/rack/attack/store_proxy/redis_store_proxy.rb +5 -24
  21. data/lib/rack/attack/throttle.rb +16 -12
  22. data/lib/rack/attack/track.rb +3 -3
  23. data/lib/rack/attack/version.rb +1 -1
  24. data/spec/acceptance/allow2ban_spec.rb +71 -0
  25. data/spec/acceptance/blocking_ip_spec.rb +38 -0
  26. data/spec/acceptance/blocking_spec.rb +41 -0
  27. data/spec/acceptance/blocking_subnet_spec.rb +44 -0
  28. data/spec/acceptance/cache_store_config_for_allow2ban_spec.rb +126 -0
  29. data/spec/acceptance/cache_store_config_for_fail2ban_spec.rb +121 -0
  30. data/spec/acceptance/cache_store_config_for_throttle_spec.rb +48 -0
  31. data/spec/acceptance/cache_store_config_with_rails_spec.rb +31 -0
  32. data/spec/acceptance/customizing_blocked_response_spec.rb +41 -0
  33. data/spec/acceptance/customizing_throttled_response_spec.rb +59 -0
  34. data/spec/acceptance/extending_request_object_spec.rb +34 -0
  35. data/spec/acceptance/fail2ban_spec.rb +76 -0
  36. data/spec/acceptance/safelisting_ip_spec.rb +48 -0
  37. data/spec/acceptance/safelisting_spec.rb +53 -0
  38. data/spec/acceptance/safelisting_subnet_spec.rb +48 -0
  39. data/spec/acceptance/stores/active_support_dalli_store_spec.rb +19 -0
  40. data/spec/acceptance/stores/active_support_mem_cache_store_pooled_spec.rb +22 -0
  41. data/spec/acceptance/stores/active_support_mem_cache_store_spec.rb +18 -0
  42. data/spec/acceptance/stores/active_support_memory_store_spec.rb +16 -0
  43. data/spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb +18 -0
  44. data/spec/acceptance/stores/active_support_redis_cache_store_spec.rb +18 -0
  45. data/spec/acceptance/stores/active_support_redis_store_spec.rb +18 -0
  46. data/spec/acceptance/stores/connection_pool_dalli_client_spec.rb +22 -0
  47. data/spec/acceptance/stores/dalli_client_spec.rb +19 -0
  48. data/spec/acceptance/stores/redis_spec.rb +20 -0
  49. data/spec/acceptance/stores/redis_store_spec.rb +18 -0
  50. data/spec/acceptance/throttling_spec.rb +159 -0
  51. data/spec/acceptance/track_spec.rb +27 -0
  52. data/spec/acceptance/track_throttle_spec.rb +53 -0
  53. data/spec/allow2ban_spec.rb +10 -9
  54. data/spec/fail2ban_spec.rb +12 -10
  55. data/spec/integration/offline_spec.rb +21 -23
  56. data/spec/rack_attack_dalli_proxy_spec.rb +0 -2
  57. data/spec/rack_attack_request_spec.rb +2 -2
  58. data/spec/rack_attack_spec.rb +53 -18
  59. data/spec/rack_attack_throttle_spec.rb +45 -13
  60. data/spec/rack_attack_track_spec.rb +11 -8
  61. data/spec/spec_helper.rb +35 -14
  62. data/spec/support/cache_store_helper.rb +82 -0
  63. metadata +161 -61
  64. data/spec/integration/rack_attack_cache_spec.rb +0 -119
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,3 @@
1
- require "rubygems"
2
1
  require "bundler/setup"
3
2
 
4
3
  require "minitest/autorun"
@@ -7,31 +6,53 @@ require "rack/test"
7
6
  require 'active_support'
8
7
  require 'action_dispatch'
9
8
 
10
- # Load Journey for Rails 3.2
11
- require 'journey' if ActionPack::VERSION::MAJOR == 3
12
-
13
9
  require "rack/attack"
14
10
 
15
- begin
16
- require 'pry'
17
- rescue LoadError
18
- #nothing to do here
11
+ if RUBY_ENGINE == "ruby"
12
+ require "byebug"
19
13
  end
20
14
 
21
- class MiniTest::Spec
15
+ def safe_require(name)
16
+ begin
17
+ require name
18
+ rescue LoadError
19
+ end
20
+ end
21
+
22
+ safe_require "connection_pool"
23
+ safe_require "dalli"
24
+ safe_require "redis"
25
+ safe_require "redis-activesupport"
26
+ safe_require "redis-store"
22
27
 
28
+ class MiniTest::Spec
23
29
  include Rack::Test::Methods
24
30
 
25
- after { Rack::Attack.clear! }
31
+ before do
32
+ @_original_throttled_response = Rack::Attack.throttled_response
33
+ @_original_blocklisted_response = Rack::Attack.blocklisted_response
34
+ end
35
+
36
+ after do
37
+ Rack::Attack.clear_configuration
38
+ Rack::Attack.instance_variable_set(:@cache, nil)
39
+
40
+ Rack::Attack.throttled_response = @_original_throttled_response
41
+ Rack::Attack.blocklisted_response = @_original_blocklisted_response
42
+ end
26
43
 
27
44
  def app
28
- Rack::Builder.new {
45
+ Rack::Builder.new do
46
+ # Use Rack::Lint to test that rack-attack is complying with the rack spec
47
+ use Rack::Lint
29
48
  use Rack::Attack
30
- run lambda {|env| [200, {}, ['Hello World']]}
31
- }.to_app
49
+ use Rack::Lint
50
+
51
+ run lambda { |_env| [200, {}, ['Hello World']] }
52
+ end.to_app
32
53
  end
33
54
 
34
- def self.allow_ok_requests
55
+ def self.it_allows_ok_requests
35
56
  it "must allow ok requests" do
36
57
  get '/', {}, 'REMOTE_ADDR' => '127.0.0.1'
37
58
  last_response.status.must_equal 200
@@ -0,0 +1,82 @@
1
+ class Minitest::Spec
2
+ def self.it_works_for_cache_backed_features(options)
3
+ fetch_from_store = options.fetch(:fetch_from_store)
4
+
5
+ it "works for throttle" do
6
+ Rack::Attack.throttle("by ip", limit: 1, period: 60) do |request|
7
+ request.ip
8
+ end
9
+
10
+ get "/", {}, "REMOTE_ADDR" => "1.2.3.4"
11
+ assert_equal 200, last_response.status
12
+
13
+ get "/", {}, "REMOTE_ADDR" => "1.2.3.4"
14
+ assert_equal 429, last_response.status
15
+ end
16
+
17
+ it "works for fail2ban" do
18
+ Rack::Attack.blocklist("fail2ban pentesters") do |request|
19
+ Rack::Attack::Fail2Ban.filter(request.ip, maxretry: 2, findtime: 30, bantime: 60) do
20
+ request.path.include?("private-place")
21
+ end
22
+ end
23
+
24
+ get "/"
25
+ assert_equal 200, last_response.status
26
+
27
+ get "/private-place"
28
+ assert_equal 403, last_response.status
29
+
30
+ get "/private-place"
31
+ assert_equal 403, last_response.status
32
+
33
+ get "/"
34
+ assert_equal 403, last_response.status
35
+ end
36
+
37
+ it "works for allow2ban" do
38
+ Rack::Attack.blocklist("allow2ban pentesters") do |request|
39
+ Rack::Attack::Allow2Ban.filter(request.ip, maxretry: 2, findtime: 30, bantime: 60) do
40
+ request.path.include?("scarce-resource")
41
+ end
42
+ end
43
+
44
+ get "/"
45
+ assert_equal 200, last_response.status
46
+
47
+ get "/scarce-resource"
48
+ assert_equal 200, last_response.status
49
+
50
+ get "/scarce-resource"
51
+ assert_equal 200, last_response.status
52
+
53
+ get "/scarce-resource"
54
+ assert_equal 403, last_response.status
55
+
56
+ get "/"
57
+ assert_equal 403, last_response.status
58
+ end
59
+
60
+ it "doesn't leak keys" do
61
+ Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request|
62
+ request.ip
63
+ end
64
+
65
+ key = nil
66
+
67
+ # Freeze time during these statement to be sure that the key used by rack attack is the same
68
+ # we pre-calculate in local variable `key`
69
+ Timecop.freeze do
70
+ key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4"
71
+
72
+ get "/", {}, "REMOTE_ADDR" => "1.2.3.4"
73
+ end
74
+
75
+ assert fetch_from_store.call(key)
76
+
77
+ sleep 2.1
78
+
79
+ assert_nil fetch_from_store.call(key)
80
+ end
81
+ end
82
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-attack
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.1
4
+ version: 5.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Suggs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2018-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -16,140 +16,174 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: '1.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: appraisal
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.2'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.16'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.16'
27
61
  - !ruby/object:Gem::Dependency
28
62
  name: minitest
29
63
  requirement: !ruby/object:Gem::Requirement
30
64
  requirements:
31
- - - ">="
65
+ - - "~>"
32
66
  - !ruby/object:Gem::Version
33
- version: '0'
67
+ version: '5.11'
34
68
  type: :development
35
69
  prerelease: false
36
70
  version_requirements: !ruby/object:Gem::Requirement
37
71
  requirements:
38
- - - ">="
72
+ - - "~>"
39
73
  - !ruby/object:Gem::Version
40
- version: '0'
74
+ version: '5.11'
41
75
  - !ruby/object:Gem::Dependency
42
- name: rack-test
76
+ name: minitest-stub-const
43
77
  requirement: !ruby/object:Gem::Requirement
44
78
  requirements:
45
- - - ">="
79
+ - - "~>"
46
80
  - !ruby/object:Gem::Version
47
- version: '0'
81
+ version: '0.6'
48
82
  type: :development
49
83
  prerelease: false
50
84
  version_requirements: !ruby/object:Gem::Requirement
51
85
  requirements:
52
- - - ">="
86
+ - - "~>"
53
87
  - !ruby/object:Gem::Version
54
- version: '0'
88
+ version: '0.6'
55
89
  - !ruby/object:Gem::Dependency
56
- name: rake
90
+ name: rack-test
57
91
  requirement: !ruby/object:Gem::Requirement
58
92
  requirements:
59
- - - ">="
93
+ - - "~>"
60
94
  - !ruby/object:Gem::Version
61
- version: '0'
95
+ version: '1.0'
62
96
  type: :development
63
97
  prerelease: false
64
98
  version_requirements: !ruby/object:Gem::Requirement
65
99
  requirements:
66
- - - ">="
100
+ - - "~>"
67
101
  - !ruby/object:Gem::Version
68
- version: '0'
102
+ version: '1.0'
69
103
  - !ruby/object:Gem::Dependency
70
- name: appraisal
104
+ name: rake
71
105
  requirement: !ruby/object:Gem::Requirement
72
106
  requirements:
73
- - - ">="
107
+ - - "~>"
74
108
  - !ruby/object:Gem::Version
75
- version: '0'
109
+ version: '12.3'
76
110
  type: :development
77
111
  prerelease: false
78
112
  version_requirements: !ruby/object:Gem::Requirement
79
113
  requirements:
80
- - - ">="
114
+ - - "~>"
81
115
  - !ruby/object:Gem::Version
82
- version: '0'
116
+ version: '12.3'
83
117
  - !ruby/object:Gem::Dependency
84
- name: activesupport
118
+ name: rubocop
85
119
  requirement: !ruby/object:Gem::Requirement
86
120
  requirements:
87
- - - ">="
121
+ - - '='
88
122
  - !ruby/object:Gem::Version
89
- version: 3.0.0
123
+ version: 0.58.2
90
124
  type: :development
91
125
  prerelease: false
92
126
  version_requirements: !ruby/object:Gem::Requirement
93
127
  requirements:
94
- - - ">="
128
+ - - '='
95
129
  - !ruby/object:Gem::Version
96
- version: 3.0.0
130
+ version: 0.58.2
97
131
  - !ruby/object:Gem::Dependency
98
- name: actionpack
132
+ name: timecop
99
133
  requirement: !ruby/object:Gem::Requirement
100
134
  requirements:
101
- - - ">="
135
+ - - "~>"
102
136
  - !ruby/object:Gem::Version
103
- version: 3.0.0
137
+ version: 0.9.1
104
138
  type: :development
105
139
  prerelease: false
106
140
  version_requirements: !ruby/object:Gem::Requirement
107
141
  requirements:
108
- - - ">="
142
+ - - "~>"
109
143
  - !ruby/object:Gem::Version
110
- version: 3.0.0
144
+ version: 0.9.1
111
145
  - !ruby/object:Gem::Dependency
112
- name: redis-activesupport
146
+ name: byebug
113
147
  requirement: !ruby/object:Gem::Requirement
114
148
  requirements:
115
- - - ">="
149
+ - - "~>"
116
150
  - !ruby/object:Gem::Version
117
- version: '0'
151
+ version: '10.0'
118
152
  type: :development
119
153
  prerelease: false
120
154
  version_requirements: !ruby/object:Gem::Requirement
121
155
  requirements:
122
- - - ">="
156
+ - - "~>"
123
157
  - !ruby/object:Gem::Version
124
- version: '0'
158
+ version: '10.0'
125
159
  - !ruby/object:Gem::Dependency
126
- name: dalli
160
+ name: actionpack
127
161
  requirement: !ruby/object:Gem::Requirement
128
162
  requirements:
129
- - - ">="
163
+ - - "~>"
130
164
  - !ruby/object:Gem::Version
131
- version: '0'
165
+ version: '5.2'
132
166
  type: :development
133
167
  prerelease: false
134
168
  version_requirements: !ruby/object:Gem::Requirement
135
169
  requirements:
136
- - - ">="
170
+ - - "~>"
137
171
  - !ruby/object:Gem::Version
138
- version: '0'
172
+ version: '5.2'
139
173
  - !ruby/object:Gem::Dependency
140
- name: connection_pool
174
+ name: activesupport
141
175
  requirement: !ruby/object:Gem::Requirement
142
176
  requirements:
143
- - - ">="
177
+ - - "~>"
144
178
  - !ruby/object:Gem::Version
145
- version: '0'
179
+ version: '5.2'
146
180
  type: :development
147
181
  prerelease: false
148
182
  version_requirements: !ruby/object:Gem::Requirement
149
183
  requirements:
150
- - - ">="
184
+ - - "~>"
151
185
  - !ruby/object:Gem::Version
152
- version: '0'
186
+ version: '5.2'
153
187
  description: A rack middleware for throttling and blocking abusive requests
154
188
  email: aaron@ktheory.com
155
189
  executables: []
@@ -158,25 +192,58 @@ extra_rdoc_files: []
158
192
  files:
159
193
  - README.md
160
194
  - Rakefile
195
+ - bin/setup
161
196
  - lib/rack/attack.rb
162
197
  - lib/rack/attack/allow2ban.rb
163
- - lib/rack/attack/blacklist.rb
198
+ - lib/rack/attack/blocklist.rb
164
199
  - lib/rack/attack/cache.rb
165
200
  - lib/rack/attack/check.rb
166
201
  - lib/rack/attack/fail2ban.rb
167
202
  - lib/rack/attack/path_normalizer.rb
168
203
  - lib/rack/attack/request.rb
204
+ - lib/rack/attack/safelist.rb
169
205
  - lib/rack/attack/store_proxy.rb
170
206
  - lib/rack/attack/store_proxy/dalli_proxy.rb
207
+ - lib/rack/attack/store_proxy/mem_cache_proxy.rb
208
+ - lib/rack/attack/store_proxy/mem_cache_store_proxy.rb
209
+ - lib/rack/attack/store_proxy/redis_cache_store_proxy.rb
210
+ - lib/rack/attack/store_proxy/redis_proxy.rb
171
211
  - lib/rack/attack/store_proxy/redis_store_proxy.rb
172
212
  - lib/rack/attack/throttle.rb
173
213
  - lib/rack/attack/track.rb
174
214
  - lib/rack/attack/version.rb
175
- - lib/rack/attack/whitelist.rb
215
+ - spec/acceptance/allow2ban_spec.rb
216
+ - spec/acceptance/blocking_ip_spec.rb
217
+ - spec/acceptance/blocking_spec.rb
218
+ - spec/acceptance/blocking_subnet_spec.rb
219
+ - spec/acceptance/cache_store_config_for_allow2ban_spec.rb
220
+ - spec/acceptance/cache_store_config_for_fail2ban_spec.rb
221
+ - spec/acceptance/cache_store_config_for_throttle_spec.rb
222
+ - spec/acceptance/cache_store_config_with_rails_spec.rb
223
+ - spec/acceptance/customizing_blocked_response_spec.rb
224
+ - spec/acceptance/customizing_throttled_response_spec.rb
225
+ - spec/acceptance/extending_request_object_spec.rb
226
+ - spec/acceptance/fail2ban_spec.rb
227
+ - spec/acceptance/safelisting_ip_spec.rb
228
+ - spec/acceptance/safelisting_spec.rb
229
+ - spec/acceptance/safelisting_subnet_spec.rb
230
+ - spec/acceptance/stores/active_support_dalli_store_spec.rb
231
+ - spec/acceptance/stores/active_support_mem_cache_store_pooled_spec.rb
232
+ - spec/acceptance/stores/active_support_mem_cache_store_spec.rb
233
+ - spec/acceptance/stores/active_support_memory_store_spec.rb
234
+ - spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb
235
+ - spec/acceptance/stores/active_support_redis_cache_store_spec.rb
236
+ - spec/acceptance/stores/active_support_redis_store_spec.rb
237
+ - spec/acceptance/stores/connection_pool_dalli_client_spec.rb
238
+ - spec/acceptance/stores/dalli_client_spec.rb
239
+ - spec/acceptance/stores/redis_spec.rb
240
+ - spec/acceptance/stores/redis_store_spec.rb
241
+ - spec/acceptance/throttling_spec.rb
242
+ - spec/acceptance/track_spec.rb
243
+ - spec/acceptance/track_throttle_spec.rb
176
244
  - spec/allow2ban_spec.rb
177
245
  - spec/fail2ban_spec.rb
178
246
  - spec/integration/offline_spec.rb
179
- - spec/integration/rack_attack_cache_spec.rb
180
247
  - spec/rack_attack_dalli_proxy_spec.rb
181
248
  - spec/rack_attack_path_normalizer_spec.rb
182
249
  - spec/rack_attack_request_spec.rb
@@ -184,10 +251,14 @@ files:
184
251
  - spec/rack_attack_throttle_spec.rb
185
252
  - spec/rack_attack_track_spec.rb
186
253
  - spec/spec_helper.rb
187
- homepage: http://github.com/kickstarter/rack-attack
254
+ - spec/support/cache_store_helper.rb
255
+ homepage: https://github.com/kickstarter/rack-attack
188
256
  licenses:
189
257
  - MIT
190
- metadata: {}
258
+ metadata:
259
+ bug_tracker_uri: https://github.com/kickstarter/rack-attack/issues
260
+ changelog_uri: https://github.com/kickstarter/rack-attack/blob/master/CHANGELOG.md
261
+ source_code_uri: https://github.com/kickstarter/rack-attack
191
262
  post_install_message:
192
263
  rdoc_options:
193
264
  - "--charset=UTF-8"
@@ -197,7 +268,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
197
268
  requirements:
198
269
  - - ">="
199
270
  - !ruby/object:Gem::Version
200
- version: 2.0.0
271
+ version: '2.2'
201
272
  required_rubygems_version: !ruby/object:Gem::Requirement
202
273
  requirements:
203
274
  - - ">="
@@ -205,19 +276,48 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
276
  version: '0'
206
277
  requirements: []
207
278
  rubyforge_project:
208
- rubygems_version: 2.4.5.1
279
+ rubygems_version: 2.7.6
209
280
  signing_key:
210
281
  specification_version: 4
211
282
  summary: Block & throttle abusive requests
212
283
  test_files:
213
- - spec/allow2ban_spec.rb
214
- - spec/fail2ban_spec.rb
215
284
  - spec/integration/offline_spec.rb
216
- - spec/integration/rack_attack_cache_spec.rb
217
- - spec/rack_attack_dalli_proxy_spec.rb
218
285
  - spec/rack_attack_path_normalizer_spec.rb
219
- - spec/rack_attack_request_spec.rb
286
+ - spec/acceptance/safelisting_subnet_spec.rb
287
+ - spec/acceptance/track_throttle_spec.rb
288
+ - spec/acceptance/cache_store_config_for_fail2ban_spec.rb
289
+ - spec/acceptance/cache_store_config_with_rails_spec.rb
290
+ - spec/acceptance/cache_store_config_for_allow2ban_spec.rb
291
+ - spec/acceptance/safelisting_ip_spec.rb
292
+ - spec/acceptance/track_spec.rb
293
+ - spec/acceptance/blocking_subnet_spec.rb
294
+ - spec/acceptance/blocking_ip_spec.rb
295
+ - spec/acceptance/allow2ban_spec.rb
296
+ - spec/acceptance/throttling_spec.rb
297
+ - spec/acceptance/blocking_spec.rb
298
+ - spec/acceptance/customizing_throttled_response_spec.rb
299
+ - spec/acceptance/extending_request_object_spec.rb
300
+ - spec/acceptance/safelisting_spec.rb
301
+ - spec/acceptance/cache_store_config_for_throttle_spec.rb
302
+ - spec/acceptance/fail2ban_spec.rb
303
+ - spec/acceptance/stores/active_support_mem_cache_store_pooled_spec.rb
304
+ - spec/acceptance/stores/active_support_redis_cache_store_spec.rb
305
+ - spec/acceptance/stores/active_support_memory_store_spec.rb
306
+ - spec/acceptance/stores/active_support_redis_store_spec.rb
307
+ - spec/acceptance/stores/active_support_mem_cache_store_spec.rb
308
+ - spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb
309
+ - spec/acceptance/stores/connection_pool_dalli_client_spec.rb
310
+ - spec/acceptance/stores/active_support_dalli_store_spec.rb
311
+ - spec/acceptance/stores/redis_store_spec.rb
312
+ - spec/acceptance/stores/dalli_client_spec.rb
313
+ - spec/acceptance/stores/redis_spec.rb
314
+ - spec/acceptance/customizing_blocked_response_spec.rb
315
+ - spec/spec_helper.rb
316
+ - spec/allow2ban_spec.rb
317
+ - spec/rack_attack_dalli_proxy_spec.rb
220
318
  - spec/rack_attack_spec.rb
221
319
  - spec/rack_attack_throttle_spec.rb
320
+ - spec/rack_attack_request_spec.rb
321
+ - spec/fail2ban_spec.rb
222
322
  - spec/rack_attack_track_spec.rb
223
- - spec/spec_helper.rb
323
+ - spec/support/cache_store_helper.rb