rodauth 1.20.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +170 -0
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +211 -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 +75 -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 +6 -15
  18. data/doc/http_basic_auth.rdoc +10 -1
  19. data/doc/internals.rdoc +1 -1
  20. data/doc/jwt.rdoc +22 -22
  21. data/doc/jwt_cors.rdoc +22 -0
  22. data/doc/jwt_refresh.rdoc +12 -8
  23. data/doc/lockout.rdoc +17 -15
  24. data/doc/login.rdoc +10 -2
  25. data/doc/login_password_requirements_base.rdoc +15 -37
  26. data/doc/logout.rdoc +2 -2
  27. data/doc/otp.rdoc +24 -19
  28. data/doc/password_complexity.rdoc +10 -26
  29. data/doc/password_expiration.rdoc +11 -25
  30. data/doc/password_grace_period.rdoc +16 -2
  31. data/doc/recovery_codes.rdoc +18 -12
  32. data/doc/release_notes/1.21.0.txt +12 -0
  33. data/doc/release_notes/1.22.0.txt +11 -0
  34. data/doc/release_notes/1.23.0.txt +32 -0
  35. data/doc/release_notes/2.0.0.txt +361 -0
  36. data/doc/release_notes/2.1.0.txt +31 -0
  37. data/doc/remember.rdoc +40 -64
  38. data/doc/reset_password.rdoc +12 -9
  39. data/doc/session_expiration.rdoc +1 -0
  40. data/doc/single_session.rdoc +16 -25
  41. data/doc/sms_codes.rdoc +24 -14
  42. data/doc/two_factor_base.rdoc +60 -22
  43. data/doc/verify_account.rdoc +14 -12
  44. data/doc/verify_account_grace_period.rdoc +6 -2
  45. data/doc/verify_login_change.rdoc +9 -8
  46. data/doc/webauthn.rdoc +115 -0
  47. data/doc/webauthn_login.rdoc +15 -0
  48. data/doc/webauthn_verify_account.rdoc +9 -0
  49. data/javascript/webauthn_auth.js +45 -0
  50. data/javascript/webauthn_setup.js +35 -0
  51. data/lib/roda/plugins/rodauth.rb +1 -1
  52. data/lib/rodauth.rb +32 -24
  53. data/lib/rodauth/features/account_expiration.rb +5 -5
  54. data/lib/rodauth/features/active_sessions.rb +160 -0
  55. data/lib/rodauth/features/audit_logging.rb +96 -0
  56. data/lib/rodauth/features/base.rb +144 -43
  57. data/lib/rodauth/features/change_password_notify.rb +2 -2
  58. data/lib/rodauth/features/confirm_password.rb +40 -2
  59. data/lib/rodauth/features/create_account.rb +8 -13
  60. data/lib/rodauth/features/disallow_common_passwords.rb +1 -1
  61. data/lib/rodauth/features/disallow_password_reuse.rb +1 -1
  62. data/lib/rodauth/features/email_auth.rb +30 -29
  63. data/lib/rodauth/features/email_base.rb +9 -4
  64. data/lib/rodauth/features/http_basic_auth.rb +55 -35
  65. data/lib/rodauth/features/jwt.rb +58 -10
  66. data/lib/rodauth/features/jwt_cors.rb +53 -0
  67. data/lib/rodauth/features/jwt_refresh.rb +3 -3
  68. data/lib/rodauth/features/lockout.rb +12 -14
  69. data/lib/rodauth/features/login.rb +54 -10
  70. data/lib/rodauth/features/login_password_requirements_base.rb +4 -4
  71. data/lib/rodauth/features/otp.rb +72 -74
  72. data/lib/rodauth/features/password_complexity.rb +4 -11
  73. data/lib/rodauth/features/password_expiration.rb +2 -2
  74. data/lib/rodauth/features/password_grace_period.rb +17 -10
  75. data/lib/rodauth/features/recovery_codes.rb +49 -53
  76. data/lib/rodauth/features/remember.rb +11 -27
  77. data/lib/rodauth/features/reset_password.rb +26 -26
  78. data/lib/rodauth/features/session_expiration.rb +6 -4
  79. data/lib/rodauth/features/single_session.rb +7 -5
  80. data/lib/rodauth/features/sms_codes.rb +62 -71
  81. data/lib/rodauth/features/two_factor_base.rb +132 -28
  82. data/lib/rodauth/features/verify_account.rb +25 -21
  83. data/lib/rodauth/features/verify_account_grace_period.rb +20 -9
  84. data/lib/rodauth/features/verify_login_change.rb +12 -11
  85. data/lib/rodauth/features/webauthn.rb +507 -0
  86. data/lib/rodauth/features/webauthn_login.rb +70 -0
  87. data/lib/rodauth/features/webauthn_verify_account.rb +46 -0
  88. data/lib/rodauth/version.rb +2 -2
  89. data/templates/button.str +1 -3
  90. data/templates/change-login.str +1 -2
  91. data/templates/change-password.str +3 -5
  92. data/templates/close-account.str +2 -2
  93. data/templates/confirm-password.str +1 -1
  94. data/templates/create-account.str +1 -1
  95. data/templates/email-auth-email.str +1 -1
  96. data/templates/email-auth-request-form.str +2 -3
  97. data/templates/email-auth.str +1 -1
  98. data/templates/global-logout-field.str +6 -0
  99. data/templates/login-confirm-field.str +2 -4
  100. data/templates/login-display.str +3 -2
  101. data/templates/login-field.str +2 -4
  102. data/templates/login-form-footer.str +6 -0
  103. data/templates/login-form.str +7 -0
  104. data/templates/login.str +1 -9
  105. data/templates/logout.str +1 -1
  106. data/templates/multi-phase-login.str +3 -0
  107. data/templates/otp-auth-code-field.str +5 -3
  108. data/templates/otp-auth.str +1 -1
  109. data/templates/otp-disable.str +1 -1
  110. data/templates/otp-setup.str +3 -3
  111. data/templates/password-confirm-field.str +2 -4
  112. data/templates/password-field.str +2 -4
  113. data/templates/recovery-auth.str +3 -6
  114. data/templates/recovery-codes.str +1 -1
  115. data/templates/remember.str +15 -20
  116. data/templates/reset-password-email.str +1 -1
  117. data/templates/reset-password-request.str +3 -3
  118. data/templates/reset-password.str +1 -2
  119. data/templates/sms-auth.str +1 -1
  120. data/templates/sms-code-field.str +5 -3
  121. data/templates/sms-confirm.str +1 -2
  122. data/templates/sms-disable.str +1 -2
  123. data/templates/sms-request.str +1 -1
  124. data/templates/sms-setup.str +6 -4
  125. data/templates/two-factor-auth.str +5 -0
  126. data/templates/two-factor-disable.str +6 -0
  127. data/templates/two-factor-manage.str +16 -0
  128. data/templates/unlock-account-email.str +1 -1
  129. data/templates/unlock-account-request.str +4 -4
  130. data/templates/unlock-account.str +1 -1
  131. data/templates/verify-account-email.str +1 -1
  132. data/templates/verify-account-resend.str +3 -3
  133. data/templates/verify-account.str +1 -2
  134. data/templates/verify-login-change-email.str +2 -1
  135. data/templates/verify-login-change.str +1 -1
  136. data/templates/webauthn-auth.str +11 -0
  137. data/templates/webauthn-remove.str +14 -0
  138. data/templates/webauthn-setup.str +12 -0
  139. metadata +89 -50
  140. data/Rakefile +0 -179
  141. data/doc/verify_change_login.rdoc +0 -11
  142. data/lib/rodauth/features/verify_change_login.rb +0 -20
  143. data/spec/account_expiration_spec.rb +0 -225
  144. data/spec/all.rb +0 -1
  145. data/spec/change_login_spec.rb +0 -156
  146. data/spec/change_password_notify_spec.rb +0 -33
  147. data/spec/change_password_spec.rb +0 -202
  148. data/spec/close_account_spec.rb +0 -162
  149. data/spec/confirm_password_spec.rb +0 -70
  150. data/spec/create_account_spec.rb +0 -127
  151. data/spec/disallow_common_passwords_spec.rb +0 -93
  152. data/spec/disallow_password_reuse_spec.rb +0 -179
  153. data/spec/email_auth_spec.rb +0 -285
  154. data/spec/http_basic_auth_spec.rb +0 -143
  155. data/spec/jwt_refresh_spec.rb +0 -256
  156. data/spec/jwt_spec.rb +0 -235
  157. data/spec/lockout_spec.rb +0 -250
  158. data/spec/login_spec.rb +0 -328
  159. data/spec/migrate/001_tables.rb +0 -184
  160. data/spec/migrate/002_account_password_hash_column.rb +0 -11
  161. data/spec/migrate_password/001_tables.rb +0 -73
  162. data/spec/migrate_travis/001_tables.rb +0 -141
  163. data/spec/password_complexity_spec.rb +0 -109
  164. data/spec/password_expiration_spec.rb +0 -244
  165. data/spec/password_grace_period_spec.rb +0 -93
  166. data/spec/remember_spec.rb +0 -451
  167. data/spec/reset_password_spec.rb +0 -229
  168. data/spec/rodauth_spec.rb +0 -343
  169. data/spec/session_expiration_spec.rb +0 -58
  170. data/spec/single_session_spec.rb +0 -127
  171. data/spec/spec_helper.rb +0 -327
  172. data/spec/two_factor_spec.rb +0 -1423
  173. data/spec/update_password_hash_spec.rb +0 -40
  174. data/spec/verify_account_grace_period_spec.rb +0 -171
  175. data/spec/verify_account_spec.rb +0 -240
  176. data/spec/verify_change_login_spec.rb +0 -46
  177. data/spec/verify_login_change_spec.rb +0 -232
  178. data/spec/views/layout-other.str +0 -11
  179. data/spec/views/layout.str +0 -11
  180. data/spec/views/login.str +0 -21
@@ -1,8 +1,7 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="reset-password-form">
1
+ <form method="post" class="rodauth" role="form" id="reset-password-form">
2
2
  #{rodauth.reset_password_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('password-field')}
5
5
  #{rodauth.render('password-confirm-field') if rodauth.require_password_confirmation?}
6
6
  #{rodauth.button(rodauth.reset_password_button)}
7
7
  </form>
8
-
@@ -1,4 +1,4 @@
1
- <form method="post" class="rodauth form-horizontal" role="form" id="sms-auth-form">
1
+ <form method="post" class="rodauth" role="form" id="sms-auth-form">
2
2
  #{rodauth.sms_auth_additional_form_tags}
3
3
  #{rodauth.csrf_tag}
4
4
  #{rodauth.render('sms-code-field')}
@@ -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,5 +1,5 @@
1
1
  Someone has requested a that the account with this email be unlocked.
2
2
  If you did not request the unlocking of this account, please ignore this
3
3
  message. If you requested the unlocking of this account, please go to
4
- #{rodauth.unlock_account_email_link}
4
+ #{rodauth.unlock_account_email_link}
5
5
  to unlock this account.
@@ -1,7 +1,7 @@
1
- <form action="#{rodauth.prefix}/#{rodauth.unlock_account_request_route}" 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
- #{rodauth.csrf_tag("#{rodauth.prefix}/#{rodauth.unlock_account_request_route}")}
4
- <input type="hidden" name="#{rodauth.login_param}" value="#{h rodauth.param(rodauth.login_param)}"/>
3
+ #{rodauth.csrf_tag(rodauth.unlock_account_request_path)}
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
1
  Someone has created an account with this email address. If you did not create
2
2
  this account, please ignore this message. If you created this account, please go to
3
- #{rodauth.verify_account_email_link}
3
+ #{rodauth.verify_account_email_link}
4
4
  to verify the account.
@@ -1,7 +1,7 @@
1
- <form action="#{rodauth.prefix}/#{rodauth.verify_account_resend_route}" 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
- #{rodauth.csrf_tag("#{rodauth.prefix}/#{rodauth.verify_account_resend_route}")}
3
+ #{rodauth.csrf_tag(rodauth.verify_account_resend_path)}
4
4
  #{rodauth.verify_account_resend_explanatory_text}
5
- #{(login = rodauth.param_or_nil(rodauth.login_param)) ? "<input type=\"hidden\" name=\"#{rodauth.login_param}\" value=\"#{h login}\"/>" : rodauth.render('login-field')}
5
+ #{rodauth.param_or_nil(rodauth.login_param) ? rodauth.login_hidden_field : rodauth.render('login-field')}
6
6
  #{rodauth.button(rodauth.verify_account_resend_button)}
7
7
  </form>
@@ -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,9 +1,10 @@
1
1
  Someone with an account has requested their login be changed to this email address:
2
2
 
3
3
  Old Login: #{rodauth.verify_login_change_old_login}
4
+
4
5
  New Login: #{rodauth.verify_login_change_new_login}
5
6
 
6
7
  If you did not request this login change, please ignore this message. If you
7
8
  requested this login change, please go to
8
- #{rodauth.verify_login_change_email_link}
9
+ #{rodauth.verify_login_change_email_link}
9
10
  to verify the login change.
@@ -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.20.0
4
+ version: 2.1.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: 2019-06-07 00:00:00.000000000 Z
11
+ date: 2020-06-09 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
@@ -150,6 +164,20 @@ dependencies:
150
164
  - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: 5.0.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: minitest-global_expectations
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: minitest-hooks
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -179,9 +207,9 @@ dependencies:
179
207
  - !ruby/object:Gem::Version
180
208
  version: 2.1.0
181
209
  description: |
182
- Rodauth is an authentication and account management framework for
183
- rack applications. It's built using Roda and Sequel, but it can
184
- 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
185
213
  other web frameworks and database libraries.
186
214
 
187
215
  Rodauth aims to provide strong security for password storage by
@@ -189,6 +217,19 @@ description: |
189
217
  MySQL, and Microsoft SQL Server. Configuration is done via
190
218
  a DSL that makes it easy to override any part of the authentication
191
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.
192
233
  email: code@jeremyevans.net
193
234
  executables: []
194
235
  extensions: []
@@ -216,7 +257,7 @@ extra_rdoc_files:
216
257
  - doc/logout.rdoc
217
258
  - doc/otp.rdoc
218
259
  - doc/login_password_requirements_base.rdoc
219
- - doc/verify_change_login.rdoc
260
+ - doc/jwt_cors.rdoc
220
261
  - doc/password_expiration.rdoc
221
262
  - doc/password_grace_period.rdoc
222
263
  - doc/recovery_codes.rdoc
@@ -232,6 +273,11 @@ extra_rdoc_files:
232
273
  - doc/jwt_refresh.rdoc
233
274
  - doc/verify_account_grace_period.rdoc
234
275
  - doc/verify_login_change.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
235
281
  - doc/release_notes/1.17.0.txt
236
282
  - doc/release_notes/1.0.0.txt
237
283
  - doc/release_notes/1.1.0.txt
@@ -253,13 +299,19 @@ extra_rdoc_files:
253
299
  - doc/release_notes/1.18.0.txt
254
300
  - doc/release_notes/1.19.0.txt
255
301
  - doc/release_notes/1.20.0.txt
302
+ - doc/release_notes/1.21.0.txt
303
+ - doc/release_notes/1.22.0.txt
304
+ - doc/release_notes/1.23.0.txt
305
+ - doc/release_notes/2.0.0.txt
306
+ - doc/release_notes/2.1.0.txt
256
307
  files:
257
308
  - CHANGELOG
258
309
  - MIT-LICENSE
259
310
  - README.rdoc
260
- - Rakefile
261
311
  - dict/top-10_000-passwords.txt
262
312
  - doc/account_expiration.rdoc
313
+ - doc/active_sessions.rdoc
314
+ - doc/audit_logging.rdoc
263
315
  - doc/base.rdoc
264
316
  - doc/change_login.rdoc
265
317
  - doc/change_password.rdoc
@@ -274,6 +326,7 @@ files:
274
326
  - doc/http_basic_auth.rdoc
275
327
  - doc/internals.rdoc
276
328
  - doc/jwt.rdoc
329
+ - doc/jwt_cors.rdoc
277
330
  - doc/jwt_refresh.rdoc
278
331
  - doc/lockout.rdoc
279
332
  - doc/login.rdoc
@@ -298,6 +351,9 @@ files:
298
351
  - doc/release_notes/1.19.0.txt
299
352
  - doc/release_notes/1.2.0.txt
300
353
  - doc/release_notes/1.20.0.txt
354
+ - doc/release_notes/1.21.0.txt
355
+ - doc/release_notes/1.22.0.txt
356
+ - doc/release_notes/1.23.0.txt
301
357
  - doc/release_notes/1.3.0.txt
302
358
  - doc/release_notes/1.4.0.txt
303
359
  - doc/release_notes/1.5.0.txt
@@ -305,6 +361,8 @@ files:
305
361
  - doc/release_notes/1.7.0.txt
306
362
  - doc/release_notes/1.8.0.txt
307
363
  - doc/release_notes/1.9.0.txt
364
+ - doc/release_notes/2.0.0.txt
365
+ - doc/release_notes/2.1.0.txt
308
366
  - doc/remember.rdoc
309
367
  - doc/reset_password.rdoc
310
368
  - doc/session_expiration.rdoc
@@ -314,11 +372,17 @@ files:
314
372
  - doc/update_password_hash.rdoc
315
373
  - doc/verify_account.rdoc
316
374
  - doc/verify_account_grace_period.rdoc
317
- - doc/verify_change_login.rdoc
318
375
  - doc/verify_login_change.rdoc
376
+ - doc/webauthn.rdoc
377
+ - doc/webauthn_login.rdoc
378
+ - doc/webauthn_verify_account.rdoc
379
+ - javascript/webauthn_auth.js
380
+ - javascript/webauthn_setup.js
319
381
  - lib/roda/plugins/rodauth.rb
320
382
  - lib/rodauth.rb
321
383
  - lib/rodauth/features/account_expiration.rb
384
+ - lib/rodauth/features/active_sessions.rb
385
+ - lib/rodauth/features/audit_logging.rb
322
386
  - lib/rodauth/features/base.rb
323
387
  - lib/rodauth/features/change_login.rb
324
388
  - lib/rodauth/features/change_password.rb
@@ -332,6 +396,7 @@ files:
332
396
  - lib/rodauth/features/email_base.rb
333
397
  - lib/rodauth/features/http_basic_auth.rb
334
398
  - lib/rodauth/features/jwt.rb
399
+ - lib/rodauth/features/jwt_cors.rb
335
400
  - lib/rodauth/features/jwt_refresh.rb
336
401
  - lib/rodauth/features/lockout.rb
337
402
  - lib/rodauth/features/login.rb
@@ -351,48 +416,12 @@ files:
351
416
  - lib/rodauth/features/update_password_hash.rb
352
417
  - lib/rodauth/features/verify_account.rb
353
418
  - lib/rodauth/features/verify_account_grace_period.rb
354
- - lib/rodauth/features/verify_change_login.rb
355
419
  - lib/rodauth/features/verify_login_change.rb
420
+ - lib/rodauth/features/webauthn.rb
421
+ - lib/rodauth/features/webauthn_login.rb
422
+ - lib/rodauth/features/webauthn_verify_account.rb
356
423
  - lib/rodauth/migrations.rb
357
424
  - lib/rodauth/version.rb
358
- - spec/account_expiration_spec.rb
359
- - spec/all.rb
360
- - spec/change_login_spec.rb
361
- - spec/change_password_notify_spec.rb
362
- - spec/change_password_spec.rb
363
- - spec/close_account_spec.rb
364
- - spec/confirm_password_spec.rb
365
- - spec/create_account_spec.rb
366
- - spec/disallow_common_passwords_spec.rb
367
- - spec/disallow_password_reuse_spec.rb
368
- - spec/email_auth_spec.rb
369
- - spec/http_basic_auth_spec.rb
370
- - spec/jwt_refresh_spec.rb
371
- - spec/jwt_spec.rb
372
- - spec/lockout_spec.rb
373
- - spec/login_spec.rb
374
- - spec/migrate/001_tables.rb
375
- - spec/migrate/002_account_password_hash_column.rb
376
- - spec/migrate_password/001_tables.rb
377
- - spec/migrate_travis/001_tables.rb
378
- - spec/password_complexity_spec.rb
379
- - spec/password_expiration_spec.rb
380
- - spec/password_grace_period_spec.rb
381
- - spec/remember_spec.rb
382
- - spec/reset_password_spec.rb
383
- - spec/rodauth_spec.rb
384
- - spec/session_expiration_spec.rb
385
- - spec/single_session_spec.rb
386
- - spec/spec_helper.rb
387
- - spec/two_factor_spec.rb
388
- - spec/update_password_hash_spec.rb
389
- - spec/verify_account_grace_period_spec.rb
390
- - spec/verify_account_spec.rb
391
- - spec/verify_change_login_spec.rb
392
- - spec/verify_login_change_spec.rb
393
- - spec/views/layout-other.str
394
- - spec/views/layout.str
395
- - spec/views/login.str
396
425
  - templates/add-recovery-codes.str
397
426
  - templates/button.str
398
427
  - templates/change-login.str
@@ -403,11 +432,15 @@ files:
403
432
  - templates/email-auth-email.str
404
433
  - templates/email-auth-request-form.str
405
434
  - templates/email-auth.str
435
+ - templates/global-logout-field.str
406
436
  - templates/login-confirm-field.str
407
437
  - templates/login-display.str
408
438
  - templates/login-field.str
439
+ - templates/login-form-footer.str
440
+ - templates/login-form.str
409
441
  - templates/login.str
410
442
  - templates/logout.str
443
+ - templates/multi-phase-login.str
411
444
  - templates/otp-auth-code-field.str
412
445
  - templates/otp-auth.str
413
446
  - templates/otp-disable.str
@@ -427,6 +460,9 @@ files:
427
460
  - templates/sms-disable.str
428
461
  - templates/sms-request.str
429
462
  - templates/sms-setup.str
463
+ - templates/two-factor-auth.str
464
+ - templates/two-factor-disable.str
465
+ - templates/two-factor-manage.str
430
466
  - templates/unlock-account-email.str
431
467
  - templates/unlock-account-request.str
432
468
  - templates/unlock-account.str
@@ -435,6 +471,9 @@ files:
435
471
  - templates/verify-account.str
436
472
  - templates/verify-login-change-email.str
437
473
  - templates/verify-login-change.str
474
+ - templates/webauthn-auth.str
475
+ - templates/webauthn-remove.str
476
+ - templates/webauthn-setup.str
438
477
  homepage: https://github.com/jeremyevans/rodauth
439
478
  licenses:
440
479
  - MIT
@@ -450,7 +489,7 @@ rdoc_options:
450
489
  - "--line-numbers"
451
490
  - "--inline-source"
452
491
  - "--title"
453
- - 'Rodauth: Authentication and Account Management Framework for Rack Applications'
492
+ - 'Rodauth: Ruby''s Most Advanced Authentication Framework'
454
493
  - "--main"
455
494
  - README.rdoc
456
495
  require_paths:
@@ -459,14 +498,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
459
498
  requirements:
460
499
  - - ">="
461
500
  - !ruby/object:Gem::Version
462
- version: 1.8.7
501
+ version: 1.9.2
463
502
  required_rubygems_version: !ruby/object:Gem::Requirement
464
503
  requirements:
465
504
  - - ">="
466
505
  - !ruby/object:Gem::Version
467
506
  version: '0'
468
507
  requirements: []
469
- rubygems_version: 3.0.3
508
+ rubygems_version: 3.1.2
470
509
  signing_key:
471
510
  specification_version: 4
472
511
  summary: Authentication and Account Management Framework for Rack Applications