authnz_eleven 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +384 -0
- data/lib/authnz_eleven/identity.rb +210 -0
- data/lib/authnz_eleven/principal.rb +201 -0
- data/lib/authnz_eleven/principals.rb +111 -0
- data/lib/authnz_eleven/version.rb +5 -0
- data/lib/authnz_eleven/wizard.rb +570 -0
- data/lib/authnz_eleven.rb +15 -0
- data/lib/generators/authnz_eleven/USAGE +26 -0
- data/lib/generators/authnz_eleven/authnz_eleven_generator.rb +3040 -0
- data/lib/generators/authnz_eleven/templates/config/forbidden_usernames.LICENSE +22 -0
- data/lib/generators/authnz_eleven/templates/config/forbidden_usernames.txt +558 -0
- data/lib/generators/authnz_eleven/templates/config/initializers/authentication.rb.tt +275 -0
- data/lib/generators/authnz_eleven/templates/config/initializers/omniauth.rb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/config/initializers/team_slug.rb.tt +24 -0
- data/lib/generators/authnz_eleven/templates/config/initializers/webauthn.rb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/config/locales/authentication.en.yml.tt +11 -0
- data/lib/generators/authnz_eleven/templates/controllers/active_teams_controller.rb.tt +6 -0
- data/lib/generators/authnz_eleven/templates/controllers/admin/dashboard_controller.rb.tt +4 -0
- data/lib/generators/authnz_eleven/templates/controllers/admin/sessions_controller.rb.tt +17 -0
- data/lib/generators/authnz_eleven/templates/controllers/admin/users_controller.rb.tt +91 -0
- data/lib/generators/authnz_eleven/templates/controllers/admin_controller.rb.tt +6 -0
- data/lib/generators/authnz_eleven/templates/controllers/base_controller.rb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/api_token_authentication.rb.tt +21 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authentication/easy_dev_login.rb.tt +47 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authentication/registering.rb.tt +25 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authentication/sudoable.rb.tt +117 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authentication/webauthn_ceremony.rb.tt +51 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authentication.rb.tt +421 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/authorization.rb.tt +48 -0
- data/lib/generators/authnz_eleven/templates/controllers/concerns/captchable.rb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/controllers/impersonations_controller.rb.tt +8 -0
- data/lib/generators/authnz_eleven/templates/controllers/invitations_controller.rb.tt +65 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/api_tokens_controller.rb.tt +54 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/authentications/events_controller.rb.tt +5 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/dashboard_controller.rb.tt +4 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/email_verifications_controller.rb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/emails_controller.rb.tt +93 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/invitations_controller.rb.tt +61 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/multi_factor_authentication/authenticators_controller.rb.tt +87 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/multi_factor_authentication/recovery_codes_controller.rb.tt +27 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/multi_factor_authentication/security_keys_controller.rb.tt +86 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/multi_factor_authentication/sms_controller.rb.tt +84 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/omniauth_identities_controller.rb.tt +27 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/passkeys_controller.rb.tt +70 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/passwords_controller.rb.tt +74 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/phone_verifications_controller.rb.tt +39 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/phones_controller.rb.tt +88 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/sessions_controller.rb.tt +29 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings/users_controller.rb.tt +42 -0
- data/lib/generators/authnz_eleven/templates/controllers/settings_controller.rb.tt +5 -0
- data/lib/generators/authnz_eleven/templates/controllers/teams_controller.rb.tt +38 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/credential_enrollments/passkeys_controller.rb.tt +36 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/credential_enrollments/passwords_controller.rb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/credential_enrollments_controller.rb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/easy_dev_logins_controller.rb.tt +19 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/email_verifications_controller.rb.tt +36 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/magic_link_controller.rb.tt +53 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/multi_factor_authentication/challenge/recovery_codes_controller.rb.tt +30 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/multi_factor_authentication/challenge/security_keys_controller.rb.tt +34 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/multi_factor_authentication/challenge/sms_controller.rb.tt +45 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/multi_factor_authentication/challenge/totps_controller.rb.tt +42 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/omniauth/registrations_controller.rb.tt +26 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/omniauth_controller.rb.tt +139 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/passkeys/sessions_controller.rb.tt +18 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/password_resets_controller.rb.tt +64 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/registrations/email_verifications_controller.rb.tt +53 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/registrations/phone_verifications_controller.rb.tt +37 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/registrations_controller.rb.tt +112 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/sessions_controller.rb.tt +52 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/sms_sessions_controller.rb.tt +53 -0
- data/lib/generators/authnz_eleven/templates/controllers/users/sudos_controller.rb.tt +42 -0
- data/lib/generators/authnz_eleven/templates/erb/admin/dashboard/index.html.erb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/erb/admin/sessions/index.html.erb.tt +27 -0
- data/lib/generators/authnz_eleven/templates/erb/admin/users/index.html.erb.tt +32 -0
- data/lib/generators/authnz_eleven/templates/erb/admin/users/show.html.erb.tt +70 -0
- data/lib/generators/authnz_eleven/templates/erb/invitations/show.html.erb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/api_tokens/create.html.erb.tt +7 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/api_tokens/index.html.erb.tt +29 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/authentications/events/index.html.erb.tt +18 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/dashboard/index.html.erb.tt +75 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/emails/edit.html.erb.tt +68 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/invitations/new.html.erb.tt +31 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/authenticators/new.html.erb.tt +57 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/recovery_codes/create.html.erb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/recovery_codes/index.html.erb.tt +13 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/security_keys/edit.html.erb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/security_keys/index.html.erb.tt +20 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/security_keys/new.html.erb.tt +17 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/multi_factor_authentication/sms/new.html.erb.tt +35 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/omniauth_identities/index.html.erb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/passkeys/edit.html.erb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/passkeys/index.html.erb.tt +21 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/passkeys/new.html.erb.tt +13 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/passwords/edit.html.erb.tt +68 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/phone_verifications/new.html.erb.tt +22 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/phones/edit.html.erb.tt +58 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/sessions/index.html.erb.tt +29 -0
- data/lib/generators/authnz_eleven/templates/erb/settings/users/show.html.erb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/erb/shared/_authnz_eleven_nav.html.erb.tt +24 -0
- data/lib/generators/authnz_eleven/templates/erb/shared/_authnz_eleven_sudo_challenge.html.erb.tt +43 -0
- data/lib/generators/authnz_eleven/templates/erb/shared/_captcha.html.erb.tt +8 -0
- data/lib/generators/authnz_eleven/templates/erb/teams/index.html.erb.tt +34 -0
- data/lib/generators/authnz_eleven/templates/erb/teams/new.html.erb.tt +22 -0
- data/lib/generators/authnz_eleven/templates/erb/teams/show.html.erb.tt +5 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/email_change_verification.html.erb.tt +7 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/invitation.html.erb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/magic_link.html.erb.tt +5 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/password_reset.html.erb.tt +6 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/registration_email_verification.html.erb.tt +7 -0
- data/lib/generators/authnz_eleven/templates/erb/user_mailer/security_notification.html.erb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/erb/users/credential_enrollments/passkeys/new.html.erb.tt +24 -0
- data/lib/generators/authnz_eleven/templates/erb/users/credential_enrollments/passwords/new.html.erb.tt +21 -0
- data/lib/generators/authnz_eleven/templates/erb/users/credential_enrollments/show.html.erb.tt +21 -0
- data/lib/generators/authnz_eleven/templates/erb/users/email_verifications/show.html.erb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/erb/users/magic_link/edit.html.erb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/erb/users/magic_link/new.html.erb.tt +22 -0
- data/lib/generators/authnz_eleven/templates/erb/users/multi_factor_authentication/challenge/recovery_codes/new.html.erb.tt +20 -0
- data/lib/generators/authnz_eleven/templates/erb/users/multi_factor_authentication/challenge/security_keys/new.html.erb.tt +17 -0
- data/lib/generators/authnz_eleven/templates/erb/users/multi_factor_authentication/challenge/sms/new.html.erb.tt +25 -0
- data/lib/generators/authnz_eleven/templates/erb/users/multi_factor_authentication/challenge/totps/new.html.erb.tt +21 -0
- data/lib/generators/authnz_eleven/templates/erb/users/omniauth/registrations/new.html.erb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/erb/users/password_resets/edit.html.erb.tt +26 -0
- data/lib/generators/authnz_eleven/templates/erb/users/password_resets/new.html.erb.tt +20 -0
- data/lib/generators/authnz_eleven/templates/erb/users/registrations/email_verifications/new.html.erb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/erb/users/registrations/email_verifications/show.html.erb.tt +34 -0
- data/lib/generators/authnz_eleven/templates/erb/users/registrations/new.html.erb.tt +87 -0
- data/lib/generators/authnz_eleven/templates/erb/users/registrations/phone_verifications/new.html.erb.tt +46 -0
- data/lib/generators/authnz_eleven/templates/erb/users/sessions/new.html.erb.tt +88 -0
- data/lib/generators/authnz_eleven/templates/erb/users/sms_sessions/edit.html.erb.tt +30 -0
- data/lib/generators/authnz_eleven/templates/erb/users/sms_sessions/new.html.erb.tt +22 -0
- data/lib/generators/authnz_eleven/templates/erb/users/sudos/new.html.erb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/javascript/controllers/webauthn_controller.js.tt +142 -0
- data/lib/generators/authnz_eleven/templates/jobs/authnz_eleven_deferred_job.rb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/jobs/authnz_eleven_mail_delivery_job.rb.tt +3 -0
- data/lib/generators/authnz_eleven/templates/jobs/sms_delivery_job.rb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/lib/captcha/null.rb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/lib/captcha/turnstile.rb.tt +39 -0
- data/lib/generators/authnz_eleven/templates/lib/captcha.rb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/lib/sms/log.rb.tt +8 -0
- data/lib/generators/authnz_eleven/templates/lib/sms/twilio.rb.tt +70 -0
- data/lib/generators/authnz_eleven/templates/lib/sms.rb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/mailers/user_mailer.rb.tt +98 -0
- data/lib/generators/authnz_eleven/templates/migrations/add_guest_to_users_migration.rb.tt +6 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_api_tokens_migration.rb.tt +14 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_events_migration.rb.tt +26 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_invitations_migration.rb.tt +20 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_memberships_migration.rb.tt +12 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_omniauth_identities_migration.rb.tt +16 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_password_histories_migration.rb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_pending_registrations_migration.rb.tt +31 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_recovery_codes_migration.rb.tt +11 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_sessions_migration.rb.tt +19 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_teams_migration.rb.tt +9 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_users_migration.rb.tt +70 -0
- data/lib/generators/authnz_eleven/templates/migrations/create_webauthn_credentials_migration.rb.tt +16 -0
- data/lib/generators/authnz_eleven/templates/models/api_token.rb.tt +24 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/adminable.rb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/authenticatable.rb.tt +151 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/bannable.rb.tt +24 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/deadboltable.rb.tt +39 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/email_verifiable.rb.tt +52 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/eventable.rb.tt +22 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/guestable.rb.tt +30 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/invitable.rb.tt +12 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/magic_linkable.rb.tt +34 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/password_historical.rb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/password_policy.rb.tt +38 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/password_rotatable.rb.tt +15 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/phone_verifiable.rb.tt +50 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/principals.rb.tt +67 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/recoverable.rb.tt +19 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/second_factor.rb.tt +52 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/sms_challengeable.rb.tt +38 -0
- data/lib/generators/authnz_eleven/templates/models/concerns/team_member.rb.tt +20 -0
- data/lib/generators/authnz_eleven/templates/models/current.rb.tt +28 -0
- data/lib/generators/authnz_eleven/templates/models/event.rb.tt +32 -0
- data/lib/generators/authnz_eleven/templates/models/invitation.rb.tt +122 -0
- data/lib/generators/authnz_eleven/templates/models/membership.rb.tt +16 -0
- data/lib/generators/authnz_eleven/templates/models/omniauth_identity.rb.tt +12 -0
- data/lib/generators/authnz_eleven/templates/models/password_history.rb.tt +3 -0
- data/lib/generators/authnz_eleven/templates/models/pending_registration.rb.tt +216 -0
- data/lib/generators/authnz_eleven/templates/models/recovery_code.rb.tt +41 -0
- data/lib/generators/authnz_eleven/templates/models/session.rb.tt +46 -0
- data/lib/generators/authnz_eleven/templates/models/team.rb.tt +12 -0
- data/lib/generators/authnz_eleven/templates/models/user.rb.tt +59 -0
- data/lib/generators/authnz_eleven/templates/models/webauthn_credential.rb.tt +12 -0
- data/lib/generators/authnz_eleven/templates/tasks/authnz_eleven.rake.tt +41 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/account_existence_parity_test.rb.tt +158 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/admin/access_test.rb.tt +139 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/admin/multi_factor_authentication_test.rb.tt +65 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/api_token_authentication_test.rb.tt +45 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/credential_enrollment_test.rb.tt +84 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/guest_access_test.rb.tt +113 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/invitations_controller_test.rb.tt +230 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/passkey_ceremony_test.rb.tt +126 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/password_rotation_test.rb.tt +67 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/security_key_ceremony_test.rb.tt +218 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/security_notifications_test.rb.tt +39 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/session_lifecycle_test.rb.tt +102 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/api_tokens_controller_test.rb.tt +61 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/authentications/events_controller_test.rb.tt +17 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/email_verifications_controller_test.rb.tt +39 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/invitations_controller_test.rb.tt +157 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/management_test.rb.tt +256 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/multi_factor_authentication/management_test.rb.tt +222 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/omniauth_identities_controller_test.rb.tt +57 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/settings/phone_verifications_controller_test.rb.tt +146 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/teams_controller_test.rb.tt +83 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/email_verifications_controller_test.rb.tt +74 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/magic_link_controller_test.rb.tt +90 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/multi_factor_authentication/challenge_test.rb.tt +143 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/omniauth/registrations_controller_test.rb.tt +138 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/omniauth_controller_test.rb.tt +97 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/password_resets_controller_test.rb.tt +58 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/registrations/email_verifications_controller_test.rb.tt +102 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/registrations/phone_verifications_controller_test.rb.tt +69 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/registrations_controller_test.rb.tt +180 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/sessions_controller_test.rb.tt +124 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/sms_sessions_controller_test.rb.tt +111 -0
- data/lib/generators/authnz_eleven/templates/test_unit/controllers/users/sudos_controller_test.rb.tt +110 -0
- data/lib/generators/authnz_eleven/templates/test_unit/fixtures/memberships.yml.tt +13 -0
- data/lib/generators/authnz_eleven/templates/test_unit/fixtures/teams.yml.tt +2 -0
- data/lib/generators/authnz_eleven/templates/test_unit/fixtures/users.yml.tt +68 -0
- data/lib/generators/authnz_eleven/templates/test_unit/mailers/user_mailer_test.rb.tt +88 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/api_token_test.rb.tt +38 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/password_history_test.rb.tt +51 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/session_test.rb.tt +16 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/sms_challengeable_test.rb.tt +108 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/user/guestable_test.rb.tt +78 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/user/recovery_codes_test.rb.tt +32 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/user/sign_in_methods_test.rb.tt +56 -0
- data/lib/generators/authnz_eleven/templates/test_unit/models/user_test.rb.tt +145 -0
- data/lib/generators/authnz_eleven/wizard_generator.rb +52 -0
- metadata +309 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class <%= identity.module_name %>::SudosController < <%= identity.controller_superclass %>
|
|
2
|
+
<%- if impeded? -%>
|
|
3
|
+
skip_impediments
|
|
4
|
+
|
|
5
|
+
<%- end -%>
|
|
6
|
+
def new
|
|
7
|
+
<%- if fail_open_sudo? -%>
|
|
8
|
+
<%= "return " if sudo_bars.include?(:webauthn) %>redirect_to(sudo_proceed_url) if sudo_strategy == :open
|
|
9
|
+
<%- end -%>
|
|
10
|
+
<%- if sudo_bars.include?(:webauthn) -%>
|
|
11
|
+
<%- if fail_open_sudo? -%>
|
|
12
|
+
|
|
13
|
+
<%- end -%>
|
|
14
|
+
respond_to do |format|
|
|
15
|
+
format.html
|
|
16
|
+
format.json do
|
|
17
|
+
issue_webauthn_challenge(WebAuthn::Credential.options_for_get(
|
|
18
|
+
<%- if passkey? -%>
|
|
19
|
+
user_verification: "<%= passkey_and_security_keys? ? "preferred" : "required" %>",
|
|
20
|
+
<%- end -%>
|
|
21
|
+
allow: <%= sudo_subject %>.webauthn_credentials.pluck(:external_id)
|
|
22
|
+
))
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
<%- end -%>
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create
|
|
29
|
+
if sudo_confirmed?
|
|
30
|
+
redirect_to sudo_proceed_url
|
|
31
|
+
else
|
|
32
|
+
redirect_to new_<%= identity.route_scope %>_sudo_path, alert: "That didn't match. Please try again."
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def sudo_proceed_url
|
|
39
|
+
session.delete(:<%= session_key(:sudo_message) %>)
|
|
40
|
+
session.delete(:<%= session_key(:sudo_proceed_to) %>).presence || <%= identity.settings_helper_prefix %>_url
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Sessions</h1>
|
|
4
|
+
|
|
5
|
+
<%% if @filtered_user %>
|
|
6
|
+
<p>Filtered to <%%= @filtered_user.<%= principals.display.column %> %>. <%%= link_to "Clear", <%= admin_helper("sessions_path") %> %></p>
|
|
7
|
+
<%% end %>
|
|
8
|
+
|
|
9
|
+
<table>
|
|
10
|
+
<thead>
|
|
11
|
+
<tr><th>User</th><%- if session_carries_team? -%><th>Team</th><%- end -%><th>Via</th><th>IP</th><th>Created</th><th></th></tr>
|
|
12
|
+
</thead>
|
|
13
|
+
<tbody>
|
|
14
|
+
<%% @sessions.each do |session| %>
|
|
15
|
+
<tr>
|
|
16
|
+
<td><%%= link_to session.<%= identity.singular %>.<%= principals.display.column %>, <%= admin_helper("user_path") %>(session.<%= identity.singular %>) %></td>
|
|
17
|
+
<%- if session_carries_team? -%>
|
|
18
|
+
<td><%%= session.team&.name %></td>
|
|
19
|
+
<%- end -%>
|
|
20
|
+
<td><%%= session.via&.humanize %></td>
|
|
21
|
+
<td><%%= session.ip_address %></td>
|
|
22
|
+
<td><%%= session.created_at %></td>
|
|
23
|
+
<td><%%= button_to "End", <%= admin_helper("session_path") %>(session), method: :delete %></td>
|
|
24
|
+
</tr>
|
|
25
|
+
<%% end %>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Users</h1>
|
|
4
|
+
|
|
5
|
+
<table>
|
|
6
|
+
<thead>
|
|
7
|
+
<tr><th><%= principals.display.label %></th><th>Admin</th><%- if deadboltable? -%><th>Deadbolted</th><%- end -%><%- if bannable? -%><th>Suspended</th><%- end -%><th></th></tr>
|
|
8
|
+
</thead>
|
|
9
|
+
<tbody>
|
|
10
|
+
<%% @users.each do |user| %>
|
|
11
|
+
<tr>
|
|
12
|
+
<td><%%= link_to user.<%= principals.display.column %>, <%= admin_helper("user_path") %>(user) %></td>
|
|
13
|
+
<td><%%= user.admin? %></td>
|
|
14
|
+
<%- if deadboltable? -%>
|
|
15
|
+
<td><%%= user.deadbolted? %></td>
|
|
16
|
+
<%- end -%>
|
|
17
|
+
<%- if bannable? -%>
|
|
18
|
+
<td><%%= user.banned? %></td>
|
|
19
|
+
<%- end -%>
|
|
20
|
+
<td>
|
|
21
|
+
<%% unless user.admin? %>
|
|
22
|
+
<%- if impersonatable? -%>
|
|
23
|
+
<%%= button_to "Impersonate", <%= admin_helper("impersonate_user_path") %>(user), method: :post %>
|
|
24
|
+
<%- end -%>
|
|
25
|
+
<%%= button_to "Delete", <%= admin_helper("user_path") %>(user), method: :delete,
|
|
26
|
+
data: {turbo_confirm: "Delete #{user.<%= principals.display.column %>}?"} %>
|
|
27
|
+
<%% end %>
|
|
28
|
+
</td>
|
|
29
|
+
</tr>
|
|
30
|
+
<%% end %>
|
|
31
|
+
</tbody>
|
|
32
|
+
</table>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1><%%= @user.<%= principals.display.column %> %></h1>
|
|
4
|
+
<p>Admin: <%%= @user.admin? %></p>
|
|
5
|
+
<%- if second_factor? -%>
|
|
6
|
+
<p>
|
|
7
|
+
Second factor: <%%= @user.second_factor_enrolled? %>
|
|
8
|
+
<%% if @user.second_factor_enrolled? && !@user.admin? %>
|
|
9
|
+
<%%= button_to "Reset second factor", reset_second_factor_<%= admin_helper("user_path") %>(@user), method: :post,
|
|
10
|
+
data: {turbo_confirm: "Clear every second factor on #{@user.<%= principals.display.column %>}'s account? Their recovery codes go too."} %>
|
|
11
|
+
<%% end %>
|
|
12
|
+
</p>
|
|
13
|
+
<%- end -%>
|
|
14
|
+
<%- if deadboltable? -%>
|
|
15
|
+
<p>
|
|
16
|
+
Password deadbolted: <%%= @user.deadbolted? %>
|
|
17
|
+
<%% if @user.deadbolted? %>
|
|
18
|
+
<%%= button_to "Clear deadbolt", undeadbolt_<%= admin_helper("user_path") %>(@user), method: :post %>
|
|
19
|
+
<%% end %>
|
|
20
|
+
</p>
|
|
21
|
+
<%- end -%>
|
|
22
|
+
<%- if bannable? -%>
|
|
23
|
+
<p>
|
|
24
|
+
Suspended: <%%= @user.banned? %>
|
|
25
|
+
<%% if @user.banned? %>
|
|
26
|
+
<%%= button_to "Lift suspension", unban_<%= admin_helper("user_path") %>(@user), method: :post %>
|
|
27
|
+
<%% elsif !@user.admin? %>
|
|
28
|
+
<%%= button_to "Suspend", ban_<%= admin_helper("user_path") %>(@user), method: :post,
|
|
29
|
+
data: {turbo_confirm: "Suspend #{@user.<%= principals.display.column %>}? This ends all their sessions."} %>
|
|
30
|
+
<%% end %>
|
|
31
|
+
</p>
|
|
32
|
+
<%- end -%>
|
|
33
|
+
|
|
34
|
+
<h2>Sessions</h2>
|
|
35
|
+
<%%= button_to "End all sessions", sessions_<%= admin_helper("user_path") %>(@user), method: :delete %>
|
|
36
|
+
<table>
|
|
37
|
+
<thead>
|
|
38
|
+
<tr><th>Device</th><th>IP</th><th>Created</th><th></th></tr>
|
|
39
|
+
</thead>
|
|
40
|
+
<tbody>
|
|
41
|
+
<%% @sessions.each do |session| %>
|
|
42
|
+
<tr>
|
|
43
|
+
<td><%%= session.user_agent %></td>
|
|
44
|
+
<td><%%= session.ip_address %></td>
|
|
45
|
+
<td><%%= session.created_at %></td>
|
|
46
|
+
<td><%%= button_to "End", <%= admin_helper("session_path") %>(session), method: :delete %></td>
|
|
47
|
+
</tr>
|
|
48
|
+
<%% end %>
|
|
49
|
+
</tbody>
|
|
50
|
+
</table>
|
|
51
|
+
<%- if trackable? -%>
|
|
52
|
+
|
|
53
|
+
<h2>Recent activity</h2>
|
|
54
|
+
<table>
|
|
55
|
+
<thead>
|
|
56
|
+
<tr><th>When</th><th>Event</th><th>IP</th></tr>
|
|
57
|
+
</thead>
|
|
58
|
+
<tbody>
|
|
59
|
+
<%% @events.each do |event| %>
|
|
60
|
+
<tr>
|
|
61
|
+
<td><%%= event.occurred_at %></td>
|
|
62
|
+
<td><%%= event.event_type %></td>
|
|
63
|
+
<td><%%= event.ip_address %></td>
|
|
64
|
+
</tr>
|
|
65
|
+
<%% end %>
|
|
66
|
+
</tbody>
|
|
67
|
+
</table>
|
|
68
|
+
<%- end -%>
|
|
69
|
+
|
|
70
|
+
<p><%%= link_to "Back to users", <%= admin_helper("users_path") %> %></p>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<h1>Accept your invitation</h1>
|
|
5
|
+
|
|
6
|
+
<p>You were invited as <%%= @invitation.sent_to %>.</p>
|
|
7
|
+
|
|
8
|
+
<%%# Accept with a non-GET request so mail scanners cannot spend the invitation. %>
|
|
9
|
+
<%%= button_to "Accept invitation", <%= identity.namespaced? ? "#{identity.route_scope}_accept_invitation_path" : "accept_invitation_path" %>(token: params[:token]), method: :patch %>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<h1>API token created</h1>
|
|
2
|
+
|
|
3
|
+
<p>Copy this token now. It will not be shown again.</p>
|
|
4
|
+
<pre><%%= @secret %></pre>
|
|
5
|
+
<p>Expires <%%= @api_token.expires_at %>. Keep it private; anyone with this token can use your API as you.</p>
|
|
6
|
+
|
|
7
|
+
<p><%%= link_to "Back to API tokens", <%= identity.settings_helper_prefix %>_api_tokens_path %></p>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= @error %></p>
|
|
3
|
+
|
|
4
|
+
<h1>API tokens</h1>
|
|
5
|
+
<p>Use a token to access your application's API. Tokens expire after 90 days. Keep them secret; anyone holding one can access your API as you.</p>
|
|
6
|
+
|
|
7
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_api_tokens_path, data: { turbo: false } do |form| %>
|
|
8
|
+
<div>
|
|
9
|
+
<%%= form.label :name, "Token name" %><br>
|
|
10
|
+
<%%= form.text_field :name, required: true, maxlength: 100, placeholder: "My script" %>
|
|
11
|
+
</div>
|
|
12
|
+
<%- if sudoable? -%>
|
|
13
|
+
<%%= render "<%= identity.sudo_partial %>", form:, submit: "Create token" %>
|
|
14
|
+
<%- else -%>
|
|
15
|
+
<%%= form.submit "Create token" %>
|
|
16
|
+
<%- end -%>
|
|
17
|
+
<%% end %>
|
|
18
|
+
|
|
19
|
+
<ul>
|
|
20
|
+
<%% @api_tokens.each do |token| %>
|
|
21
|
+
<li>
|
|
22
|
+
<%%= token.name %> (created <%%= token.created_at %>, expires <%%= token.expires_at %>)
|
|
23
|
+
<%%= button_to "Revoke", <%= identity.settings_helper_prefix %>_api_token_path(token), method: :delete,
|
|
24
|
+
data: { turbo_confirm: "Revoke this token?" } %>
|
|
25
|
+
</li>
|
|
26
|
+
<%% end %>
|
|
27
|
+
</ul>
|
|
28
|
+
|
|
29
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
data/lib/generators/authnz_eleven/templates/erb/settings/authentications/events/index.html.erb.tt
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<h1>Security activity</h1>
|
|
2
|
+
|
|
3
|
+
<table>
|
|
4
|
+
<thead>
|
|
5
|
+
<tr><th>When</th><th>Event</th><th>IP address</th></tr>
|
|
6
|
+
</thead>
|
|
7
|
+
<tbody>
|
|
8
|
+
<%% @events.each do |event| %>
|
|
9
|
+
<tr>
|
|
10
|
+
<td><%%= event.occurred_at %></td>
|
|
11
|
+
<td><%%= event.event_type %></td>
|
|
12
|
+
<td><%%= event.ip_address %></td>
|
|
13
|
+
</tr>
|
|
14
|
+
<%% end %>
|
|
15
|
+
</tbody>
|
|
16
|
+
</table>
|
|
17
|
+
|
|
18
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<h1>Settings</h1>
|
|
5
|
+
|
|
6
|
+
<h2>Account</h2>
|
|
7
|
+
|
|
8
|
+
<ul>
|
|
9
|
+
<%- if email_changeable? -%>
|
|
10
|
+
<li><%%= link_to "Email address", edit_<%= identity.settings_helper_prefix %>_email_path %></li>
|
|
11
|
+
<%- elsif principals.email -%>
|
|
12
|
+
<li>Email address: <%%= <%= identity.current_class %>.user.email %></li>
|
|
13
|
+
<%- end -%>
|
|
14
|
+
<%- if phone_changeable? -%>
|
|
15
|
+
<li><%%= link_to "Phone number", edit_<%= identity.settings_helper_prefix %>_phone_path %></li>
|
|
16
|
+
<%- if phone_change_verification? -%>
|
|
17
|
+
<%% if <%= identity.current_class %>.user.pending_phone.present? %>
|
|
18
|
+
<li><%%= link_to "Verify your phone number", new_<%= identity.settings_helper_prefix %>_phone_verification_path %></li>
|
|
19
|
+
<%% end %>
|
|
20
|
+
<%- end -%>
|
|
21
|
+
<%- elsif principals.phone -%>
|
|
22
|
+
<li>Phone number: <%%= <%= identity.current_class %>.user.phone %></li>
|
|
23
|
+
<%- end -%>
|
|
24
|
+
<%- if password? -%>
|
|
25
|
+
<li><%%= link_to "Password", edit_<%= identity.settings_helper_prefix %>_password_path %></li>
|
|
26
|
+
<%- end -%>
|
|
27
|
+
<%- if invitable? -%>
|
|
28
|
+
<li><%%= link_to "Invite someone", new_<%= identity.settings_helper_prefix %>_invitation_path %></li>
|
|
29
|
+
<%- end -%>
|
|
30
|
+
<li><%%= link_to "Delete your account", <%= identity.settings_helper_prefix %>_user_path %></li>
|
|
31
|
+
</ul>
|
|
32
|
+
|
|
33
|
+
<h2>Security</h2>
|
|
34
|
+
|
|
35
|
+
<ul>
|
|
36
|
+
<%- if passkey? -%>
|
|
37
|
+
<li><%%= link_to "Passkeys", <%= identity.settings_helper_prefix %>_passkeys_path %></li>
|
|
38
|
+
<%- end -%>
|
|
39
|
+
<%- if omniauth? -%>
|
|
40
|
+
<li><%%= link_to "Connected accounts", <%= identity.settings_helper_prefix %>_omniauth_identities_path %></li>
|
|
41
|
+
<%- end -%>
|
|
42
|
+
<%- if totp? -%>
|
|
43
|
+
<%% if <%= identity.current_class %>.user.totp_enrolled_at? %>
|
|
44
|
+
<li><%%= link_to "Authenticator app", new_<%= identity.settings_helper_prefix %>_mfa_authenticator_path %></li>
|
|
45
|
+
<%% else %>
|
|
46
|
+
<li><%%= link_to "Set up an authenticator app", new_<%= identity.settings_helper_prefix %>_mfa_authenticator_path %></li>
|
|
47
|
+
<%% end %>
|
|
48
|
+
<%- end -%>
|
|
49
|
+
<%- if sms_second_factor? -%>
|
|
50
|
+
<%% if <%= identity.current_class %>.user.sms_enrolled_at? %>
|
|
51
|
+
<li><%%= link_to "Two-factor authentication by text", new_<%= identity.settings_helper_prefix %>_mfa_sms_path %></li>
|
|
52
|
+
<%% else %>
|
|
53
|
+
<li><%%= link_to "Set up two-factor authentication by text", new_<%= identity.settings_helper_prefix %>_mfa_sms_path %></li>
|
|
54
|
+
<%% end %>
|
|
55
|
+
<%- end -%>
|
|
56
|
+
<%- if security_keys? -%>
|
|
57
|
+
<li><%%= link_to "Security keys", <%= identity.settings_helper_prefix %>_mfa_security_keys_path %></li>
|
|
58
|
+
<%- end -%>
|
|
59
|
+
<%- if second_factor? -%>
|
|
60
|
+
<%% if <%= identity.current_class %>.user.second_factor_enrolled? %>
|
|
61
|
+
<%% if <%= identity.current_class %>.user.recovery_codes.any? %>
|
|
62
|
+
<li><%%= link_to "Recovery codes", <%= identity.settings_helper_prefix %>_mfa_recovery_codes_path %></li>
|
|
63
|
+
<%% else %>
|
|
64
|
+
<li><%%= link_to "Generate recovery codes", <%= identity.settings_helper_prefix %>_mfa_recovery_codes_path %></li>
|
|
65
|
+
<%% end %>
|
|
66
|
+
<%% end %>
|
|
67
|
+
<%- end -%>
|
|
68
|
+
<li><%%= link_to "Active sessions", <%= identity.settings_helper_prefix %>_sessions_path %></li>
|
|
69
|
+
<%- if api_tokens? -%>
|
|
70
|
+
<li><%%= link_to "API tokens", <%= identity.settings_helper_prefix %>_api_tokens_path %></li>
|
|
71
|
+
<%- end -%>
|
|
72
|
+
<%- if trackable? -%>
|
|
73
|
+
<li><%%= link_to "Sign-in history", <%= identity.settings_helper_prefix %>_authentications_events_path %></li>
|
|
74
|
+
<%- end -%>
|
|
75
|
+
</ul>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<%- optional = principals.email.optional? -%>
|
|
2
|
+
<%- field_label = optional ? %q(email ? "New email" : "Email") : %q("New email") -%>
|
|
3
|
+
<%- submit_label = optional ? %q(email ? "Change email" : "Add an email") : %q("Change email") -%>
|
|
4
|
+
<p style="color: green"><%%= notice %></p>
|
|
5
|
+
<p style="color: red"><%%= alert %></p>
|
|
6
|
+
|
|
7
|
+
<%- if optional -%>
|
|
8
|
+
<%% email = <%= identity.current_class %>.user.email_in_database.presence %>
|
|
9
|
+
|
|
10
|
+
<h1><%%= email ? "Change your email" : "Add an email" %></h1>
|
|
11
|
+
|
|
12
|
+
<%% if email %>
|
|
13
|
+
<p>
|
|
14
|
+
Current email: <%%= email %>
|
|
15
|
+
</p>
|
|
16
|
+
<%% end %>
|
|
17
|
+
<%- else -%>
|
|
18
|
+
<h1>Change your email</h1>
|
|
19
|
+
|
|
20
|
+
<p>
|
|
21
|
+
Current email: <%%= <%= identity.current_class %>.user.email_in_database %>
|
|
22
|
+
</p>
|
|
23
|
+
<%- end -%>
|
|
24
|
+
<%- if email_verifiable? -%>
|
|
25
|
+
<%% if <%= identity.current_class %>.user.pending_email_in_database.present? %>
|
|
26
|
+
<p>Unconfirmed email: <%%= <%= identity.current_class %>.user.pending_email_in_database %></p>
|
|
27
|
+
<%% end %>
|
|
28
|
+
<%- end -%>
|
|
29
|
+
|
|
30
|
+
<%% if @user.errors.any? %>
|
|
31
|
+
<ul style="color: red">
|
|
32
|
+
<%% @user.errors.full_messages.each do |message| %>
|
|
33
|
+
<li><%%= message %></li>
|
|
34
|
+
<%% end %>
|
|
35
|
+
</ul>
|
|
36
|
+
<%% end %>
|
|
37
|
+
|
|
38
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_email_path, method: :patch do |form| %>
|
|
39
|
+
<div>
|
|
40
|
+
<%%= form.label :email, <%= field_label %> %><br>
|
|
41
|
+
<%%= form.email_field :email, value: <%= email_verifiable? ? "#{identity.current_class}.user.pending_email || " : "" %><%= identity.current_class %>.user.email<%= principals.email.required? ? ", required: true" : "" %>, autocomplete: "email" %>
|
|
42
|
+
<%- if optional -%>
|
|
43
|
+
<%% if email %><small>Leave blank to remove your email.</small><%% end %>
|
|
44
|
+
<%- end -%>
|
|
45
|
+
</div>
|
|
46
|
+
<%- if sudoable? -%>
|
|
47
|
+
|
|
48
|
+
<%%= render "<%= identity.sudo_partial %>", form:, submit: <%= submit_label %> %>
|
|
49
|
+
<%- else -%>
|
|
50
|
+
<%- if password? -%>
|
|
51
|
+
|
|
52
|
+
<div>
|
|
53
|
+
<%%= form.label :password_challenge, "Current password" %><br>
|
|
54
|
+
<%%= form.password_field :password_challenge, autocomplete: "current-password" %>
|
|
55
|
+
</div>
|
|
56
|
+
<%- end -%>
|
|
57
|
+
|
|
58
|
+
<div><%%= form.submit <%= submit_label %> %></div>
|
|
59
|
+
<%- end -%>
|
|
60
|
+
<%% end %>
|
|
61
|
+
<%- if email_verifiable? -%>
|
|
62
|
+
|
|
63
|
+
<%% if <%= identity.current_class %>.user.pending_email_in_database.present? %>
|
|
64
|
+
<%%= button_to "Resend confirmation email", <%= identity.settings_helper_prefix %>_email_verification_path, method: :post %>
|
|
65
|
+
<%% end %>
|
|
66
|
+
<%- end -%>
|
|
67
|
+
|
|
68
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<h1>Invite someone</h1>
|
|
5
|
+
|
|
6
|
+
<%% if @invitation.errors.any? %>
|
|
7
|
+
<ul style="color: red">
|
|
8
|
+
<%% @invitation.errors.full_messages.each do |message| %>
|
|
9
|
+
<li><%%= message %></li>
|
|
10
|
+
<%% end %>
|
|
11
|
+
</ul>
|
|
12
|
+
<%% end %>
|
|
13
|
+
|
|
14
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_invitation_path, method: :post do |form| %>
|
|
15
|
+
<div>
|
|
16
|
+
<%%= form.label :sent_to, "<%= invitation_recipient_label %>" %><br>
|
|
17
|
+
<%%= form.<%= multi_channel_invitable? ? "text_field" : (email_invitable? ? "email_field" : "telephone_field") %> :sent_to, value: @invitation.sent_to, required: true, autofocus: true %>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<%- if teams? -%>
|
|
21
|
+
<div>
|
|
22
|
+
<%%= form.label :team_id, "Team" %><br>
|
|
23
|
+
<%%= form.select :team_id, @teams.map { |team| [ team.name, team.id ] },
|
|
24
|
+
include_blank: "No team, invite to #{<%= identity.config_reference %>.app_name}" %>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<%- end -%>
|
|
28
|
+
<div><%%= form.submit "Send invitation" %></div>
|
|
29
|
+
<%% end %>
|
|
30
|
+
|
|
31
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<%% if @user.totp_enrolled_at? %>
|
|
5
|
+
<h1>Two-factor authentication</h1>
|
|
6
|
+
|
|
7
|
+
<p>Two-factor authentication is on. You'll be asked for a code from your
|
|
8
|
+
authenticator app when you sign in.</p>
|
|
9
|
+
|
|
10
|
+
<h2>Add another device</h2>
|
|
11
|
+
|
|
12
|
+
<p>Scan this with any authenticator app to pair it with this account. Every paired
|
|
13
|
+
app shows the same code.</p>
|
|
14
|
+
|
|
15
|
+
<%%= raw @qr_svg %>
|
|
16
|
+
|
|
17
|
+
<p>Or enter this setup key manually:</p>
|
|
18
|
+
<pre><%%= @provisioning_uri %></pre>
|
|
19
|
+
|
|
20
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_mfa_authenticator_path, method: :post do |form| %>
|
|
21
|
+
<div>
|
|
22
|
+
<%%= form.label :code, "Enter a code from the app to check that it works" %><br>
|
|
23
|
+
<%%= form.text_field :code, required: true, autocomplete: "one-time-code", inputmode: "numeric" %>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div><%%= form.submit "Check this app" %></div>
|
|
27
|
+
<%% end %>
|
|
28
|
+
|
|
29
|
+
<h2>Turn it off</h2>
|
|
30
|
+
|
|
31
|
+
<p>Turning off two-factor authentication invalidates every authenticator app you've paired. Your recovery
|
|
32
|
+
codes are deleted once you have no second factor left.</p>
|
|
33
|
+
|
|
34
|
+
<%%= button_to "Turn off two-factor authentication", <%= identity.settings_helper_prefix %>_mfa_authenticator_path, method: :delete,
|
|
35
|
+
data: {turbo_confirm: "You'll no longer be asked for a code when you sign in. Continue?"} %>
|
|
36
|
+
<%% else %>
|
|
37
|
+
<h1>Set up two-factor authentication</h1>
|
|
38
|
+
|
|
39
|
+
<p>Scan this QR code with your authenticator app:</p>
|
|
40
|
+
|
|
41
|
+
<%%= raw @qr_svg %>
|
|
42
|
+
|
|
43
|
+
<p>Or enter this setup key manually:</p>
|
|
44
|
+
<pre><%%= @provisioning_uri %></pre>
|
|
45
|
+
|
|
46
|
+
<%%# Disable Turbo because this successful response is the only page that reveals the newly generated recovery codes. %>
|
|
47
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_mfa_authenticator_path, method: :post, data: {turbo: false} do |form| %>
|
|
48
|
+
<div>
|
|
49
|
+
<%%= form.label :code, "Enter the 6-digit code to confirm" %><br>
|
|
50
|
+
<%%= form.text_field :code, required: true, autofocus: true, autocomplete: "one-time-code", inputmode: "numeric" %>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div><%%= form.submit "Enable two-factor authentication" %></div>
|
|
54
|
+
<%% end %>
|
|
55
|
+
<%% end %>
|
|
56
|
+
|
|
57
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Save your recovery codes</h1>
|
|
4
|
+
|
|
5
|
+
<p><strong>This is the only time these will be shown.</strong> Each one signs you in
|
|
6
|
+
once if you lose your authenticator app, so store them somewhere safe.</p>
|
|
7
|
+
|
|
8
|
+
<ul>
|
|
9
|
+
<%% @codes.each do |code| %>
|
|
10
|
+
<li><code><%%= code %></code></li>
|
|
11
|
+
<%% end %>
|
|
12
|
+
</ul>
|
|
13
|
+
|
|
14
|
+
<p><%%= button_to "I've saved them", complete_<%= identity.settings_helper_prefix %>_mfa_recovery_codes_path, method: :post %></p>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Recovery codes</h1>
|
|
4
|
+
|
|
5
|
+
<p>Each one signs you in once if you can't use your second factor. They can't be shown to you again. If you no longer have yours, generate
|
|
6
|
+
a new set. Doing so invalidates the codes you have now.</p>
|
|
7
|
+
|
|
8
|
+
<p>You have <%%= @remaining %> unused recovery <%%= "code".pluralize(@remaining) %>.</p>
|
|
9
|
+
|
|
10
|
+
<%%= button_to "Generate a new set", <%= identity.settings_helper_prefix %>_mfa_recovery_codes_path, method: :post,
|
|
11
|
+
data: {turbo: false} %>
|
|
12
|
+
|
|
13
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Rename security key</h1>
|
|
4
|
+
|
|
5
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_mfa_security_key_path(@security_key), method: :patch do |form| %>
|
|
6
|
+
<div>
|
|
7
|
+
<%%= label_tag :name %><br>
|
|
8
|
+
<%%= text_field_tag :name, @security_key.name, required: true, autofocus: true %>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<div><%%= form.submit "Save" %></div>
|
|
12
|
+
<%% end %>
|
|
13
|
+
|
|
14
|
+
<p><%%= link_to "Back to security keys", <%= identity.settings_helper_prefix %>_mfa_security_keys_path %></p>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Security keys</h1>
|
|
4
|
+
|
|
5
|
+
<ul>
|
|
6
|
+
<%% @security_keys.each do |security_key| %>
|
|
7
|
+
<li>
|
|
8
|
+
<%%= security_key.name %>
|
|
9
|
+
<%%= link_to "Rename", edit_<%= identity.settings_helper_prefix %>_mfa_security_key_path(security_key) %>
|
|
10
|
+
<%%= button_to "Remove", <%= identity.settings_helper_prefix %>_mfa_security_key_path(security_key), method: :delete,
|
|
11
|
+
data: {turbo_confirm: "Remove this security key?"} %>
|
|
12
|
+
</li>
|
|
13
|
+
<%% end %>
|
|
14
|
+
</ul>
|
|
15
|
+
|
|
16
|
+
<p>Your recovery codes are deleted once you have no second factor left.</p>
|
|
17
|
+
|
|
18
|
+
<p><%%= link_to "Add a security key", new_<%= identity.settings_helper_prefix %>_mfa_security_key_path %></p>
|
|
19
|
+
|
|
20
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<p style="color: red"><%%= alert %></p>
|
|
2
|
+
|
|
3
|
+
<h1>Add a security key</h1>
|
|
4
|
+
|
|
5
|
+
<p>Plug in or activate your security key, then click below to register it.</p>
|
|
6
|
+
|
|
7
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_mfa_security_keys_path, method: :post, data: {turbo: false} do |form| %>
|
|
8
|
+
<div data-controller="webauthn"
|
|
9
|
+
data-webauthn-challenge-url-value="<%%= new_<%= identity.settings_helper_prefix %>_mfa_security_key_path(format: :json) %>">
|
|
10
|
+
<%%= form.hidden_field :credential, data: { webauthn_target: "field" } %>
|
|
11
|
+
<%%= form.button "Register security key", type: "button",
|
|
12
|
+
data: { webauthn_target: "button", action: "webauthn#createCredential" } %>
|
|
13
|
+
<p data-webauthn-target="error" style="color: red" hidden></p>
|
|
14
|
+
</div>
|
|
15
|
+
<%% end %>
|
|
16
|
+
|
|
17
|
+
<p><%%= link_to "Back to security keys", <%= identity.settings_helper_prefix %>_mfa_security_keys_path %></p>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<%% if @user.sms_enrolled_at? %>
|
|
5
|
+
<h1>Two-factor authentication</h1>
|
|
6
|
+
|
|
7
|
+
<p>Two-factor authentication is on. We'll text you a code when you sign in.</p>
|
|
8
|
+
|
|
9
|
+
<h2>Turn it off</h2>
|
|
10
|
+
|
|
11
|
+
<p>Your recovery codes are deleted once you have no second factor left.</p>
|
|
12
|
+
|
|
13
|
+
<%%= button_to "Turn off two-factor authentication", <%= identity.settings_helper_prefix %>_mfa_sms_path, method: :delete,
|
|
14
|
+
data: {turbo_confirm: "You'll no longer be asked for a code when you sign in. Continue?"} %>
|
|
15
|
+
<%% else %>
|
|
16
|
+
<h1>Set up two-factor authentication</h1>
|
|
17
|
+
|
|
18
|
+
<p>We'll text a six-digit code to the number on your account, and ask for one
|
|
19
|
+
every time you sign in.</p>
|
|
20
|
+
|
|
21
|
+
<%%= button_to "Text me a code", <%= identity.settings_helper_prefix %>_mfa_sms_path %>
|
|
22
|
+
|
|
23
|
+
<%%# Disable Turbo because this successful response is the only page that reveals the newly generated recovery codes. %>
|
|
24
|
+
<%%= form_with url: <%= identity.settings_helper_prefix %>_mfa_sms_path, method: :patch, data: {turbo: false} do |form| %>
|
|
25
|
+
<div>
|
|
26
|
+
<%%= form.label :code, "Enter the code to confirm" %><br>
|
|
27
|
+
<%%= form.text_field :code, required: true, autocomplete: "one-time-code",
|
|
28
|
+
inputmode: "numeric", pattern: "[0-9]*" %>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div><%%= form.submit "Enable two-factor authentication" %></div>
|
|
32
|
+
<%% end %>
|
|
33
|
+
<%% end %>
|
|
34
|
+
|
|
35
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|
data/lib/generators/authnz_eleven/templates/erb/settings/omniauth_identities/index.html.erb.tt
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<p style="color: green"><%%= notice %></p>
|
|
2
|
+
<p style="color: red"><%%= alert %></p>
|
|
3
|
+
|
|
4
|
+
<h1>Connected accounts</h1>
|
|
5
|
+
|
|
6
|
+
<%% if @omniauth_identities.any? %>
|
|
7
|
+
<ul>
|
|
8
|
+
<%% @omniauth_identities.each do |omniauth_identity| %>
|
|
9
|
+
<li>
|
|
10
|
+
<%%= omniauth_identity.provider_name %>
|
|
11
|
+
<small>linked <%%= omniauth_identity.created_at.to_date %></small>
|
|
12
|
+
<%%= button_to "Unlink", <%= identity.settings_helper_prefix %>_omniauth_identity_path(omniauth_identity), method: :delete %>
|
|
13
|
+
</li>
|
|
14
|
+
<%% end %>
|
|
15
|
+
</ul>
|
|
16
|
+
<%% else %>
|
|
17
|
+
<p>No connected accounts yet.</p>
|
|
18
|
+
<%% end %>
|
|
19
|
+
|
|
20
|
+
<%%# Add one connection button per configured provider above this development-only example. %>
|
|
21
|
+
<%% if Rails.env.development? %>
|
|
22
|
+
<fieldset style="color: gray; margin-top: 1em;">
|
|
23
|
+
<legend><em>Development</em></legend>
|
|
24
|
+
<%%= button_to "Connect Developer", "<%= omniauth_path_prefix %>/developer", data: {turbo: false} %>
|
|
25
|
+
</fieldset>
|
|
26
|
+
<%% end %>
|
|
27
|
+
|
|
28
|
+
<p><%%= link_to "Back to settings", <%= identity.settings_helper_prefix %>_path %></p>
|