authentication-zero 2.2.10 → 2.3.2

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +3 -2
  5. data/lib/authentication_zero/version.rb +1 -1
  6. data/lib/generators/authentication/authentication_generator.rb +27 -21
  7. data/lib/generators/authentication/templates/controllers/api/email_verifications_controller.rb.tt +2 -0
  8. data/lib/generators/authentication/templates/controllers/api/emails_controller.rb.tt +2 -3
  9. data/lib/generators/authentication/templates/controllers/api/password_resets_controller.rb.tt +2 -2
  10. data/lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt +4 -4
  11. data/lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt +4 -4
  12. data/lib/generators/authentication/templates/controllers/api/sudos_controller.rb.tt +11 -0
  13. data/lib/generators/authentication/templates/controllers/html/email_verifications_controller.rb.tt +2 -0
  14. data/lib/generators/authentication/templates/controllers/html/emails_controller.rb.tt +2 -3
  15. data/lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt +2 -2
  16. data/lib/generators/authentication/templates/controllers/html/registrations_controller.rb.tt +5 -6
  17. data/lib/generators/authentication/templates/controllers/html/sessions_controller.rb.tt +4 -4
  18. data/lib/generators/authentication/templates/controllers/html/sudos_controller.rb.tt +14 -0
  19. data/lib/generators/authentication/templates/erb/emails/edit.html.erb.tt +0 -5
  20. data/lib/generators/authentication/templates/erb/sudos/new.html.erb.tt +28 -0
  21. data/lib/generators/authentication/templates/migrations/create_sessions_migration.rb.tt +2 -0
  22. data/lib/generators/authentication/templates/models/model.rb.tt +4 -0
  23. data/lib/generators/authentication/templates/test_unit/controllers/api/emails_controller_test.rb.tt +7 -5
  24. data/lib/generators/authentication/templates/test_unit/controllers/api/passwords_controller_test.rb.tt +1 -1
  25. data/lib/generators/authentication/templates/test_unit/controllers/api/sessions_controller_test.rb.tt +1 -1
  26. data/lib/generators/authentication/templates/test_unit/controllers/api/sudos_controller_test.rb.tt +24 -0
  27. data/lib/generators/authentication/templates/test_unit/controllers/html/emails_controller_test.rb.tt +12 -5
  28. data/lib/generators/authentication/templates/test_unit/controllers/html/passwords_controller_test.rb.tt +1 -1
  29. data/lib/generators/authentication/templates/test_unit/controllers/html/sessions_controller_test.rb.tt +1 -1
  30. data/lib/generators/authentication/templates/test_unit/controllers/html/sudos_controller_test.rb.tt +26 -0
  31. data/lib/generators/authentication/templates/test_unit/system/emails_test.rb.tt +1 -1
  32. data/lib/generators/authentication/templates/test_unit/system/passwords_test.rb.tt +1 -0
  33. data/lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt +3 -3
  34. data/lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt +1 -7
  35. data/lib/generators/authentication/templates/test_unit/system/sudos_test.rb.tt +25 -0
  36. metadata +13 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d86415b86a2afceb0fd9f224ca9edd8f6ee32824d0e3c4bd8bb4ed6b7ac01b29
4
- data.tar.gz: 7f16a4f0cd62f7a6ebc201172c8e8f7443af20ebf7f43e2aa2cac76eb26edfd5
3
+ metadata.gz: d624ca7163c73901295fea611c7dbfaac4cb6a4a07e67fdb73e8902bfb196610
4
+ data.tar.gz: a5f2a10b0094c6deb84b7802feba74f4ab271f46ae427e15249c0ade995d9b9c
5
5
  SHA512:
6
- metadata.gz: f17fc115b066489463a3f7ee458f1028a731619508db8b559d58b743686b4e217ba00540e7343e59636519da27409abec73801f33d94282866c156bef14aeaf7
7
- data.tar.gz: 346c434a4270e1733363d2d0bab34863d7a000646b1ef8f79c42301b9a11fe191b5c548fcefb9f00f5e967ddedf1fa505febd343ff2608348505c97b1e40f01d
6
+ metadata.gz: 65745cf79a45d33c105eacea19b7575837597fd86265cc5cf481d1b4262ec7964c7b9f61e0fcf55a443a5009ff1da7341e7c53a994240b1271c8f8aa64a16c22
7
+ data.tar.gz: ac01c99af8da3c5fd7f0d50ba357fb17cb3e905302a425861ce92b9cb306148d630ac303d95943b175efc5a09ed9f0817eddc8c4229593b08a21f25730623c96
data/CHANGELOG.md CHANGED
@@ -0,0 +1,5 @@
1
+ ## Rails 2.3.0 (February 26, 2022) ##
2
+
3
+ * Implemented sudo
4
+ * Destroy sessions after change password
5
+ * On system tests, assert_current_path in sign_in
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- authentication-zero (2.2.10)
4
+ authentication-zero (2.3.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -8,10 +8,11 @@ The purpose of authentication zero is to generate a pre-built authentication sys
8
8
  - **Inspired by hey.com**
9
9
  - Sign up
10
10
  - Email and password validations
11
- - Reset the user password and send reset instructions
12
- - Reset the user password only from verified emails
13
11
  - Authentication by cookie (html)
14
12
  - Authentication by token (api)
13
+ - Ask password before sensitive data changes, aka: sudo
14
+ - Reset the user password and send reset instructions
15
+ - Reset the user password only from verified emails
15
16
  - Send e-mail verification when your email has been changed
16
17
  - Send email when someone has logged into your account
17
18
  - Manage multiple sessions & devices
@@ -1,3 +1,3 @@
1
1
  module AuthenticationZero
2
- VERSION = "2.2.10"
2
+ VERSION = "2.3.2"
3
3
  end
@@ -11,8 +11,7 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
11
11
  class_option :fixture, type: :boolean, default: true
12
12
  class_option :system_tests, type: :string, desc: "Skip system test files"
13
13
 
14
- class_option :skip_routes, type: :boolean
15
- class_option :template_engine, type: :string, desc: "Template engine to be invoked"
14
+ class_option :skip_routes, type: :boolean, default: false
16
15
 
17
16
  source_root File.expand_path("templates", __dir__)
18
17
 
@@ -47,27 +46,37 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
47
46
 
48
47
  before_action :authenticate
49
48
 
50
- private
51
- def authenticate
52
- if session = authenticate_with_http_token { |token, _| Session.find_signed(token) }
53
- Current.session = session
54
- else
55
- request_http_token_authentication
56
- end
49
+ def authenticate
50
+ if session = authenticate_with_http_token { |token, _| Session.find_signed(token) }
51
+ Current.session = session
52
+ else
53
+ request_http_token_authentication
57
54
  end
55
+ end
56
+
57
+ def require_sudo
58
+ if Time.current > 30.minutes.after(Current.session.sudo_at)
59
+ render json: { error: "Enter your password to continue" }, status: :forbidden
60
+ end
61
+ end
58
62
  CODE
59
63
 
60
64
  html_code = <<~CODE
61
65
  before_action :authenticate
62
66
 
63
- private
64
- def authenticate
65
- if session = Session.find_by_id(cookies.signed[:session_token])
66
- Current.session = session
67
- else
68
- redirect_to sign_in_path
69
- end
67
+ def authenticate
68
+ if session = Session.find_by_id(cookies.signed[:session_token])
69
+ Current.session = session
70
+ else
71
+ redirect_to sign_in_path
72
+ end
73
+ end
74
+
75
+ def require_sudo
76
+ if Time.current > 30.minutes.after(Current.session.sudo_at)
77
+ redirect_to new_sudo_path(proceed_to_url: request.url)
70
78
  end
79
+ end
71
80
  CODE
72
81
 
73
82
  inject_code = options.api? ? api_code : html_code
@@ -83,7 +92,7 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
83
92
  directory "erb/identity_mailer", "app/views/identity_mailer"
84
93
  directory "erb/session_mailer", "app/views/session_mailer"
85
94
  else
86
- directory "#{template_engine}", "app/views"
95
+ directory "erb", "app/views"
87
96
  end
88
97
  end
89
98
 
@@ -93,6 +102,7 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
93
102
 
94
103
  def add_routes
95
104
  unless options.skip_routes
105
+ route "resource :sudo, only: [:new, :create]"
96
106
  route "resource :registration, only: :destroy"
97
107
  route "resource :password_reset, only: [:new, :edit, :create, :update]"
98
108
  route "resource :password, only: [:edit, :update]"
@@ -116,10 +126,6 @@ class AuthenticationGenerator < Rails::Generators::NamedBase
116
126
  options.api ? "api" : "html"
117
127
  end
118
128
 
119
- def template_engine
120
- options.template_engine
121
- end
122
-
123
129
  def test_framework
124
130
  options.test_framework
125
131
  end
@@ -1,4 +1,6 @@
1
1
  class EmailVerificationsController < ApplicationController
2
+ skip_before_action :authenticate, only: :edit
3
+
2
4
  before_action :set_<%= singular_table_name %>, only: :edit
3
5
 
4
6
  def edit
@@ -1,10 +1,9 @@
1
1
  class EmailsController < ApplicationController
2
+ before_action :require_sudo
2
3
  before_action :set_<%= singular_table_name %>
3
4
 
4
5
  def update
5
- if !@<%= singular_table_name %>.authenticate(params[:current_password])
6
- render json: { error: "The current password you entered is incorrect" }, status: :bad_request
7
- elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
6
+ if @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
8
7
  render json: @<%= singular_table_name %>
9
8
  else
10
9
  render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
@@ -4,8 +4,8 @@ class PasswordResetsController < ApplicationController
4
4
  before_action :set_<%= singular_table_name %>, only: :update
5
5
 
6
6
  def create
7
- if @<%= singular_table_name %> = <%= class_name %>.find_by(email: params[:email], verified: true)
8
- IdentityMailer.with(<%= singular_table_name %>: @<%= singular_table_name %>).password_reset_provision.deliver_later
7
+ if <%= singular_table_name %> = <%= class_name %>.find_by(email: params[:email], verified: true)
8
+ IdentityMailer.with(<%= singular_table_name %>: <%= singular_table_name %>).password_reset_provision.deliver_later
9
9
  else
10
10
  render json: { error: "You can't reset your password until you verify your email" }, status: :not_found
11
11
  end
@@ -2,12 +2,12 @@ class RegistrationsController < ApplicationController
2
2
  skip_before_action :authenticate, only: :create
3
3
 
4
4
  def create
5
- @<%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
5
+ <%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
6
6
 
7
- if @<%= singular_table_name %>.save
8
- render json: @<%= singular_table_name %>, status: :created
7
+ if <%= singular_table_name %>.save
8
+ render json: <%= singular_table_name %>, status: :created
9
9
  else
10
- render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity
10
+ render json: <%= singular_table_name %>.errors, status: :unprocessable_entity
11
11
  end
12
12
  end
13
13
 
@@ -12,10 +12,10 @@ class SessionsController < ApplicationController
12
12
  end
13
13
 
14
14
  def create
15
- @<%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
15
+ <%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
16
16
 
17
- if @<%= singular_table_name %> && @<%= singular_table_name %>.authenticate(params[:password])
18
- session = @<%= singular_table_name %>.sessions.create!(session_params)
17
+ if <%= singular_table_name %> && <%= singular_table_name %>.authenticate(params[:password])
18
+ session = <%= singular_table_name %>.sessions.create!(session_params)
19
19
  response.set_header("X-Session-Token", session.signed_id)
20
20
 
21
21
  render json: session, status: :created
@@ -34,6 +34,6 @@ class SessionsController < ApplicationController
34
34
  end
35
35
 
36
36
  def session_params
37
- { user_agent: request.user_agent, ip_address: request.remote_ip }
37
+ { user_agent: request.user_agent, ip_address: request.remote_ip, sudo_at: Time.current }
38
38
  end
39
39
  end
@@ -0,0 +1,11 @@
1
+ class SudosController < ApplicationController
2
+ def create
3
+ session = Current.session
4
+
5
+ if session.<%= singular_table_name %>.authenticate(params[:password])
6
+ session.update! sudo_at: Time.current
7
+ else
8
+ render json: { error: "The password you entered is incorrect" }, status: :bad_request
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,6 @@
1
1
  class EmailVerificationsController < ApplicationController
2
+ skip_before_action :authenticate, only: :edit
3
+
2
4
  before_action :set_<%= singular_table_name %>, only: :edit
3
5
 
4
6
  def edit
@@ -1,13 +1,12 @@
1
1
  class EmailsController < ApplicationController
2
+ before_action :require_sudo
2
3
  before_action :set_<%= singular_table_name %>
3
4
 
4
5
  def edit
5
6
  end
6
7
 
7
8
  def update
8
- if !@<%= singular_table_name %>.authenticate(params[:current_password])
9
- redirect_to edit_email_path, alert: "The current password you entered is incorrect"
10
- elsif @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
9
+ if @<%= singular_table_name %>.update(<%= "#{singular_table_name}_params" %>)
11
10
  redirect_to root_path, notice: "Your email has been changed"
12
11
  else
13
12
  render :edit, status: :unprocessable_entity
@@ -10,8 +10,8 @@ class PasswordResetsController < ApplicationController
10
10
  end
11
11
 
12
12
  def create
13
- if @<%= singular_table_name %> = <%= class_name %>.find_by(email: params[:email], verified: true)
14
- IdentityMailer.with(<%= singular_table_name %>: @<%= singular_table_name %>).password_reset_provision.deliver_later
13
+ if <%= singular_table_name %> = <%= class_name %>.find_by(email: params[:email], verified: true)
14
+ IdentityMailer.with(<%= singular_table_name %>: <%= singular_table_name %>).password_reset_provision.deliver_later
15
15
  redirect_to sign_in_path, notice: "Check your email for reset instructions"
16
16
  else
17
17
  redirect_to new_password_reset_path, alert: "You can't reset your password until you verify your email"
@@ -6,10 +6,10 @@ class RegistrationsController < ApplicationController
6
6
  end
7
7
 
8
8
  def create
9
- @<%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
9
+ <%= singular_table_name %> = <%= class_name %>.new(<%= "#{singular_table_name}_params" %>)
10
10
 
11
- if @<%= singular_table_name %>.save
12
- session = @<%= singular_table_name %>.sessions.create!(session_params)
11
+ if <%= singular_table_name %>.save
12
+ session = <%= singular_table_name %>.sessions.create!(session_params)
13
13
  cookies.signed.permanent[:session_token] = { value: session.id, httponly: true }
14
14
 
15
15
  redirect_to root_path, notice: "Welcome! You have signed up successfully"
@@ -19,8 +19,7 @@ class RegistrationsController < ApplicationController
19
19
  end
20
20
 
21
21
  def destroy
22
- Current.<%= singular_table_name %>.destroy
23
- redirect_to sign_in_path, notice: "Your account is closed"
22
+ Current.<%= singular_table_name %>.destroy; redirect_to(sign_in_path, notice: "Your account is closed")
24
23
  end
25
24
 
26
25
  private
@@ -29,6 +28,6 @@ class RegistrationsController < ApplicationController
29
28
  end
30
29
 
31
30
  def session_params
32
- { user_agent: request.user_agent, ip_address: request.remote_ip }
31
+ { user_agent: request.user_agent, ip_address: request.remote_ip, sudo_at: Time.current }
33
32
  end
34
33
  end
@@ -12,10 +12,10 @@ class SessionsController < ApplicationController
12
12
  end
13
13
 
14
14
  def create
15
- @<%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
15
+ <%= singular_table_name %> = <%= class_name %>.find_by_email(params[:email])
16
16
 
17
- if @<%= singular_table_name %> && @<%= singular_table_name %>.authenticate(params[:password])
18
- session = @<%= singular_table_name %>.sessions.create!(session_params)
17
+ if <%= singular_table_name %> && <%= singular_table_name %>.authenticate(params[:password])
18
+ session = <%= singular_table_name %>.sessions.create!(session_params)
19
19
  cookies.signed.permanent[:session_token] = { value: session.id, httponly: true }
20
20
 
21
21
  redirect_to root_path, notice: "Signed in successfully"
@@ -35,6 +35,6 @@ class SessionsController < ApplicationController
35
35
  end
36
36
 
37
37
  def session_params
38
- { user_agent: request.user_agent, ip_address: request.remote_ip }
38
+ { user_agent: request.user_agent, ip_address: request.remote_ip, sudo_at: Time.current }
39
39
  end
40
40
  end
@@ -0,0 +1,14 @@
1
+ class SudosController < ApplicationController
2
+ def new
3
+ end
4
+
5
+ def create
6
+ session = Current.session
7
+
8
+ if session.<%= singular_table_name %>.authenticate(params[:password])
9
+ session.update!(sudo_at: Time.current); redirect_to(params[:proceed_to_url])
10
+ else
11
+ redirect_to new_sudo_path(proceed_to_url: params[:proceed_to_url]), alert: "The password you entered is incorrect"
12
+ end
13
+ end
14
+ end
@@ -21,11 +21,6 @@
21
21
  </div>
22
22
  <%% end %>
23
23
 
24
- <div>
25
- <%%= label_tag :current_password, nil, style: "display: block" %>
26
- <%%= password_field_tag :current_password, nil, autofocus: true, autocomplete: "current-password" %>
27
- </div>
28
-
29
24
  <div>
30
25
  <%%= form.label :email, "New email", style: "display: block" %>
31
26
  <%%= form.email_field :email %>
@@ -0,0 +1,28 @@
1
+ <p style="color: red"><%%= alert %></p>
2
+
3
+ <h1>Enter your password to continue</h1>
4
+
5
+ <%%= form_with(url: sudo_path) do |form| %>
6
+
7
+ <%%= hidden_field_tag :proceed_to_url, params[:proceed_to_url] %>
8
+
9
+ <div>
10
+ <%%= password_field_tag :password, nil, autofocus: true, autocomplete: "current-password" %>
11
+ </div>
12
+
13
+ <div>
14
+ <%%= form.submit "Continue" %>
15
+ </div>
16
+ <%% end %>
17
+
18
+ <br>
19
+
20
+ <p>
21
+ <strong>Why are you asking me to do this?</strong><br>
22
+ To better protect your account, we'll occasionally ask you to confirm your password before performing sensitive actions.
23
+ </p>
24
+
25
+ <p>
26
+ <strong>Forgot your password?</strong><br>
27
+ We'll help you <%%= link_to "reset it", new_password_reset_path %> so you can continue.
28
+ </p>
@@ -5,6 +5,8 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
5
5
  t.string :user_agent
6
6
  t.string :ip_address
7
7
 
8
+ t.datetime :sudo_at, null: false
9
+
8
10
  t.timestamps
9
11
  end
10
12
  end
@@ -17,6 +17,10 @@ class <%= class_name %> < ApplicationRecord
17
17
  self.verified = false
18
18
  end
19
19
 
20
+ after_update if: :password_digest_previously_changed? do
21
+ sessions.where.not(id: Current.session).destroy_all
22
+ end
23
+
20
24
  after_create_commit do
21
25
  IdentityMailer.with(<%= singular_table_name %>: self).email_verify_confirmation.deliver_later
22
26
  end
@@ -6,15 +6,17 @@ class EmailsControllerTest < ActionDispatch::IntegrationTest
6
6
  end
7
7
 
8
8
  test "should update email" do
9
- patch email_url, params: { current_password: "Secret123456", email: "new_email@hey.com" }, headers: { "Authorization" => "Bearer #{@token}" }
9
+ patch email_url, params: { email: "new_email@hey.com" }, headers: { "Authorization" => "Bearer #{@token}" }
10
10
  assert_response :success
11
11
  end
12
12
 
13
- test "should not update email with wrong current password" do
14
- patch email_url, params: { current_password: "wrong_password", email: @<%= singular_table_name %>.email }, headers: { "Authorization" => "Bearer #{@token}" }
13
+ test "should not update email without sudo" do
14
+ @<%= singular_table_name %>.sessions.last.update! sudo_at: 1.day.ago
15
15
 
16
- assert_response :bad_request
17
- assert_equal "The current password you entered is incorrect", response.parsed_body["error"]
16
+ patch email_url, params: { email: "new_email@hey.com" }, headers: { "Authorization" => "Bearer #{@token}" }
17
+
18
+ assert_response :forbidden
19
+ assert_equal "Enter your password to continue", response.parsed_body["error"]
18
20
  end
19
21
 
20
22
  def sign_in_as(<%= singular_table_name %>)
@@ -11,7 +11,7 @@ class PasswordsControllerTest < ActionDispatch::IntegrationTest
11
11
  end
12
12
 
13
13
  test "should not update password with wrong current password" do
14
- patch password_url, params: { current_password: "wrong_password", password: "Secret654321", password_confirmation: "Secret654321" }, headers: { "Authorization" => "Bearer #{@token}" }
14
+ patch password_url, params: { current_password: "SecretWrong123", password: "Secret654321", password_confirmation: "Secret654321" }, headers: { "Authorization" => "Bearer #{@token}" }
15
15
 
16
16
  assert_response :bad_request
17
17
  assert_equal "The current password you entered is incorrect", response.parsed_body["error"]
@@ -23,7 +23,7 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
23
23
  end
24
24
 
25
25
  test "should not sign in with wrong credentials" do
26
- post sign_in_url, params: { email: @<%= singular_table_name %>.email, password: "wrong_password" }
26
+ post sign_in_url, params: { email: @<%= singular_table_name %>.email, password: "SecretWrong123" }
27
27
  assert_response :unauthorized
28
28
  end
29
29
 
@@ -0,0 +1,24 @@
1
+ require "test_helper"
2
+
3
+ class SudosControllerTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ @<%= singular_table_name %>, @token = sign_in_as(<%= table_name %>(:lazaro_nixon))
6
+ @<%= singular_table_name %>.sessions.last.update! sudo_at: 1.day.ago
7
+ end
8
+
9
+ test "should sudo" do
10
+ post sudo_url, params: { password: "Secret123456" }, headers: { "Authorization" => "Bearer #{@token}" }
11
+ assert_response :no_content
12
+ end
13
+
14
+ test "should not sudo with wrong password" do
15
+ post sudo_url, params: { password: "SecretWrong123" }, headers: { "Authorization" => "Bearer #{@token}" }
16
+
17
+ assert_response :bad_request
18
+ assert_equal "The password you entered is incorrect", response.parsed_body["error"]
19
+ end
20
+
21
+ def sign_in_as(<%= singular_table_name %>)
22
+ post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret123456" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
23
+ end
24
+ end
@@ -10,16 +10,23 @@ class EmailsControllerTest < ActionDispatch::IntegrationTest
10
10
  assert_response :success
11
11
  end
12
12
 
13
+ test "should not get edit without sudo" do
14
+ @<%= singular_table_name %>.sessions.last.update! sudo_at: 1.day.ago
15
+
16
+ get edit_email_url
17
+ assert_redirected_to new_sudo_path(proceed_to_url: edit_email_url)
18
+ end
19
+
13
20
  test "should update email" do
14
- patch email_url, params: { current_password: "Secret123456", <%= singular_table_name %>: { email: "new_email@hey.com" } }
21
+ patch email_url, params: { <%= singular_table_name %>: { email: "new_email@hey.com" } }
15
22
  assert_redirected_to root_path
16
23
  end
17
24
 
18
- test "should not update email with wrong current password" do
19
- patch email_url, params: { current_password: "wrong_password", <%= singular_table_name %>: { email: @<%= singular_table_name %>.email } }
25
+ test "should not update email without sudo" do
26
+ @<%= singular_table_name %>.sessions.last.update! sudo_at: 1.day.ago
20
27
 
21
- assert_redirected_to edit_email_path
22
- assert_equal "The current password you entered is incorrect", flash[:alert]
28
+ patch email_url, params: { <%= singular_table_name %>: { email: "new_email@hey.com" } }
29
+ assert_redirected_to new_sudo_path(proceed_to_url: email_url)
23
30
  end
24
31
 
25
32
  def sign_in_as(<%= singular_table_name %>)
@@ -16,7 +16,7 @@ class PasswordsControllerTest < ActionDispatch::IntegrationTest
16
16
  end
17
17
 
18
18
  test "should not update password with wrong current password" do
19
- patch password_url, params: { current_password: "wrong_password", <%= singular_table_name %>: { password: "Secret654321", password_confirmation: "Secret654321" } }
19
+ patch password_url, params: { current_password: "SecretWrong123", <%= singular_table_name %>: { password: "Secret654321", password_confirmation: "Secret654321" } }
20
20
 
21
21
  assert_redirected_to edit_password_path
22
22
  assert_equal "The current password you entered is incorrect", flash[:alert]
@@ -28,7 +28,7 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
28
28
  end
29
29
 
30
30
  test "should not sign in with wrong credentials" do
31
- post sign_in_url, params: { email: @<%= singular_table_name %>.email, password: "wrong_password" }
31
+ post sign_in_url, params: { email: @<%= singular_table_name %>.email, password: "SecretWrong123" }
32
32
  assert_redirected_to sign_in_url(email_hint: @<%= singular_table_name %>.email)
33
33
  assert_equal "That email or password is incorrect", flash[:alert]
34
34
 
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+
3
+ class SudosControllerTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ @<%= singular_table_name %> = sign_in_as(<%= table_name %>(:lazaro_nixon))
6
+ end
7
+
8
+ test "should get new" do
9
+ get new_sudo_url(proceed_to_url: edit_password_url)
10
+ assert_response :success
11
+ end
12
+
13
+ test "should sudo" do
14
+ post sudo_url, params: { password: "Secret123456", proceed_to_url: edit_password_url }
15
+ assert_redirected_to edit_password_url
16
+ end
17
+
18
+ test "should not sudo with wrong password" do
19
+ post sudo_url, params: { password: "SecretWrong123", proceed_to_url: edit_password_url }
20
+ assert_redirected_to new_sudo_url(proceed_to_url: edit_password_url)
21
+ end
22
+
23
+ def sign_in_as(<%= singular_table_name %>)
24
+ post(sign_in_url, params: { email: <%= singular_table_name %>.email, password: "Secret123456" }); [<%= singular_table_name %>, response.headers["X-Session-Token"]]
25
+ end
26
+ end
@@ -8,7 +8,6 @@ class EmailsTest < ApplicationSystemTestCase
8
8
  test "updating the email" do
9
9
  click_on "Change email address"
10
10
 
11
- fill_in "Current password", with: "Secret123456"
12
11
  fill_in "New email", with: "new_email@hey.com"
13
12
  click_on "Save changes"
14
13
 
@@ -30,6 +29,7 @@ class EmailsTest < ApplicationSystemTestCase
30
29
  fill_in :password, with: "Secret123456"
31
30
  click_on "Sign in"
32
31
 
32
+ assert_current_path root_path
33
33
  return <%= singular_table_name %>
34
34
  end
35
35
  end
@@ -22,6 +22,7 @@ class PasswordsTest < ApplicationSystemTestCase
22
22
  fill_in :password, with: "Secret123456"
23
23
  click_on "Sign in"
24
24
 
25
+ assert_current_path root_path
25
26
  return <%= singular_table_name %>
26
27
  end
27
28
  end
@@ -6,8 +6,7 @@ class RegistrationsTest < ApplicationSystemTestCase
6
6
  end
7
7
 
8
8
  test "signing up" do
9
- visit sign_in_url
10
- click_on "Sign up"
9
+ visit sign_up_url
11
10
 
12
11
  fill_in "Email", with: "lazaronixon@hey.com"
13
12
  fill_in "Password", with: "Secret654321"
@@ -19,8 +18,8 @@ class RegistrationsTest < ApplicationSystemTestCase
19
18
 
20
19
  test "cancelling my account" do
21
20
  sign_in_as @<%= singular_table_name %>
22
- click_on "Cancel my account & delete my data"
23
21
 
22
+ click_on "Cancel my account & delete my data"
24
23
  assert_text "Your account is closed"
25
24
  end
26
25
 
@@ -30,6 +29,7 @@ class RegistrationsTest < ApplicationSystemTestCase
30
29
  fill_in :password, with: "Secret123456"
31
30
  click_on "Sign in"
32
31
 
32
+ assert_current_path root_path
33
33
  return <%= singular_table_name %>
34
34
  end
35
35
  end
@@ -21,19 +21,13 @@ class SessionsTest < ApplicationSystemTestCase
21
21
  assert_text "Signed in successfully"
22
22
  end
23
23
 
24
- test "signing out" do
25
- sign_in_as @<%= singular_table_name %>
26
-
27
- click_on "Log out"
28
- assert_selector "h1", text: "Sign in"
29
- end
30
-
31
24
  def sign_in_as(<%= singular_table_name %>)
32
25
  visit sign_in_url
33
26
  fill_in :email, with: <%= singular_table_name %>.email
34
27
  fill_in :password, with: "Secret123456"
35
28
  click_on "Sign in"
36
29
 
30
+ assert_current_path root_path
37
31
  return <%= singular_table_name %>
38
32
  end
39
33
  end
@@ -0,0 +1,25 @@
1
+ require "application_system_test_case"
2
+
3
+ class SudosTest < ApplicationSystemTestCase
4
+ setup do
5
+ @<%= singular_table_name %> = sign_in_as(<%= table_name %>(:lazaro_nixon))
6
+ end
7
+
8
+ test "executing sudo" do
9
+ visit new_sudo_url(proceed_to_url: edit_password_url)
10
+ fill_in :password, with: "Secret123456"
11
+ click_on "Continue"
12
+
13
+ assert_selector "h1", text: "Change your password"
14
+ end
15
+
16
+ def sign_in_as(<%= singular_table_name %>)
17
+ visit sign_in_url
18
+ fill_in :email, with: <%= singular_table_name %>.email
19
+ fill_in :password, with: "Secret123456"
20
+ click_on "Sign in"
21
+
22
+ assert_current_path root_path
23
+ return <%= singular_table_name %>
24
+ end
25
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authentication-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.10
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nixon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-25 00:00:00.000000000 Z
11
+ date: 2022-02-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description:
14
14
  email:
15
15
  - lazaronixon@hotmail.com
16
16
  executables: []
@@ -37,12 +37,14 @@ files:
37
37
  - lib/generators/authentication/templates/controllers/api/passwords_controller.rb.tt
38
38
  - lib/generators/authentication/templates/controllers/api/registrations_controller.rb.tt
39
39
  - lib/generators/authentication/templates/controllers/api/sessions_controller.rb.tt
40
+ - lib/generators/authentication/templates/controllers/api/sudos_controller.rb.tt
40
41
  - lib/generators/authentication/templates/controllers/html/email_verifications_controller.rb.tt
41
42
  - lib/generators/authentication/templates/controllers/html/emails_controller.rb.tt
42
43
  - lib/generators/authentication/templates/controllers/html/password_resets_controller.rb.tt
43
44
  - lib/generators/authentication/templates/controllers/html/passwords_controller.rb.tt
44
45
  - lib/generators/authentication/templates/controllers/html/registrations_controller.rb.tt
45
46
  - lib/generators/authentication/templates/controllers/html/sessions_controller.rb.tt
47
+ - lib/generators/authentication/templates/controllers/html/sudos_controller.rb.tt
46
48
  - lib/generators/authentication/templates/erb/emails/edit.html.erb.tt
47
49
  - lib/generators/authentication/templates/erb/identity_mailer/email_verify_confirmation.html.erb.tt
48
50
  - lib/generators/authentication/templates/erb/identity_mailer/email_verify_confirmation.text.erb.tt
@@ -56,6 +58,7 @@ files:
56
58
  - lib/generators/authentication/templates/erb/session_mailer/signed_in_notification.text.erb.tt
57
59
  - lib/generators/authentication/templates/erb/sessions/index.html.erb.tt
58
60
  - lib/generators/authentication/templates/erb/sessions/new.html.erb.tt
61
+ - lib/generators/authentication/templates/erb/sudos/new.html.erb.tt
59
62
  - lib/generators/authentication/templates/mailers/identity_mailer.rb.tt
60
63
  - lib/generators/authentication/templates/mailers/session_mailer.rb.tt
61
64
  - lib/generators/authentication/templates/migrations/create_sessions_migration.rb.tt
@@ -69,18 +72,21 @@ files:
69
72
  - lib/generators/authentication/templates/test_unit/controllers/api/passwords_controller_test.rb.tt
70
73
  - lib/generators/authentication/templates/test_unit/controllers/api/registrations_controller_test.rb.tt
71
74
  - lib/generators/authentication/templates/test_unit/controllers/api/sessions_controller_test.rb.tt
75
+ - lib/generators/authentication/templates/test_unit/controllers/api/sudos_controller_test.rb.tt
72
76
  - lib/generators/authentication/templates/test_unit/controllers/html/email_verifications_controller_test.rb.tt
73
77
  - lib/generators/authentication/templates/test_unit/controllers/html/emails_controller_test.rb.tt
74
78
  - lib/generators/authentication/templates/test_unit/controllers/html/password_resets_controller_test.rb.tt
75
79
  - lib/generators/authentication/templates/test_unit/controllers/html/passwords_controller_test.rb.tt
76
80
  - lib/generators/authentication/templates/test_unit/controllers/html/registrations_controller_test.rb.tt
77
81
  - lib/generators/authentication/templates/test_unit/controllers/html/sessions_controller_test.rb.tt
82
+ - lib/generators/authentication/templates/test_unit/controllers/html/sudos_controller_test.rb.tt
78
83
  - lib/generators/authentication/templates/test_unit/fixtures.yml.tt
79
84
  - lib/generators/authentication/templates/test_unit/system/emails_test.rb.tt
80
85
  - lib/generators/authentication/templates/test_unit/system/password_resets_test.rb.tt
81
86
  - lib/generators/authentication/templates/test_unit/system/passwords_test.rb.tt
82
87
  - lib/generators/authentication/templates/test_unit/system/registrations_test.rb.tt
83
88
  - lib/generators/authentication/templates/test_unit/system/sessions_test.rb.tt
89
+ - lib/generators/authentication/templates/test_unit/system/sudos_test.rb.tt
84
90
  homepage: https://github.com/lazaronixon/authentication-zero
85
91
  licenses:
86
92
  - MIT
@@ -88,7 +94,7 @@ metadata:
88
94
  homepage_uri: https://github.com/lazaronixon/authentication-zero
89
95
  source_code_uri: https://github.com/lazaronixon/authentication-zero
90
96
  changelog_uri: https://github.com/lazaronixon/authentication-zero/blob/main/CHANGELOG.md
91
- post_install_message:
97
+ post_install_message:
92
98
  rdoc_options: []
93
99
  require_paths:
94
100
  - lib
@@ -103,8 +109,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
109
  - !ruby/object:Gem::Version
104
110
  version: '0'
105
111
  requirements: []
106
- rubygems_version: 3.1.4
107
- signing_key:
112
+ rubygems_version: 3.3.7
113
+ signing_key:
108
114
  specification_version: 4
109
115
  summary: An authentication system generator for Rails applications
110
116
  test_files: []