Skip to content

Commit edaa6c6

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

File tree

10 files changed

+51
-41
lines changed

10 files changed

+51
-41
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_proxy/dalli_proxy'
10+
require 'rack/attack/store_proxy/mem_cache_store_proxy'
11+
require 'rack/attack/store_proxy/redis_proxy'
12+
require 'rack/attack/store_proxy/redis_store_proxy'
13+
require 'rack/attack/store_proxy/redis_cache_store_proxy'
14+
require 'rack/attack/store_proxy/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/base_proxy.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
require 'delegate'
4+
5+
module Rack
6+
class Attack
7+
class BaseProxy < 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
20+
21+
def handle?(_store)
22+
raise NotImplementedError
23+
end
24+
end
25+
end
26+
end
27+
end

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 = BaseProxy.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.rb

Lines changed: 0 additions & 21 deletions
This file was deleted.

lib/rack/attack/store_proxy/active_support_redis_store_proxy.rb

Lines changed: 2 additions & 2 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/base_proxy'
44

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

lib/rack/attack/store_proxy/dalli_proxy.rb

Lines changed: 2 additions & 2 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/base_proxy'
44

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

lib/rack/attack/store_proxy/mem_cache_store_proxy.rb

Lines changed: 2 additions & 2 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/base_proxy'
44

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

lib/rack/attack/store_proxy/redis_cache_store_proxy.rb

Lines changed: 2 additions & 2 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/base_proxy'
44

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

lib/rack/attack/store_proxy/redis_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/base_proxy'
44

55
module Rack
66
class Attack
77
module StoreProxy
8-
class RedisProxy < SimpleDelegator
8+
class RedisProxy < BaseProxy
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# frozen_string_literal: true
22

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

55
module Rack
66
class Attack

0 commit comments

Comments
 (0)