action_interceptor 0.2.1 → 0.2.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.
- checksums.yaml +13 -5
- data/README.md +12 -1
- data/lib/action_interceptor/controller.rb +12 -2
- data/lib/action_interceptor/version.rb +1 -1
- data/spec/lib/action_interceptor/controller_spec.rb +12 -12
- data/spec/lib/action_interceptor/view_spec.rb +3 -3
- data/spec/lib/action_interceptor_spec.rb +2 -2
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTZmOTJjOTJlOTgxNGMzM2MzMmRmMjFiZTdjNTFiOTEyMTRiN2MxZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzY5ZTBlODU5MWMwZWZiM2U4NmFhMjNiNjM4YTQwZmFiNDcxMzJjNw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzdjZmFkOTFiNmMyNjA5MmVmNjU5MGVmNjg3ZDY0NzAwZWU1OWNiZWYzODRj
|
10
|
+
ZTQ1OGFlNGQwNDEzNjZmZDI3ZTRhOGJjOGUwMjc3N2YxNmUwMzcwNGViNDMw
|
11
|
+
YTQ0Zjc0ODIwZDgxNDUxNjBlZjliZjQyMmIxODA5NjY5M2I1NzM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
M2NmYmJkNjE0Y2VjMDI1Mjk0MzdmY2VhNjA4Mjg1MWYwODAxNTdiM2M2YTky
|
14
|
+
Yjk4MzQwMmJlYTQ0Njk4MTA2YjA0OGM4NDBhZjEyNGFhNWZmN2VmNzYwN2Ri
|
15
|
+
ZDFmNmE1MWVjYzBhMjFiNGQ4NzZlMTMxYmE4NzRjOGVlYmZmNmU=
|
data/README.md
CHANGED
@@ -24,13 +24,24 @@ And then execute:
|
|
24
24
|
$ bundle install
|
25
25
|
```
|
26
26
|
|
27
|
-
|
27
|
+
Afterwards, run the following rake task to add
|
28
28
|
Action Interceptor's initializer to your application:
|
29
29
|
|
30
30
|
```sh
|
31
31
|
$ rake action_interceptor:install
|
32
32
|
```
|
33
33
|
|
34
|
+
In case Action Interceptor is completely unable to determine which page a user
|
35
|
+
came from (should rarely happen if properly configured), it will send the user
|
36
|
+
to your application or gem's root_url. So make sure it is defined:
|
37
|
+
|
38
|
+
```rb
|
39
|
+
root :to => 'some_controller#some_action'
|
40
|
+
```
|
41
|
+
|
42
|
+
Alternatively, you can always stub root_url in your
|
43
|
+
ApplicationController and make it a helper method.
|
44
|
+
|
34
45
|
## Usage
|
35
46
|
|
36
47
|
Interceptors are blocks of code that are declared in Action Interceptor's
|
@@ -41,6 +41,7 @@ module ActionInterceptor
|
|
41
41
|
# Can't redirect back to non-get
|
42
42
|
# Also, can't call root_url here, so use '/' instead
|
43
43
|
url = Encryptor.encrypt_and_sign(request.get? ? current_url : '/')
|
44
|
+
|
44
45
|
@current_url_hash = {key => url}
|
45
46
|
end
|
46
47
|
|
@@ -100,11 +101,16 @@ module ActionInterceptor
|
|
100
101
|
return @intercepted_url if @intercepted_url
|
101
102
|
|
102
103
|
key = ActionInterceptor.intercepted_url_key
|
104
|
+
encrypted_url = params[key]
|
105
|
+
|
103
106
|
begin
|
104
107
|
# URL params are the most reliable, as they preserve
|
105
108
|
# state even if the user presses the back button
|
106
109
|
# We need to sign them to prevent the Open Redirect vulnerability
|
107
|
-
@intercepted_url = Encryptor.decrypt_and_verify(
|
110
|
+
@intercepted_url = Encryptor.decrypt_and_verify(encrypted_url)
|
111
|
+
|
112
|
+
# If we got this far, the encrypted url is valid, so reuse it
|
113
|
+
@intercepted_url_hash = {key => encrypted_url}
|
108
114
|
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
109
115
|
# If the param is not available, use our best guess
|
110
116
|
# Session and referer are safe for redirects (for that user)
|
@@ -118,8 +124,12 @@ module ActionInterceptor
|
|
118
124
|
end
|
119
125
|
|
120
126
|
def intercepted_url_hash
|
127
|
+
# Run intercepted_url to verify the params in case the
|
128
|
+
# encrypted url is in there and can be reused
|
129
|
+
unencrypted_url = intercepted_url
|
121
130
|
return @intercepted_url_hash if @intercepted_url_hash
|
122
|
-
|
131
|
+
|
132
|
+
url = Encryptor.encrypt_and_sign(unencrypted_url)
|
123
133
|
key = ActionInterceptor.intercepted_url_key
|
124
134
|
|
125
135
|
@intercepted_url_hash = {key => url}
|
@@ -7,7 +7,7 @@ module ActionInterceptor
|
|
7
7
|
expect(ActionController::Base).to respond_to(:is_interceptor)
|
8
8
|
expect(ActionController::Base).to respond_to(:use_interceptor)
|
9
9
|
expect(ActionController::Base).to respond_to(:interceptor_filters)
|
10
|
-
expect(ActionController::Base.is_interceptor).to
|
10
|
+
expect(ActionController::Base.is_interceptor).to eq(false)
|
11
11
|
expect(ActionController::Base.interceptor_filters).to be_a(Hash)
|
12
12
|
|
13
13
|
expect(ActionController::Base).to respond_to(:interceptor)
|
@@ -15,30 +15,30 @@ module ActionInterceptor
|
|
15
15
|
expect(ActionController::Base).to respond_to(:acts_as_interceptor)
|
16
16
|
|
17
17
|
expect(ActionController::Base.new.respond_to?(
|
18
|
-
:current_page?, true)).to
|
18
|
+
:current_page?, true)).to eq(true)
|
19
19
|
expect(ActionController::Base.new.respond_to?(
|
20
|
-
:current_url, true)).to
|
20
|
+
:current_url, true)).to eq(true)
|
21
21
|
expect(ActionController::Base.new.respond_to?(
|
22
|
-
:current_url_hash, true)).to
|
22
|
+
:current_url_hash, true)).to eq(true)
|
23
23
|
expect(ActionController::Base.new.respond_to?(
|
24
|
-
:url_for, true)).to
|
24
|
+
:url_for, true)).to eq(true)
|
25
25
|
expect(ActionController::Base.new.respond_to?(
|
26
|
-
:with_interceptor, true)).to
|
26
|
+
:with_interceptor, true)).to eq(true)
|
27
27
|
expect(ActionController::Base.new.respond_to?(
|
28
|
-
:without_interceptor, true)).to
|
28
|
+
:without_interceptor, true)).to eq(true)
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'modifies classes that act_as_interceptor' do
|
32
|
-
expect(RegistrationsController.is_interceptor).to
|
32
|
+
expect(RegistrationsController.is_interceptor).to eq(true)
|
33
33
|
|
34
34
|
expect(RegistrationsController.new.respond_to?(
|
35
|
-
:intercepted_url, true)).to
|
35
|
+
:intercepted_url, true)).to eq(true)
|
36
36
|
expect(RegistrationsController.new.respond_to?(
|
37
|
-
:intercepted_url=, true)).to
|
37
|
+
:intercepted_url=, true)).to eq(true)
|
38
38
|
expect(RegistrationsController.new.respond_to?(
|
39
|
-
:intercepted_url_hash, true)).to
|
39
|
+
:intercepted_url_hash, true)).to eq(true)
|
40
40
|
expect(RegistrationsController.new.respond_to?(
|
41
|
-
:redirect_back, true)).to
|
41
|
+
:redirect_back, true)).to eq(true)
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'registers and skips before_filters' do
|
@@ -5,11 +5,11 @@ module ActionInterceptor
|
|
5
5
|
|
6
6
|
it 'modifies ActionView::Base' do
|
7
7
|
expect(ActionView::Base.new.respond_to?(
|
8
|
-
:url_for, true)).to
|
8
|
+
:url_for, true)).to eq(true)
|
9
9
|
expect(ActionView::Base.new.respond_to?(
|
10
|
-
:with_interceptor, true)).to
|
10
|
+
:with_interceptor, true)).to eq(true)
|
11
11
|
expect(ActionView::Base.new.respond_to?(
|
12
|
-
:without_interceptor, true)).to
|
12
|
+
:without_interceptor, true)).to eq(true)
|
13
13
|
end
|
14
14
|
|
15
15
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe ActionInterceptor do
|
4
4
|
it 'must be configurable' do
|
5
5
|
expect(ActionInterceptor.intercepted_url_key).to eq(:dummy_key)
|
6
|
-
expect(ActionInterceptor.override_url_options).to
|
6
|
+
expect(ActionInterceptor.override_url_options).to eq(true)
|
7
7
|
expect(ActionInterceptor.interceptors.keys).to include(:registration)
|
8
8
|
|
9
9
|
my_block = lambda { 'my_block' }
|
@@ -15,7 +15,7 @@ describe ActionInterceptor do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
expect(ActionInterceptor.intercepted_url_key).to eq(:my_key)
|
18
|
-
expect(ActionInterceptor.override_url_options).to
|
18
|
+
expect(ActionInterceptor.override_url_options).to eq(false)
|
19
19
|
expect(ActionInterceptor.interceptors).to include({:my_name => my_block})
|
20
20
|
end
|
21
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_interceptor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dante Soares
|
@@ -14,42 +14,42 @@ dependencies:
|
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sqlite3
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description: Action Interceptor provides controllers that require users to perform
|
@@ -125,12 +125,12 @@ require_paths:
|
|
125
125
|
- lib
|
126
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
|
-
- -
|
128
|
+
- - ! '>='
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0'
|
131
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
132
|
requirements:
|
133
|
-
- -
|
133
|
+
- - ! '>='
|
134
134
|
- !ruby/object:Gem::Version
|
135
135
|
version: '0'
|
136
136
|
requirements: []
|