devise_masquerade 1.3.7 → 1.3.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c612609f3eeb20d48b13ed9166d5a6e3631cf284bda1aceb67501686bb806ee
4
- data.tar.gz: 7c1e2356ec14f72af05816534d037b2a1e344a5d482a28156f71053b4d1dab0e
3
+ metadata.gz: 765e1b2a1c4a2ae6f4708ad80b7f69745093be77070aaffb0415a71e870d3d3e
4
+ data.tar.gz: ccfd44dc5346385d69a5b0bd6ef69f7504cb36e4d092568744b3e3bbbda34a07
5
5
  SHA512:
6
- metadata.gz: 7545f0259d8607d0f06738308704646fccfea3708f33b39408302afc9893ab1203d36a5f3cedebb12ab4fc9b150b198d7dbf6f984655bec3ff02aa4ab2e76c47
7
- data.tar.gz: 5e0b106db2ce2d05b1bfcbd91c81730ce09560e248bea3b700c6ba9ad822bbad68adf19305763470817b76a0b18775a974ba431334a1c043c9e1abe5345aec96
6
+ metadata.gz: 02f79998f7f9364a32628b3fa246e1e82b0b7a6007bfa344861ee5cf6fb168166cb73350733e554017922bd889709dcf29d374a08cf39cb191d68ca4e2fea811
7
+ data.tar.gz: 0b814c4cef685103f3a846dbdc2ee62f4b070b9be2c20e913eb63605e518e125d8aae6933c1006437a3b7fdfc5e5677820b4640c50d204e66174c6c4b1687800
data/.travis.yml CHANGED
@@ -1,12 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.5.1
4
3
  - 2.6.0
5
- - 2.7.2
6
- gemfile:
7
- - Gemfile
4
+ - 2.7.3
8
5
  script: time ./script/travis.sh
9
- sudo: false
10
6
  addons:
11
7
  apt:
12
8
  packages:
data/Gemfile.lock CHANGED
@@ -52,7 +52,7 @@ GIT
52
52
  PATH
53
53
  remote: .
54
54
  specs:
55
- devise_masquerade (1.3.7)
55
+ devise_masquerade (1.3.10)
56
56
  devise (>= 4.7.0)
57
57
  globalid (>= 0.3.6)
58
58
  railties (>= 5.2.0)
@@ -93,12 +93,12 @@ GEM
93
93
  minitest (~> 5.1)
94
94
  tzinfo (~> 1.1)
95
95
  zeitwerk (~> 2.1, >= 2.1.8)
96
- addressable (2.7.0)
96
+ addressable (2.8.0)
97
97
  public_suffix (>= 2.0.2, < 5.0)
98
98
  archive-zip (0.12.0)
99
99
  io-like (~> 0.3.0)
100
100
  backports (3.15.0)
101
- bcrypt (3.1.16)
101
+ bcrypt (3.1.17)
102
102
  bson (1.12.5)
103
103
  bson_ext (1.12.5)
104
104
  bson (~> 1.12.5)
@@ -142,7 +142,7 @@ GEM
142
142
  cucumber-tag_expressions (1.1.1)
143
143
  cucumber-wire (0.0.1)
144
144
  database_cleaner (1.0.1)
145
- devise (4.7.3)
145
+ devise (4.8.1)
146
146
  bcrypt (~> 3.0)
147
147
  orm_adapter (~> 0.1)
148
148
  railties (>= 4.1.0)
@@ -201,13 +201,13 @@ GEM
201
201
  mime-types-data (~> 3.2015)
202
202
  mime-types-data (3.2019.1009)
203
203
  mini_mime (1.0.2)
204
- mini_portile2 (2.5.0)
204
+ mini_portile2 (2.8.0)
205
205
  minitest (5.12.2)
206
206
  multi_json (1.14.1)
207
207
  multi_test (0.1.2)
208
208
  nenv (0.3.0)
209
- nokogiri (1.11.1)
210
- mini_portile2 (~> 2.5.0)
209
+ nokogiri (1.13.3)
210
+ mini_portile2 (~> 2.8.0)
211
211
  racc (~> 1.4)
212
212
  notiffany (0.1.3)
213
213
  nenv (~> 0.1)
@@ -220,8 +220,8 @@ GEM
220
220
  pry-byebug (3.7.0)
221
221
  byebug (~> 11.0)
222
222
  pry (~> 0.10)
223
- public_suffix (4.0.1)
224
- racc (1.5.2)
223
+ public_suffix (4.0.6)
224
+ racc (1.6.0)
225
225
  rack (2.2.3)
226
226
  rack-test (1.1.0)
227
227
  rack (>= 1.0, < 3)
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Devise Masquerade
2
- [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/oivoodoo/devise_masquerade?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3
- [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade?ref=badge_shield)
4
2
 
5
- [![Build Status](https://secure.travis-ci.org/oivoodoo/devise_masquerade.png?branch=master)](https://travis-ci.org/oivoodoo/devise_masquerade)
3
+ [![Gitter chat](https://badges.gitter.im/oivoodoo/devise_masquerade.svg)](https://gitter.im/oivoodoo/devise_masquerade?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+
5
+ [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade?ref=badge_shield)
6
6
 
7
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/oivoodoo/devise_masquerade)
7
+ [![Build Status](https://secure.travis-ci.org/oivoodoo/devise_masquerade.svg?branch=master)](https://travis-ci.org/oivoodoo/devise_masquerade)
8
8
 
9
- [![endorse](https://api.coderwall.com/oivoodoo/endorsecount.png)](https://coderwall.com/oivoodoo)
9
+ [![Maintainability](https://api.codeclimate.com/v1/badges/cf63d775dc014a7ebc03/maintainability)](https://codeclimate.com/github/oivoodoo/devise_masquerade/maintainability)
10
10
 
11
- [![Analytics](https://ga-beacon.appspot.com/UA-46818771-1/devise_masquerade/README.md)](https://github.com/oivoodoo/devise_masquerade)
11
+ [Consulting](https://bitscorp.co)
12
12
 
13
13
  It's a utility library for enabling functionallity like login as button for
14
14
  admin.
@@ -31,7 +31,9 @@ And then execute:
31
31
 
32
32
  In the view you can use url helper for defining link:
33
33
 
34
+ ```ruby
34
35
  = link_to "Login As", masquerade_path(user)
36
+ ```
35
37
 
36
38
  `masquerade_path` would create specific `/masquerade` path with query params `masquerade`(key) and `masqueraded_resource_class` to know
37
39
  which model to choose to search and sign in by masquerade key.
@@ -62,9 +64,11 @@ Instead of user you can use your resource name admin, student or another names.
62
64
  If you want to back to the owner of masquerade action user you could use
63
65
  helpers:
64
66
 
67
+ ```ruby
65
68
  user_masquerade? # current user was masqueraded by owner?
66
69
 
67
70
  = link_to "Reverse masquerade", back_masquerade_path(current_user)
71
+ ```
68
72
 
69
73
  ## Custom controller for adding cancan for authorization
70
74
 
@@ -162,12 +166,12 @@ in `routes.rb`:
162
166
  Devise.masquerade_key_size = 16 # size of the generate by SecureRandom.urlsafe_base64
163
167
  Devise.masquerade_bypass_warden_callback = false
164
168
  Devise.masquerade_routes_back = false # if true, route back to the page the user was on via redirect_back
165
- Devise.masquerading_resource_class = User
169
+ Devise.masquerading_resource_class = AdminUser
166
170
  # optional, default: masquerading_resource_class.model_name.param_key
167
- Devise.masquerading_resource_name = :user
168
- Devise.masqueraded_resource_class = AdminUser
171
+ Devise.masquerading_resource_name = :admin_user
172
+ Devise.masqueraded_resource_class = User
169
173
  # optional, default: masqueraded_resource_class.model_name.param_key
170
- Devise.masqueraded_resource_name = :admin_user
174
+ Devise.masqueraded_resource_name = :user
171
175
  ```
172
176
 
173
177
  ## Demo project
@@ -181,7 +185,7 @@ And check http://localhost:3000/, use for login user1@example.com and
181
185
 
182
186
  ## Troubleshooting
183
187
 
184
- Are you working in development mode and wondering why masquerade attempts result in a [Receiving "You are already signed in" flash[:error]](https://github.com/oivoodoo/devise_masquerade/issues/58) message? `Filter chain halted as :require_no_authentication rendered or redirected` showing up in your logfile? Chances are that you need to enable caching:
188
+ Are you working in development mode and wondering why masquerade attempts result in a [Receiving "You are already signed in" flash[:error]](https://github.com/oivoodoo/devise_masquerade/issues/58) message? `Filter chain halted as :require_no_authentication rendered or redirected` showing up in your logfile? Do you find that your `user_masquerade?` method is always returning false? Chances are that you need to enable caching:
185
189
 
186
190
  rails dev:cache
187
191
 
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  class Devise::MasqueradesController < DeviseController
2
4
  Devise.mappings.each do |name, _|
3
5
  class_eval <<-METHODS, __FILE__, __LINE__ + 1
@@ -10,41 +12,52 @@ class Devise::MasqueradesController < DeviseController
10
12
  prepend_before_action :masquerade_authorize!
11
13
 
12
14
  def show
13
- masqueradable_resource = find_masqueradable_resource
15
+ if send("#{masqueraded_resource_name}_masquerade?")
16
+ resource = masquerading_current_user
14
17
 
15
- save_masquerade_owner_session(masqueradable_resource)
18
+ go_back(resource, path: after_masquerade_full_path_for(resource))
19
+ else
20
+ masqueradable_resource = find_masqueradable_resource
16
21
 
17
- self.resource = masqueradable_resource
18
- sign_out(send("current_#{masquerading_resource_name}"))
22
+ save_masquerade_owner_session(masqueradable_resource)
19
23
 
20
- unless resource
21
- flash[:error] = "#{masqueraded_resource_class} not found."
22
- redirect_to(new_user_session_path) and return
23
- end
24
+ resource = masqueradable_resource
25
+ sign_out(masquerading_current_user)
26
+
27
+ unless resource
28
+ flash[:error] = "#{masqueraded_resource_class} not found."
29
+ redirect_to(send("new_#{masqueraded_resource_name}_session_path")) and return
30
+ end
24
31
 
25
- request.env['devise.skip_trackable'] = '1'
32
+ request.env['devise.skip_trackable'] = '1'
26
33
 
27
- masquerade_sign_in(resource)
34
+ masquerade_sign_in(resource)
28
35
 
29
- go_back(resource, path: after_masquerade_full_path_for(resource))
36
+ go_back(resource, path: after_masquerade_full_path_for(resource))
37
+ end
30
38
  end
31
39
 
32
40
  def back
33
- masqueradable_resource = send("current_#{masqueraded_resource_name}")
41
+ unless send("#{masqueraded_resource_name}_masquerade?")
42
+ resource = send("current_#{masqueraded_resource_name}")
43
+ go_back(resource, path: after_back_masquerade_path_for(resource))
44
+ else
45
+ masqueradable_resource = send("current_#{masqueraded_resource_name}")
34
46
 
35
- unless send("#{masqueraded_resource_name}_signed_in?")
36
- head(401) and return
37
- end
47
+ unless send("#{masqueraded_resource_name}_signed_in?")
48
+ head(401) and return
49
+ end
38
50
 
39
- self.resource = find_owner_resource(masqueradable_resource)
40
- sign_out(send("current_#{masqueraded_resource_name}"))
51
+ resource = find_owner_resource(masqueradable_resource)
52
+ sign_out(send("current_#{masqueraded_resource_name}"))
41
53
 
42
- masquerade_sign_in(resource)
43
- request.env['devise.skip_trackable'] = nil
54
+ sign_in(resource)
55
+ request.env['devise.skip_trackable'] = nil
44
56
 
45
- go_back(resource, path: after_back_masquerade_path_for(resource))
57
+ go_back(resource, path: after_back_masquerade_path_for(resource))
46
58
 
47
- cleanup_masquerade_owner_session(masqueradable_resource)
59
+ cleanup_masquerade_owner_session(masqueradable_resource)
60
+ end
48
61
  end
49
62
 
50
63
  protected
@@ -62,7 +75,7 @@ class Devise::MasqueradesController < DeviseController
62
75
  end
63
76
 
64
77
  def find_owner_resource(masqueradable_resource)
65
- skey = session_key(masqueradable_resource)
78
+ skey = session_key(masqueradable_resource, masquerading_guid)
66
79
 
67
80
  GlobalID::Locator.locate_signed(Rails.cache.read(skey), for: 'masquerade')
68
81
  end
@@ -130,7 +143,9 @@ class Devise::MasqueradesController < DeviseController
130
143
  end
131
144
 
132
145
  def save_masquerade_owner_session(masqueradable_resource)
133
- skey = session_key(masqueradable_resource)
146
+ guid = SecureRandom.uuid
147
+
148
+ skey = session_key(masqueradable_resource, guid)
134
149
 
135
150
  resource_gid = send("current_#{masquerading_resource_name}").to_sgid(for: 'masquerade')
136
151
 
@@ -139,19 +154,21 @@ class Devise::MasqueradesController < DeviseController
139
154
  session[skey] = true
140
155
  session[session_key_masquerading_resource_class] = masquerading_resource_class.name
141
156
  session[session_key_masqueraded_resource_class] = masqueraded_resource_class.name
157
+ session[session_key_masquerading_resource_guid] = guid
142
158
  end
143
159
 
144
160
  def cleanup_masquerade_owner_session(masqueradable_resource)
145
- skey = session_key(masqueradable_resource)
161
+ skey = session_key(masqueradable_resource, masquerading_guid)
146
162
 
147
163
  Rails.cache.delete(skey)
148
164
  session.delete(skey)
149
165
  session.delete(session_key_masqueraded_resource_class)
150
166
  session.delete(session_key_masquerading_resource_class)
167
+ session.delete(session_key_masquerading_resource_guid)
151
168
  end
152
169
 
153
- def session_key(masqueradable_resource)
154
- "devise_masquerade_#{masqueraded_resource_name}_#{masqueradable_resource.to_param}".to_sym
170
+ def session_key(masqueradable_resource, guid)
171
+ "devise_masquerade_#{masqueraded_resource_name}_#{masqueradable_resource.to_param}_#{guid}".to_sym
155
172
  end
156
173
 
157
174
  def session_key_masqueraded_resource_class
@@ -159,6 +176,19 @@ class Devise::MasqueradesController < DeviseController
159
176
  end
160
177
 
161
178
  def session_key_masquerading_resource_class
162
- "devise_masquerade_masquerading_resource_class"
179
+ "devise_masquerade_masquerading_resource_class"
180
+ end
181
+
182
+ def session_key_masquerading_resource_guid
183
+ "devise_masquerade_masquerading_resource_guid"
184
+ end
185
+
186
+ def masquerading_current_user
187
+ send("current_#{masquerading_resource_name}")
188
+ end
189
+
190
+ def masquerading_guid
191
+ session[session_key_masquerading_resource_guid]
163
192
  end
164
193
  end
194
+
@@ -39,23 +39,28 @@ module DeviseMasquerade
39
39
 
40
40
  def #{name}_masquerade?
41
41
  return false if current_#{name}.blank?
42
+ return false if session[#{name}_helper_session_key].blank?
42
43
 
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?
44
+ ::Rails.cache.exist?(#{name}_helper_session_key).present?
47
45
  end
48
46
 
49
47
  def #{name}_masquerade_owner
50
48
  return unless send(:#{name}_masquerade?)
51
49
 
52
- key = "devise_masquerade_#{name}_" + current_#{name}.to_param
53
- sgid = ::Rails.cache.read(key.to_sym)
50
+ sgid = ::Rails.cache.read(#{name}_helper_session_key)
54
51
  GlobalID::Locator.locate_signed(sgid, for: 'masquerade')
55
52
  end
56
53
 
57
54
  private
58
55
 
56
+ def #{name}_helper_session_key
57
+ ["devise_masquerade_#{name}", current_#{name}.to_param, #{name}_helper_masquerading_resource_guid].join("_")
58
+ end
59
+
60
+ def #{name}_helper_masquerading_resource_guid
61
+ session["devise_masquerade_masquerading_resource_guid"].to_s
62
+ end
63
+
59
64
  def masquerade_sign_in(resource)
60
65
  if Devise.masquerade_bypass_warden_callback
61
66
  if respond_to?(:bypass_sign_in)
@@ -8,9 +8,9 @@ module DeviseMasquerade
8
8
  scope = Devise::Mapping.find_scope!(resource)
9
9
 
10
10
  opts = args.shift || {}
11
- opts.merge!(masqueraded_resource_class: resource.class.name)
11
+ opts[:masqueraded_resource_class] = resource.class.name
12
12
 
13
- opts.merge!(Devise.masquerade_param => resource.masquerade_key)
13
+ opts[Devise.masquerade_param] = resource.masquerade_key
14
14
 
15
15
  send("#{scope}_masquerade_index_path", opts, *args)
16
16
  end
@@ -19,7 +19,7 @@ module DeviseMasquerade
19
19
  scope = Devise::Mapping.find_scope!(resource)
20
20
 
21
21
  opts = args.first || {}
22
- opts.merge!(masqueraded_resource_class: resource.class.name)
22
+ opts[:masqueraded_resource_class] = resource.class.name
23
23
 
24
24
  send("back_#{scope}_masquerade_index_path", opts, *args)
25
25
  end
@@ -1,3 +1,3 @@
1
1
  module DeviseMasquerade
2
- VERSION = '1.3.7'.freeze
2
+ VERSION = '1.3.10'.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_#{mask.to_param}")).to be }
17
+ it { expect(cache_read(mask)).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)
@@ -22,6 +22,9 @@ describe Devise::MasqueradesController, type: :controller do
22
22
 
23
23
  it { should redirect_to('/') }
24
24
  end
25
+ end
26
+ context 'when logged in' do
27
+ before { logged_in }
25
28
 
26
29
  describe '#masquerade user' do
27
30
  let(:mask) { create(:user) }
@@ -30,7 +33,7 @@ describe Devise::MasqueradesController, type: :controller do
30
33
  get :show, params: { id: mask.to_param, masquerade: mask.masquerade_key }
31
34
  end
32
35
 
33
- it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).to be }
36
+ it { expect(cache_read(mask)).to be }
34
37
  it { expect(session["warden.user.user.key"].first.first).to eq(mask.id) }
35
38
  it { should redirect_to('/') }
36
39
 
@@ -39,7 +42,7 @@ describe Devise::MasqueradesController, type: :controller do
39
42
 
40
43
  it { should redirect_to(masquerade_page) }
41
44
  it { expect(current_user.reload).to eq(@user) }
42
- it { expect(Rails.cache.read("devise_masquerade_user_#{mask.to_param}")).not_to be }
45
+ it { expect(cache_read(mask)).not_to be }
43
46
  end
44
47
  end
45
48
 
@@ -107,4 +110,16 @@ describe Devise::MasqueradesController, type: :controller do
107
110
  def masquerade_page
108
111
  "/"
109
112
  end
113
+
114
+ def guid
115
+ session[:devise_masquerade_masquerading_resource_guid]
116
+ end
117
+
118
+ def cache_read(user)
119
+ Rails.cache.read(cache_key(user))
120
+ end
121
+
122
+ def cache_key(user)
123
+ "devise_masquerade_#{mask.class.name.downcase}_#{mask.to_param}_#{guid}"
124
+ end
110
125
  end
@@ -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_#{mask.to_param}")).not_to be }
19
+ it { expect(cache_read(mask)).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,20 @@ 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_#{mask.to_param}")).to be }
38
+ it { expect(cache_read(mask)).to be }
39
39
  it { expect(session['warden.user.user.key'].first.first).to eq(mask.id) }
40
40
  end
41
+
42
+
43
+ def guid
44
+ session[:devise_masquerade_masquerading_resource_guid]
45
+ end
46
+
47
+ def cache_read(user)
48
+ Rails.cache.read(cache_key(user))
49
+ end
50
+
51
+ def cache_key(user)
52
+ "devise_masquerade_#{mask.class.name.downcase}_#{mask.to_param}_#{guid}"
53
+ end
41
54
  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.7
4
+ version: 1.3.10
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-04-28 00:00:00.000000000 Z
11
+ date: 2022-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler