devise_masquerade 1.3.3 → 1.3.8

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
  SHA256:
3
- metadata.gz: 23f626ba1c590f1686660a00804eaa5c5139a210fae80e72168a9f0a322e4be8
4
- data.tar.gz: ee1641f8fed338ac83be5935b5e374df60fc7eb003919c120b24052528462302
3
+ metadata.gz: 3f3c384ee31658834131c95ec34bc376340a9f7d8b7d237ed97316f6e61eb5ee
4
+ data.tar.gz: 78f66fc23c43a3db4eef66c98e15447decfea5627b2900c2ee827785a3b0cdd2
5
5
  SHA512:
6
- metadata.gz: 49c892cf2302d56d3d3aafb106d4e2eeba92b6c2f256440aa27a428df620bd16f49e89d5666ef6c2083e44fb260c1cb0beef3e575234cf5c6e91bff8f621dc4d
7
- data.tar.gz: 357d959e456fa0d10a748f2c15b4cd0f94f8c21e773c970d52715e752dfd29c4d39f1e5f06fb2cbe11c8b4517c9503203954af1674a4a02c89669ffacbacc5c0
6
+ metadata.gz: a6b318f8d335a53524a94d24b5c1bc78c41bc308200a0eed543fabdfb891e63a1d119efee269282f9f2e4e1d1a7dd27161076ed9465c3ac55b188f2127dce429
7
+ data.tar.gz: 0d39bbd0099a4d70496ece49d3db3e955eadbcb14bc20accfcc9fcc90c070b9e7aa5b697ce91367c7d20590a218d182fe99b7d0c37b220fd4bbb59ee1f6c5bde
data/Gemfile.lock CHANGED
@@ -52,7 +52,7 @@ GIT
52
52
  PATH
53
53
  remote: .
54
54
  specs:
55
- devise_masquerade (1.3.3)
55
+ devise_masquerade (1.3.8)
56
56
  devise (>= 4.7.0)
57
57
  globalid (>= 0.3.6)
58
58
  railties (>= 5.2.0)
@@ -9,44 +9,53 @@ class Devise::MasqueradesController < DeviseController
9
9
  prepend_before_action :authenticate_scope!, only: :show
10
10
  prepend_before_action :masquerade_authorize!
11
11
 
12
- before_action :save_masquerade_owner_session, only: :show
12
+ def show
13
+ if send("#{masqueraded_resource_name}_masquerade?")
14
+ resource = send("current_#{masquerading_resource_name}")
13
15
 
14
- after_action :cleanup_masquerade_owner_session, only: :back
16
+ go_back(resource, path: after_masquerade_full_path_for(resource))
17
+ else
18
+ masqueradable_resource = find_masqueradable_resource
15
19
 
16
- def show
17
- self.resource = find_resource
20
+ save_masquerade_owner_session(masqueradable_resource)
18
21
 
19
- if resource.class != masquerading_resource_class
22
+ resource = masqueradable_resource
20
23
  sign_out(send("current_#{masquerading_resource_name}"))
21
- end
22
24
 
23
- unless resource
24
- flash[:error] = "#{masqueraded_resource_class} not found."
25
- redirect_to(new_user_session_path) and return
26
- end
25
+ unless resource
26
+ flash[:error] = "#{masqueraded_resource_class} not found."
27
+ redirect_to(new_user_session_path) and return
28
+ end
27
29
 
28
- request.env['devise.skip_trackable'] = '1'
30
+ request.env['devise.skip_trackable'] = '1'
29
31
 
30
- masquerade_sign_in(resource)
32
+ masquerade_sign_in(resource)
31
33
 
32
- go_back(resource, path: after_masquerade_full_path_for(resource))
34
+ go_back(resource, path: after_masquerade_full_path_for(resource))
35
+ end
33
36
  end
34
37
 
35
38
  def back
36
- unless send("#{masqueraded_resource_name}_signed_in?")
37
- head(401) and return
38
- end
39
+ unless send("#{masqueraded_resource_name}_masquerade?")
40
+ resource = send("current_#{masqueraded_resource_name}")
41
+ go_back(resource, path: after_back_masquerade_path_for(resource))
42
+ else
43
+ masqueradable_resource = send("current_#{masqueraded_resource_name}")
39
44
 
40
- self.resource = find_owner_resource
45
+ unless send("#{masqueraded_resource_name}_signed_in?")
46
+ head(401) and return
47
+ end
41
48
 
42
- if resource.class != masqueraded_resource_class
49
+ resource = find_owner_resource(masqueradable_resource)
43
50
  sign_out(send("current_#{masqueraded_resource_name}"))
44
- end
45
51
 
46
- masquerade_sign_in(resource)
47
- request.env['devise.skip_trackable'] = nil
52
+ sign_in(resource)
53
+ request.env['devise.skip_trackable'] = nil
54
+
55
+ go_back(resource, path: after_back_masquerade_path_for(resource))
48
56
 
49
- go_back(resource, path: after_back_masquerade_path_for(resource))
57
+ cleanup_masquerade_owner_session(masqueradable_resource)
58
+ end
50
59
  end
51
60
 
52
61
  protected
@@ -59,12 +68,14 @@ class Devise::MasqueradesController < DeviseController
59
68
  true
60
69
  end
61
70
 
62
- def find_resource
63
- GlobalID::Locator.locate_signed params[Devise.masquerade_param], for: 'masquerade'
71
+ def find_masqueradable_resource
72
+ GlobalID::Locator.locate_signed(params[Devise.masquerade_param], for: 'masquerade')
64
73
  end
65
74
 
66
- def find_owner_resource
67
- GlobalID::Locator.locate_signed(Rails.cache.read(session_key), for: 'masquerade')
75
+ def find_owner_resource(masqueradable_resource)
76
+ skey = session_key(masqueradable_resource)
77
+
78
+ GlobalID::Locator.locate_signed(Rails.cache.read(skey), for: 'masquerade')
68
79
  end
69
80
 
70
81
  def go_back(user, path:)
@@ -129,27 +140,29 @@ class Devise::MasqueradesController < DeviseController
129
140
  '/'
130
141
  end
131
142
 
132
- def save_masquerade_owner_session
133
- resource_gid = send("current_#{masquerading_resource_name}").to_sgid(
134
- expires_in: Devise.masquerade_expires_in, for: 'masquerade')
135
- # skip sharing owner id via session
136
- Rails.cache.write(session_key, resource_gid, expires_in: Devise.masquerade_expires_in)
143
+ def save_masquerade_owner_session(masqueradable_resource)
144
+ skey = session_key(masqueradable_resource)
137
145
 
138
- unless session.key?(session_key)
139
- session[session_key_masquerading_resource_class] = masquerading_resource_class.name
140
- session[session_key_masqueraded_resource_class] = masqueraded_resource_class.name
141
- end
146
+ resource_gid = send("current_#{masquerading_resource_name}").to_sgid(for: 'masquerade')
147
+
148
+ # skip sharing owner id via session
149
+ Rails.cache.write(skey, resource_gid)
150
+ session[skey] = true
151
+ session[session_key_masquerading_resource_class] = masquerading_resource_class.name
152
+ session[session_key_masqueraded_resource_class] = masqueraded_resource_class.name
142
153
  end
143
154
 
144
- def cleanup_masquerade_owner_session
145
- Rails.cache.delete(session_key)
155
+ def cleanup_masquerade_owner_session(masqueradable_resource)
156
+ skey = session_key(masqueradable_resource)
146
157
 
158
+ Rails.cache.delete(skey)
159
+ session.delete(skey)
147
160
  session.delete(session_key_masqueraded_resource_class)
148
161
  session.delete(session_key_masquerading_resource_class)
149
162
  end
150
163
 
151
- def session_key
152
- "devise_masquerade_#{masqueraded_resource_name}".to_sym
164
+ def session_key(masqueradable_resource)
165
+ "devise_masquerade_#{masqueraded_resource_name}_#{masqueradable_resource.to_param}".to_sym
153
166
  end
154
167
 
155
168
  def session_key_masqueraded_resource_class
@@ -157,6 +170,6 @@ class Devise::MasqueradesController < DeviseController
157
170
  end
158
171
 
159
172
  def session_key_masquerading_resource_class
160
- "devise_masquerade_masquerading_resource_class"
173
+ "devise_masquerade_masquerading_resource_class"
161
174
  end
162
175
  end
@@ -0,0 +1,18 @@
1
+ Feature: Use back button for returning to the owner despite on expiration time.
2
+ In order to back to the owner user
3
+ As an masquerade user
4
+ I want to be able to press a simple button on the page
5
+
6
+ Scenario: Use back button
7
+ Given I logged in
8
+ And I have a user for masquerade
9
+
10
+ When I have devise masquerade expiration time in 1 second
11
+
12
+ When I am on the users page
13
+ And I login as one user
14
+ Then I should be login as this user
15
+ And I waited for 2 seconds
16
+
17
+ When I press back masquerade button
18
+ Then I should be login as owner user
@@ -0,0 +1,9 @@
1
+ When("I have devise masquerade expiration time in {int} second") do |seconds|
2
+ Devise.masquerade_expires_in = seconds.second
3
+ end
4
+
5
+ Then("I waited for {int} seconds") do |seconds|
6
+ sleep(seconds)
7
+
8
+ Devise.masquerade_expires_in = 5.minutes
9
+ end
@@ -38,12 +38,20 @@ module DeviseMasquerade
38
38
  end
39
39
 
40
40
  def #{name}_masquerade?
41
- ::Rails.cache.exist?(:"devise_masquerade_#{name}").present?
41
+ return false if current_#{name}.blank?
42
+
43
+ key = "devise_masquerade_#{name}_" + current_#{name}.to_param
44
+ return false if session[key].blank?
45
+
46
+ ::Rails.cache.exist?(key.to_sym).present?
42
47
  end
43
48
 
44
49
  def #{name}_masquerade_owner
45
- return nil unless send(:#{name}_masquerade?)
46
- GlobalID::Locator.locate_signed(::Rails.cache.read(:"devise_masquerade_#{name}"), for: 'masquerade')
50
+ return unless send(:#{name}_masquerade?)
51
+
52
+ key = "devise_masquerade_#{name}_" + current_#{name}.to_param
53
+ sgid = ::Rails.cache.read(key.to_sym)
54
+ GlobalID::Locator.locate_signed(sgid, for: 'masquerade')
47
55
  end
48
56
 
49
57
  private
@@ -1,3 +1,3 @@
1
1
  module DeviseMasquerade
2
- VERSION = '1.3.3'.freeze
2
+ VERSION = '1.3.8'.freeze
3
3
  end
@@ -14,7 +14,7 @@ describe Devise::MasqueradesController, type: :controller do
14
14
  get :show, params: { id: mask.to_param, masqueraded_resource_class: mask.class.name, masquerade: mask.masquerade_key }
15
15
  end
16
16
 
17
- it { expect(Rails.cache.read('devise_masquerade_student')).to be }
17
+ it { expect(Rails.cache.read("devise_masquerade_student_#{mask.to_param}")).to be }
18
18
 
19
19
  it 'should have warden keys defined' do
20
20
  expect(session["warden.user.student.key"].first.first).to eq(mask.id)
@@ -30,7 +30,7 @@ describe Devise::MasqueradesController, type: :controller do
30
30
  get :show, params: { id: mask.to_param, masquerade: mask.masquerade_key }
31
31
  end
32
32
 
33
- it { expect(Rails.cache.read('devise_masquerade_user')).to be }
33
+ it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).to be }
34
34
  it { expect(session["warden.user.user.key"].first.first).to eq(mask.id) }
35
35
  it { should redirect_to('/') }
36
36
 
@@ -39,7 +39,7 @@ describe Devise::MasqueradesController, type: :controller do
39
39
 
40
40
  it { should redirect_to(masquerade_page) }
41
41
  it { expect(current_user.reload).to eq(@user) }
42
- it { expect(Rails.cache.read('devise_masquerade_user')).not_to be }
42
+ it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).not_to be }
43
43
  end
44
44
  end
45
45
 
@@ -16,7 +16,7 @@ describe MasqueradesTestsController, type: :controller do
16
16
  before { get :show, params: { id: mask.to_param, masquerade: mask.masquerade_key } }
17
17
 
18
18
  it { expect(response.status).to eq(403) }
19
- it { expect(Rails.cache.read('devise_masquerade_user')).not_to be }
19
+ it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).not_to be }
20
20
  it { expect(session['warden.user.user.key'].first.first).not_to eq(mask.id) }
21
21
  end
22
22
 
@@ -35,7 +35,7 @@ describe MasqueradesTestsController, type: :controller do
35
35
  end
36
36
 
37
37
  it { expect(response.status).to eq(302) }
38
- it { expect(Rails.cache.read('devise_masquerade_user')).to be }
38
+ it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).to be }
39
39
  it { expect(session['warden.user.user.key'].first.first).to eq(mask.id) }
40
40
  end
41
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_masquerade
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Korsak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-16 00:00:00.000000000 Z
11
+ date: 2021-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -92,9 +92,11 @@ files:
92
92
  - config/environment.rb
93
93
  - devise_masquerade.gemspec
94
94
  - features/back.feature
95
+ - features/expires_masquerade.feature
95
96
  - features/multiple_masquerading_models.feature
96
97
  - features/step_definitions/auth_steps.rb
97
98
  - features/step_definitions/back_steps.rb
99
+ - features/step_definitions/expires_steps.rb
98
100
  - features/step_definitions/url_helpers_steps.rb
99
101
  - features/support/env.rb
100
102
  - features/url_helpers.feature
@@ -185,9 +187,11 @@ specification_version: 4
185
187
  summary: use for login as functionallity on your admin users pages
186
188
  test_files:
187
189
  - features/back.feature
190
+ - features/expires_masquerade.feature
188
191
  - features/multiple_masquerading_models.feature
189
192
  - features/step_definitions/auth_steps.rb
190
193
  - features/step_definitions/back_steps.rb
194
+ - features/step_definitions/expires_steps.rb
191
195
  - features/step_definitions/url_helpers_steps.rb
192
196
  - features/support/env.rb
193
197
  - features/url_helpers.feature