rack-attack 4.3.1 → 4.4.0

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: 62911565ba358aadd130a8edf862d1f3ca57786d
4
- data.tar.gz: 55876d8afb3bed309bb09a5b1fae357c8d5cdf10
3
+ metadata.gz: 7d06cf65c8cfce9d8611003c5da19f1384273d6d
4
+ data.tar.gz: 4e8e0064ab9087fc7503e9e1cb850f6dd10c8838
5
5
  SHA512:
6
- metadata.gz: b54245dad4b5101ce8364da45654d650bfe86c2f4e3c85d48e3923b7ca8a31ad5ec61e3938745dedefba3fd117447e522a4207145b086eccf86bf14ba1696643
7
- data.tar.gz: 57063639a9c9d6e3884b1a89cbfce044fefebe7dcb4a95f1e025e260db75490a05447d4e7294060aa55531b55d567b9763101debb2119a690c8760b0b94787ec
6
+ metadata.gz: d66f18bf9e4f6058c2f40339392e38a62f71afd6852eb0f3f30075fe1eb233b5a355b61bcac39dcf109644987c1ae41fb4831d6c0ed206827258f59a06c4883e
7
+ data.tar.gz: b5f72dc5abf4c6b27d89b38dfea3ba85cdbed807bf9aced9388c69707f5e8115aa06a32204bd6fc7c49263ea73dff8fbf2914fcb3868b8965b36e0b63729d10c
data/README.md CHANGED
@@ -83,7 +83,7 @@ def call(env)
83
83
  end
84
84
  ```
85
85
 
86
- Note: `Rack::Attack::Request` is just a subclass of `Rack::Attack` so that you
86
+ Note: `Rack::Attack::Request` is just a subclass of `Rack::Request` so that you
87
87
  can cleanly monkey patch helper methods onto the
88
88
  [request object](https://github.com/kickstarter/rack-attack/blob/master/lib/rack/attack/request.rb).
89
89
 
@@ -11,6 +11,7 @@ class Rack::Attack
11
11
  autoload :Track, 'rack/attack/track'
12
12
  autoload :StoreProxy, 'rack/attack/store_proxy'
13
13
  autoload :DalliProxy, 'rack/attack/store_proxy/dalli_proxy'
14
+ autoload :MemCacheProxy, 'rack/attack/store_proxy/mem_cache_proxy'
14
15
  autoload :RedisStoreProxy, 'rack/attack/store_proxy/redis_store_proxy'
15
16
  autoload :Fail2Ban, 'rack/attack/fail2ban'
16
17
  autoload :Allow2Ban, 'rack/attack/allow2ban'
@@ -1,19 +1,25 @@
1
1
  module Rack
2
2
  class Attack
3
3
  module StoreProxy
4
- PROXIES = [DalliProxy, RedisStoreProxy]
4
+ PROXIES = [DalliProxy, MemCacheProxy, RedisStoreProxy]
5
5
 
6
6
  def self.build(store)
7
7
  # RedisStore#increment needs different behavior, so detect that
8
8
  # (method has an arity of 2; must call #expire separately
9
- if defined?(::ActiveSupport::Cache::RedisStore) && store.is_a?(::ActiveSupport::Cache::RedisStore)
9
+ if (defined?(::ActiveSupport::Cache::RedisStore) && store.is_a?(::ActiveSupport::Cache::RedisStore)) ||
10
+ (defined?(::ActiveSupport::Cache::MemCacheStore) && store.is_a?(::ActiveSupport::Cache::MemCacheStore))
11
+
10
12
  # ActiveSupport::Cache::RedisStore doesn't expose any way to set an expiry,
11
- # so use the raw Redis::Store instead
12
- store = store.instance_variable_get(:@data)
13
+ # so use the raw Redis::Store instead.
14
+ # We also want to use the underlying Dalli client instead of ::ActiveSupport::Cache::MemCacheStore,
15
+ # and the MemCache client if using Rails 3.x
16
+ client = store.instance_variable_get(:@data)
17
+ if (defined?(::Redis::Store) && client.is_a?(Redis::Store)) ||
18
+ (defined?(Dalli::Client) && client.is_a?(Dalli::Client)) || (defined?(MemCache) && client.is_a?(MemCache))
19
+ store = store.instance_variable_get(:@data)
20
+ end
13
21
  end
14
-
15
22
  klass = PROXIES.find { |proxy| proxy.handle?(store) }
16
-
17
23
  klass ? klass.new(store) : store
18
24
  end
19
25
 
@@ -0,0 +1,51 @@
1
+ module Rack
2
+ class Attack
3
+ module StoreProxy
4
+ class MemCacheProxy < SimpleDelegator
5
+ def self.handle?(store)
6
+ defined?(::MemCache) && store.is_a?(::MemCache)
7
+ end
8
+
9
+ def initialize(store)
10
+ super(store)
11
+ stub_with_if_missing
12
+ end
13
+
14
+ def read(key)
15
+ # Second argument: reading raw value
16
+ get(key, true)
17
+ rescue MemCache::MemCacheError
18
+ end
19
+
20
+ def write(key, value, options={})
21
+ # Third argument: writing raw value
22
+ set(key, value, options.fetch(:expires_in, 0), true)
23
+ rescue MemCache::MemCacheError
24
+ end
25
+
26
+ def increment(key, amount, options={})
27
+ incr(key, amount)
28
+ rescue MemCache::MemCacheError
29
+ end
30
+
31
+ def delete(key, options={})
32
+ with do |client|
33
+ client.delete(key)
34
+ end
35
+ rescue MemCache::MemCacheError
36
+ end
37
+
38
+ private
39
+
40
+ def stub_with_if_missing
41
+ unless __getobj__.respond_to?(:with)
42
+ class << self
43
+ def with; yield __getobj__; end
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Attack
3
- VERSION = '4.3.1'
3
+ VERSION = '4.4.0'
4
4
  end
5
5
  end
@@ -17,12 +17,14 @@ describe Rack::Attack::Cache do
17
17
  end
18
18
 
19
19
  require 'active_support/cache/dalli_store'
20
+ require 'active_support/cache/mem_cache_store'
20
21
  require 'active_support/cache/redis_store'
21
22
  require 'connection_pool'
22
23
  cache_stores = [
23
24
  ActiveSupport::Cache::MemoryStore.new,
24
25
  ActiveSupport::Cache::DalliStore.new("127.0.0.1"),
25
26
  ActiveSupport::Cache::RedisStore.new("127.0.0.1"),
27
+ ActiveSupport::Cache::MemCacheStore.new("127.0.0.1"),
26
28
  Dalli::Client.new,
27
29
  ConnectionPool.new { Dalli::Client.new },
28
30
  Redis::Store.new
@@ -54,6 +56,7 @@ describe Rack::Attack::Cache do
54
56
  @cache.send(:do_count, @key, @expires_in).must_equal 2
55
57
  end
56
58
  end
59
+
57
60
  describe "do_count after expires_in" do
58
61
  it "must be 1" do
59
62
  @cache.send(:do_count, @key, @expires_in)
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: 4.4.0
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: 2016-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: memcache-client
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  description: A rack middleware for throttling and blocking abusive requests
154
168
  email: aaron@ktheory.com
155
169
  executables: []
@@ -168,6 +182,7 @@ files:
168
182
  - lib/rack/attack/request.rb
169
183
  - lib/rack/attack/store_proxy.rb
170
184
  - lib/rack/attack/store_proxy/dalli_proxy.rb
185
+ - lib/rack/attack/store_proxy/mem_cache_proxy.rb
171
186
  - lib/rack/attack/store_proxy/redis_store_proxy.rb
172
187
  - lib/rack/attack/throttle.rb
173
188
  - lib/rack/attack/track.rb
@@ -205,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
220
  version: '0'
206
221
  requirements: []
207
222
  rubyforge_project:
208
- rubygems_version: 2.4.5.1
223
+ rubygems_version: 2.5.1
209
224
  signing_key:
210
225
  specification_version: 4
211
226
  summary: Block & throttle abusive requests