booth 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/LICENSE.md +1 -2
- data/README.md +37 -6
- data/app/assets/images/booth/browsers/README.md +1 -2
- data/app/assets/images/booth/browsers/chrome.svg +1 -1
- data/app/assets/images/booth/browsers/edge.svg +1 -1
- data/app/assets/images/booth/browsers/firefox.svg +1 -1
- data/app/assets/images/booth/browsers/opera.svg +1 -1
- data/app/assets/images/booth/browsers/safari.svg +1 -1
- data/app/assets/images/booth/fido/passkey_mark_a.svg +10 -0
- data/app/assets/images/booth/fido/passkey_mark_a_black.svg +32 -0
- data/app/assets/images/booth/fido/passkey_mark_a_reverse.svg +33 -0
- data/app/assets/images/booth/fido/passkey_mark_a_white.svg +32 -0
- data/app/assets/images/booth/fido/passkey_mark_b_black.svg +1 -0
- data/app/assets/images/booth/platforms/android.svg +1 -6
- data/app/assets/images/booth/platforms/apple.svg +1 -6
- data/app/assets/images/booth/platforms/linux.svg +1 -6
- data/app/assets/images/booth/platforms/windows.svg +1 -6
- data/app/assets/javascripts/booth/authentication.js +29 -0
- data/app/assets/javascripts/booth/authentication.js.map +1 -0
- data/app/assets/javascripts/booth/error.js +38 -0
- data/app/assets/javascripts/booth/error.js.map +1 -0
- data/app/assets/javascripts/booth/form.js +78 -0
- data/app/assets/javascripts/booth/form.js.map +1 -0
- data/app/assets/javascripts/booth/gui.js +53 -0
- data/app/assets/javascripts/booth/gui.js.map +1 -0
- data/app/assets/javascripts/booth/registration.js +29 -0
- data/app/assets/javascripts/booth/registration.js.map +1 -0
- data/app/assets/javascripts/booth/setup.js +14 -0
- data/app/assets/javascripts/booth/verification.js +49 -0
- data/app/assets/javascripts/booth/verification.js.map +1 -0
- data/app/assets/javascripts/declarations/authentication.d.ts +6 -0
- data/app/assets/javascripts/declarations/error.d.ts +36 -0
- data/app/assets/javascripts/declarations/form.d.ts +8 -0
- data/app/assets/javascripts/declarations/gui.d.ts +4 -0
- data/app/assets/javascripts/declarations/registration.d.ts +6 -0
- data/app/assets/javascripts/declarations/setup.d.ts +3 -0
- data/app/assets/javascripts/declarations/verification.d.ts +6 -0
- data/app/assets/javascripts/src/authentication.ts +41 -0
- data/app/assets/javascripts/src/error.ts +35 -0
- data/app/assets/javascripts/src/form.ts +90 -0
- data/app/assets/javascripts/src/gui.ts +59 -0
- data/app/assets/javascripts/src/registration.ts +44 -0
- data/app/assets/javascripts/src/verification.ts +61 -0
- data/app/assets/stylesheets/booth/booth.css +3 -0
- data/config/importmap.rb +11 -0
- data/config/locales/de.yml +14 -38
- data/config/locales/en.yml +17 -36
- data/data/combined_aaguid.json +1 -0
- data/lib/booth/adminland/credentials/create.rb +10 -12
- data/lib/booth/adminland/credentials/index.rb +31 -0
- data/lib/booth/adminland/onboardings/create.rb +24 -15
- data/lib/booth/adminland/onboardings/destroy.rb +8 -4
- data/lib/booth/adminland/onboardings/find.rb +52 -45
- data/lib/booth/adminland/onboardings/find_unconsumed.rb +61 -0
- data/lib/booth/adminland/onboardings/index.rb +6 -3
- data/lib/booth/adminland/periodic_cleanup.rb +7 -2
- data/lib/booth/adminland.rb +17 -18
- data/lib/booth/coercers/domain.rb +11 -0
- data/lib/booth/coercers/request.rb +51 -0
- data/lib/booth/coercers/scope.rb +11 -0
- data/lib/booth/comparisons/domain.rb +38 -0
- data/lib/booth/comparisons/scope.rb +38 -0
- data/lib/booth/concerns/action.rb +25 -13
- data/lib/booth/concerns/transition.rb +5 -2
- data/lib/booth/configuration.rb +14 -73
- data/lib/booth/configure.rb +3 -10
- data/lib/booth/{audits/register → core/audit}/completed_onboarding.rb +8 -6
- data/lib/booth/core/audit/credential_created.rb +24 -0
- data/lib/booth/core/audit/logout.rb +24 -0
- data/lib/booth/core/authenticators/confirm.rb +30 -0
- data/lib/booth/core/authenticators/step.rb +24 -0
- data/lib/booth/core/cooldowns/distance_of_time.rb +50 -0
- data/lib/booth/core/cooldowns/strategies/exponential.rb +88 -0
- data/lib/booth/core/cooldowns/strategies/global.rb +66 -0
- data/lib/booth/core/cooldowns/strategies/result.rb +27 -0
- data/lib/booth/core/credentials/create.rb +32 -0
- data/lib/booth/core/credentials/find_by_username.rb +63 -0
- data/lib/booth/core/credentials/index.rb +15 -0
- data/lib/booth/core/credentials/webauth_challenge.rb +37 -0
- data/lib/booth/core/geolocation.rb +25 -0
- data/lib/booth/core/onboardings/find.rb +92 -0
- data/lib/booth/core/onboardings/step.rb +19 -0
- data/lib/booth/core/remotes/get.rb +45 -0
- data/lib/booth/core/remotes/respond.rb +82 -0
- data/lib/booth/core/remotes/set_for_login.rb +31 -0
- data/lib/booth/core/sessions/create_and_login.rb +63 -0
- data/lib/booth/core/sessions/historical_locations.rb +22 -0
- data/lib/booth/core/sessions/index.rb +66 -0
- data/lib/booth/core/sessions/revoke.rb +59 -0
- data/lib/booth/core/sessions/revoke_all_others.rb +49 -0
- data/lib/booth/core/sessions/to_passport.rb +35 -0
- data/lib/booth/core/webauth/authentication_verification.rb +76 -0
- data/lib/booth/core/webauth/options_for_create.rb +56 -0
- data/lib/booth/core/webauth/options_for_get.rb +30 -0
- data/lib/booth/core/webauth/provider.rb +36 -0
- data/lib/booth/core/webauth/registration_verification.rb +100 -0
- data/lib/booth/credential.rb +35 -0
- data/lib/booth/engine.rb +15 -4
- data/lib/booth/errors.rb +2 -0
- data/lib/booth/hooks/after_fetch.rb +14 -6
- data/lib/booth/hooks/before_logout.rb +5 -3
- data/lib/booth/hooks/serialize_from_session.rb +13 -5
- data/lib/booth/hooks/serialize_into_session.rb +6 -3
- data/lib/booth/logging.rb +13 -42
- data/lib/booth/models/application_record.rb +3 -0
- data/lib/booth/models/audit.rb +10 -11
- data/lib/booth/models/authenticator.rb +6 -9
- data/lib/booth/models/credential.rb +17 -20
- data/lib/booth/models/onboarding.rb +16 -39
- data/lib/booth/models/{contest.rb → remote.rb} +13 -14
- data/lib/booth/models/remotes/scopes/recently_created.rb +26 -0
- data/lib/booth/models/remotes/scopes/recently_responded.rb +35 -0
- data/lib/booth/models/session.rb +15 -10
- data/lib/booth/models/user_agent.rb +2 -0
- data/lib/booth/request.rb +43 -22
- data/lib/booth/requests/agent.rb +3 -1
- data/lib/booth/requests/authentication.rb +15 -5
- data/lib/booth/requests/ip.rb +4 -2
- data/lib/booth/requests/return_path.rb +4 -2
- data/lib/booth/requests/session.rb +6 -4
- data/lib/booth/requests/storage.rb +5 -31
- data/lib/booth/requests/storages/login.rb +35 -29
- data/lib/booth/requests/storages/registration.rb +2 -0
- data/lib/booth/requests/storages/webauth.rb +3 -0
- data/lib/booth/requests/sudo.rb +6 -50
- data/lib/booth/routes/userland.rb +13 -59
- data/lib/booth/syntaxes/domain.rb +46 -0
- data/lib/booth/syntaxes/email.rb +11 -8
- data/lib/booth/syntaxes/ip.rb +6 -4
- data/lib/booth/syntaxes/remote_code.rb +60 -0
- data/lib/booth/syntaxes/scope.rb +7 -3
- data/lib/booth/syntaxes/secret_key.rb +8 -6
- data/lib/booth/syntaxes/username.rb +23 -10
- data/lib/booth/syntaxes/uuid.rb +3 -1
- data/lib/booth/test.rb +27 -22
- data/lib/booth/testing/incorporation_test_case.rb +29 -0
- data/lib/booth/testing/shortcuts.rb +77 -0
- data/lib/booth/testing/support/assert_all_partials_were_covered.rb +69 -0
- data/lib/booth/testing/support/assert_logged_in.rb +68 -0
- data/lib/booth/{test → testing}/support/assert_logged_out.rb +7 -4
- data/lib/booth/testing/support/assert_partial.rb +56 -0
- data/lib/booth/{test → testing}/support/force_login.rb +10 -4
- data/lib/booth/{test → testing}/support/get_session_value.rb +8 -6
- data/lib/booth/testing/support/scenario.rb +23 -0
- data/lib/booth/testing/support/shortcuts/create_and_onboard.rb +56 -0
- data/lib/booth/testing/support/shortcuts/login_with_passkey.rb +55 -0
- data/lib/booth/testing/support/shortcuts/register_new_passkey.rb +51 -0
- data/lib/booth/testing/support/soft_reset_session.rb +24 -0
- data/lib/booth/testing/support/virtual_authenticators/create.rb +34 -0
- data/lib/booth/testing/support/virtual_authenticators/destroy.rb +20 -0
- data/lib/booth/testing/support/virtual_authenticators/enable.rb +24 -0
- data/lib/booth/testing/support/virtual_authenticators/load.rb +38 -0
- data/lib/booth/testing/support/virtual_authenticators/manager.rb +124 -0
- data/lib/booth/testing/support/visit.rb +62 -0
- data/lib/booth/testing/userland/login_remotely.rb +100 -0
- data/lib/booth/testing/userland/onboarding_first_time.rb +81 -0
- data/lib/booth/testing/userland/onboarding_to_reset_passkeys.rb +129 -0
- data/lib/booth/testing/userland/registration_with_passkey.rb +93 -0
- data/lib/booth/testing/userland/registration_without_passkey.rb +101 -0
- data/lib/booth/testing/userland/sessions_manage_behavior.rb +68 -0
- data/lib/booth/testing/userland/sessions_revoke_all_others.rb +17 -0
- data/lib/booth/testing/userland/sessions_revoke_one.rb +17 -0
- data/lib/booth/testing/userland.rb +36 -0
- data/lib/booth/to_struct.rb +9 -2
- data/lib/booth/userland/extract_flash_messages.rb +10 -3
- data/lib/booth/userland/logins/create.rb +8 -6
- data/lib/booth/userland/logins/destroy.rb +23 -6
- data/lib/booth/userland/logins/new.rb +23 -25
- data/lib/booth/userland/logins/transitions/create/choose_username.rb +62 -27
- data/lib/booth/userland/logins/transitions/create/skip_remotes.rb +18 -14
- data/lib/booth/userland/logins/transitions/create/webauth_authentication_initiation.rb +54 -48
- data/lib/booth/userland/logins/transitions/create/webauth_authentication_verification.rb +62 -58
- data/lib/booth/userland/logins/transitions/new/already_logged_in.rb +4 -3
- data/lib/booth/userland/logins/transitions/new/fallible.rb +4 -0
- data/lib/booth/userland/logins/transitions/new/{mode_username_and_password.rb → missing_authenticators.rb} +5 -4
- data/lib/booth/userland/logins/transitions/new/mode_username_and_webauth.rb +6 -4
- data/lib/booth/userland/logins/transitions/new/no_username_chosen.rb +3 -1
- data/lib/booth/userland/logins/transitions/new/remote_session_available.rb +20 -13
- data/lib/booth/userland/logins/transitions/new/timed_out.rb +3 -1
- data/lib/booth/userland/onboardings/show.rb +65 -39
- data/lib/booth/userland/onboardings/update.rb +46 -38
- data/lib/booth/userland/registrations/create.rb +51 -20
- data/lib/booth/userland/registrations/new.rb +6 -7
- data/lib/booth/userland/remotes/show.rb +56 -0
- data/lib/booth/userland/{personal_contests → remotes}/update.rb +5 -3
- data/lib/booth/userland/sessions/destroy_one_or_other.rb +3 -16
- data/lib/booth/userland/sessions/index.rb +4 -2
- data/lib/booth/userland/sessions/show.rb +5 -6
- data/lib/booth/userland/sessions/transitions/destroy/enter_webauth.rb +8 -6
- data/lib/booth/userland/sessions/transitions/destroy/webauth_authentication_initiation.rb +8 -6
- data/lib/booth/userland/sessions/transitions/destroy/webauth_authentication_verification.rb +7 -5
- data/lib/booth/userland/sessions/transitions/show/enter_webauth.rb +8 -6
- data/lib/booth/userland/webauths/create.rb +20 -17
- data/lib/booth/userland/webauths/destroy.rb +6 -16
- data/lib/booth/userland/webauths/guards/sudo.rb +10 -5
- data/lib/booth/userland/webauths/index.rb +4 -2
- data/lib/booth/userland/webauths/new.rb +7 -22
- data/lib/booth/userland/webauths/sudo.rb +3 -1
- data/lib/booth/userland/webauths/transitions/create/authentication_initiation.rb +8 -11
- data/lib/booth/userland/webauths/transitions/create/authentication_verification.rb +11 -13
- data/lib/booth/userland/webauths/transitions/create/choose_nickname.rb +8 -5
- data/lib/booth/userland/webauths/transitions/create/registration_initiation.rb +15 -14
- data/lib/booth/userland/webauths/transitions/create/registration_verification.rb +34 -28
- data/lib/booth/userland/webauths/transitions/create/reset.rb +2 -0
- data/lib/booth/userland/webauths/transitions/new/step.rb +3 -1
- data/lib/booth/userland/webauths/transitions/sudo/authentication_initiation.rb +5 -10
- data/lib/booth/userland/webauths/transitions/sudo/authentication_verification.rb +4 -2
- data/lib/booth/userland.rb +53 -109
- data/lib/booth/version.rb +3 -1
- data/lib/booth.rb +6 -236
- data/lib/generators/booth/migration/migration_generator.rb +2 -1
- data/lib/generators/booth/migration/templates/add_credential_to_users.erb +6 -4
- data/lib/generators/booth/migration/templates/create_booth_tables.erb +61 -72
- metadata +124 -571
- data/app/assets/config/booth_manifest.js +0 -15
- data/app/assets/images/booth/browsers/internet_explorer.svg +0 -1
- data/app/assets/javascripts/booth/all.js +0 -162
- data/app/assets/javascripts/booth/all.js.map +0 -1
- data/app/assets/javascripts/booth/booth.ts +0 -194
- data/app/assets/javascripts/booth/webauthn-json.ts +0 -99
- data/lib/booth/adminland/recoveries/consume.rb +0 -70
- data/lib/booth/audits/register/added_otp.rb +0 -22
- data/lib/booth/audits/register/changed_otp.rb +0 -22
- data/lib/booth/audits/register/correct_otp.rb +0 -42
- data/lib/booth/audits/register/correct_password.rb +0 -43
- data/lib/booth/audits/register/logout.rb +0 -22
- data/lib/booth/audits/register/requested_password_reset.rb +0 -22
- data/lib/booth/audits/register/wrong_otp.rb +0 -22
- data/lib/booth/audits/register/wrong_password.rb +0 -25
- data/lib/booth/authenticators/confirm.rb +0 -34
- data/lib/booth/authenticators/credential_mode_after_confirmation.rb +0 -25
- data/lib/booth/authenticators/step.rb +0 -19
- data/lib/booth/contests/get.rb +0 -36
- data/lib/booth/contests/respond.rb +0 -78
- data/lib/booth/contests/set_for_login.rb +0 -28
- data/lib/booth/cooldowns/distance_of_time.rb +0 -46
- data/lib/booth/cooldowns/otp.rb +0 -22
- data/lib/booth/cooldowns/password.rb +0 -44
- data/lib/booth/cooldowns/password_reset.rb +0 -24
- data/lib/booth/cooldowns/strategies/exponential.rb +0 -82
- data/lib/booth/cooldowns/strategies/global.rb +0 -62
- data/lib/booth/cooldowns/strategies/result.rb +0 -22
- data/lib/booth/credentials/create.rb +0 -28
- data/lib/booth/credentials/create_with_onboarding.rb +0 -26
- data/lib/booth/credentials/find_by_username.rb +0 -45
- data/lib/booth/credentials/mode.rb +0 -69
- data/lib/booth/credentials/modes/otp_addable.rb +0 -23
- data/lib/booth/credentials/modes/otp_changeable.rb +0 -23
- data/lib/booth/credentials/modes/otp_manageable.rb +0 -17
- data/lib/booth/credentials/modes/otp_removable.rb +0 -23
- data/lib/booth/credentials/modes/password_addable.rb +0 -29
- data/lib/booth/credentials/modes/password_changeable.rb +0 -31
- data/lib/booth/credentials/modes/password_manageable.rb +0 -17
- data/lib/booth/credentials/modes/password_removable.rb +0 -24
- data/lib/booth/credentials/modes/password_removal_requires_user_verifiable_webauth.rb +0 -16
- data/lib/booth/credentials/modes/webauth_addable.rb +0 -26
- data/lib/booth/credentials/modes/webauth_manageable.rb +0 -16
- data/lib/booth/credentials/modes/webauth_removable.rb +0 -25
- data/lib/booth/credentials/otp_authentication.rb +0 -59
- data/lib/booth/credentials/password_authentication.rb +0 -72
- data/lib/booth/credentials/webauth_challenge.rb +0 -28
- data/lib/booth/geolocation.rb +0 -20
- data/lib/booth/logger.rb +0 -41
- data/lib/booth/method_object.rb +0 -73
- data/lib/booth/mode.rb +0 -22
- data/lib/booth/models/concerns/modeable.rb +0 -50
- data/lib/booth/models/concerns/otpable.rb +0 -37
- data/lib/booth/models/concerns/passwordable.rb +0 -58
- data/lib/booth/models/contests/scopes/recently_created.rb +0 -23
- data/lib/booth/models/contests/scopes/recently_responded.rb +0 -32
- data/lib/booth/models/password_reset.rb +0 -41
- data/lib/booth/models/recovery.rb +0 -32
- data/lib/booth/models/registration.rb +0 -10
- data/lib/booth/modes/base.rb +0 -25
- data/lib/booth/modes/username_and_password.rb +0 -7
- data/lib/booth/modes/username_and_webauth.rb +0 -7
- data/lib/booth/modes/username_password_and_otp.rb +0 -7
- data/lib/booth/modes/username_password_and_webauth.rb +0 -7
- data/lib/booth/onboardings/find.rb +0 -35
- data/lib/booth/onboardings/propagate_to_credential.rb +0 -63
- data/lib/booth/onboardings/step.rb +0 -68
- data/lib/booth/password_resets/create.rb +0 -57
- data/lib/booth/password_resets/find.rb +0 -36
- data/lib/booth/password_resets/propagate_to_credential.rb +0 -36
- data/lib/booth/password_resets/step.rb +0 -18
- data/lib/booth/recoveries/create.rb +0 -45
- data/lib/booth/requests/storages/otp.rb +0 -54
- data/lib/booth/requests/storages/password.rb +0 -49
- data/lib/booth/requests/storages/password_reset.rb +0 -35
- data/lib/booth/requests/storages/recovery.rb +0 -35
- data/lib/booth/sessions/create_and_login.rb +0 -46
- data/lib/booth/sessions/historical_locations.rb +0 -18
- data/lib/booth/sessions/index.rb +0 -59
- data/lib/booth/sessions/revoke.rb +0 -51
- data/lib/booth/sessions/revoke_all_others.rb +0 -43
- data/lib/booth/sessions/to_passport.rb +0 -51
- data/lib/booth/syntaxes/contest_code.rb +0 -58
- data/lib/booth/syntaxes/otp.rb +0 -57
- data/lib/booth/syntaxes/scope_comparison.rb +0 -28
- data/lib/booth/test/helpers.rb +0 -63
- data/lib/booth/test/support/assert_all_partials_were_covered.rb +0 -63
- data/lib/booth/test/support/assert_logged_in.rb +0 -49
- data/lib/booth/test/support/assert_partial.rb +0 -29
- data/lib/booth/test/support/otp_code_from_session.rb +0 -30
- data/lib/booth/test/support/soft_reset_session.rb +0 -22
- data/lib/booth/test/userland/logins/missing_authenticators.rb +0 -72
- data/lib/booth/test/userland/logins/missing_onboarding.rb +0 -35
- data/lib/booth/test/userland/logins/username_and_password.rb +0 -40
- data/lib/booth/test/userland/logins/username_and_webauth.rb +0 -75
- data/lib/booth/test/userland/logins/username_password_and_otp.rb +0 -45
- data/lib/booth/test/userland/logins/username_password_and_webauth.rb +0 -86
- data/lib/booth/test/userland/onboardings/already_logged_in.rb +0 -64
- data/lib/booth/test/userland/onboardings/otp.rb +0 -63
- data/lib/booth/test/userland/onboardings/password.rb +0 -49
- data/lib/booth/test/userland/onboardings/timeout.rb +0 -47
- data/lib/booth/test/userland/otps/manage.rb +0 -86
- data/lib/booth/test/userland/password_resets/reset.rb +0 -102
- data/lib/booth/test/userland.rb +0 -38
- data/lib/booth/test/webauthn/disable.rb +0 -17
- data/lib/booth/test/webauthn/enable.rb +0 -19
- data/lib/booth/test/webauthn/virtual_authenticators/create.rb +0 -38
- data/lib/booth/test/webauthn/virtual_authenticators/destroy.rb +0 -20
- data/lib/booth/userland/logins/transitions/create/enter_otp.rb +0 -70
- data/lib/booth/userland/logins/transitions/create/verify_password.rb +0 -70
- data/lib/booth/userland/logins/transitions/new/mode_first_time.rb +0 -20
- data/lib/booth/userland/logins/transitions/new/mode_username_password_and_otp.rb +0 -24
- data/lib/booth/userland/logins/transitions/new/mode_username_password_and_webauth.rb +0 -24
- data/lib/booth/userland/onboardings/transitions/update/choose_mode.rb +0 -58
- data/lib/booth/userland/onboardings/transitions/update/choose_password.rb +0 -41
- data/lib/booth/userland/onboardings/transitions/update/choose_webauth_nickname.rb +0 -50
- data/lib/booth/userland/onboardings/transitions/update/confirm_otp.rb +0 -58
- data/lib/booth/userland/onboardings/transitions/update/confirm_password.rb +0 -49
- data/lib/booth/userland/onboardings/transitions/update/register_otp.rb +0 -31
- data/lib/booth/userland/onboardings/transitions/update/reset_otp.rb +0 -40
- data/lib/booth/userland/onboardings/transitions/update/reset_password.rb +0 -35
- data/lib/booth/userland/onboardings/transitions/update/reset_webauth.rb +0 -46
- data/lib/booth/userland/onboardings/transitions/update/webauth_authentication_initiation.rb +0 -40
- data/lib/booth/userland/onboardings/transitions/update/webauth_authentication_verification.rb +0 -59
- data/lib/booth/userland/onboardings/transitions/update/webauth_registration_initiation.rb +0 -46
- data/lib/booth/userland/onboardings/transitions/update/webauth_registration_verification.rb +0 -56
- data/lib/booth/userland/otps/destroy.rb +0 -42
- data/lib/booth/userland/otps/edit.rb +0 -72
- data/lib/booth/userland/otps/guards/manageable.rb +0 -21
- data/lib/booth/userland/otps/guards/sudo.rb +0 -23
- data/lib/booth/userland/otps/show.rb +0 -36
- data/lib/booth/userland/otps/sudo.rb +0 -51
- data/lib/booth/userland/otps/transitions/update/confirm.rb +0 -84
- data/lib/booth/userland/otps/transitions/update/register.rb +0 -40
- data/lib/booth/userland/otps/transitions/update/reset.rb +0 -31
- data/lib/booth/userland/otps/update.rb +0 -34
- data/lib/booth/userland/password_resets/create.rb +0 -73
- data/lib/booth/userland/password_resets/guards/logged_out.rb +0 -21
- data/lib/booth/userland/password_resets/new.rb +0 -57
- data/lib/booth/userland/password_resets/show.rb +0 -77
- data/lib/booth/userland/password_resets/transitions/update/choose_password.rb +0 -48
- data/lib/booth/userland/password_resets/transitions/update/confirm_password.rb +0 -54
- data/lib/booth/userland/password_resets/transitions/update/reset_password.rb +0 -29
- data/lib/booth/userland/password_resets/update.rb +0 -65
- data/lib/booth/userland/passwords/destroy.rb +0 -41
- data/lib/booth/userland/passwords/edit.rb +0 -54
- data/lib/booth/userland/passwords/guards/manageable.rb +0 -21
- data/lib/booth/userland/passwords/guards/removable.rb +0 -21
- data/lib/booth/userland/passwords/guards/sudo.rb +0 -21
- data/lib/booth/userland/passwords/remove.rb +0 -34
- data/lib/booth/userland/passwords/show.rb +0 -32
- data/lib/booth/userland/passwords/sudo.rb +0 -55
- data/lib/booth/userland/passwords/transitions/remove/step.rb +0 -27
- data/lib/booth/userland/passwords/transitions/update/choose_password.rb +0 -62
- data/lib/booth/userland/passwords/transitions/update/confirm_password.rb +0 -82
- data/lib/booth/userland/passwords/update.rb +0 -33
- data/lib/booth/userland/personal_contests/show.rb +0 -60
- data/lib/booth/userland/recoveries/create.rb +0 -48
- data/lib/booth/userland/recoveries/new.rb +0 -35
- data/lib/booth/userland/sessions/transitions/destroy/enter_password.rb +0 -50
- data/lib/booth/userland/sessions/transitions/destroy/verify_password.rb +0 -83
- data/lib/booth/userland/webauths/guards/manageable.rb +0 -21
- data/lib/booth/webauth/authentication_verification.rb +0 -68
- data/lib/booth/webauth/demand_user_verification.rb +0 -29
- data/lib/booth/webauth/options_for_create.rb +0 -46
- data/lib/booth/webauth/options_for_get.rb +0 -29
- data/lib/generators/booth/migration/templates/create_booth_mode_types.erb +0 -20
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Logins
|
|
5
|
-
class UsernamePasswordAndWebauth
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :show_onboarding_path
|
|
12
|
-
option :new_login_path
|
|
13
|
-
|
|
14
|
-
def call
|
|
15
|
-
# Setup
|
|
16
|
-
|
|
17
|
-
credential = ::Booth::Models::Credential.create!(
|
|
18
|
-
username: 'alice',
|
|
19
|
-
password: 'qwrasfyxv',
|
|
20
|
-
scope:,
|
|
21
|
-
mode: :username_password_and_webauth,
|
|
22
|
-
allowed_modes: [:username_password_and_webauth]
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
onboarding = ::Booth::Models::Onboarding.create!(
|
|
26
|
-
credential_id: credential.id,
|
|
27
|
-
mode: :username_password_and_webauth
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
31
|
-
create_virtual_authenticator
|
|
32
|
-
|
|
33
|
-
assert_userland_partial controller: :onboarding, step: :choose_password
|
|
34
|
-
|
|
35
|
-
# Choose password
|
|
36
|
-
|
|
37
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
38
|
-
page.click_on :submit
|
|
39
|
-
|
|
40
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
41
|
-
page.click_on :submit
|
|
42
|
-
|
|
43
|
-
# Choose Webauth
|
|
44
|
-
|
|
45
|
-
page.click_on :register
|
|
46
|
-
page.fill_in :nickname, with: 'Yubikey'
|
|
47
|
-
page.click_on :submit
|
|
48
|
-
|
|
49
|
-
page.click_on :authenticate
|
|
50
|
-
|
|
51
|
-
assert_userland_partial controller: :onboarding, step: :completed
|
|
52
|
-
assert_logged_in credential: credential
|
|
53
|
-
|
|
54
|
-
soft_reset_session
|
|
55
|
-
assert_logged_out
|
|
56
|
-
|
|
57
|
-
# Login
|
|
58
|
-
|
|
59
|
-
page.visit new_login_path
|
|
60
|
-
|
|
61
|
-
assert_userland_partial controller: :login, step: :enter_username
|
|
62
|
-
|
|
63
|
-
page.fill_in :username, with: 'alice'
|
|
64
|
-
page.click_on :submit
|
|
65
|
-
|
|
66
|
-
assert_userland_partial controller: :login, step: :remote_session_available
|
|
67
|
-
# TODO: Not really needed if there were no other active session (created by onboarding)
|
|
68
|
-
page.click_on :skip
|
|
69
|
-
|
|
70
|
-
assert_userland_partial controller: :login, step: :enter_password
|
|
71
|
-
|
|
72
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
73
|
-
page.click_on :submit
|
|
74
|
-
|
|
75
|
-
assert_userland_partial controller: :login, step: :enter_webauth
|
|
76
|
-
|
|
77
|
-
page.click_on :authenticate
|
|
78
|
-
sleep 1
|
|
79
|
-
|
|
80
|
-
assert_logged_in credential:
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Onboardings
|
|
5
|
-
class AlreadyLoggedIn
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :show_onboarding_path
|
|
12
|
-
option :new_login_path
|
|
13
|
-
|
|
14
|
-
def call
|
|
15
|
-
# Setup
|
|
16
|
-
|
|
17
|
-
alice = ::Booth::Models::Credential.create!(
|
|
18
|
-
username: 'alice',
|
|
19
|
-
password: 'qwrasfyxv',
|
|
20
|
-
scope:,
|
|
21
|
-
mode: :username_and_password,
|
|
22
|
-
allowed_modes: [:username_and_password]
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
bobby = ::Booth::Models::Credential.create!(
|
|
26
|
-
username: 'bobby',
|
|
27
|
-
password: 'qwrasfyxv',
|
|
28
|
-
scope:,
|
|
29
|
-
mode: :username_and_password,
|
|
30
|
-
allowed_modes: [:username_and_password]
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
onboarding = ::Booth::Models::Onboarding.create!(
|
|
34
|
-
credential_id: bobby.id,
|
|
35
|
-
mode: :username_and_password
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
# Loging in Alice
|
|
39
|
-
|
|
40
|
-
page.visit new_login_path
|
|
41
|
-
|
|
42
|
-
assert_userland_partial controller: :login, step: :enter_username
|
|
43
|
-
|
|
44
|
-
page.fill_in :username, with: 'alice'
|
|
45
|
-
page.click_on :submit
|
|
46
|
-
|
|
47
|
-
assert_userland_partial controller: :login, step: :enter_password
|
|
48
|
-
|
|
49
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
50
|
-
page.click_on :submit
|
|
51
|
-
|
|
52
|
-
assert_logged_in credential: alice
|
|
53
|
-
|
|
54
|
-
# Onboarding as Bobby
|
|
55
|
-
|
|
56
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
57
|
-
|
|
58
|
-
assert_userland_partial controller: :onboarding, step: :already_logged_in
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Onboardings
|
|
5
|
-
class Otp
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :show_onboarding_path
|
|
12
|
-
option :new_login_path
|
|
13
|
-
|
|
14
|
-
def call
|
|
15
|
-
# Setup
|
|
16
|
-
|
|
17
|
-
credential = ::Booth::Models::Credential.create!(
|
|
18
|
-
username: 'alice',
|
|
19
|
-
password: 'qwrasfyxv',
|
|
20
|
-
scope:,
|
|
21
|
-
mode: :username_password_and_otp,
|
|
22
|
-
allowed_modes: %i[username_password_and_otp username_and_webauth]
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
onboarding = ::Booth::Models::Onboarding.create!(
|
|
26
|
-
credential_id: credential.id,
|
|
27
|
-
mode: :first_time
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
# Onboarding
|
|
31
|
-
|
|
32
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
33
|
-
|
|
34
|
-
assert_userland_partial controller: :onboarding, step: :choose_mode
|
|
35
|
-
|
|
36
|
-
page.click_on :choose_username_password_and_otp
|
|
37
|
-
|
|
38
|
-
assert_userland_partial controller: :onboarding, step: :choose_password
|
|
39
|
-
|
|
40
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
41
|
-
page.click_on :submit
|
|
42
|
-
|
|
43
|
-
assert_userland_partial controller: :onboarding, step: :confirm_password
|
|
44
|
-
|
|
45
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
46
|
-
page.click_on :submit
|
|
47
|
-
|
|
48
|
-
assert_userland_partial controller: :onboarding, step: :register_otp
|
|
49
|
-
|
|
50
|
-
page.click_on :confirm
|
|
51
|
-
|
|
52
|
-
assert_userland_partial controller: :onboarding, step: :confirm_otp
|
|
53
|
-
|
|
54
|
-
page.fill_in :code, with: onboarding.reload.otp_code
|
|
55
|
-
page.click_on :submit
|
|
56
|
-
|
|
57
|
-
assert_logged_in credential:
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Onboardings
|
|
5
|
-
class Password
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :show_onboarding_path
|
|
12
|
-
|
|
13
|
-
def call
|
|
14
|
-
# Setup
|
|
15
|
-
|
|
16
|
-
credential = ::Booth::Models::Credential.create!(
|
|
17
|
-
username: 'alice',
|
|
18
|
-
password: 'qwrasfyxv',
|
|
19
|
-
scope:,
|
|
20
|
-
mode: :username_and_password,
|
|
21
|
-
allowed_modes: %i[username_and_password username_and_webauth]
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
onboarding = ::Booth::Models::Onboarding.create!(
|
|
25
|
-
credential_id: credential.id,
|
|
26
|
-
mode: :first_time
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
# Onboarding
|
|
30
|
-
|
|
31
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
32
|
-
|
|
33
|
-
assert_userland_partial controller: :onboarding, step: :choose_mode
|
|
34
|
-
|
|
35
|
-
page.click_on :choose_username_and_password
|
|
36
|
-
|
|
37
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
38
|
-
page.click_on :submit
|
|
39
|
-
|
|
40
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
41
|
-
page.click_on :submit
|
|
42
|
-
|
|
43
|
-
assert_logged_in credential:
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Onboardings
|
|
5
|
-
class Timeout
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
include ActiveSupport::Testing::TimeHelpers
|
|
9
|
-
|
|
10
|
-
option :page
|
|
11
|
-
option :scope
|
|
12
|
-
option :show_onboarding_path
|
|
13
|
-
|
|
14
|
-
def call
|
|
15
|
-
# Setup
|
|
16
|
-
freeze_time
|
|
17
|
-
|
|
18
|
-
credential = ::Booth::Models::Credential.create!(
|
|
19
|
-
username: 'alice',
|
|
20
|
-
password: 'qwrasfyxv',
|
|
21
|
-
scope:,
|
|
22
|
-
mode: :username_and_password,
|
|
23
|
-
allowed_modes: %i[username_and_password username_and_webauth]
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
onboarding = ::Booth::Models::Onboarding.create!(
|
|
27
|
-
credential_id: credential.id,
|
|
28
|
-
mode: :first_time
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
# Onboarding
|
|
32
|
-
|
|
33
|
-
travel 7.days - 1.minute
|
|
34
|
-
|
|
35
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
36
|
-
assert_userland_partial controller: :onboarding, step: :choose_mode
|
|
37
|
-
|
|
38
|
-
travel 2.minutes
|
|
39
|
-
|
|
40
|
-
page.visit show_onboarding_path.sub('ID', onboarding.secret_key)
|
|
41
|
-
assert_userland_partial controller: :onboarding, step: :timed_out
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module Otps
|
|
5
|
-
class Manage
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :new_login_path
|
|
12
|
-
option :show_otp_path
|
|
13
|
-
option :after_credential, default: -> {}
|
|
14
|
-
|
|
15
|
-
def call
|
|
16
|
-
# Setup
|
|
17
|
-
|
|
18
|
-
credential = ::Booth::Models::Credential.create!(
|
|
19
|
-
username: 'alice',
|
|
20
|
-
password: 'qwrasfyxv',
|
|
21
|
-
scope:,
|
|
22
|
-
mode: :username_and_password,
|
|
23
|
-
allowed_modes: %i[username_and_password username_password_and_otp]
|
|
24
|
-
)
|
|
25
|
-
after_credential&.call(credential.id)
|
|
26
|
-
|
|
27
|
-
# Login
|
|
28
|
-
|
|
29
|
-
page.visit new_login_path
|
|
30
|
-
|
|
31
|
-
assert_userland_partial controller: :login, step: :enter_username
|
|
32
|
-
page.fill_in :username, with: 'alice'
|
|
33
|
-
page.click_on :submit
|
|
34
|
-
|
|
35
|
-
assert_userland_partial controller: :login, step: :enter_password
|
|
36
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
37
|
-
page.click_on :submit
|
|
38
|
-
|
|
39
|
-
# Add OTP
|
|
40
|
-
|
|
41
|
-
assert_logged_in credential: credential
|
|
42
|
-
page.visit show_otp_path
|
|
43
|
-
|
|
44
|
-
assert_userland_partial controller: :otp, step: :add
|
|
45
|
-
page.click_on :add
|
|
46
|
-
|
|
47
|
-
assert_userland_partial controller: :otp, step: :register
|
|
48
|
-
page.assert_selector '[data-booth=otpqr]'
|
|
49
|
-
page.assert_text 'otpauth://totp/'
|
|
50
|
-
page.click_on :registered
|
|
51
|
-
|
|
52
|
-
# Back one step
|
|
53
|
-
|
|
54
|
-
assert_userland_partial controller: :otp, step: :confirm
|
|
55
|
-
page.click_on :change
|
|
56
|
-
|
|
57
|
-
# Continue adding OTP
|
|
58
|
-
|
|
59
|
-
assert_userland_partial controller: :otp, step: :register
|
|
60
|
-
code = extract_otp_secret_key_and_generate_code
|
|
61
|
-
page.click_on :registered
|
|
62
|
-
|
|
63
|
-
assert_userland_partial controller: :otp, step: :confirm
|
|
64
|
-
page.fill_in :code, with: code
|
|
65
|
-
page.click_on :submit
|
|
66
|
-
|
|
67
|
-
assert_userland_partial controller: :otp, step: :successfully_changed
|
|
68
|
-
|
|
69
|
-
page.visit show_otp_path
|
|
70
|
-
assert_userland_partial controller: :otp, step: :show
|
|
71
|
-
page.assert_selector '[data-booth=otpqr]'
|
|
72
|
-
page.assert_text 'otpauth://totp/'
|
|
73
|
-
|
|
74
|
-
travel 19.minutes
|
|
75
|
-
page.visit show_otp_path
|
|
76
|
-
assert_userland_partial controller: :otp, step: :show
|
|
77
|
-
|
|
78
|
-
travel 2.minutes
|
|
79
|
-
page.visit show_otp_path
|
|
80
|
-
assert_userland_partial controller: :otp, step: :sudo
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
module PasswordResets
|
|
5
|
-
class Reset
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
include ::Booth::Test::Helpers
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :scope
|
|
11
|
-
option :new_login_path
|
|
12
|
-
option :new_password_reset_path
|
|
13
|
-
option :show_password_reset_path
|
|
14
|
-
|
|
15
|
-
def call
|
|
16
|
-
# Setup
|
|
17
|
-
alice = ::Booth::Models::Credential.create!(
|
|
18
|
-
username: 'alice',
|
|
19
|
-
password: 'qwrasfyxv',
|
|
20
|
-
scope:,
|
|
21
|
-
mode: :username_and_password,
|
|
22
|
-
allowed_modes: %i[username_and_password]
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
bobby = ::Booth::Models::Credential.create!(
|
|
26
|
-
username: 'bobby',
|
|
27
|
-
password: 'qwrasfyxv',
|
|
28
|
-
scope:,
|
|
29
|
-
mode: :username_and_password,
|
|
30
|
-
allowed_modes: %i[username_and_password]
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
bobbys_password_reset = ::Booth::Models::PasswordReset.create!(
|
|
34
|
-
credential: bobby,
|
|
35
|
-
creator_ip: '198.51.100.50'
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
bobbys_other_password_reset = ::Booth::Models::PasswordReset.create!(
|
|
39
|
-
credential: bobby,
|
|
40
|
-
creator_ip: '198.51.100.51'
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
# Request Password Reset
|
|
44
|
-
page.visit new_login_path
|
|
45
|
-
assert_userland_partial controller: :login, step: :enter_username
|
|
46
|
-
page.fill_in :username, with: 'alice'
|
|
47
|
-
page.click_on :submit
|
|
48
|
-
assert_userland_partial controller: :login, step: :enter_password
|
|
49
|
-
page.click_on :forgot
|
|
50
|
-
assert_userland_partial controller: :password_reset, step: :new
|
|
51
|
-
page.fill_in :email, with: 'alice@example.com'
|
|
52
|
-
page.click_on :submit
|
|
53
|
-
assert_userland_partial controller: :password_reset, step: :check_your_mail
|
|
54
|
-
|
|
55
|
-
# Forgot Login password
|
|
56
|
-
page.visit new_login_path
|
|
57
|
-
assert_userland_partial controller: :login, step: :enter_password
|
|
58
|
-
page.fill_in :password, with: 'qwrasfyxv'
|
|
59
|
-
page.click_on :submit
|
|
60
|
-
assert_logged_in credential: alice
|
|
61
|
-
page.visit new_password_reset_path
|
|
62
|
-
assert_userland_partial controller: :password_reset, step: :logout_first
|
|
63
|
-
|
|
64
|
-
# Reset password as wrong user
|
|
65
|
-
page.visit show_password_reset_path.sub('ID', bobbys_password_reset.secret_key)
|
|
66
|
-
assert_userland_partial controller: :password_reset, step: :wrong_user_logged_in
|
|
67
|
-
page.click_on :logout
|
|
68
|
-
assert_logged_out
|
|
69
|
-
|
|
70
|
-
# Timed out
|
|
71
|
-
travel 2.hours + 1.second
|
|
72
|
-
page.visit show_password_reset_path.sub('ID', bobbys_password_reset.secret_key)
|
|
73
|
-
assert_userland_partial controller: :password_reset, step: :timed_out
|
|
74
|
-
travel_back
|
|
75
|
-
|
|
76
|
-
# Reset password
|
|
77
|
-
page.visit show_password_reset_path.sub('ID', bobbys_password_reset.secret_key)
|
|
78
|
-
assert_userland_partial controller: :password_reset, step: :choose_password
|
|
79
|
-
page.fill_in :password, with: 'wetsdgxcb'
|
|
80
|
-
page.click_on :submit
|
|
81
|
-
page.click_on :change
|
|
82
|
-
assert_userland_partial controller: :password_reset, step: :choose_password
|
|
83
|
-
page.fill_in :password, with: 'rtufgjvbm'
|
|
84
|
-
page.click_on :submit
|
|
85
|
-
assert_userland_partial controller: :password_reset, step: :confirm_password
|
|
86
|
-
page.fill_in :password, with: 'rtufgjvbm'
|
|
87
|
-
page.click_on :submit
|
|
88
|
-
assert_userland_partial controller: :password_reset, step: :completed
|
|
89
|
-
|
|
90
|
-
# Refresh page
|
|
91
|
-
page.visit show_password_reset_path.sub('ID', bobbys_password_reset.secret_key)
|
|
92
|
-
assert_userland_partial controller: :password_reset, step: :completed
|
|
93
|
-
|
|
94
|
-
# Try a revoked token
|
|
95
|
-
page.visit show_password_reset_path.sub('ID', bobbys_other_password_reset.secret_key)
|
|
96
|
-
assert_userland_partial controller: :password_reset, step: :revoked
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
data/lib/booth/test/userland.rb
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Userland
|
|
4
|
-
class Scenario
|
|
5
|
-
attr_accessor :page, :scope, :new_login_path, :show_onboarding_path, :show_otp_path, :new_password_reset_path,
|
|
6
|
-
:show_password_reset_path, :after_credential
|
|
7
|
-
|
|
8
|
-
def initialize(klass)
|
|
9
|
-
@klass = klass
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def name
|
|
13
|
-
@klass.to_s.underscore.parameterize(separator: '_')
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def call
|
|
17
|
-
arguments = @klass.dry_initializer.public_attributes(self)
|
|
18
|
-
@klass.call(**arguments)
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def self.scenarios(skip_password_resets: false) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
23
|
-
yield Scenario.new(Booth::Test::Userland::Logins::MissingAuthenticators)
|
|
24
|
-
yield Scenario.new(Booth::Test::Userland::Logins::MissingOnboarding)
|
|
25
|
-
yield Scenario.new(Booth::Test::Userland::Logins::UsernameAndPassword)
|
|
26
|
-
yield Scenario.new(Booth::Test::Userland::Logins::UsernameAndWebauth)
|
|
27
|
-
yield Scenario.new(Booth::Test::Userland::Logins::UsernamePasswordAndOtp)
|
|
28
|
-
yield Scenario.new(Booth::Test::Userland::Logins::UsernamePasswordAndWebauth)
|
|
29
|
-
yield Scenario.new(Booth::Test::Userland::Onboardings::AlreadyLoggedIn)
|
|
30
|
-
yield Scenario.new(Booth::Test::Userland::Onboardings::Otp)
|
|
31
|
-
yield Scenario.new(Booth::Test::Userland::Onboardings::Password)
|
|
32
|
-
yield Scenario.new(Booth::Test::Userland::Onboardings::Timeout)
|
|
33
|
-
yield Scenario.new(Booth::Test::Userland::Otps::Manage)
|
|
34
|
-
yield Scenario.new(Booth::Test::Userland::PasswordResets::Reset) unless skip_password_resets
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Webauthn
|
|
4
|
-
class Disable
|
|
5
|
-
include ::Booth::Logging
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
|
|
8
|
-
option :devtools
|
|
9
|
-
|
|
10
|
-
def call
|
|
11
|
-
debug { 'Disabling Chrome Virtual Authenticator Environment...' }
|
|
12
|
-
devtools.send_cmd 'WebAuthn.disable'
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Webauthn
|
|
4
|
-
class Enable
|
|
5
|
-
include ::Booth::Logging
|
|
6
|
-
include ::Booth::MethodObject
|
|
7
|
-
|
|
8
|
-
option :devtools
|
|
9
|
-
|
|
10
|
-
def call
|
|
11
|
-
WebAuthn.configuration.origin = Capybara.current_session.server.base_url
|
|
12
|
-
|
|
13
|
-
debug { 'Ensuring enabled Chrome Virtual Authenticator Environment...' }
|
|
14
|
-
devtools.send_cmd 'WebAuthn.enable'
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Webauthn
|
|
4
|
-
module VirtualAuthenticators
|
|
5
|
-
class Create
|
|
6
|
-
include ::Booth::Logging
|
|
7
|
-
include ::Booth::MethodObject
|
|
8
|
-
|
|
9
|
-
option :page
|
|
10
|
-
option :has_user_verification
|
|
11
|
-
|
|
12
|
-
def call
|
|
13
|
-
options = ::Selenium::WebDriver::VirtualAuthenticatorOptions.new
|
|
14
|
-
options.user_verification = has_user_verification
|
|
15
|
-
options.user_verified = true
|
|
16
|
-
|
|
17
|
-
debug { "Registering Virtual Authenticator... #{options.as_json}" }
|
|
18
|
-
page.driver.browser.add_virtual_authenticator(options)
|
|
19
|
-
|
|
20
|
-
# debug { "Created #{authenticator.id}" }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# See https://chromedevtools.github.io/devtools-protocol/tot/WebAuthn/#type-VirtualAuthenticatorOptions
|
|
24
|
-
# def options
|
|
25
|
-
# {
|
|
26
|
-
# protocol: :ctap2,
|
|
27
|
-
# transport: :internal,
|
|
28
|
-
# hasResidentKey: false, # Chrome should not have to reveal a list of existing virtual authenticator IDs.
|
|
29
|
-
# # isUserConsenting: true, # Not sure, this option exists in selenium but not in chrome?
|
|
30
|
-
# hasUserVerification: has_user_verification,
|
|
31
|
-
# isUserVerified: true,
|
|
32
|
-
# }
|
|
33
|
-
# end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module Booth
|
|
2
|
-
module Test
|
|
3
|
-
module Webauthn
|
|
4
|
-
module VirtualAuthenticators
|
|
5
|
-
class Destroy
|
|
6
|
-
include ::Booth::Logging
|
|
7
|
-
include ::Booth::MethodObject
|
|
8
|
-
|
|
9
|
-
option :devtools
|
|
10
|
-
option :id
|
|
11
|
-
|
|
12
|
-
def call
|
|
13
|
-
debug { "Removing Virtual Authenticator with ID #{id}" }
|
|
14
|
-
devtools.send_cmd 'WebAuthn.removeVirtualAuthenticator', authenticatorId: id
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|