rodauth-rails 0.17.0 → 1.0.0

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +80 -0
  3. data/README.md +224 -548
  4. data/lib/generators/rodauth/install_generator.rb +40 -35
  5. data/lib/generators/rodauth/migration/base.erb +8 -2
  6. data/lib/generators/rodauth/migration_generator.rb +9 -2
  7. data/lib/generators/rodauth/templates/INSTRUCTIONS +40 -0
  8. data/lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb +36 -19
  9. data/lib/generators/rodauth/templates/app/misc/rodauth_app.rb +38 -0
  10. data/lib/generators/rodauth/templates/app/{lib/rodauth_app.rb → misc/rodauth_main.rb} +10 -53
  11. data/lib/generators/rodauth/templates/app/views/rodauth/_email_auth_request_form.html.erb +7 -4
  12. data/lib/generators/rodauth/templates/app/views/rodauth/_login_form.html.erb +26 -9
  13. data/lib/generators/rodauth/templates/app/views/rodauth/_login_form_footer.html.erb +7 -6
  14. data/lib/generators/rodauth/templates/app/views/rodauth/_login_form_header.html.erb +3 -3
  15. data/lib/generators/rodauth/templates/app/views/rodauth/add_recovery_codes.html.erb +7 -5
  16. data/lib/generators/rodauth/templates/app/views/rodauth/change_login.html.erb +29 -6
  17. data/lib/generators/rodauth/templates/app/views/rodauth/change_password.html.erb +29 -6
  18. data/lib/generators/rodauth/templates/app/views/rodauth/close_account.html.erb +15 -4
  19. data/lib/generators/rodauth/templates/app/views/rodauth/confirm_password.html.erb +13 -4
  20. data/lib/generators/rodauth/templates/app/views/rodauth/create_account.html.erb +37 -7
  21. data/lib/generators/rodauth/templates/app/views/rodauth/email_auth.html.erb +7 -3
  22. data/lib/generators/rodauth/templates/app/views/rodauth/login.html.erb +5 -3
  23. data/lib/generators/rodauth/templates/app/views/rodauth/logout.html.erb +16 -4
  24. data/lib/generators/rodauth/templates/app/views/rodauth/multi_phase_login.html.erb +5 -3
  25. data/lib/generators/rodauth/templates/app/views/rodauth/otp_auth.html.erb +17 -4
  26. data/lib/generators/rodauth/templates/app/views/rodauth/otp_disable.html.erb +15 -4
  27. data/lib/generators/rodauth/templates/app/views/rodauth/otp_setup.html.erb +30 -10
  28. data/lib/generators/rodauth/templates/app/views/rodauth/recovery_auth.html.erb +13 -4
  29. data/lib/generators/rodauth/templates/app/views/rodauth/recovery_codes.html.erb +15 -1
  30. data/lib/generators/rodauth/templates/app/views/rodauth/remember.html.erb +14 -9
  31. data/lib/generators/rodauth/templates/app/views/rodauth/reset_password.html.erb +21 -5
  32. data/lib/generators/rodauth/templates/app/views/rodauth/reset_password_request.html.erb +19 -9
  33. data/lib/generators/rodauth/templates/app/views/rodauth/sms_auth.html.erb +17 -4
  34. data/lib/generators/rodauth/templates/app/views/rodauth/sms_confirm.html.erb +17 -4
  35. data/lib/generators/rodauth/templates/app/views/rodauth/sms_disable.html.erb +15 -4
  36. data/lib/generators/rodauth/templates/app/views/rodauth/sms_request.html.erb +7 -3
  37. data/lib/generators/rodauth/templates/app/views/rodauth/sms_setup.html.erb +25 -5
  38. data/lib/generators/rodauth/templates/app/views/rodauth/two_factor_auth.html.erb +5 -3
  39. data/lib/generators/rodauth/templates/app/views/rodauth/two_factor_disable.html.erb +15 -4
  40. data/lib/generators/rodauth/templates/app/views/rodauth/two_factor_manage.html.erb +17 -15
  41. data/lib/generators/rodauth/templates/app/views/rodauth/unlock_account.html.erb +17 -5
  42. data/lib/generators/rodauth/templates/app/views/rodauth/unlock_account_request.html.erb +11 -5
  43. data/lib/generators/rodauth/templates/app/views/rodauth/verify_account.html.erb +23 -5
  44. data/lib/generators/rodauth/templates/app/views/rodauth/verify_account_resend.html.erb +19 -9
  45. data/lib/generators/rodauth/templates/app/views/rodauth/verify_login_change.html.erb +7 -3
  46. data/lib/generators/rodauth/templates/app/views/rodauth/webauthn_auth.html.erb +13 -9
  47. data/lib/generators/rodauth/templates/app/views/rodauth/webauthn_remove.html.erb +21 -9
  48. data/lib/generators/rodauth/templates/app/views/rodauth/webauthn_setup.html.erb +21 -9
  49. data/lib/generators/rodauth/templates/app/views/rodauth_mailer/email_auth.text.erb +1 -1
  50. data/lib/generators/rodauth/templates/app/views/rodauth_mailer/reset_password.text.erb +1 -1
  51. data/lib/generators/rodauth/templates/app/views/rodauth_mailer/unlock_account.text.erb +1 -1
  52. data/lib/generators/rodauth/templates/app/views/rodauth_mailer/verify_account.text.erb +1 -1
  53. data/lib/generators/rodauth/templates/app/views/rodauth_mailer/verify_login_change.text.erb +3 -3
  54. data/lib/generators/rodauth/views_generator.rb +55 -93
  55. data/lib/rodauth/rails/app.rb +5 -4
  56. data/lib/rodauth/rails/auth.rb +1 -16
  57. data/lib/rodauth/rails/controller_methods.rb +1 -1
  58. data/lib/rodauth/rails/feature/csrf.rb +15 -4
  59. data/lib/rodauth/rails/feature/internal_request.rb +22 -20
  60. data/lib/rodauth/rails/feature/render.rb +9 -1
  61. data/lib/rodauth/rails/railtie.rb +4 -2
  62. data/lib/rodauth/rails/tasks.rake +2 -2
  63. data/lib/rodauth/rails/version.rb +1 -1
  64. data/lib/rodauth/rails.rb +16 -20
  65. data/rodauth-rails.gemspec +2 -2
  66. metadata +9 -23
  67. data/lib/generators/rodauth/templates/app/views/rodauth/_field.html.erb +0 -10
  68. data/lib/generators/rodauth/templates/app/views/rodauth/_field_error.html.erb +0 -3
  69. data/lib/generators/rodauth/templates/app/views/rodauth/_global_logout_field.html.erb +0 -6
  70. data/lib/generators/rodauth/templates/app/views/rodauth/_login_confirm_field.html.erb +0 -4
  71. data/lib/generators/rodauth/templates/app/views/rodauth/_login_display.html.erb +0 -4
  72. data/lib/generators/rodauth/templates/app/views/rodauth/_login_field.html.erb +0 -4
  73. data/lib/generators/rodauth/templates/app/views/rodauth/_login_hidden_field.html.erb +0 -1
  74. data/lib/generators/rodauth/templates/app/views/rodauth/_new_password_field.html.erb +0 -4
  75. data/lib/generators/rodauth/templates/app/views/rodauth/_otp_auth_code_field.html.erb +0 -8
  76. data/lib/generators/rodauth/templates/app/views/rodauth/_password_confirm_field.html.erb +0 -4
  77. data/lib/generators/rodauth/templates/app/views/rodauth/_password_field.html.erb +0 -4
  78. data/lib/generators/rodauth/templates/app/views/rodauth/_recovery_code_field.html.erb +0 -4
  79. data/lib/generators/rodauth/templates/app/views/rodauth/_recovery_codes_form.html.erb +0 -6
  80. data/lib/generators/rodauth/templates/app/views/rodauth/_sms_code_field.html.erb +0 -8
  81. data/lib/generators/rodauth/templates/app/views/rodauth/_sms_phone_field.html.erb +0 -8
  82. data/lib/generators/rodauth/templates/app/views/rodauth/_submit.html.erb +0 -3
@@ -10,6 +10,20 @@ module Rodauth
10
10
  include ::ActiveRecord::Generators::Migration
11
11
  include MigrationHelpers
12
12
 
13
+ if RUBY_ENGINE == "jruby"
14
+ SEQUEL_ADAPTERS = {
15
+ "sqlite3" => "sqlite",
16
+ "oracle_enhanced" => "oracle", # https://github.com/rsim/oracle-enhanced
17
+ "sqlserver" => "mssql",
18
+ }
19
+ else
20
+ SEQUEL_ADAPTERS = {
21
+ "sqlite3" => "sqlite",
22
+ "oracle_enhanced" => "oracle", # https://github.com/rsim/oracle-enhanced
23
+ "sqlserver" => "tinytds", # https://github.com/rails-sqlserver/activerecord-sqlserver-adapter
24
+ }
25
+ end
26
+
13
27
  MAILER_VIEWS = %w[
14
28
  email_auth
15
29
  password_changed
@@ -26,7 +40,7 @@ module Rodauth
26
40
  class_option :jwt, type: :boolean, desc: "Configure JWT support"
27
41
 
28
42
  def create_rodauth_migration
29
- return unless defined?(ActiveRecord::Base)
43
+ return unless defined?(ActiveRecord::Railtie)
30
44
 
31
45
  migration_template "db/migrate/create_rodauth.rb"
32
46
  end
@@ -36,14 +50,15 @@ module Rodauth
36
50
  end
37
51
 
38
52
  def create_sequel_initializer
39
- return unless defined?(ActiveRecord::Base)
53
+ return unless defined?(ActiveRecord::Railtie)
40
54
  return if defined?(Sequel) && !Sequel::DATABASES.empty?
41
55
 
42
56
  template "config/initializers/sequel.rb"
43
57
  end
44
58
 
45
59
  def create_rodauth_app
46
- template "app/lib/rodauth_app.rb"
60
+ template "app/misc/rodauth_app.rb"
61
+ template "app/misc/rodauth_main.rb"
47
62
  end
48
63
 
49
64
  def create_rodauth_controller
@@ -51,7 +66,7 @@ module Rodauth
51
66
  end
52
67
 
53
68
  def create_account_model
54
- return unless defined?(ActiveRecord::Base)
69
+ return unless defined?(ActiveRecord::Railtie)
55
70
 
56
71
  template "app/models/account.rb"
57
72
  end
@@ -60,52 +75,42 @@ module Rodauth
60
75
  template "app/mailers/rodauth_mailer.rb"
61
76
 
62
77
  MAILER_VIEWS.each do |view|
63
- template "app/views/rodauth_mailer/#{view}.text.erb"
78
+ copy_file "app/views/rodauth_mailer/#{view}.text.erb"
64
79
  end
65
80
  end
66
81
 
82
+ def show_instructions
83
+ readme "INSTRUCTIONS" if behavior == :invoke
84
+ end
85
+
67
86
  private
68
87
 
69
- def sequel_uri_scheme
70
- if RUBY_ENGINE == "jruby"
71
- "jdbc:#{sequel_jdbc_subadapter}"
72
- else
73
- sequel_adapter
74
- end
88
+ def migration_features
89
+ features = [:base, :reset_password, :verify_account, :verify_login_change]
90
+ features << :remember unless jwt?
91
+ features
75
92
  end
76
93
 
77
- def sequel_adapter
78
- case activerecord_adapter
79
- when "sqlite3" then "sqlite"
80
- when "oracle_enhanced" then "oracle" # https://github.com/rsim/oracle-enhanced
81
- when "sqlserver" then "tinytds" # https://github.com/rails-sqlserver/activerecord-sqlserver-adapter
82
- else
83
- activerecord_adapter
84
- end
94
+ def json?
95
+ options[:json] || api_only? && session_store? && !options[:jwt]
85
96
  end
86
97
 
87
- def sequel_jdbc_subadapter
88
- case activerecord_adapter
89
- when "sqlite3" then "sqlite"
90
- when "oracle_enhanced" then "oracle" # https://github.com/rsim/oracle-enhanced
91
- when "sqlserver" then "mssql"
92
- else
93
- activerecord_adapter
94
- end
98
+ def jwt?
99
+ options[:jwt] || api_only? && !session_store? && !options[:json]
95
100
  end
96
101
 
97
- def json?
98
- options[:json]
102
+ def session_store?
103
+ !!::Rails.application.config.session_store
99
104
  end
100
105
 
101
- def jwt?
102
- options[:jwt] || Rodauth::Rails.api_only?
106
+ def api_only?
107
+ Rodauth::Rails.api_only?
103
108
  end
104
109
 
105
- def migration_features
106
- features = [:base, :reset_password, :verify_account, :verify_login_change]
107
- features << :remember unless jwt?
108
- features
110
+ def sequel_uri_scheme
111
+ scheme = SEQUEL_ADAPTERS[activerecord_adapter] || activerecord_adapter
112
+ scheme = "jdbc:#{scheme}" if RUBY_ENGINE == "jruby"
113
+ scheme
109
114
  end
110
115
  end
111
116
  end
@@ -5,11 +5,17 @@ enable_extension "citext"
5
5
  create_table :accounts<%= primary_key_type %> do |t|
6
6
  <% case activerecord_adapter -%>
7
7
  <% when "postgresql" -%>
8
- t.citext :email, null: false, index: { unique: true, where: "status IN ('unverified', 'verified')" }
8
+ t.citext :email, null: false
9
9
  <% else -%>
10
- t.string :email, null: false, index: { unique: true }
10
+ t.string :email, null: false
11
11
  <% end -%>
12
12
  t.string :status, null: false, default: "unverified"
13
+ <% case activerecord_adapter -%>
14
+ <% when "postgresql", "sqlite3" -%>
15
+ t.index :email, unique: true, where: "status IN ('unverified', 'verified')"
16
+ <% else -%>
17
+ t.index :email, unique: true
18
+ <% end -%>
13
19
  end
14
20
 
15
21
  # Used if storing password hashes in a separate table (default)
@@ -16,16 +16,23 @@ module Rodauth
16
16
  desc: "Rodauth features to create tables for (otp, sms_codes, single_session, account_expiration etc.)",
17
17
  default: %w[]
18
18
 
19
+ class_option :name, optional: true, type: :string,
20
+ desc: "Name of the generated migration file"
21
+
19
22
  def create_rodauth_migration
20
- return unless defined?(ActiveRecord::Base)
23
+ return unless defined?(ActiveRecord::Railtie)
21
24
  return if features.empty?
22
25
 
23
- migration_template "db/migrate/create_rodauth.rb", "create_rodauth_#{features.join("_")}.rb"
26
+ migration_template "db/migrate/create_rodauth.rb", "#{migration_name}.rb"
24
27
  end
25
28
 
26
29
  def migration_features
27
30
  features
28
31
  end
32
+
33
+ def migration_name
34
+ options[:name] || "create_rodauth_#{features.join("_")}"
35
+ end
29
36
  end
30
37
  end
31
38
  end
@@ -0,0 +1,40 @@
1
+ ===============================================================================
2
+
3
+ Depending on your application's configuration some manual setup may be required:
4
+
5
+ 1. Ensure you have defined default url options in your environments files. Here
6
+ is an example of default_url_options appropriate for a development environment
7
+ in config/environments/development.rb:
8
+
9
+ config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
10
+
11
+ In production, :host should be set to the actual host of your application.
12
+
13
+ * Required for all applications. *
14
+
15
+ 2. Ensure you have defined root_url to *something* in your config/routes.rb.
16
+ For example:
17
+
18
+ root to: "home#index"
19
+
20
+ * Not required for API-only Applications *
21
+
22
+ 3. Ensure you have flash messages in app/views/layouts/application.html.erb.
23
+ For example:
24
+
25
+ <% if notice %>
26
+ <div class="alert alert-success"><%= notice %></div>
27
+ <% end %>
28
+ <% if alert %>
29
+ <div class="alert alert-danger"><%= alert %></div>
30
+ <% end %>
31
+
32
+ * Not required for API-only Applications *
33
+
34
+ 4. You can copy Rodauth views (for customization) to your app by running:
35
+
36
+ rails g rodauth:views
37
+
38
+ * Not required *
39
+
40
+ ===============================================================================
@@ -1,37 +1,54 @@
1
1
  class RodauthMailer < ApplicationMailer
2
- def verify_account(recipient, email_link)
3
- @email_link = email_link
2
+ def verify_account(account_id, key)
3
+ @email_link = rodauth.verify_account_url(key: email_token(account_id, key))
4
+ @account = Account.find(account_id)
4
5
 
5
- mail to: recipient
6
+ mail to: @account.email, subject: rodauth.verify_account_email_subject
6
7
  end
7
8
 
8
- def reset_password(recipient, email_link)
9
- @email_link = email_link
9
+ def reset_password(account_id, key)
10
+ @email_link = rodauth.reset_password_url(key: email_token(account_id, key))
11
+ @account = Account.find(account_id)
10
12
 
11
- mail to: recipient
13
+ mail to: @account.email, subject: rodauth.reset_password_email_subject
12
14
  end
13
15
 
14
- def verify_login_change(recipient, old_login, new_login, email_link)
16
+ def verify_login_change(account_id, old_login, new_login, key)
15
17
  @old_login = old_login
16
18
  @new_login = new_login
17
- @email_link = email_link
19
+ @email_link = rodauth.verify_login_change_url(key: email_token(account_id, key))
20
+ @account = Account.find(account_id)
18
21
 
19
- mail to: recipient
22
+ mail to: new_login, subject: rodauth.verify_login_change_email_subject
20
23
  end
21
24
 
22
- def password_changed(recipient)
23
- mail to: recipient
25
+ def password_changed(account_id)
26
+ @account = Account.find(account_id)
27
+
28
+ mail to: @account.email, subject: rodauth.password_changed_email_subject
24
29
  end
25
30
 
26
- # def email_auth(recipient, email_link)
27
- # @email_link = email_link
28
- #
29
- # mail to: recipient
31
+ # def email_auth(account_id, key)
32
+ # @email_link = rodauth.email_auth_url(key: email_token(account_id, key))
33
+ # @account = Account.find(account_id)
34
+
35
+ # mail to: @account.email, subject: rodauth.email_auth_email_subject
30
36
  # end
31
37
 
32
- # def unlock_account(recipient, email_link)
33
- # @email_link = email_link
34
- #
35
- # mail to: recipient
38
+ # def unlock_account(account_id, key)
39
+ # @email_link = rodauth.unlock_account_url(key: email_token(account_id, key))
40
+ # @account = Account.find(account_id)
41
+
42
+ # mail to: @account.email, subject: rodauth.unlock_account_email_subject
36
43
  # end
44
+
45
+ private
46
+
47
+ def email_token(account_id, key)
48
+ "#{account_id}_#{rodauth.compute_hmac(key)}"
49
+ end
50
+
51
+ def rodauth(name = nil)
52
+ RodauthApp.rodauth(name).allocate
53
+ end
37
54
  end
@@ -0,0 +1,38 @@
1
+ class RodauthApp < Rodauth::Rails::App
2
+ # primary configuration
3
+ configure RodauthMain
4
+
5
+ # secondary configuration
6
+ # configure RodauthAdmin, :admin
7
+
8
+ route do |r|
9
+ <% unless jwt? -%>
10
+ rodauth.load_memory # autologin remembered users
11
+
12
+ <% end -%>
13
+ r.rodauth # route rodauth requests
14
+
15
+ # ==> Authenticating Requests
16
+ # Call `rodauth.require_authentication` for requests that you want to
17
+ # require authentication for. Some examples:
18
+ #
19
+ # next if r.path.start_with?("/docs") # skip authentication for documentation pages
20
+ # next if session[:admin] # skip authentication for admins
21
+ #
22
+ # # authenticate /dashboard/* and /account/* requests
23
+ # if r.path.start_with?("/dashboard") || r.path.start_with?("/account")
24
+ # rodauth.require_authentication
25
+ # end
26
+
27
+ # ==> Secondary configurations
28
+ # r.on "admin" do
29
+ # r.rodauth(:admin)
30
+ #
31
+ # unless rodauth(:admin).logged_in?
32
+ # rodauth(:admin).require_http_basic_auth
33
+ # end
34
+ #
35
+ # break # allow the Rails app to handle other "/admin/*" requests
36
+ # end
37
+ end
38
+ end
@@ -1,11 +1,10 @@
1
- class RodauthApp < Rodauth::Rails::App
1
+ class RodauthMain < Rodauth::Rails::Auth
2
2
  configure do
3
3
  # List of authentication features that are loaded.
4
4
  enable :create_account, :verify_account, :verify_account_grace_period,
5
5
  :login, :logout<%= ", :remember" unless jwt? %><%= ", :json" if json? %><%= ", :jwt" if jwt? %>,
6
6
  :reset_password, :change_password, :change_password_notify,
7
- :change_login, :verify_login_change,
8
- :close_account
7
+ :change_login, :verify_login_change, :close_account
9
8
 
10
9
  # See the Rodauth documentation for the list of available config options:
11
10
  # http://rodauth.jeremyevans.net/documentation.html
@@ -52,7 +51,7 @@ class RodauthApp < Rodauth::Rails::App
52
51
  # reset_password_autologin? true
53
52
 
54
53
  # Delete the account record when the user has closed their account.
55
- delete_account_on_close? true
54
+ # delete_account_on_close? true
56
55
 
57
56
  # Redirect to the app from login and registration pages if already logged in.
58
57
  # already_logged_in { redirect login_redirect }
@@ -60,22 +59,22 @@ class RodauthApp < Rodauth::Rails::App
60
59
  # ==> Emails
61
60
  # Use a custom mailer for delivering authentication emails.
62
61
  create_reset_password_email do
63
- RodauthMailer.reset_password(email_to, reset_password_email_link)
62
+ RodauthMailer.reset_password(account_id, reset_password_key_value)
64
63
  end
65
64
  create_verify_account_email do
66
- RodauthMailer.verify_account(email_to, verify_account_email_link)
65
+ RodauthMailer.verify_account(account_id, verify_account_key_value)
67
66
  end
68
- create_verify_login_change_email do |login|
69
- RodauthMailer.verify_login_change(login, verify_login_change_old_login, verify_login_change_new_login, verify_login_change_email_link)
67
+ create_verify_login_change_email do |_login|
68
+ RodauthMailer.verify_login_change(account_id, verify_login_change_old_login, verify_login_change_new_login, verify_login_change_key_value)
70
69
  end
71
70
  create_password_changed_email do
72
- RodauthMailer.password_changed(email_to)
71
+ RodauthMailer.password_changed(account_id)
73
72
  end
74
73
  # create_email_auth_email do
75
- # RodauthMailer.email_auth(email_to, email_auth_email_link)
74
+ # RodauthMailer.email_auth(account_id, email_auth_key_value)
76
75
  # end
77
76
  # create_unlock_account_email do
78
- # RodauthMailer.unlock_account(email_to, unlock_account_email_link)
77
+ # RodauthMailer.unlock_account(account_id, unlock_account_key_value)
79
78
  # end
80
79
  send_email do |email|
81
80
  # queue email delivery on the mailer after the transaction commits
@@ -153,46 +152,4 @@ class RodauthApp < Rodauth::Rails::App
153
152
  # remember_deadline_interval Hash[days: 30]
154
153
  <% end -%>
155
154
  end
156
-
157
- # ==> Secondary configurations
158
- # configure(:admin) do
159
- # # ... enable features ...
160
- # prefix "/admin"
161
- # session_key_prefix "admin_"
162
- # # remember_cookie_key "_admin_remember" # if using remember feature
163
- #
164
- # # search views in `app/views/admin/rodauth` directory
165
- # rails_controller { Admin::RodauthController }
166
- # end
167
-
168
- route do |r|
169
- <% unless jwt? -%>
170
- rodauth.load_memory # autologin remembered users
171
-
172
- <% end -%>
173
- r.rodauth # route rodauth requests
174
-
175
- # ==> Authenticating Requests
176
- # Call `rodauth.require_authentication` for requests that you want to
177
- # require authentication for. Some examples:
178
- #
179
- # next if r.path.start_with?("/docs") # skip authentication for documentation pages
180
- # next if session[:admin] # skip authentication for admins
181
- #
182
- # # authenticate /dashboard/* and /account/* requests
183
- # if r.path.start_with?("/dashboard") || r.path.start_with?("/account")
184
- # rodauth.require_authentication
185
- # end
186
-
187
- # ==> Secondary configurations
188
- # r.on "admin" do
189
- # r.rodauth(:admin)
190
- #
191
- # unless rodauth(:admin).logged_in?
192
- # rodauth(:admin).require_http_basic_auth
193
- # end
194
- #
195
- # break # allow the Rails app to handle other "/admin/*" requests
196
- # end
197
- end
198
155
  end
@@ -1,4 +1,7 @@
1
- <%%= form_tag <%= rodauth %>.email_auth_request_path, method: :post do %>
2
- <%%= render "login_hidden_field" %>
3
- <%%= render "submit", value: "Send Login Link Via Email" %>
4
- <%% end %>
1
+ <%= form_with url: rodauth.email_auth_request_path, method: :post, data: { turbo: false } do |form| %>
2
+ <%= form.hidden_field rodauth.login_param, value: params[rodauth.login_param] %>
3
+
4
+ <div class="form-group mb-3">
5
+ <%= form.submit rodauth.email_auth_request_button, class: "btn btn-primary" %>
6
+ </div>
7
+ <% end %>
@@ -1,9 +1,26 @@
1
- <%%= form_tag <%= rodauth %>.login_path, method: :post do %>
2
- <%% if <%= rodauth %>.skip_login_field_on_login? %>
3
- <%%= render "login_display" %>
4
- <%% else %>
5
- <%%= render "login_field" %>
6
- <%% end %>
7
- <%%= render "password_field" unless <%= rodauth %>.skip_password_field_on_login? %>
8
- <%%= render "submit", value: "Login" %>
9
- <%% end %>
1
+ <%= form_with url: rodauth.login_path, method: :post, data: { turbo: false } do |form| %>
2
+ <% if rodauth.skip_login_field_on_login? %>
3
+ <div class="form-group mb-3">
4
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
5
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", readonly: true, class: "form-control-plaintext" %>
6
+ </div>
7
+ <% else %>
8
+ <div class="form-group mb-3">
9
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
10
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", autocomplete: "email", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_param)}", aria: ({ invalid: true, describedby: "login_error_message" } if rodauth.field_error(rodauth.login_param)) %>
11
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_param), class: "invalid-feedback", id: "login_error_message") if rodauth.field_error(rodauth.login_param) %>
12
+ </div>
13
+ <% end %>
14
+
15
+ <% unless rodauth.skip_password_field_on_login? %>
16
+ <div class="form-group mb-3">
17
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
18
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
19
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
20
+ </div>
21
+ <% end %>
22
+
23
+ <div class="form-group mb-3">
24
+ <%= form.submit rodauth.login_button, class: "btn btn-primary" %>
25
+ </div>
26
+ <% end %>
@@ -1,8 +1,9 @@
1
- <%% unless <%= rodauth %>.login_form_footer_links.empty? %>
2
- <h2>Other Options</h2>
1
+ <% unless rodauth.login_form_footer_links.empty? %>
2
+ <%== rodauth.login_form_footer_links_heading %>
3
+
3
4
  <ul>
4
- <%% <%= rodauth %>.login_form_footer_links.sort.each do |_, link, text| %>
5
- <li><%%= link_to text, link %></li>
6
- <%% end %>
5
+ <% rodauth.login_form_footer_links.sort.each do |_, link, text| %>
6
+ <li><%= link_to text, link %></li>
7
+ <% end %>
7
8
  </ul>
8
- <%% end %>
9
+ <% end %>
@@ -1,3 +1,3 @@
1
- <%% if <%= rodauth %>.field_error("password") && <%= rodauth %>.features.include?(:reset_password) %>
2
- <%%= render template: "<%= directory %>/reset_password_request", layout: false %>
3
- <%% end %>
1
+ <% if rodauth.field_error(rodauth.password_param) && rodauth.features.include?(:reset_password) %>
2
+ <%= render template: "rodauth/reset_password_request", layout: false %>
3
+ <% end %>
@@ -1,6 +1,8 @@
1
- <pre id="recovery-codes"><%%= <%= rodauth %>.recovery_codes.map { |s| h(s) }.join("\n\n") %></pre>
1
+ <% content_for :title, rodauth.add_recovery_codes_page_title %>
2
2
 
3
- <%% if <%= rodauth %>.can_add_recovery_codes? %>
4
- <h2>Add Additional Recovery Codes</h2>
5
- <%%= render "recovery_codes_form" %>
6
- <%% end %>
3
+ <pre id="recovery-codes"><%= rodauth.recovery_codes.map { |s| h(s) }.join("\n\n") %></pre>
4
+
5
+ <% if rodauth.can_add_recovery_codes? %>
6
+ <%== rodauth.add_recovery_codes_heading %>
7
+ <%= render template: "rodauth/recovery_codes", layout: false %>
8
+ <% end %>
@@ -1,6 +1,29 @@
1
- <%%= form_tag <%= rodauth %>.change_login_path, method: :post do %>
2
- <%%= render "login_field" %>
3
- <%%= render "login_confirm_field" if <%= rodauth %>.require_login_confirmation? %>
4
- <%%= render "password_field" if <%= rodauth %>.change_login_requires_password? %>
5
- <%%= render "submit", value: "Change Login" %>
6
- <%% end %>
1
+ <% content_for :title, rodauth.change_login_page_title %>
2
+
3
+ <%= form_with url: rodauth.change_login_path, method: :post, data: { turbo: false } do |form| %>
4
+ <div class="form-group mb-3">
5
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
6
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", autocomplete: "email", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_param)}", aria: ({ invalid: true, describedby: "login_error_message" } if rodauth.field_error(rodauth.login_param)) %>
7
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_param), class: "invalid-feedback", id: "login_error_message") if rodauth.field_error(rodauth.login_param) %>
8
+ </div>
9
+
10
+ <% if rodauth.require_login_confirmation? %>
11
+ <div class="form-group mb-3">
12
+ <%= form.label "login-confirm", rodauth.login_confirm_label, class: "form-label" %>
13
+ <%= form.email_field rodauth.login_confirm_param, value: params[rodauth.login_confirm_param], id: "login-confirm", autocomplete: "email", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_confirm_param)}", aria: ({ invalid: true, describedby: "login-confirm_error_message" } if rodauth.field_error(rodauth.login_confirm_param)) %>
14
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_confirm_param), class: "invalid-feedback", id: "login-confirm_error_message") if rodauth.field_error(rodauth.login_confirm_param) %>
15
+ </div>
16
+ <% end %>
17
+
18
+ <% if rodauth.change_login_requires_password? %>
19
+ <div class="form-group mb-3">
20
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
21
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
22
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
23
+ </div>
24
+ <% end %>
25
+
26
+ <div class="form-group mb-3">
27
+ <%= form.submit rodauth.change_login_button, class: "btn btn-primary" %>
28
+ </div>
29
+ <% end %>
@@ -1,6 +1,29 @@
1
- <%%= form_tag <%= rodauth %>.change_password_path, method: :post do %>
2
- <%%= render "password_field" if <%= rodauth %>.change_password_requires_password? %>
3
- <%%= render "new_password_field" %>
4
- <%%= render "password_confirm_field" if <%= rodauth %>.require_password_confirmation? %>
5
- <%%= render "submit", value: "Change Password" %>
6
- <%% end %>
1
+ <% content_for :title, rodauth.change_password_page_title %>
2
+
3
+ <%= form_with url: rodauth.change_password_path, method: :post, data: { turbo: false } do |form| %>
4
+ <% if rodauth.change_password_requires_password? %>
5
+ <div class="form-group mb-3">
6
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
7
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
8
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
9
+ </div>
10
+ <% end %>
11
+
12
+ <div class="form-group mb-3">
13
+ <%= form.label "new-password", rodauth.new_password_label, class: "form-label" %>
14
+ <%= form.password_field rodauth.new_password_param, value: "", id: "new-password", autocomplete: "new-password", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.new_password_param)}", aria: ({ invalid: true, describedby: "new-password_error_message" } if rodauth.field_error(rodauth.new_password_param)) %>
15
+ <%= content_tag(:span, rodauth.field_error(rodauth.new_password_param), class: "invalid-feedback", id: "new-password_error_message") if rodauth.field_error(rodauth.new_password_param) %>
16
+ </div>
17
+
18
+ <% if rodauth.require_password_confirmation? %>
19
+ <div class="form-group mb-3">
20
+ <%= form.label "password-confirm", rodauth.password_confirm_label, class: "form-label" %>
21
+ <%= form.password_field rodauth.password_confirm_param, value: "", id: "password-confirm", autocomplete: "new-password", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_confirm_param)}", aria: ({ invalid: true, describedby: "password-confirm_error_message" } if rodauth.field_error(rodauth.password_confirm_param)) %>
22
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_confirm_param), class: "invalid-feedback", id: "password-confirm_error_message") if rodauth.field_error(rodauth.password_confirm_param) %>
23
+ </div>
24
+ <% end %>
25
+
26
+ <div class="form-group mb-3">
27
+ <%= form.submit rodauth.change_password_button, class: "btn btn-primary" %>
28
+ </div>
29
+ <% end %>
@@ -1,4 +1,15 @@
1
- <%%= form_tag <%= rodauth %>.close_account_path, method: :post do %>
2
- <%%= render "password_field" if <%= rodauth %>.close_account_requires_password? %>
3
- <%%= render "submit", value: "Close Account", class: "btn btn-danger" %>
4
- <%% end %>
1
+ <% content_for :title, rodauth.close_account_page_title %>
2
+
3
+ <%= form_with url: rodauth.close_account_path, method: :post, data: { turbo: false } do |form| %>
4
+ <% if rodauth.close_account_requires_password? %>
5
+ <div class="form-group mb-3">
6
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
7
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
8
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
9
+ </div>
10
+ <% end %>
11
+
12
+ <div class="form-group mb-3">
13
+ <%= form.submit rodauth.close_account_button, class: "btn btn-danger" %>
14
+ </div>
15
+ <% end %>
@@ -1,4 +1,13 @@
1
- <%%= form_tag <%= rodauth %>.confirm_password_path, method: :post do %>
2
- <%%= render "password_field" %>
3
- <%%= render "submit", value: "Confirm Password" %>
4
- <%% end %>
1
+ <% content_for :title, rodauth.confirm_password_page_title %>
2
+
3
+ <%= form_with url: rodauth.confirm_password_path, method: :post, data: { turbo: false } do |form| %>
4
+ <div class="form-group mb-3">
5
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
6
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
7
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
8
+ </div>
9
+
10
+ <div class="form-group mb-3">
11
+ <%= form.submit rodauth.confirm_password_button, class: "btn btn-primary" %>
12
+ </div>
13
+ <% end %>