Skip to content

Commit addd4ed

Browse files
committed
Make store proxies lookup dynamic
1 parent a4ea214 commit addd4ed

File tree

10 files changed

+50
-40
lines changed

10 files changed

+50
-40
lines changed

lib/rack/attack.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
require 'rack/attack/configuration'
77
require 'rack/attack/path_normalizer'
88
require 'rack/attack/request'
9+
require 'rack/attack/store_proxies/dalli_proxy'
10+
require 'rack/attack/store_proxies/mem_cache_store_proxy'
11+
require 'rack/attack/store_proxies/redis_proxy'
12+
require 'rack/attack/store_proxies/redis_store_proxy'
13+
require 'rack/attack/store_proxies/redis_cache_store_proxy'
14+
require 'rack/attack/store_proxies/active_support_redis_store_proxy'
915

1016
require 'rack/attack/railtie' if defined?(::Rails)
1117

@@ -21,13 +27,6 @@ class IncompatibleStoreError < Error; end
2127
autoload :Safelist, 'rack/attack/safelist'
2228
autoload :Blocklist, 'rack/attack/blocklist'
2329
autoload :Track, 'rack/attack/track'
24-
autoload :StoreProxy, 'rack/attack/store_proxy'
25-
autoload :DalliProxy, 'rack/attack/store_proxy/dalli_proxy'
26-
autoload :MemCacheStoreProxy, 'rack/attack/store_proxy/mem_cache_store_proxy'
27-
autoload :RedisProxy, 'rack/attack/store_proxy/redis_proxy'
28-
autoload :RedisStoreProxy, 'rack/attack/store_proxy/redis_store_proxy'
29-
autoload :RedisCacheStoreProxy, 'rack/attack/store_proxy/redis_cache_store_proxy'
30-
autoload :ActiveSupportRedisStoreProxy, 'rack/attack/store_proxy/active_support_redis_store_proxy'
3130
autoload :Fail2Ban, 'rack/attack/fail2ban'
3231
autoload :Allow2Ban, 'rack/attack/allow2ban'
3332

lib/rack/attack/cache.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ def initialize
1313

1414
attr_reader :store
1515
def store=(store)
16-
@store = StoreProxy.build(store)
16+
@store =
17+
if (proxy = StoreProxy.lookup(store))
18+
proxy.new(store)
19+
else
20+
store
21+
end
1722
end
1823

1924
def count(unprefixed_key, period)

lib/rack/attack/store_proxy/active_support_redis_store_proxy.rb renamed to lib/rack/attack/store_proxies/active_support_redis_store_proxy.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
8-
class ActiveSupportRedisStoreProxy < SimpleDelegator
7+
module StoreProxies
8+
class ActiveSupportRedisStoreProxy < StoreProxy
99
def self.handle?(store)
1010
defined?(::Redis) &&
1111
defined?(::ActiveSupport::Cache::RedisStore) &&

lib/rack/attack/store_proxy/dalli_proxy.rb renamed to lib/rack/attack/store_proxies/dalli_proxy.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
8-
class DalliProxy < SimpleDelegator
7+
module StoreProxies
8+
class DalliProxy < StoreProxy
99
def self.handle?(store)
1010
return false unless defined?(::Dalli)
1111

lib/rack/attack/store_proxy/mem_cache_store_proxy.rb renamed to lib/rack/attack/store_proxies/mem_cache_store_proxy.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
8-
class MemCacheStoreProxy < SimpleDelegator
7+
module StoreProxies
8+
class MemCacheStoreProxy < StoreProxy
99
def self.handle?(store)
1010
defined?(::Dalli) &&
1111
defined?(::ActiveSupport::Cache::MemCacheStore) &&

lib/rack/attack/store_proxy/redis_cache_store_proxy.rb renamed to lib/rack/attack/store_proxies/redis_cache_store_proxy.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
8-
class RedisCacheStoreProxy < SimpleDelegator
7+
module StoreProxies
8+
class RedisCacheStoreProxy < StoreProxy
99
def self.handle?(store)
1010
store.class.name == "ActiveSupport::Cache::RedisCacheStore"
1111
end

lib/rack/attack/store_proxy/redis_proxy.rb renamed to lib/rack/attack/store_proxies/redis_proxy.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
8-
class RedisProxy < SimpleDelegator
7+
module StoreProxies
8+
class RedisProxy < StoreProxy
99
def initialize(*args)
1010
if Gem::Version.new(Redis::VERSION) < Gem::Version.new("3")
1111
warn 'RackAttack requires Redis gem >= 3.0.0.'
@@ -15,7 +15,7 @@ def initialize(*args)
1515
end
1616

1717
def self.handle?(store)
18-
defined?(::Redis) && store.is_a?(::Redis)
18+
defined?(::Redis) && store.class == ::Redis
1919
end
2020

2121
def read(key)

lib/rack/attack/store_proxy/redis_store_proxy.rb renamed to lib/rack/attack/store_proxies/redis_store_proxy.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# frozen_string_literal: true
22

3-
require 'delegate'
3+
require 'rack/attack/store_proxies/redis_proxy'
44

55
module Rack
66
class Attack
7-
module StoreProxy
7+
module StoreProxies
88
class RedisStoreProxy < RedisProxy
99
def self.handle?(store)
1010
defined?(::Redis::Store) && store.is_a?(::Redis::Store)

lib/rack/attack/store_proxy.rb

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
# frozen_string_literal: true
22

3+
require 'delegate'
4+
35
module Rack
46
class Attack
5-
module StoreProxy
6-
PROXIES = [
7-
DalliProxy,
8-
MemCacheStoreProxy,
9-
RedisStoreProxy,
10-
RedisProxy,
11-
RedisCacheStoreProxy,
12-
ActiveSupportRedisStoreProxy
13-
].freeze
7+
class StoreProxy < SimpleDelegator
8+
class << self
9+
def proxies
10+
@@proxies ||= []
11+
end
12+
13+
def inherited(klass)
14+
proxies << klass
15+
end
16+
17+
def lookup(store)
18+
proxies.find { |proxy| proxy.handle?(store) }
19+
end
1420

15-
def self.build(store)
16-
klass = PROXIES.find { |proxy| proxy.handle?(store) }
17-
klass ? klass.new(store) : store
21+
def handle?(_store)
22+
raise NotImplementedError
23+
end
1824
end
1925
end
2026
end

spec/rack_attack_dalli_proxy_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
require_relative 'spec_helper'
44

5-
describe Rack::Attack::StoreProxy::DalliProxy do
5+
describe Rack::Attack::StoreProxies::DalliProxy do
66
it 'should stub Dalli::Client#with on older clients' do
7-
proxy = Rack::Attack::StoreProxy::DalliProxy.new(Class.new)
7+
proxy = Rack::Attack::StoreProxies::DalliProxy.new(Class.new)
88
proxy.with {} # will not raise an error
99
end
1010
end

0 commit comments

Comments
 (0)