devise_masquerade 0.6.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise_masquerade might be problematic. Click here for more details.

Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -2
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +2 -4
  5. data/Gemfile +14 -10
  6. data/Gemfile.lock +303 -0
  7. data/Makefile +6 -1
  8. data/README.md +25 -1
  9. data/app/controllers/devise/masquerades_controller.rb +70 -54
  10. data/devise_masquerade.gemspec +4 -4
  11. data/features/back.feature +0 -1
  12. data/features/multiple_masquerading_models.feature +17 -0
  13. data/features/step_definitions/auth_steps.rb +1 -0
  14. data/features/step_definitions/back_steps.rb +18 -3
  15. data/features/support/env.rb +23 -4
  16. data/lib/devise_masquerade/controllers/helpers.rb +26 -7
  17. data/lib/devise_masquerade/controllers/url_helpers.rb +19 -4
  18. data/lib/devise_masquerade/models/masqueradable.rb +47 -0
  19. data/lib/devise_masquerade/models.rb +9 -0
  20. data/lib/devise_masquerade/rails.rb +14 -4
  21. data/lib/devise_masquerade/routes.rb +10 -8
  22. data/lib/devise_masquerade/version.rb +1 -1
  23. data/lib/devise_masquerade.rb +3 -9
  24. data/spec/controllers/admin/dashboard_controller_spec.rb +5 -4
  25. data/spec/controllers/dashboard_controller_spec.rb +4 -4
  26. data/spec/controllers/devise/masquerades_controller_spec.rb +60 -36
  27. data/spec/controllers/{masquerades_controller_spec.rb → masquerades_tests_controller_spec.rb} +11 -8
  28. data/spec/dummy/app/controllers/admin/dashboard_controller.rb +1 -2
  29. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  30. data/spec/dummy/app/controllers/dashboard_controller.rb +1 -2
  31. data/spec/dummy/app/controllers/masquerades_tests_controller.rb +7 -0
  32. data/spec/dummy/app/controllers/students_controller.rb +8 -0
  33. data/spec/dummy/app/models/admin/user.rb +0 -7
  34. data/spec/dummy/app/models/student.rb +3 -0
  35. data/spec/dummy/app/models/user.rb +1 -10
  36. data/spec/dummy/app/views/admin/dashboard/index.html.erb +0 -2
  37. data/spec/dummy/app/views/dashboard/index.html.erb +0 -2
  38. data/spec/dummy/app/views/layouts/application.html.erb +7 -1
  39. data/spec/dummy/app/views/students/_student.html.erb +6 -0
  40. data/spec/dummy/app/views/students/index.html.erb +1 -0
  41. data/spec/dummy/app/views/users/_user.html.erb +1 -1
  42. data/spec/dummy/config/application.rb +2 -0
  43. data/spec/dummy/config/environment.rb +1 -0
  44. data/spec/dummy/config/routes.rb +6 -4
  45. data/spec/dummy/db/.gitignore +1 -0
  46. data/spec/dummy/db/migrate/20121119085620_devise_create_users.rb +1 -1
  47. data/spec/dummy/db/migrate/20140418160449_create_admin_users.rb +1 -1
  48. data/spec/dummy/db/migrate/20191022100000_create_students.rb +14 -0
  49. data/spec/dummy/db/schema.rb +37 -31
  50. data/spec/models/user_spec.rb +1 -1
  51. data/spec/orm/active_record.rb +5 -2
  52. data/spec/spec_helper.rb +3 -3
  53. data/spec/support/factories.rb +13 -9
  54. metadata +31 -16
  55. data/lib/devise_masquerade/model.rb +0 -42
  56. data/spec/dummy/app/controllers/masquerades_controller.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6c87023570a8bad6035430b8d59504c57eb5b6c5
4
- data.tar.gz: 71c6a3020fc870b0ce559e46a14ebbb64c37dbea
2
+ SHA256:
3
+ metadata.gz: a3d9619a76cbee988888a5168f0cf57b74a59fd7b5c3cfbbac3113458c5cb60c
4
+ data.tar.gz: 9d04f07b596f095533e4e766f0ed1e0672f0078ae5fcecf696571326ed3d3b8d
5
5
  SHA512:
6
- metadata.gz: 9f5305d971f2c9f158386824abb546daa1672147ae7449d673a91d3a3464a057373c9aa483606d6dc3675da7cd83a37cb32914f2f37d65a3821ea8c7ce6ac8bc
7
- data.tar.gz: e9a5238986ec0cfcb8e548c2e09649270eeeea2406392ad60675cbd5a11e4d51bcb74beff76c5be64169fa2311ba4579f0de49eea9b351b5a609ae382e1f805f
6
+ metadata.gz: 82d09ecc8063ce935f4125d7c8ecd73772a5d7ad5e5a9e6a909cb18e899793229a473ffdceb6a1c5a1eb36ddd244c2646f248e205f62b4d0c70ad47ef1cadbe9
7
+ data.tar.gz: 8c9456b986f8761a5258d1099777d0e8a0d71974de41e1e220c50e6cd7cfec362956d5f41b7ab1466cddbc7d49c350c04febe852f9920bca99a27c1e043ce024
data/.gitignore CHANGED
@@ -3,7 +3,6 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
7
6
  InstalledFiles
8
7
  _yardoc
9
8
  coverage
@@ -19,4 +18,4 @@ spec/dummy/db/*.sqlite3
19
18
  tmp
20
19
  tags
21
20
  .vimrc
22
-
21
+ vendor/
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.3
1
+ 2.6.0
data/.travis.yml CHANGED
@@ -1,12 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.5
4
- - 2.3.1
5
- - 2.3.3
3
+ - 2.5.1
4
+ - 2.6.0
6
5
  gemfile:
7
6
  - Gemfile
8
7
  script: time ./script/travis.sh
9
- cache: bundler
10
8
  sudo: false
11
9
  addons:
12
10
  apt:
data/Gemfile CHANGED
@@ -4,10 +4,10 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :test do
7
- gem 'activerecord', '~> 3.0'
8
- gem 'actionmailer', '~> 3.0'
9
- gem "bson_ext", "~> 1.3"
10
- gem 'sqlite3'
7
+ gem 'activerecord', '>= 5.2'
8
+ gem 'actionmailer', '>= 5.2'
9
+ gem 'bson_ext', '~> 1.3'
10
+ gem 'sqlite3', '~> 1.4'
11
11
 
12
12
  gem 'test-unit'
13
13
 
@@ -15,21 +15,25 @@ group :test do
15
15
  gem 'pry-byebug'
16
16
 
17
17
  gem 'guard'
18
- gem 'guard-rspec'
18
+ gem 'guard-rspec', '~> 4.7'
19
19
  gem 'guard-bundler'
20
20
  gem 'guard-cucumber'
21
21
 
22
- gem 'rspec-rails'
23
- gem 'rspec'
24
- gem 'rspec-mocks'
22
+ gem 'rspec', github: 'rspec/rspec'
23
+ gem 'rspec-core', github: 'rspec/rspec-core'
24
+ gem 'rspec-expectations', github: 'rspec/rspec-expectations'
25
+ gem 'rspec-mocks', github: 'rspec/rspec-mocks'
26
+ gem 'rspec-rails', github: 'rspec/rspec-rails'
27
+ gem 'rspec-support', github: 'rspec/rspec-support'
25
28
 
26
29
  gem 'shoulda'
27
30
  gem 'rb-fsevent'
28
- gem 'factory_girl_rails'
31
+ gem 'factory_bot_rails'
29
32
  gem 'database_cleaner', '< 1.1.0'
30
33
  gem 'cucumber'
31
34
  gem 'cucumber-rails'
32
35
  gem 'capybara'
33
- gem 'capybara-webkit'
36
+ gem 'selenium-webdriver'
37
+ gem 'chromedriver-helper'
34
38
  gem 'launchy'
35
39
  end
data/Gemfile.lock ADDED
@@ -0,0 +1,303 @@
1
+ GIT
2
+ remote: https://github.com/rspec/rspec-core.git
3
+ revision: b7067c5da4fde57cbbff739b168008482e61db44
4
+ specs:
5
+ rspec-core (3.10.0.pre)
6
+ rspec-support (= 3.10.0.pre)
7
+
8
+ GIT
9
+ remote: https://github.com/rspec/rspec-expectations.git
10
+ revision: 99f9bcaff2a6f3d82f4e350e829eca6ab015694f
11
+ specs:
12
+ rspec-expectations (3.10.0.pre)
13
+ diff-lcs (>= 1.2.0, < 2.0)
14
+ rspec-support (= 3.10.0.pre)
15
+
16
+ GIT
17
+ remote: https://github.com/rspec/rspec-mocks.git
18
+ revision: 5b897e8f74f3059aef43f1ed5f91719f2267a04e
19
+ specs:
20
+ rspec-mocks (3.10.0.pre)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (= 3.10.0.pre)
23
+
24
+ GIT
25
+ remote: https://github.com/rspec/rspec-rails.git
26
+ revision: 9b7ab39c027a8cb25e2ebe9e0e985756025b0549
27
+ specs:
28
+ rspec-rails (4.0.0.pre)
29
+ actionpack (>= 4.2)
30
+ activesupport (>= 4.2)
31
+ railties (>= 4.2)
32
+ rspec-core (= 3.10.0.pre)
33
+ rspec-expectations (= 3.10.0.pre)
34
+ rspec-mocks (= 3.10.0.pre)
35
+ rspec-support (= 3.10.0.pre)
36
+
37
+ GIT
38
+ remote: https://github.com/rspec/rspec-support.git
39
+ revision: 673133cdd13b17077b3d88ece8d7380821f8d7dc
40
+ specs:
41
+ rspec-support (3.10.0.pre)
42
+
43
+ GIT
44
+ remote: https://github.com/rspec/rspec.git
45
+ revision: e1c2c6bd78c849d7956431331f32ba5092951dab
46
+ specs:
47
+ rspec (3.10.0.pre)
48
+ rspec-core (= 3.10.0.pre)
49
+ rspec-expectations (= 3.10.0.pre)
50
+ rspec-mocks (= 3.10.0.pre)
51
+
52
+ PATH
53
+ remote: .
54
+ specs:
55
+ devise_masquerade (1.2.0)
56
+ devise (>= 4.7.0)
57
+ railties (>= 5.2.0)
58
+
59
+ GEM
60
+ remote: https://rubygems.org/
61
+ specs:
62
+ actionmailer (6.0.0)
63
+ actionpack (= 6.0.0)
64
+ actionview (= 6.0.0)
65
+ activejob (= 6.0.0)
66
+ mail (~> 2.5, >= 2.5.4)
67
+ rails-dom-testing (~> 2.0)
68
+ actionpack (6.0.0)
69
+ actionview (= 6.0.0)
70
+ activesupport (= 6.0.0)
71
+ rack (~> 2.0)
72
+ rack-test (>= 0.6.3)
73
+ rails-dom-testing (~> 2.0)
74
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
75
+ actionview (6.0.0)
76
+ activesupport (= 6.0.0)
77
+ builder (~> 3.1)
78
+ erubi (~> 1.4)
79
+ rails-dom-testing (~> 2.0)
80
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
81
+ activejob (6.0.0)
82
+ activesupport (= 6.0.0)
83
+ globalid (>= 0.3.6)
84
+ activemodel (6.0.0)
85
+ activesupport (= 6.0.0)
86
+ activerecord (6.0.0)
87
+ activemodel (= 6.0.0)
88
+ activesupport (= 6.0.0)
89
+ activesupport (6.0.0)
90
+ concurrent-ruby (~> 1.0, >= 1.0.2)
91
+ i18n (>= 0.7, < 2)
92
+ minitest (~> 5.1)
93
+ tzinfo (~> 1.1)
94
+ zeitwerk (~> 2.1, >= 2.1.8)
95
+ addressable (2.7.0)
96
+ public_suffix (>= 2.0.2, < 5.0)
97
+ archive-zip (0.12.0)
98
+ io-like (~> 0.3.0)
99
+ backports (3.15.0)
100
+ bcrypt (3.1.13)
101
+ bson (1.12.5)
102
+ bson_ext (1.12.5)
103
+ bson (~> 1.12.5)
104
+ builder (3.2.3)
105
+ byebug (11.0.1)
106
+ capybara (3.29.0)
107
+ addressable
108
+ mini_mime (>= 0.1.3)
109
+ nokogiri (~> 1.8)
110
+ rack (>= 1.6.0)
111
+ rack-test (>= 0.6.3)
112
+ regexp_parser (~> 1.5)
113
+ xpath (~> 3.2)
114
+ childprocess (3.0.0)
115
+ chromedriver-helper (2.1.1)
116
+ archive-zip (~> 0.10)
117
+ nokogiri (~> 1.8)
118
+ coderay (1.1.2)
119
+ concurrent-ruby (1.1.5)
120
+ crass (1.0.5)
121
+ cucumber (3.1.2)
122
+ builder (>= 2.1.2)
123
+ cucumber-core (~> 3.2.0)
124
+ cucumber-expressions (~> 6.0.1)
125
+ cucumber-wire (~> 0.0.1)
126
+ diff-lcs (~> 1.3)
127
+ gherkin (~> 5.1.0)
128
+ multi_json (>= 1.7.5, < 2.0)
129
+ multi_test (>= 0.1.2)
130
+ cucumber-core (3.2.1)
131
+ backports (>= 3.8.0)
132
+ cucumber-tag_expressions (~> 1.1.0)
133
+ gherkin (~> 5.0)
134
+ cucumber-expressions (6.0.1)
135
+ cucumber-rails (1.8.0)
136
+ capybara (>= 2.12, < 4)
137
+ cucumber (>= 3.0.2, < 4)
138
+ mime-types (>= 2.0, < 4)
139
+ nokogiri (~> 1.8)
140
+ railties (>= 4.2, < 7)
141
+ cucumber-tag_expressions (1.1.1)
142
+ cucumber-wire (0.0.1)
143
+ database_cleaner (1.0.1)
144
+ devise (4.7.1)
145
+ bcrypt (~> 3.0)
146
+ orm_adapter (~> 0.1)
147
+ railties (>= 4.1.0)
148
+ responders
149
+ warden (~> 1.2.3)
150
+ diff-lcs (1.3)
151
+ erubi (1.9.0)
152
+ factory_bot (5.1.1)
153
+ activesupport (>= 4.2.0)
154
+ factory_bot_rails (5.1.1)
155
+ factory_bot (~> 5.1.0)
156
+ railties (>= 4.2.0)
157
+ ffi (1.11.1)
158
+ formatador (0.2.5)
159
+ gherkin (5.1.0)
160
+ globalid (0.4.2)
161
+ activesupport (>= 4.2.0)
162
+ guard (2.15.1)
163
+ formatador (>= 0.2.4)
164
+ listen (>= 2.7, < 4.0)
165
+ lumberjack (>= 1.0.12, < 2.0)
166
+ nenv (~> 0.1)
167
+ notiffany (~> 0.0)
168
+ pry (>= 0.9.12)
169
+ shellany (~> 0.0)
170
+ thor (>= 0.18.1)
171
+ guard-bundler (2.2.1)
172
+ bundler (>= 1.3.0, < 3)
173
+ guard (~> 2.2)
174
+ guard-compat (~> 1.1)
175
+ guard-compat (1.2.1)
176
+ guard-cucumber (1.5.4)
177
+ cucumber (>= 1.3.0)
178
+ guard-compat (~> 1.0)
179
+ nenv (~> 0.1)
180
+ guard-rspec (4.7.3)
181
+ guard (~> 2.1)
182
+ guard-compat (~> 1.1)
183
+ rspec (>= 2.99.0, < 4.0)
184
+ i18n (1.7.0)
185
+ concurrent-ruby (~> 1.0)
186
+ io-like (0.3.0)
187
+ launchy (2.4.3)
188
+ addressable (~> 2.3)
189
+ listen (3.2.0)
190
+ rb-fsevent (~> 0.10, >= 0.10.3)
191
+ rb-inotify (~> 0.9, >= 0.9.10)
192
+ loofah (2.3.0)
193
+ crass (~> 1.0.2)
194
+ nokogiri (>= 1.5.9)
195
+ lumberjack (1.0.13)
196
+ mail (2.7.1)
197
+ mini_mime (>= 0.1.1)
198
+ method_source (0.9.2)
199
+ mime-types (3.3)
200
+ mime-types-data (~> 3.2015)
201
+ mime-types-data (3.2019.1009)
202
+ mini_mime (1.0.2)
203
+ mini_portile2 (2.4.0)
204
+ minitest (5.12.2)
205
+ multi_json (1.14.1)
206
+ multi_test (0.1.2)
207
+ nenv (0.3.0)
208
+ nokogiri (1.10.4)
209
+ mini_portile2 (~> 2.4.0)
210
+ notiffany (0.1.3)
211
+ nenv (~> 0.1)
212
+ shellany (~> 0.0)
213
+ orm_adapter (0.5.0)
214
+ power_assert (1.1.5)
215
+ pry (0.12.2)
216
+ coderay (~> 1.1.0)
217
+ method_source (~> 0.9.0)
218
+ pry-byebug (3.7.0)
219
+ byebug (~> 11.0)
220
+ pry (~> 0.10)
221
+ public_suffix (4.0.1)
222
+ rack (2.0.7)
223
+ rack-test (1.1.0)
224
+ rack (>= 1.0, < 3)
225
+ rails-dom-testing (2.0.3)
226
+ activesupport (>= 4.2.0)
227
+ nokogiri (>= 1.6)
228
+ rails-html-sanitizer (1.3.0)
229
+ loofah (~> 2.3)
230
+ railties (6.0.0)
231
+ actionpack (= 6.0.0)
232
+ activesupport (= 6.0.0)
233
+ method_source
234
+ rake (>= 0.8.7)
235
+ thor (>= 0.20.3, < 2.0)
236
+ rake (13.0.0)
237
+ rb-fsevent (0.10.3)
238
+ rb-inotify (0.10.0)
239
+ ffi (~> 1.0)
240
+ regexp_parser (1.6.0)
241
+ responders (3.0.0)
242
+ actionpack (>= 5.0)
243
+ railties (>= 5.0)
244
+ rubyzip (2.0.0)
245
+ selenium-webdriver (3.142.6)
246
+ childprocess (>= 0.5, < 4.0)
247
+ rubyzip (>= 1.2.2)
248
+ shellany (0.0.1)
249
+ shoulda (3.6.0)
250
+ shoulda-context (~> 1.0, >= 1.0.1)
251
+ shoulda-matchers (~> 3.0)
252
+ shoulda-context (1.2.2)
253
+ shoulda-matchers (3.1.3)
254
+ activesupport (>= 4.0.0)
255
+ sqlite3 (1.4.1)
256
+ test-unit (3.3.4)
257
+ power_assert
258
+ thor (0.20.3)
259
+ thread_safe (0.3.6)
260
+ tzinfo (1.2.5)
261
+ thread_safe (~> 0.1)
262
+ warden (1.2.8)
263
+ rack (>= 2.0.6)
264
+ xpath (3.2.0)
265
+ nokogiri (~> 1.8)
266
+ zeitwerk (2.2.0)
267
+
268
+ PLATFORMS
269
+ ruby
270
+
271
+ DEPENDENCIES
272
+ actionmailer (>= 5.2)
273
+ activerecord (>= 5.2)
274
+ bson_ext (~> 1.3)
275
+ bundler (>= 2.0.0)
276
+ capybara
277
+ chromedriver-helper
278
+ cucumber
279
+ cucumber-rails
280
+ database_cleaner (< 1.1.0)
281
+ devise_masquerade!
282
+ factory_bot_rails
283
+ guard
284
+ guard-bundler
285
+ guard-cucumber
286
+ guard-rspec (~> 4.7)
287
+ launchy
288
+ pry
289
+ pry-byebug
290
+ rb-fsevent
291
+ rspec!
292
+ rspec-core!
293
+ rspec-expectations!
294
+ rspec-mocks!
295
+ rspec-rails!
296
+ rspec-support!
297
+ selenium-webdriver
298
+ shoulda
299
+ sqlite3 (~> 1.4)
300
+ test-unit
301
+
302
+ BUNDLED WITH
303
+ 2.0.2
data/Makefile CHANGED
@@ -1,6 +1,11 @@
1
+ release:
2
+ bundle exec rake release
3
+ .PHONY: release
4
+
1
5
  setup:
2
6
  cd spec/dummy && \
3
- RAILS_ENV=test rake db:setup
7
+ bundle exec rails db:environment:set RAILS_ENV=test && \
8
+ RAILS_ENV=test bundle exec rails db:setup
4
9
  .PHONY: setup
5
10
 
6
11
  rspec:
data/README.md CHANGED
@@ -33,18 +33,30 @@ In the view you can use url helper for defining link:
33
33
 
34
34
  = link_to "Login As", masquerade_path(user)
35
35
 
36
+ `masquerade_path` would create specific `/masquerade` path with query params `masquerade`(key) and `masqueraded_resource_class` to know
37
+ which model to choose to search and sign in by masquerade key.
38
+
36
39
  In the model you'll need to add the parameter :masqueradable to the existing comma separated values in the devise method:
37
40
 
38
41
  ```ruby
39
42
  devise :invitable, :confirmable, :database_authenticatable, :registerable, :masqueradable
40
43
  ```
41
44
 
42
- Add into your application_controller.rb:
45
+ Add into your `application_controller.rb` if you want to have custom way on sign in by using masquerade token otherwise you can still
46
+ use only `masquerade_path` in your view to generate temporary token and link to make `Login As`:
43
47
 
44
48
  ```ruby
45
49
  before_action :masquerade_user!
46
50
  ```
47
51
 
52
+ or
53
+
54
+ ```ruby
55
+ before_action :masquerade!
56
+ ```
57
+
58
+ `masquerade!` is generic way in case if you want to support multiple models on masquerade.
59
+
48
60
  Instead of user you can use your resource name admin, student or another names.
49
61
 
50
62
  If you want to back to the owner of masquerade action user you could use
@@ -109,6 +121,18 @@ In your view:
109
121
  end
110
122
  ```
111
123
 
124
+ ## Custom url redirect after finishing masquerade:
125
+
126
+ ```ruby
127
+ class Admin::MasqueradesController < Devise::MasqueradesController
128
+ protected
129
+
130
+ def after_back_masquerade_path_for(resource)
131
+ "/custom_url"
132
+ end
133
+ end
134
+ ```
135
+
112
136
  ## Overriding the finder
113
137
 
114
138
  For example, if you use FriendlyId:
@@ -1,68 +1,49 @@
1
1
  class Devise::MasqueradesController < DeviseController
2
- if respond_to?(:prepend_before_action)
3
- prepend_before_action :authenticate_scope!, :masquerade_authorize!
4
- else
5
- prepend_before_filter :authenticate_scope!, :masquerade_authorize!
2
+ Devise.mappings.each do |name, _|
3
+ class_eval <<-METHODS, __FILE__, __LINE__ + 1
4
+ skip_before_action :masquerade_#{name}!, raise: false
5
+ METHODS
6
6
  end
7
+ skip_before_action :masquerade!, raise: false
7
8
 
8
- if respond_to?(:before_action)
9
- before_action :save_masquerade_owner_session, :only => :show
10
- else
11
- before_filter :save_masquerade_owner_session, :only => :show
12
- end
9
+ prepend_before_action :authenticate_scope!, :masquerade_authorize!
13
10
 
14
- if respond_to?(:after_action)
15
- after_action :cleanup_masquerade_owner_session, :only => :back
16
- else
17
- after_filter :cleanup_masquerade_owner_session, :only => :back
18
- end
11
+ before_action :save_masquerade_owner_session, only: :show
12
+
13
+ after_action :cleanup_masquerade_owner_session, only: :back
19
14
 
20
15
  def show
21
16
  self.resource = find_resource
22
17
 
23
- unless self.resource
18
+ unless resource
24
19
  flash[:error] = "#{masqueraded_resource_class} not found."
25
20
  redirect_to(new_user_session_path) and return
26
21
  end
27
22
 
28
- self.resource.masquerade!
29
- request.env["devise.skip_trackable"] = "1"
23
+ request.env['devise.skip_trackable'] = '1'
30
24
 
31
- masquerade_sign_in(self.resource)
25
+ masquerade_sign_in(resource)
32
26
 
33
- if Devise.masquerade_routes_back && Rails::VERSION::MAJOR == 5
34
- redirect_back(fallback_location: after_masquerade_full_path_for(resource))
35
- elsif Devise.masquerade_routes_back && request.env['HTTP_REFERER'].present?
36
- redirect_to :back
37
- else
38
- redirect_to(after_masquerade_full_path_for(resource))
39
- end
27
+ go_back(resource, path: after_masquerade_full_path_for(resource))
40
28
  end
41
29
 
42
30
  def back
43
31
  user_id = session[session_key]
44
32
 
45
- owner_user = if user_id.present?
46
- masquerading_resource_class.to_adapter.find_first(:id => user_id)
47
- else
48
- send(:"current_#{masquerading_resource_name}")
49
- end
33
+ resource = if user_id.present?
34
+ masquerading_resource_class.to_adapter.find_first(:id => user_id)
35
+ else
36
+ send(:"current_#{masquerading_resource_name}")
37
+ end
50
38
 
51
39
  if masquerading_resource_class != masqueraded_resource_class
52
40
  sign_out(send("current_#{masqueraded_resource_name}"))
53
41
  end
54
42
 
55
- masquerade_sign_in(owner_user)
56
- request.env["devise.skip_trackable"] = nil
43
+ masquerade_sign_in(resource)
44
+ request.env['devise.skip_trackable'] = nil
57
45
 
58
- if Devise.masquerade_routes_back && Rails::VERSION::MAJOR == 5
59
- # If using the masquerade_routes_back and Rails 5
60
- redirect_back(fallback_location: after_back_masquerade_path_for(owner_user))
61
- elsif Devise.masquerade_routes_back && request.env['HTTP_REFERER'].present?
62
- redirect_to :back
63
- else
64
- redirect_to after_back_masquerade_path_for(owner_user)
65
- end
46
+ go_back(resource, path: after_back_masquerade_path_for(resource))
66
47
  end
67
48
 
68
49
  protected
@@ -76,13 +57,34 @@ class Devise::MasqueradesController < DeviseController
76
57
  end
77
58
 
78
59
  def find_resource
79
- masqueraded_resource_class.to_adapter.find_first(:id => params[:id])
60
+ masqueraded_resource_class.
61
+ find_by_masquerade_key(params[Devise.masquerade_param]).
62
+ where(id: params[:id]).
63
+ first
64
+ end
65
+
66
+ def go_back(user, path:)
67
+ if Devise.masquerade_routes_back
68
+ redirect_back(fallback_location: path)
69
+ else
70
+ redirect_to path
71
+ end
80
72
  end
81
73
 
82
74
  private
83
75
 
84
76
  def masqueraded_resource_class
85
- Devise.masqueraded_resource_class || resource_class
77
+ @masqueraded_resource_class ||= begin
78
+ unless params[:masqueraded_resource_class].blank?
79
+ params[:masqueraded_resource_class].constantize
80
+ else
81
+ unless session[session_key_masqueraded_resource_class].blank?
82
+ session[session_key_masquerading_resource_class].constantize
83
+ else
84
+ Devise.masqueraded_resource_class || resource_class
85
+ end
86
+ end
87
+ end
86
88
  end
87
89
 
88
90
  def masqueraded_resource_name
@@ -90,7 +92,17 @@ class Devise::MasqueradesController < DeviseController
90
92
  end
91
93
 
92
94
  def masquerading_resource_class
93
- Devise.masquerading_resource_class || resource_class
95
+ @masquerading_resource_class ||= begin
96
+ unless params[:masquerading_resource_class].blank?
97
+ params[:masquerading_resource_class].constantize
98
+ else
99
+ unless session[session_key_masquerading_resource_class].blank?
100
+ session[session_key_masquerading_resource_class].constantize
101
+ else
102
+ Devise.masquerading_resource_class || resource_class
103
+ end
104
+ end
105
+ end
94
106
  end
95
107
 
96
108
  def masquerading_resource_name
@@ -98,23 +110,15 @@ class Devise::MasqueradesController < DeviseController
98
110
  end
99
111
 
100
112
  def authenticate_scope!
101
- send(:"authenticate_#{masquerading_resource_name}!", :force => true)
113
+ send(:"authenticate_#{masquerading_resource_name}!", force: true)
102
114
  end
103
115
 
104
116
  def after_masquerade_path_for(resource)
105
- "/"
117
+ '/'
106
118
  end
107
119
 
108
120
  def after_masquerade_full_path_for(resource)
109
- if after_masquerade_path_for(resource) =~ /\?/
110
- "#{after_masquerade_path_for(resource)}&#{after_masquerade_param_for(resource)}"
111
- else
112
- "#{after_masquerade_path_for(resource)}?#{after_masquerade_param_for(resource)}"
113
- end
114
- end
115
-
116
- def after_masquerade_param_for(resource)
117
- "#{Devise.masquerade_param}=#{resource.masquerade_key}"
121
+ after_masquerade_path_for(resource)
118
122
  end
119
123
 
120
124
  def after_back_masquerade_path_for(resource)
@@ -124,14 +128,26 @@ class Devise::MasqueradesController < DeviseController
124
128
  def save_masquerade_owner_session
125
129
  unless session.key?(session_key)
126
130
  session[session_key] = send("current_#{masquerading_resource_name}").id
131
+ session[session_key_masquerading_resource_class] = masquerading_resource_class.name
132
+ session[session_key_masqueraded_resource_class] = masqueraded_resource_class.name
127
133
  end
128
134
  end
129
135
 
130
136
  def cleanup_masquerade_owner_session
131
137
  session.delete(session_key)
138
+ session.delete(session_key_masqueraded_resource_class)
139
+ session.delete(session_key_masquerading_resource_class)
132
140
  end
133
141
 
134
142
  def session_key
135
143
  "devise_masquerade_#{masqueraded_resource_name}".to_sym
136
144
  end
145
+
146
+ def session_key_masqueraded_resource_class
147
+ "devise_masquerade_masqueraded_resource_class"
148
+ end
149
+
150
+ def session_key_masquerading_resource_class
151
+ "devise_masquerade_masquerading_resource_class"
152
+ end
137
153
  end
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.email = ['alex.korsak@gmail.com']
12
12
  gem.description = 'devise masquerade library'
13
13
  gem.summary = 'use for login as functionallity on your admin users pages'
14
- gem.homepage = 'http://github.com/oivoodoo/devise_masquerade/'
14
+ gem.homepage = 'http://github.com/oivoodoo/devise_masquerade'
15
15
 
16
16
  gem.files = `git ls-files`.split($/)
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
@@ -20,8 +20,8 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.license = 'MIT'
22
22
 
23
- gem.add_development_dependency('bundler', '>= 1.1.0')
23
+ gem.add_development_dependency('bundler', '>= 2.0.0')
24
24
 
25
- gem.add_runtime_dependency('railties', '>= 3.0')
26
- gem.add_runtime_dependency('devise', '>= 2.1.0')
25
+ gem.add_runtime_dependency('railties', '>= 5.2.0')
26
+ gem.add_runtime_dependency('devise', '>= 4.7.0')
27
27
  end
@@ -13,4 +13,3 @@ Feature: Use back button for returning to the owner of the masquerade action.
13
13
 
14
14
  When I press back masquerade button
15
15
  Then I should be login as owner user
16
-