devise_masquerade 1.3.7 → 1.3.10
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 +4 -4
- data/.travis.yml +1 -5
- data/Gemfile.lock +9 -9
- data/README.md +15 -11
- data/app/controllers/devise/masquerades_controller.rb +57 -27
- data/lib/devise_masquerade/controllers/helpers.rb +11 -6
- data/lib/devise_masquerade/controllers/url_helpers.rb +3 -3
- data/lib/devise_masquerade/version.rb +1 -1
- data/spec/controllers/devise/masquerades_controller_spec.rb +18 -3
- data/spec/controllers/masquerades_tests_controller_spec.rb +15 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 765e1b2a1c4a2ae6f4708ad80b7f69745093be77070aaffb0415a71e870d3d3e
|
|
4
|
+
data.tar.gz: ccfd44dc5346385d69a5b0bd6ef69f7504cb36e4d092568744b3e3bbbda34a07
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 02f79998f7f9364a32628b3fa246e1e82b0b7a6007bfa344861ee5cf6fb168166cb73350733e554017922bd889709dcf29d374a08cf39cb191d68ca4e2fea811
|
|
7
|
+
data.tar.gz: 0b814c4cef685103f3a846dbdc2ee62f4b070b9be2c20e913eb63605e518e125d8aae6933c1006437a3b7fdfc5e5677820b4640c50d204e66174c6c4b1687800
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -52,7 +52,7 @@ GIT
|
|
|
52
52
|
PATH
|
|
53
53
|
remote: .
|
|
54
54
|
specs:
|
|
55
|
-
devise_masquerade (1.3.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
210
|
-
mini_portile2 (~> 2.
|
|
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.
|
|
224
|
-
racc (1.
|
|
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
|
-
[](https://gitter.im/oivoodoo/devise_masquerade?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
3
|
-
[](https://app.fossa.io/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade?ref=badge_shield)
|
|
4
2
|
|
|
5
|
-
[](https://gitter.im/oivoodoo/devise_masquerade?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
4
|
+
|
|
5
|
+
[](https://app.fossa.io/projects/git%2Bgithub.com%2Foivoodoo%2Fdevise_masquerade?ref=badge_shield)
|
|
6
6
|
|
|
7
|
-
[](https://travis-ci.org/oivoodoo/devise_masquerade)
|
|
8
8
|
|
|
9
|
-
[](https://codeclimate.com/github/oivoodoo/devise_masquerade/maintainability)
|
|
10
10
|
|
|
11
|
-
[
|
|
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 =
|
|
169
|
+
Devise.masquerading_resource_class = AdminUser
|
|
166
170
|
# optional, default: masquerading_resource_class.model_name.param_key
|
|
167
|
-
Devise.masquerading_resource_name = :
|
|
168
|
-
Devise.masqueraded_resource_class =
|
|
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 = :
|
|
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
|
-
|
|
15
|
+
if send("#{masqueraded_resource_name}_masquerade?")
|
|
16
|
+
resource = masquerading_current_user
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
go_back(resource, path: after_masquerade_full_path_for(resource))
|
|
19
|
+
else
|
|
20
|
+
masqueradable_resource = find_masqueradable_resource
|
|
16
21
|
|
|
17
|
-
|
|
18
|
-
sign_out(send("current_#{masquerading_resource_name}"))
|
|
22
|
+
save_masquerade_owner_session(masqueradable_resource)
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
32
|
+
request.env['devise.skip_trackable'] = '1'
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
masquerade_sign_in(resource)
|
|
28
35
|
|
|
29
|
-
|
|
36
|
+
go_back(resource, path: after_masquerade_full_path_for(resource))
|
|
37
|
+
end
|
|
30
38
|
end
|
|
31
39
|
|
|
32
40
|
def back
|
|
33
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
unless send("#{masqueraded_resource_name}_signed_in?")
|
|
48
|
+
head(401) and return
|
|
49
|
+
end
|
|
38
50
|
|
|
39
|
-
|
|
40
|
-
|
|
51
|
+
resource = find_owner_resource(masqueradable_resource)
|
|
52
|
+
sign_out(send("current_#{masqueraded_resource_name}"))
|
|
41
53
|
|
|
42
|
-
|
|
43
|
-
|
|
54
|
+
sign_in(resource)
|
|
55
|
+
request.env['devise.skip_trackable'] = nil
|
|
44
56
|
|
|
45
|
-
|
|
57
|
+
go_back(resource, path: after_back_masquerade_path_for(resource))
|
|
46
58
|
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
11
|
+
opts[:masqueraded_resource_class] = resource.class.name
|
|
12
12
|
|
|
13
|
-
opts
|
|
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
|
|
22
|
+
opts[:masqueraded_resource_class] = resource.class.name
|
|
23
23
|
|
|
24
24
|
send("back_#{scope}_masquerade_index_path", opts, *args)
|
|
25
25
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
|
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:
|
|
11
|
+
date: 2022-03-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|