devise_masquerade 1.0.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/brakeman-analysis.yml +44 -0
  4. data/.github/workflows/rubocop-analysis.yml +39 -0
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +1 -0
  7. data/Gemfile +4 -2
  8. data/Gemfile.lock +31 -18
  9. data/README.md +21 -1
  10. data/app/controllers/devise/masquerades_controller.rb +66 -24
  11. data/devise_masquerade.gemspec +1 -1
  12. data/features/back.feature +0 -1
  13. data/features/multiple_masquerading_models.feature +17 -0
  14. data/features/step_definitions/auth_steps.rb +1 -0
  15. data/features/step_definitions/back_steps.rb +18 -3
  16. data/features/step_definitions/url_helpers_steps.rb +11 -0
  17. data/features/url_helpers.feature +14 -0
  18. data/lib/devise_masquerade.rb +5 -5
  19. data/lib/devise_masquerade/controllers/helpers.rb +27 -6
  20. data/lib/devise_masquerade/controllers/url_helpers.rb +14 -2
  21. data/lib/devise_masquerade/models/masqueradable.rb +2 -27
  22. data/lib/devise_masquerade/rails.rb +5 -7
  23. data/lib/devise_masquerade/routes.rb +3 -2
  24. data/lib/devise_masquerade/version.rb +1 -1
  25. data/spec/controllers/admin/dashboard_controller_spec.rb +3 -4
  26. data/spec/controllers/dashboard_controller_spec.rb +3 -5
  27. data/spec/controllers/devise/masquerades_controller_spec.rb +60 -39
  28. data/spec/controllers/masquerades_tests_controller_spec.rb +41 -0
  29. data/spec/dummy/app/controllers/admin/dashboard_controller.rb +0 -1
  30. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  31. data/spec/dummy/app/controllers/dashboard_controller.rb +4 -1
  32. data/spec/dummy/app/controllers/masquerades_tests_controller.rb +7 -0
  33. data/spec/dummy/app/controllers/students_controller.rb +8 -0
  34. data/spec/dummy/app/models/student.rb +3 -0
  35. data/spec/dummy/app/views/admin/dashboard/index.html.erb +0 -2
  36. data/spec/dummy/app/views/dashboard/extra_params.html.erb +7 -0
  37. data/spec/dummy/app/views/dashboard/index.html.erb +0 -2
  38. data/spec/dummy/app/views/layouts/application.html.erb +8 -2
  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/routes.rb +9 -5
  43. data/spec/dummy/db/migrate/20191022100000_create_students.rb +14 -0
  44. data/spec/dummy/db/schema.rb +10 -1
  45. data/spec/models/user_spec.rb +3 -30
  46. data/spec/support/factories.rb +8 -4
  47. metadata +34 -13
  48. data/spec/controllers/masquerades_controller_spec.rb +0 -42
  49. data/spec/dummy/app/controllers/masquerades_controller.rb +0 -5
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe MasqueradesTestsController, type: :controller do
4
+ before { @request.env['devise.mapping'] = Devise.mappings[:user] }
5
+
6
+ context 'no access for masquerade' do
7
+ before do
8
+ session.clear
9
+ allow_any_instance_of(MasqueradesTestsController).to receive(:masquerade_authorized?) { false }
10
+ end
11
+
12
+ before { logged_in }
13
+
14
+ let(:mask) { create(:user) }
15
+
16
+ before { get :show, params: { id: mask.to_param, masquerade: mask.masquerade_key } }
17
+
18
+ it { expect(response.status).to eq(403) }
19
+ it { expect(Rails.cache.read('devise_masquerade_user')).not_to be }
20
+ it { expect(session['warden.user.user.key'].first.first).not_to eq(mask.id) }
21
+ end
22
+
23
+ context 'access for masquerade' do
24
+ before do
25
+ session.clear
26
+ allow_any_instance_of(MasqueradesTestsController).to receive(:masquerade_authorized?) { true }
27
+ end
28
+
29
+ before { logged_in }
30
+
31
+ let(:mask) { create(:user) }
32
+
33
+ before do
34
+ get :show, params: { id: mask.to_param, masquerade: mask.masquerade_key }
35
+ end
36
+
37
+ it { expect(response.status).to eq(302) }
38
+ it { expect(Rails.cache.read('devise_masquerade_user')).to be }
39
+ it { expect(session['warden.user.user.key'].first.first).to eq(mask.id) }
40
+ end
41
+ end
@@ -1,6 +1,5 @@
1
1
  class Admin::DashboardController < ApplicationController
2
2
  before_action :authenticate_admin_user!
3
- before_action :masquerade_admin_user!
4
3
 
5
4
  def index
6
5
  @users = Admin::User.where("admin_users.id != ?", current_admin_user.id).all
@@ -1,4 +1,6 @@
1
1
  class ApplicationController < ActionController::Base
2
+ before_action :masquerade!
3
+
2
4
  protect_from_forgery
3
5
  end
4
6
 
@@ -1,9 +1,12 @@
1
1
  class DashboardController < ApplicationController
2
2
  before_action :authenticate_user!
3
- before_action :masquerade_user!
4
3
 
5
4
  def index
6
5
  @users = User.where("users.id != ?", current_user.id).all
7
6
  end
7
+
8
+ def extra_params
9
+ @users = User.where("users.id != ?", current_user.id).all
10
+ end
8
11
  end
9
12
 
@@ -0,0 +1,7 @@
1
+ class MasqueradesTestsController < Devise::MasqueradesController
2
+ before_action :authenticate_user!
3
+
4
+ def show
5
+ super
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ class StudentsController < ApplicationController
2
+ before_action :authenticate_user!
3
+
4
+ def index
5
+ @students = Student.all
6
+ end
7
+ end
8
+
@@ -0,0 +1,3 @@
1
+ class Student < ActiveRecord::Base
2
+ devise :database_authenticatable, :validatable, :masqueradable
3
+ end
@@ -1,3 +1 @@
1
- <h1>Users</h1>
2
-
3
1
  <%= render @users %>
@@ -0,0 +1,7 @@
1
+ <% @users.each do |user| %>
2
+ <p>
3
+ <%= user.email %>
4
+
5
+ <%= link_to "Login as", masquerade_path(user, key1: 'value1'), class: 'login_as' %>
6
+ </p>
7
+ <% end %>
@@ -1,3 +1 @@
1
- <h1>Users</h1>
2
-
3
1
  <%= render @users %>
@@ -8,10 +8,16 @@
8
8
  </head>
9
9
  <body>
10
10
  <% if signed_in? %>
11
- <h1 class='current_user'><%= current_user.email %></h1>
11
+ <% if user_signed_in? %>
12
+ <h1 class='current_user'><%= current_user.email %></h1>
13
+ <% end %>
14
+
15
+ <% if student_signed_in? %>
16
+ <h1 class='current_student'><%= current_student.email %></h1>
17
+ <% end %>
12
18
 
13
19
  <% if user_masquerade? %>
14
- <%= link_to "Back masquerade", back_masquerade_path(current_user) %>
20
+ <%= link_to "Back masquerade", back_masquerade_path(User.new) %>
15
21
  <% end %>
16
22
  <% end %>
17
23
 
@@ -0,0 +1,6 @@
1
+ <p>
2
+ <%= student.email %>
3
+
4
+ <%= link_to "Login as", masquerade_path(student), class: 'login_as' %>
5
+ </p>
6
+
@@ -0,0 +1 @@
1
+ <%= render @students %>
@@ -1,6 +1,6 @@
1
1
  <p>
2
2
  <%= user.email %>
3
3
 
4
- <%= link_to "Login as", masquerade_path(user) %>
4
+ <%= link_to "Login as", masquerade_path(user), class: 'login_as' %>
5
5
  </p>
6
6
 
@@ -1,12 +1,16 @@
1
1
  Dummy::Application.routes.draw do
2
- devise_for :users, controllers: { masquerades: "users/masquerades" }
3
- devise_for :admin_users, :class_name => 'Admin::User'
2
+ devise_for :users, controllers: { masquerades: 'users/masquerades' }
3
+ devise_for :admin_users, class_name: Admin::User.name
4
+ devise_for :students, class_name: Student.name
4
5
 
5
- root :to => 'dashboard#index'
6
+ root to: 'dashboard#index'
6
7
 
7
- resources :masquerades
8
+ get '/extra_params', to: 'dashboard#extra_params'
9
+
10
+ resources :masquerades_tests
11
+ resources :students, only: :index
8
12
 
9
13
  namespace :admin do
10
- root :to => 'dashboard#index'
14
+ root to: 'dashboard#index'
11
15
  end
12
16
  end
@@ -0,0 +1,14 @@
1
+ class CreateStudents < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table(:students) do |t|
4
+ t.string :email, null: false, default: ''
5
+ t.string :encrypted_password, null: false, default: ''
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :students, :email, unique: true
11
+ add_index :students, :reset_password_token, unique: true
12
+ end
13
+ end
14
+
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2014_04_18_160449) do
13
+ ActiveRecord::Schema.define(version: 2019_10_22_100000) do
14
14
 
15
15
  create_table "admin_users", force: :cascade do |t|
16
16
  t.string "email", default: "", null: false
@@ -29,6 +29,15 @@ ActiveRecord::Schema.define(version: 2014_04_18_160449) do
29
29
  t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true
30
30
  end
31
31
 
32
+ create_table "students", force: :cascade do |t|
33
+ t.string "email", default: "", null: false
34
+ t.string "encrypted_password", default: "", null: false
35
+ t.datetime "created_at", null: false
36
+ t.datetime "updated_at", null: false
37
+ t.index "\"reset_password_token\"", name: "index_students_on_reset_password_token", unique: true
38
+ t.index ["email"], name: "index_students_on_email", unique: true
39
+ end
40
+
32
41
  create_table "users", force: :cascade do |t|
33
42
  t.string "email", default: "", null: false
34
43
  t.string "encrypted_password", default: "", null: false
@@ -3,37 +3,10 @@ require 'spec_helper'
3
3
  describe User do
4
4
  let!(:user) { create(:user) }
5
5
 
6
- describe '#masquerade!' do
6
+ describe '#masquerade_key' do
7
7
  it 'should cache special key on masquerade' do
8
- expect(SecureRandom).to receive(:urlsafe_base64).with(16) { "secure_key" }
9
- user.masquerade!
10
- end
11
- end
12
-
13
- describe '#remove_masquerade_key' do
14
- before { allow(SecureRandom).to receive(:urlsafe_base64) { "secure_key" } }
15
-
16
- let(:key) { 'users:secure_key:masquerade' }
17
-
18
- it 'should be possible to remove cached masquerade key' do
19
- user.masquerade!
20
- expect(Rails.cache.exist?(key)).to eq(true)
21
-
22
- User.remove_masquerade_key!('secure_key')
23
- expect(Rails.cache.exist?(key)).to eq(false)
24
- end
25
- end
26
-
27
- describe '#find_by_masquerade_key' do
28
- it 'should be possible to find user by generate masquerade key' do
29
- user.masquerade!
30
-
31
- allow(Rails.cache).to receive(:read).with("users:#{user.masquerade_key}:masquerade") { user.id }
32
- allow(Rails.cache).to receive(:delete).with("users:#{user.masquerade_key}:masquerade")
33
-
34
- new_user = User.find_by_masquerade_key(user.masquerade_key)
35
-
36
- expect(new_user).to eq(user)
8
+ expect(user).to receive(:to_sgid).with(expires_in: 1.minute, for: 'masquerade') { "secure_key" }
9
+ user.masquerade_key
37
10
  end
38
11
  end
39
12
  end
@@ -1,14 +1,18 @@
1
1
  FactoryBot.define do
2
- sequence(:email) { |i| "john#{i}@example.com" }
3
-
4
2
  factory :user do
5
- email
3
+ sequence(:email) { |i| "user#{i}@example.com" }
6
4
  password { 'password' }
7
5
  password_confirmation { 'password' }
8
6
  end
9
7
 
10
8
  factory :admin_user, :class => 'Admin::User' do
11
- email
9
+ sequence(:email) { |i| "admin#{i}@example.com" }
10
+ password { 'password' }
11
+ password_confirmation { 'password' }
12
+ end
13
+
14
+ factory :student do
15
+ sequence(:email) { |i| "student#{i}@example.com" }
12
16
  password { 'password' }
13
17
  password_confirmation { 'password' }
14
18
  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.0.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Korsak
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-21 00:00:00.000000000 Z
11
+ date: 2021-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 4.7.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: zeitwerk
56
+ name: globalid
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 2.2.0
61
+ version: 0.3.6
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 2.2.0
68
+ version: 0.3.6
69
69
  description: devise masquerade library
70
70
  email:
71
71
  - alex.korsak@gmail.com
@@ -73,6 +73,9 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
+ - ".github/FUNDING.yml"
77
+ - ".github/workflows/brakeman-analysis.yml"
78
+ - ".github/workflows/rubocop-analysis.yml"
76
79
  - ".gitignore"
77
80
  - ".rspec"
78
81
  - ".ruby-version"
@@ -89,9 +92,12 @@ files:
89
92
  - config/environment.rb
90
93
  - devise_masquerade.gemspec
91
94
  - features/back.feature
95
+ - features/multiple_masquerading_models.feature
92
96
  - features/step_definitions/auth_steps.rb
93
97
  - features/step_definitions/back_steps.rb
98
+ - features/step_definitions/url_helpers_steps.rb
94
99
  - features/support/env.rb
100
+ - features/url_helpers.feature
95
101
  - lib/devise_masquerade.rb
96
102
  - lib/devise_masquerade/controllers/helpers.rb
97
103
  - lib/devise_masquerade/controllers/url_helpers.rb
@@ -104,20 +110,25 @@ files:
104
110
  - spec/controllers/admin/dashboard_controller_spec.rb
105
111
  - spec/controllers/dashboard_controller_spec.rb
106
112
  - spec/controllers/devise/masquerades_controller_spec.rb
107
- - spec/controllers/masquerades_controller_spec.rb
113
+ - spec/controllers/masquerades_tests_controller_spec.rb
108
114
  - spec/dummy/Rakefile
109
115
  - spec/dummy/app/controllers/admin/dashboard_controller.rb
110
116
  - spec/dummy/app/controllers/application_controller.rb
111
117
  - spec/dummy/app/controllers/dashboard_controller.rb
112
- - spec/dummy/app/controllers/masquerades_controller.rb
118
+ - spec/dummy/app/controllers/masquerades_tests_controller.rb
119
+ - spec/dummy/app/controllers/students_controller.rb
113
120
  - spec/dummy/app/controllers/users/masquerades_controller.rb
114
121
  - spec/dummy/app/helpers/application_helper.rb
115
122
  - spec/dummy/app/models/admin.rb
116
123
  - spec/dummy/app/models/admin/user.rb
124
+ - spec/dummy/app/models/student.rb
117
125
  - spec/dummy/app/models/user.rb
118
126
  - spec/dummy/app/views/admin/dashboard/index.html.erb
127
+ - spec/dummy/app/views/dashboard/extra_params.html.erb
119
128
  - spec/dummy/app/views/dashboard/index.html.erb
120
129
  - spec/dummy/app/views/layouts/application.html.erb
130
+ - spec/dummy/app/views/students/_student.html.erb
131
+ - spec/dummy/app/views/students/index.html.erb
121
132
  - spec/dummy/app/views/users/_user.html.erb
122
133
  - spec/dummy/config.ru
123
134
  - spec/dummy/config/application.rb
@@ -139,6 +150,7 @@ files:
139
150
  - spec/dummy/db/.gitignore
140
151
  - spec/dummy/db/migrate/20121119085620_devise_create_users.rb
141
152
  - spec/dummy/db/migrate/20140418160449_create_admin_users.rb
153
+ - spec/dummy/db/migrate/20191022100000_create_students.rb
142
154
  - spec/dummy/db/schema.rb
143
155
  - spec/dummy/db/seeds.rb
144
156
  - spec/dummy/public/.empty
@@ -152,7 +164,7 @@ homepage: http://github.com/oivoodoo/devise_masquerade
152
164
  licenses:
153
165
  - MIT
154
166
  metadata: {}
155
- post_install_message:
167
+ post_install_message:
156
168
  rdoc_options: []
157
169
  require_paths:
158
170
  - lib
@@ -167,32 +179,40 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
179
  - !ruby/object:Gem::Version
168
180
  version: '0'
169
181
  requirements: []
170
- rubygems_version: 3.0.1
171
- signing_key:
182
+ rubygems_version: 3.1.4
183
+ signing_key:
172
184
  specification_version: 4
173
185
  summary: use for login as functionallity on your admin users pages
174
186
  test_files:
175
187
  - features/back.feature
188
+ - features/multiple_masquerading_models.feature
176
189
  - features/step_definitions/auth_steps.rb
177
190
  - features/step_definitions/back_steps.rb
191
+ - features/step_definitions/url_helpers_steps.rb
178
192
  - features/support/env.rb
193
+ - features/url_helpers.feature
179
194
  - spec/controllers/admin/dashboard_controller_spec.rb
180
195
  - spec/controllers/dashboard_controller_spec.rb
181
196
  - spec/controllers/devise/masquerades_controller_spec.rb
182
- - spec/controllers/masquerades_controller_spec.rb
197
+ - spec/controllers/masquerades_tests_controller_spec.rb
183
198
  - spec/dummy/Rakefile
184
199
  - spec/dummy/app/controllers/admin/dashboard_controller.rb
185
200
  - spec/dummy/app/controllers/application_controller.rb
186
201
  - spec/dummy/app/controllers/dashboard_controller.rb
187
- - spec/dummy/app/controllers/masquerades_controller.rb
202
+ - spec/dummy/app/controllers/masquerades_tests_controller.rb
203
+ - spec/dummy/app/controllers/students_controller.rb
188
204
  - spec/dummy/app/controllers/users/masquerades_controller.rb
189
205
  - spec/dummy/app/helpers/application_helper.rb
190
206
  - spec/dummy/app/models/admin.rb
191
207
  - spec/dummy/app/models/admin/user.rb
208
+ - spec/dummy/app/models/student.rb
192
209
  - spec/dummy/app/models/user.rb
193
210
  - spec/dummy/app/views/admin/dashboard/index.html.erb
211
+ - spec/dummy/app/views/dashboard/extra_params.html.erb
194
212
  - spec/dummy/app/views/dashboard/index.html.erb
195
213
  - spec/dummy/app/views/layouts/application.html.erb
214
+ - spec/dummy/app/views/students/_student.html.erb
215
+ - spec/dummy/app/views/students/index.html.erb
196
216
  - spec/dummy/app/views/users/_user.html.erb
197
217
  - spec/dummy/config.ru
198
218
  - spec/dummy/config/application.rb
@@ -214,6 +234,7 @@ test_files:
214
234
  - spec/dummy/db/.gitignore
215
235
  - spec/dummy/db/migrate/20121119085620_devise_create_users.rb
216
236
  - spec/dummy/db/migrate/20140418160449_create_admin_users.rb
237
+ - spec/dummy/db/migrate/20191022100000_create_students.rb
217
238
  - spec/dummy/db/schema.rb
218
239
  - spec/dummy/db/seeds.rb
219
240
  - spec/dummy/public/.empty