rodauth 1.23.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +132 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +207 -79
  5. data/doc/account_expiration.rdoc +12 -26
  6. data/doc/active_sessions.rdoc +49 -0
  7. data/doc/audit_logging.rdoc +44 -0
  8. data/doc/base.rdoc +74 -128
  9. data/doc/change_login.rdoc +7 -14
  10. data/doc/change_password.rdoc +9 -13
  11. data/doc/change_password_notify.rdoc +2 -2
  12. data/doc/close_account.rdoc +9 -16
  13. data/doc/confirm_password.rdoc +12 -5
  14. data/doc/create_account.rdoc +11 -22
  15. data/doc/disallow_password_reuse.rdoc +6 -13
  16. data/doc/email_auth.rdoc +15 -14
  17. data/doc/email_base.rdoc +5 -15
  18. data/doc/http_basic_auth.rdoc +10 -1
  19. data/doc/jwt.rdoc +22 -22
  20. data/doc/jwt_cors.rdoc +2 -3
  21. data/doc/jwt_refresh.rdoc +12 -8
  22. data/doc/lockout.rdoc +17 -15
  23. data/doc/login.rdoc +10 -2
  24. data/doc/login_password_requirements_base.rdoc +15 -37
  25. data/doc/logout.rdoc +2 -2
  26. data/doc/otp.rdoc +24 -19
  27. data/doc/password_complexity.rdoc +10 -26
  28. data/doc/password_expiration.rdoc +11 -25
  29. data/doc/password_grace_period.rdoc +16 -2
  30. data/doc/recovery_codes.rdoc +18 -12
  31. data/doc/release_notes/2.0.0.txt +361 -0
  32. data/doc/remember.rdoc +40 -64
  33. data/doc/reset_password.rdoc +12 -9
  34. data/doc/session_expiration.rdoc +1 -0
  35. data/doc/single_session.rdoc +16 -25
  36. data/doc/sms_codes.rdoc +24 -14
  37. data/doc/two_factor_base.rdoc +60 -22
  38. data/doc/verify_account.rdoc +14 -12
  39. data/doc/verify_account_grace_period.rdoc +6 -2
  40. data/doc/verify_login_change.rdoc +9 -8
  41. data/doc/webauthn.rdoc +115 -0
  42. data/doc/webauthn_login.rdoc +15 -0
  43. data/doc/webauthn_verify_account.rdoc +9 -0
  44. data/javascript/webauthn_auth.js +45 -0
  45. data/javascript/webauthn_setup.js +35 -0
  46. data/lib/roda/plugins/rodauth.rb +1 -1
  47. data/lib/rodauth.rb +29 -24
  48. data/lib/rodauth/features/account_expiration.rb +5 -5
  49. data/lib/rodauth/features/active_sessions.rb +160 -0
  50. data/lib/rodauth/features/audit_logging.rb +96 -0
  51. data/lib/rodauth/features/base.rb +131 -47
  52. data/lib/rodauth/features/change_password_notify.rb +1 -1
  53. data/lib/rodauth/features/confirm_password.rb +40 -2
  54. data/lib/rodauth/features/create_account.rb +7 -13
  55. data/lib/rodauth/features/disallow_common_passwords.rb +1 -1
  56. data/lib/rodauth/features/disallow_password_reuse.rb +1 -1
  57. data/lib/rodauth/features/email_auth.rb +29 -27
  58. data/lib/rodauth/features/email_base.rb +3 -3
  59. data/lib/rodauth/features/http_basic_auth.rb +44 -37
  60. data/lib/rodauth/features/jwt.rb +51 -8
  61. data/lib/rodauth/features/jwt_refresh.rb +3 -3
  62. data/lib/rodauth/features/lockout.rb +11 -13
  63. data/lib/rodauth/features/login.rb +48 -8
  64. data/lib/rodauth/features/login_password_requirements_base.rb +4 -4
  65. data/lib/rodauth/features/otp.rb +71 -81
  66. data/lib/rodauth/features/password_complexity.rb +4 -11
  67. data/lib/rodauth/features/password_expiration.rb +1 -1
  68. data/lib/rodauth/features/password_grace_period.rb +17 -10
  69. data/lib/rodauth/features/recovery_codes.rb +47 -51
  70. data/lib/rodauth/features/remember.rb +11 -27
  71. data/lib/rodauth/features/reset_password.rb +25 -25
  72. data/lib/rodauth/features/session_expiration.rb +6 -4
  73. data/lib/rodauth/features/single_session.rb +7 -5
  74. data/lib/rodauth/features/sms_codes.rb +58 -67
  75. data/lib/rodauth/features/two_factor_base.rb +132 -28
  76. data/lib/rodauth/features/verify_account.rb +23 -20
  77. data/lib/rodauth/features/verify_account_grace_period.rb +19 -8
  78. data/lib/rodauth/features/verify_login_change.rb +11 -10
  79. data/lib/rodauth/features/webauthn.rb +507 -0
  80. data/lib/rodauth/features/webauthn_login.rb +70 -0
  81. data/lib/rodauth/features/webauthn_verify_account.rb +46 -0
  82. data/lib/rodauth/version.rb +2 -2
  83. data/templates/button.str +1 -3
  84. data/templates/change-login.str +1 -2
  85. data/templates/change-password.str +3 -5
  86. data/templates/close-account.str +2 -2
  87. data/templates/confirm-password.str +1 -1
  88. data/templates/create-account.str +1 -1
  89. data/templates/email-auth-request-form.str +1 -2
  90. data/templates/email-auth.str +1 -1
  91. data/templates/global-logout-field.str +6 -0
  92. data/templates/login-confirm-field.str +2 -4
  93. data/templates/login-display.str +3 -2
  94. data/templates/login-field.str +2 -4
  95. data/templates/login-form-footer.str +6 -0
  96. data/templates/login-form.str +7 -0
  97. data/templates/login.str +1 -9
  98. data/templates/logout.str +1 -1
  99. data/templates/multi-phase-login.str +3 -0
  100. data/templates/otp-auth-code-field.str +5 -3
  101. data/templates/otp-auth.str +1 -1
  102. data/templates/otp-disable.str +1 -1
  103. data/templates/otp-setup.str +3 -3
  104. data/templates/password-confirm-field.str +2 -4
  105. data/templates/password-field.str +2 -4
  106. data/templates/recovery-auth.str +3 -6
  107. data/templates/recovery-codes.str +1 -1
  108. data/templates/remember.str +15 -20
  109. data/templates/reset-password-request.str +2 -2
  110. data/templates/reset-password.str +1 -2
  111. data/templates/sms-auth.str +1 -1
  112. data/templates/sms-code-field.str +5 -3
  113. data/templates/sms-confirm.str +1 -2
  114. data/templates/sms-disable.str +1 -2
  115. data/templates/sms-request.str +1 -1
  116. data/templates/sms-setup.str +6 -4
  117. data/templates/two-factor-auth.str +5 -0
  118. data/templates/two-factor-disable.str +6 -0
  119. data/templates/two-factor-manage.str +16 -0
  120. data/templates/unlock-account-request.str +2 -2
  121. data/templates/unlock-account.str +1 -1
  122. data/templates/verify-account-resend.str +1 -1
  123. data/templates/verify-account.str +1 -2
  124. data/templates/verify-login-change.str +1 -1
  125. data/templates/webauthn-auth.str +11 -0
  126. data/templates/webauthn-remove.str +14 -0
  127. data/templates/webauthn-setup.str +12 -0
  128. metadata +64 -11
  129. data/doc/verify_change_login.rdoc +0 -11
  130. data/lib/rodauth/features/verify_change_login.rb +0 -20
@@ -1,6 +1,8 @@
1
1
  <div class="form-group">
2
- <label class="col-sm-3 control-label" for="sms-code">#{rodauth.sms_code_label}#{rodauth.input_field_label_suffix}</label>
3
- <div class="col-sm-3">
4
- #{rodauth.input_field_string(rodauth.sms_code_param, 'sms-code', :value => '')}
2
+ <label for="sms-code">#{rodauth.sms_code_label}#{rodauth.input_field_label_suffix}</label>
3
+ <div class="row">
4
+ <div class="col-sm-3">
5
+ #{rodauth.input_field_string(rodauth.sms_code_param, 'sms-code', :value => '', :autocomplete=>'one-time-code', :inputmode=>'numeric')}
6
+ </div>
5
7
  </div>
6
8
  </div>
@@ -1,7 +1,6 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-confirm-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-confirm-form">
2
2
  #{rodauth.sms_confirm_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('sms-code-field')}
5
5
  #{rodauth.button(rodauth.sms_confirm_button)}
6
6
  </form>
7
-
@@ -1,7 +1,6 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-disable-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-disable-form">
2
2
  #{rodauth.sms_disable_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
5
  #{rodauth.button(rodauth.sms_disable_button)}
6
6
  </form>
7
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-request-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-request-form">
2
2
  #{rodauth.sms_request_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.button(rodauth.sms_request_button)}
@@ -1,11 +1,13 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-setup-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-setup-form">
2
2
  #{rodauth.sms_setup_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
5
  <div class="form-group">
6
- <label class="col-sm-2 control-label" for="sms-phone">#{rodauth.sms_phone_label}#{rodauth.input_field_label_suffix}</label>
7
- <div class="col-sm-3">
8
- #{rodauth.input_field_string(rodauth.sms_phone_param, 'sms-phone')}
6
+ <label for="sms-phone">#{rodauth.sms_phone_label}#{rodauth.input_field_label_suffix}</label>
7
+ <div class="row">
8
+ <div class="col-sm-3">
9
+ #{rodauth.input_field_string(rodauth.sms_phone_param, 'sms-phone', :type=>rodauth.sms_phone_input_type, :autocomplete=>'tel')}
10
+ </div>
9
11
  </div>
10
12
  </div>
11
13
  #{rodauth.button(rodauth.sms_setup_button)}
@@ -0,0 +1,5 @@
1
+ <ul class="rodauth-links rodauth-two-factor-auth-links">
2
+ #{rodauth.two_factor_auth_links.sort.map do |_, link, text|
3
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
4
+ end.join}
5
+ </ul>
@@ -0,0 +1,6 @@
1
+ <form method="post" class="rodauth" role="form" id="multifactor-disable-form">
2
+ #{rodauth.two_factor_disable_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
+ #{rodauth.button(rodauth.two_factor_disable_button)}
6
+ </form>
@@ -0,0 +1,16 @@
1
+ #{rodauth.two_factor_setup_heading unless rodauth.two_factor_setup_links.empty?}
2
+
3
+ <ul class="rodauth-links rodauth-multifactor-setup-links">
4
+ #{rodauth.two_factor_setup_links.sort.map do |_, link, text|
5
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
6
+ end.join("\n")}
7
+ </ul>
8
+
9
+ #{rodauth.two_factor_remove_heading unless rodauth.two_factor_remove_links.empty?}
10
+
11
+ <ul class="rodauth-links rodauth-multifactor-remove-links">
12
+ #{rodauth.two_factor_remove_links.sort.map do |_, link, text|
13
+ "<li><a href=\"#{h link}\">#{h text}</a></li>"
14
+ end.join("\n")}
15
+ #{"<li><a href=\"#{h rodauth.two_factor_disable_path}\">#{rodauth.two_factor_disable_link_text}</a></li>" if rodauth.two_factor_remove_links.length > 1}
16
+ </ul>
@@ -1,7 +1,7 @@
1
- <form action="#{rodauth.unlock_account_request_path}" method="post" class="rodauth form-horizontal" role="form" id="unlock-account-request-form">
1
+ <form action="#{rodauth.unlock_account_request_path}" method="post" class="rodauth" role="form" id="unlock-account-request-form">
2
2
  #{rodauth.unlock_account_request_additional_form_tags}
3
3
  #{rodauth.csrf_tag(rodauth.unlock_account_request_path)}
4
4
  #{rodauth.login_hidden_field}
5
5
  #{rodauth.unlock_account_request_explanatory_text}
6
- <input type="submit" class="btn btn-primary inline" value="#{rodauth.unlock_account_request_button}"/>
6
+ #{rodauth.button(rodauth.unlock_account_request_button)}
7
7
  </form>
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="unlock-account-form">
1
+ <form method="post" class="rodauth" role="form" id="unlock-account-form">
2
2
  #{rodauth.unlock_account_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.unlock_account_explanatory_text}
@@ -1,4 +1,4 @@
1
- <form action="#{rodauth.verify_account_resend_path}" method="post" class="rodauth form-horizontal" role="form" id="verify-account-resend-form">
1
+ <form action="#{rodauth.verify_account_resend_path}" method="post" class="rodauth" role="form" id="verify-account-resend-form">
2
2
  #{rodauth.verify_account_resend_additional_form_tags}
3
3
  #{rodauth.csrf_tag(rodauth.verify_account_resend_path)}
4
4
  #{rodauth.verify_account_resend_explanatory_text}
@@ -1,8 +1,7 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="verify-account-form">
1
+ <form method="post" class="rodauth" role="form" id="verify-account-form">
2
2
  #{rodauth.verify_account_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field') if rodauth.verify_account_set_password?}
5
5
  #{rodauth.render('password-confirm-field') if rodauth.verify_account_set_password? && rodauth.require_password_confirmation?}
6
6
  #{rodauth.button(rodauth.verify_account_button)}
7
7
  </form>
8
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="verify-login-change-form">
1
+ <form method="post" class="rodauth" role="form" id="verify-login-change-form">
2
2
  #{rodauth.verify_login_change_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.button(rodauth.verify_login_change_button)}
@@ -0,0 +1,11 @@
1
+ <form method="post" action="#{rodauth.webauthn_auth_form_path}" class="rodauth" role="form" id="webauthn-auth-form" data-credential-options="#{h((cred = rodauth.webauth_credential_options_for_get).as_json.to_json)}">
2
+ #{rodauth.webauthn_auth_additional_form_tags}
3
+ #{rodauth.csrf_tag(rodauth.webauthn_auth_form_path)}
4
+ <input type="hidden" name="#{rodauth.webauthn_auth_challenge_param}" value="#{cred.challenge}" />
5
+ <input type="hidden" name="#{rodauth.webauthn_auth_challenge_hmac_param}" value="#{rodauth.compute_hmac(cred.challenge)}" />
6
+ <input class="rodauth_hidden" aria-hidden="true" type="text" name="#{rodauth.webauthn_auth_param}" id="webauthn-auth" value="" />
7
+ <div id="webauthn-auth-button">
8
+ #{rodauth.button(rodauth.webauthn_auth_button)}
9
+ </div>
10
+ </form>
11
+ <script src="#{rodauth.webauthn_js_host}#{rodauth.webauthn_auth_js_path}"></script>
@@ -0,0 +1,14 @@
1
+ <form method="post" class="rodauth" role="form" id="webauthn-remove-form">
2
+ #{rodauth.webauthn_remove_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
5
+ <fieldset class="form-group">
6
+ #{(usage = rodauth.account_webauthn_usage; last_id = usage.keys.last; usage;).map do |id, last_use|
7
+ input = rodauth.input_field_string(rodauth.webauthn_remove_param, "webauthn-remove-#{h id}", :type=>'radio', :class=>"form-check-input", :skip_error_message=>true, :value=>id, :required=>false)
8
+ label = "<label class=\"rodauth-webauthn-id form-check-label\" for=\"webauthn-remove-#{h id}\">Last Use: #{last_use}</label>"
9
+ error = rodauth.formatted_field_error(rodauth.webauthn_remove_param) if id == last_id
10
+ "<div class=\"form-check radio\">#{input}#{label}#{error}</div>"
11
+ end.join("\n")}
12
+ </fieldset>
13
+ #{rodauth.button(rodauth.webauthn_remove_button)}
14
+ </form>
@@ -0,0 +1,12 @@
1
+ <form method="post" class="rodauth" role="form" id="webauthn-setup-form" data-credential-options="#{h((cred = rodauth.new_webauthn_credential).as_json.to_json)}">
2
+ #{rodauth.webauthn_setup_additional_form_tags}
3
+ #{rodauth.csrf_tag}
4
+ <input type="hidden" name="#{rodauth.webauthn_setup_challenge_param}" value="#{cred.challenge}" />
5
+ <input type="hidden" name="#{rodauth.webauthn_setup_challenge_hmac_param}" value="#{rodauth.compute_hmac(cred.challenge)}" />
6
+ <input class="rodauth_hidden" aria-hidden="true" type="text" name="#{rodauth.webauthn_setup_param}" id="webauthn-setup" value="" />
7
+ #{rodauth.render('password-field') if rodauth.two_factor_modifications_require_password?}
8
+ <div id="webauthn-setup-button">
9
+ #{rodauth.button(rodauth.webauthn_setup_button)}
10
+ </div>
11
+ </form>
12
+ <script src="#{rodauth.webauthn_js_host}#{rodauth.webauthn_setup_js_path}"></script>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.23.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-06 00:00:00.000000000 Z
11
+ date: 2020-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webauthn
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">"
144
+ - !ruby/object:Gem::Version
145
+ version: '2'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">"
151
+ - !ruby/object:Gem::Version
152
+ version: '2'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: minitest
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -193,9 +207,9 @@ dependencies:
193
207
  - !ruby/object:Gem::Version
194
208
  version: 2.1.0
195
209
  description: |
196
- Rodauth is an authentication and account management framework for
197
- rack applications. It's built using Roda and Sequel, but it can
198
- be used as middleware in front of web applications that use
210
+ Rodauth is Ruby's most advanced authentication framework, designed
211
+ to work in all rack applications. It's built using Roda and Sequel,
212
+ but it can be used as middleware in front of web applications that use
199
213
  other web frameworks and database libraries.
200
214
 
201
215
  Rodauth aims to provide strong security for password storage by
@@ -203,6 +217,19 @@ description: |
203
217
  MySQL, and Microsoft SQL Server. Configuration is done via
204
218
  a DSL that makes it easy to override any part of the authentication
205
219
  process.
220
+
221
+ Rodauth supports typical authentication features: such as login and
222
+ logout, changing logins and passwords, and creating, verifying,
223
+ unlocking, and resetting passwords for accounts. Rodauth also
224
+ supports many advanced authentication features:
225
+
226
+ * Secure password storage using security definer database functions
227
+ * Multiple primary multifactor authentication methods (WebAuthn and
228
+ TOTP), as well as backup multifactor authentication methods (SMS
229
+ and recovery codes).
230
+ * Passwordless authentication using email links and WebAuthn
231
+ authenticators.
232
+ * Both standard HTML form and JSON API support for all features.
206
233
  email: code@jeremyevans.net
207
234
  executables: []
208
235
  extensions: []
@@ -230,7 +257,7 @@ extra_rdoc_files:
230
257
  - doc/logout.rdoc
231
258
  - doc/otp.rdoc
232
259
  - doc/login_password_requirements_base.rdoc
233
- - doc/verify_change_login.rdoc
260
+ - doc/jwt_cors.rdoc
234
261
  - doc/password_expiration.rdoc
235
262
  - doc/password_grace_period.rdoc
236
263
  - doc/recovery_codes.rdoc
@@ -246,7 +273,11 @@ extra_rdoc_files:
246
273
  - doc/jwt_refresh.rdoc
247
274
  - doc/verify_account_grace_period.rdoc
248
275
  - doc/verify_login_change.rdoc
249
- - doc/jwt_cors.rdoc
276
+ - doc/webauthn.rdoc
277
+ - doc/webauthn_login.rdoc
278
+ - doc/webauthn_verify_account.rdoc
279
+ - doc/active_sessions.rdoc
280
+ - doc/audit_logging.rdoc
250
281
  - doc/release_notes/1.17.0.txt
251
282
  - doc/release_notes/1.0.0.txt
252
283
  - doc/release_notes/1.1.0.txt
@@ -271,12 +302,15 @@ extra_rdoc_files:
271
302
  - doc/release_notes/1.21.0.txt
272
303
  - doc/release_notes/1.22.0.txt
273
304
  - doc/release_notes/1.23.0.txt
305
+ - doc/release_notes/2.0.0.txt
274
306
  files:
275
307
  - CHANGELOG
276
308
  - MIT-LICENSE
277
309
  - README.rdoc
278
310
  - dict/top-10_000-passwords.txt
279
311
  - doc/account_expiration.rdoc
312
+ - doc/active_sessions.rdoc
313
+ - doc/audit_logging.rdoc
280
314
  - doc/base.rdoc
281
315
  - doc/change_login.rdoc
282
316
  - doc/change_password.rdoc
@@ -326,6 +360,7 @@ files:
326
360
  - doc/release_notes/1.7.0.txt
327
361
  - doc/release_notes/1.8.0.txt
328
362
  - doc/release_notes/1.9.0.txt
363
+ - doc/release_notes/2.0.0.txt
329
364
  - doc/remember.rdoc
330
365
  - doc/reset_password.rdoc
331
366
  - doc/session_expiration.rdoc
@@ -335,11 +370,17 @@ files:
335
370
  - doc/update_password_hash.rdoc
336
371
  - doc/verify_account.rdoc
337
372
  - doc/verify_account_grace_period.rdoc
338
- - doc/verify_change_login.rdoc
339
373
  - doc/verify_login_change.rdoc
374
+ - doc/webauthn.rdoc
375
+ - doc/webauthn_login.rdoc
376
+ - doc/webauthn_verify_account.rdoc
377
+ - javascript/webauthn_auth.js
378
+ - javascript/webauthn_setup.js
340
379
  - lib/roda/plugins/rodauth.rb
341
380
  - lib/rodauth.rb
342
381
  - lib/rodauth/features/account_expiration.rb
382
+ - lib/rodauth/features/active_sessions.rb
383
+ - lib/rodauth/features/audit_logging.rb
343
384
  - lib/rodauth/features/base.rb
344
385
  - lib/rodauth/features/change_login.rb
345
386
  - lib/rodauth/features/change_password.rb
@@ -373,8 +414,10 @@ files:
373
414
  - lib/rodauth/features/update_password_hash.rb
374
415
  - lib/rodauth/features/verify_account.rb
375
416
  - lib/rodauth/features/verify_account_grace_period.rb
376
- - lib/rodauth/features/verify_change_login.rb
377
417
  - lib/rodauth/features/verify_login_change.rb
418
+ - lib/rodauth/features/webauthn.rb
419
+ - lib/rodauth/features/webauthn_login.rb
420
+ - lib/rodauth/features/webauthn_verify_account.rb
378
421
  - lib/rodauth/migrations.rb
379
422
  - lib/rodauth/version.rb
380
423
  - templates/add-recovery-codes.str
@@ -387,11 +430,15 @@ files:
387
430
  - templates/email-auth-email.str
388
431
  - templates/email-auth-request-form.str
389
432
  - templates/email-auth.str
433
+ - templates/global-logout-field.str
390
434
  - templates/login-confirm-field.str
391
435
  - templates/login-display.str
392
436
  - templates/login-field.str
437
+ - templates/login-form-footer.str
438
+ - templates/login-form.str
393
439
  - templates/login.str
394
440
  - templates/logout.str
441
+ - templates/multi-phase-login.str
395
442
  - templates/otp-auth-code-field.str
396
443
  - templates/otp-auth.str
397
444
  - templates/otp-disable.str
@@ -411,6 +458,9 @@ files:
411
458
  - templates/sms-disable.str
412
459
  - templates/sms-request.str
413
460
  - templates/sms-setup.str
461
+ - templates/two-factor-auth.str
462
+ - templates/two-factor-disable.str
463
+ - templates/two-factor-manage.str
414
464
  - templates/unlock-account-email.str
415
465
  - templates/unlock-account-request.str
416
466
  - templates/unlock-account.str
@@ -419,6 +469,9 @@ files:
419
469
  - templates/verify-account.str
420
470
  - templates/verify-login-change-email.str
421
471
  - templates/verify-login-change.str
472
+ - templates/webauthn-auth.str
473
+ - templates/webauthn-remove.str
474
+ - templates/webauthn-setup.str
422
475
  homepage: https://github.com/jeremyevans/rodauth
423
476
  licenses:
424
477
  - MIT
@@ -434,7 +487,7 @@ rdoc_options:
434
487
  - "--line-numbers"
435
488
  - "--inline-source"
436
489
  - "--title"
437
- - 'Rodauth: Authentication and Account Management Framework for Rack Applications'
490
+ - 'Rodauth: Ruby''s Most Advanced Authentication Framework'
438
491
  - "--main"
439
492
  - README.rdoc
440
493
  require_paths:
@@ -443,7 +496,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
443
496
  requirements:
444
497
  - - ">="
445
498
  - !ruby/object:Gem::Version
446
- version: 1.8.7
499
+ version: 1.9.2
447
500
  required_rubygems_version: !ruby/object:Gem::Requirement
448
501
  requirements:
449
502
  - - ">="
@@ -1,11 +0,0 @@
1
- = Documentation for Verify Change Login Feature
2
-
3
- This feature is deprecated, because it is possible for a user to get
4
- locked out of their account if they use the wrong address on the
5
- change login page. It is recommended that users switch to using the
6
- verify login change feature, which doesn't change the login until
7
- after it has been verified.
8
-
9
- The verify change login feature implements account reverification after
10
- change login. Depends on the change login and verify account grace
11
- period features.
@@ -1,20 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Rodauth
4
- Feature.define(:verify_change_login, :VerifyChangeLogin) do
5
- depends :change_login, :verify_account_grace_period
6
-
7
- def change_login_notice_flash
8
- "#{super}. #{verify_account_email_sent_notice_flash}"
9
- end
10
-
11
- private
12
-
13
- def after_change_login
14
- super
15
- update_account(account_status_column=>account_unverified_status_value)
16
- setup_account_verification
17
- session[unverified_account_session_key] = true
18
- end
19
- end
20
- end