action_interceptor 0.5.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -2
- data/README.md +30 -107
- data/config/initializers/action_interceptor.rb +22 -48
- data/lib/action_interceptor.rb +6 -19
- data/lib/action_interceptor/action_controller/base.rb +94 -0
- data/lib/action_interceptor/configuration.rb +7 -0
- data/lib/action_interceptor/engine.rb +1 -3
- data/lib/action_interceptor/strategies.rb +19 -0
- data/lib/action_interceptor/strategies/session.rb +28 -0
- data/lib/action_interceptor/version.rb +1 -1
- data/spec/dummy/config/application.rb +0 -2
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/initializers/action_interceptor.rb +3 -11
- data/spec/dummy/lib/strategies/dummy.rb +24 -0
- data/spec/dummy/log/test.log +1 -0
- data/spec/lib/action_interceptor/action_controller/base_spec.rb +65 -0
- data/spec/lib/action_interceptor/configuration_spec.rb +20 -0
- data/spec/lib/action_interceptor/strategies/session_spec.rb +29 -0
- data/spec/lib/action_interceptor/strategies_spec.rb +23 -0
- data/spec/lib/action_interceptor_spec.rb +2 -18
- metadata +35 -35
- data/lib/action_interceptor/action_controller.rb +0 -175
- data/lib/action_interceptor/action_mailer.rb +0 -21
- data/lib/action_interceptor/common.rb +0 -74
- data/lib/action_interceptor/encryptor.rb +0 -36
- data/lib/action_interceptor/undefined_interceptor.rb +0 -4
- data/spec/lib/action_interceptor/action_controller_spec.rb +0 -62
- data/spec/lib/action_interceptor/action_mailer_spec.rb +0 -16
- data/spec/lib/action_interceptor/common_spec.rb +0 -25
- data/spec/lib/action_interceptor/encryptor_spec.rb +0 -19
@@ -1,21 +0,0 @@
|
|
1
|
-
module ActionInterceptor
|
2
|
-
module ActionMailer
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.helper_method :interceptor_enabled, :interceptor_enabled=
|
6
|
-
end
|
7
|
-
|
8
|
-
protected
|
9
|
-
|
10
|
-
def interceptor_enabled
|
11
|
-
false
|
12
|
-
end
|
13
|
-
|
14
|
-
def interceptor_enabled=(arg)
|
15
|
-
false
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
ActionMailer::Base.send :include, ActionInterceptor::ActionMailer
|
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'action_interceptor/action_controller'
|
2
|
-
|
3
|
-
module ActionInterceptor
|
4
|
-
module Common
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.alias_method_chain :url_for, :interceptor
|
8
|
-
end
|
9
|
-
|
10
|
-
def url_for_with_interceptor(options = {})
|
11
|
-
url = url_for_without_interceptor(options)
|
12
|
-
return url unless interceptor_enabled
|
13
|
-
|
14
|
-
@interceptor_url_for_hash ||= is_interceptor? ? \
|
15
|
-
intercepted_url_hash : \
|
16
|
-
current_url_hash
|
17
|
-
|
18
|
-
uri = URI(url)
|
19
|
-
new_query = HashWithIndifferentAccess[
|
20
|
-
URI.decode_www_form(uri.query || '')
|
21
|
-
].merge(@interceptor_url_for_hash)
|
22
|
-
uri.query = URI.encode_www_form(new_query)
|
23
|
-
uri.to_s
|
24
|
-
end
|
25
|
-
|
26
|
-
protected
|
27
|
-
|
28
|
-
# Executes the given block as if it was inside an interceptor
|
29
|
-
def with_interceptor(&block)
|
30
|
-
previous_interceptor_enabled = interceptor_enabled
|
31
|
-
|
32
|
-
begin
|
33
|
-
# Send the referer with intercepted requests
|
34
|
-
# So we don't rely on the user's browser to do it for us
|
35
|
-
self.interceptor_enabled = true
|
36
|
-
|
37
|
-
# Execute the block as if it was defined in this controller
|
38
|
-
instance_exec &block
|
39
|
-
rescue LocalJumpError => e
|
40
|
-
# Silently ignore `return` errors in the block
|
41
|
-
# and return the given value
|
42
|
-
e.exit_value
|
43
|
-
ensure
|
44
|
-
self.interceptor_enabled = previous_interceptor_enabled
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Executes the given block as if it was not inside an interceptor
|
49
|
-
def without_interceptor(&block)
|
50
|
-
previous_interceptor_enabled = interceptor_enabled
|
51
|
-
|
52
|
-
begin
|
53
|
-
# Send the referer with intercepted requests
|
54
|
-
# So we don't rely on the user's browser to do it for us
|
55
|
-
self.interceptor_enabled = false
|
56
|
-
|
57
|
-
# Execute the block as if it was defined in this controller
|
58
|
-
instance_exec &block
|
59
|
-
rescue LocalJumpError => e
|
60
|
-
# Silently ignore `return` errors in the block
|
61
|
-
# and return the given value
|
62
|
-
e.exit_value
|
63
|
-
ensure
|
64
|
-
self.interceptor_enabled = previous_interceptor_enabled
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
ActionController::Base.send :include, ActionInterceptor::Common
|
72
|
-
ActionView::Base.send :include, ActionInterceptor::Common
|
73
|
-
ActionView::RoutingUrlFor.send :include, ActionInterceptor::Common \
|
74
|
-
if defined?(ActionView::RoutingUrlFor)
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module ActionInterceptor
|
2
|
-
class Encryptor
|
3
|
-
|
4
|
-
def self.encrypt_and_sign(value)
|
5
|
-
message_encryptor.encrypt_and_sign(value)
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.decrypt_and_verify(value)
|
9
|
-
message_encryptor.decrypt_and_verify(value)
|
10
|
-
end
|
11
|
-
|
12
|
-
protected
|
13
|
-
|
14
|
-
def self.message_encryptor
|
15
|
-
return @message_encryptor if @message_encryptor
|
16
|
-
|
17
|
-
application = Rails.application
|
18
|
-
config = application.config
|
19
|
-
application_secret = application.secrets[:secret_key_base] \
|
20
|
-
if application.respond_to?(:secrets)
|
21
|
-
application_secret ||= config.secret_key_base if config.respond_to?(:secret_key_base)
|
22
|
-
application_secret ||= config.secret_token
|
23
|
-
|
24
|
-
# This is how Rails 4 generates keys for encrypted cookies
|
25
|
-
# Except that, in Rails 4, MessageEncryptor can take 2 different secrets,
|
26
|
-
# one for encryption and one for verification
|
27
|
-
salt = 'encrypted intercepted url'
|
28
|
-
secret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(
|
29
|
-
application_secret, salt, 2**16, 64)
|
30
|
-
|
31
|
-
@message_encryptor = ActiveSupport::MessageEncryptor.new(secret,
|
32
|
-
:serializer => ActiveSupport::MessageEncryptor::NullSerializer)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ActionInterceptor
|
4
|
-
describe ActionController do
|
5
|
-
|
6
|
-
it 'modifies ActionController::Base' do
|
7
|
-
expect(::ActionController::Base).to respond_to(:interceptor_filters)
|
8
|
-
expect(::ActionController::Base.interceptor_filters).to be_a(Hash)
|
9
|
-
|
10
|
-
expect(::ActionController::Base).to respond_to(:interceptor)
|
11
|
-
expect(::ActionController::Base).to respond_to(:skip_interceptor)
|
12
|
-
expect(::ActionController::Base).to respond_to(:acts_as_interceptor)
|
13
|
-
|
14
|
-
expect(::ActionController::Base.new.respond_to?(
|
15
|
-
:is_interceptor?, true)).to eq(true)
|
16
|
-
expect(::ActionController::Base.new.send :is_interceptor?).to eq(false)
|
17
|
-
|
18
|
-
expect(::ActionController::Base.new.respond_to?(
|
19
|
-
:interceptor_enabled, true)).to eq(true)
|
20
|
-
expect(::ActionController::Base.new.respond_to?(
|
21
|
-
:current_page?, true)).to eq(true)
|
22
|
-
expect(::ActionController::Base.new.respond_to?(
|
23
|
-
:current_url, true)).to eq(true)
|
24
|
-
expect(::ActionController::Base.new.respond_to?(
|
25
|
-
:current_url_hash, true)).to eq(true)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'modifies classes that act_as_interceptor' do
|
29
|
-
expect(RegistrationsController.new.send :is_interceptor?).to eq(true)
|
30
|
-
|
31
|
-
expect(RegistrationsController.new.respond_to?(
|
32
|
-
:intercepted_url, true)).to eq(true)
|
33
|
-
expect(RegistrationsController.new.respond_to?(
|
34
|
-
:intercepted_url=, true)).to eq(true)
|
35
|
-
expect(RegistrationsController.new.respond_to?(
|
36
|
-
:intercepted_url_hash, true)).to eq(true)
|
37
|
-
expect(RegistrationsController.new.respond_to?(
|
38
|
-
:redirect_back, true)).to eq(true)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'registers and skips before_filters' do
|
42
|
-
filters = RegistrationsController.new._process_action_callbacks
|
43
|
-
.collect{|c| c.filter}
|
44
|
-
expect(filters).not_to include(:my_interceptor)
|
45
|
-
|
46
|
-
RegistrationsController.interceptor :my_interceptor
|
47
|
-
filters = RegistrationsController.new._process_action_callbacks
|
48
|
-
.collect{|c| c.filter}
|
49
|
-
expect(filters).to include(:my_interceptor)
|
50
|
-
|
51
|
-
filters = ApplicationController.new._process_action_callbacks
|
52
|
-
.collect{|c| c.filter}
|
53
|
-
expect(filters).to include(:my_interceptor)
|
54
|
-
|
55
|
-
ApplicationController.skip_interceptor :my_interceptor
|
56
|
-
filters = ApplicationController.new._process_action_callbacks
|
57
|
-
.collect{|c| c.filter}
|
58
|
-
expect(filters).not_to include(:my_interceptor)
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ActionInterceptor
|
4
|
-
describe ActionMailer do
|
5
|
-
|
6
|
-
it 'modifies ActionMailer::Base' do
|
7
|
-
mailer = ::ActionMailer::Base.send(:new)
|
8
|
-
expect(mailer.respond_to?(:interceptor_enabled, true)).to eq(true)
|
9
|
-
expect(mailer.respond_to?(:interceptor_enabled=, true)).to eq(true)
|
10
|
-
|
11
|
-
expect(mailer.send(:interceptor_enabled)).to eq(false)
|
12
|
-
expect(mailer.send(:interceptor_enabled=, true)).to eq(false)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ActionInterceptor
|
4
|
-
describe Common do
|
5
|
-
|
6
|
-
it 'modifies ActionController::Base' do
|
7
|
-
expect(::ActionController::Base.new.respond_to?(
|
8
|
-
:url_for, true)).to eq(true)
|
9
|
-
expect(::ActionController::Base.new.respond_to?(
|
10
|
-
:with_interceptor, true)).to eq(true)
|
11
|
-
expect(::ActionController::Base.new.respond_to?(
|
12
|
-
:without_interceptor, true)).to eq(true)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'modifies ActionView::Base' do
|
16
|
-
expect(::ActionView::Base.new.respond_to?(
|
17
|
-
:url_for, true)).to eq(true)
|
18
|
-
expect(::ActionView::Base.new.respond_to?(
|
19
|
-
:with_interceptor, true)).to eq(true)
|
20
|
-
expect(::ActionView::Base.new.respond_to?(
|
21
|
-
:without_interceptor, true)).to eq(true)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ActionInterceptor
|
4
|
-
describe Encryptor do
|
5
|
-
|
6
|
-
it 'encrypts and decrypts strings' do
|
7
|
-
my_string = 'My string'
|
8
|
-
encrypted_string = Encryptor.encrypt_and_sign(my_string)
|
9
|
-
expect(encrypted_string).not_to include(my_string)
|
10
|
-
|
11
|
-
decrypted_string = Encryptor.decrypt_and_verify(encrypted_string)
|
12
|
-
expect(decrypted_string).to eq(my_string)
|
13
|
-
|
14
|
-
expect{Encryptor.decrypt_and_verify(my_string)}.to(
|
15
|
-
raise_error(ActiveSupport::MessageVerifier::InvalidSignature))
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|