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,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Requests
|
|
3
5
|
module Storages
|
|
@@ -21,20 +23,22 @@ module Booth
|
|
|
21
23
|
def credential_for_username
|
|
22
24
|
return @credential_for_username if defined?(@credential_for_username)
|
|
23
25
|
|
|
24
|
-
@credential_for_username = ::Booth::Models::Credential.find_by(
|
|
26
|
+
@credential_for_username = ::Booth::Models::Credential.find_by(
|
|
27
|
+
scope:,
|
|
28
|
+
id: session[:credential_for_username],
|
|
29
|
+
)
|
|
25
30
|
end
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
# Deserializes a Remote record from cookie.
|
|
33
|
+
#
|
|
34
|
+
def remote_for_username
|
|
35
|
+
return @remote_for_username if defined?(@remote_for_username)
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
end
|
|
37
|
+
log { "Deserializing Remote from Cookie in scope #{scope.inspect}" }
|
|
32
38
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@password_authenticated_credential = ::Booth::Models::Credential.find_by(
|
|
37
|
-
id: session[:password_authenticated_credential]
|
|
39
|
+
@remote_for_username = ::Booth::Models::Remote.joins(:credential).find_by(
|
|
40
|
+
credential: { scope: },
|
|
41
|
+
id: session[:remote_for_username],
|
|
38
42
|
)
|
|
39
43
|
end
|
|
40
44
|
|
|
@@ -55,36 +59,38 @@ module Booth
|
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def credential_for_username=(new_credential)
|
|
58
|
-
|
|
59
|
-
session[:credential_for_username] = new_credential.id
|
|
60
|
-
@credential_for_username = nil
|
|
61
|
-
end
|
|
62
|
+
log { "Persisting credential for username in browser session for scope #{scope.inspect}" }
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@contest_for_username = nil
|
|
67
|
-
end
|
|
64
|
+
# I think this could happen if the end-user has multiple browser windows open
|
|
65
|
+
# and registers for different companies, finding race conditions.
|
|
66
|
+
raise "Scope mismatch #{new_credential.scope} != #{scope}" if new_credential.scope.to_sym != scope.to_sym
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
debug { "Resetting credential in browser session for scope #{scope.inspect}" }
|
|
71
|
-
session.delete(:credential_for_username)
|
|
68
|
+
session[:credential_for_username] = new_credential.id
|
|
72
69
|
@credential_for_username = nil
|
|
73
70
|
end
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
# Serializes a Remote record in the cookie.
|
|
73
|
+
#
|
|
74
|
+
def remote_for_username=(new_remote)
|
|
75
|
+
log { "Persisting remote for username in browser session for scope #{scope.inspect}" }
|
|
76
|
+
session[:remote_for_username] = new_remote.id
|
|
77
|
+
@remote_for_username = nil
|
|
79
78
|
end
|
|
80
79
|
|
|
80
|
+
# def reset_credential_for_username
|
|
81
|
+
# log { "Resetting credential in browser session for scope #{scope.inspect}" }
|
|
82
|
+
# session.delete(:credential_for_username)
|
|
83
|
+
# @credential_for_username = nil
|
|
84
|
+
# end
|
|
85
|
+
|
|
81
86
|
def webauthn_challenge=(new_challenge)
|
|
82
87
|
if new_challenge
|
|
83
|
-
|
|
84
|
-
"Persisting webauth challenge #{new_challenge.inspect} in browser
|
|
88
|
+
log do
|
|
89
|
+
"Persisting webauth challenge #{new_challenge.inspect} in browser " \
|
|
90
|
+
"session for scope #{scope.inspect}"
|
|
85
91
|
end
|
|
86
92
|
else
|
|
87
|
-
|
|
93
|
+
log { "Removing webauth challenge from browser session for scope #{scope.inspect}" }
|
|
88
94
|
end
|
|
89
95
|
session[:webauthn_challenge] = new_challenge.presence
|
|
90
96
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Requests
|
|
3
5
|
module Storages
|
|
@@ -26,6 +28,7 @@ module Booth
|
|
|
26
28
|
# -------
|
|
27
29
|
|
|
28
30
|
def authenticator_id=(new_authenticator_id)
|
|
31
|
+
@authenticator = nil
|
|
29
32
|
session[:authenticator_id] = new_authenticator_id
|
|
30
33
|
end
|
|
31
34
|
|
data/lib/booth/requests/sudo.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Requests
|
|
3
5
|
class Sudo
|
|
@@ -8,59 +10,23 @@ module Booth
|
|
|
8
10
|
@request = request
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
def mode
|
|
12
|
-
request.authentication.mode.to_sym
|
|
13
|
-
end
|
|
14
|
-
|
|
15
13
|
def lifespan
|
|
16
14
|
::Booth.config.interaction_timeout
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
# Guards
|
|
20
18
|
|
|
21
|
-
def guard_with_password
|
|
22
|
-
raise unless block_given?
|
|
23
|
-
return if password?
|
|
24
|
-
|
|
25
|
-
debug { 'You need password sudo' }
|
|
26
|
-
public_message = I18n.t('booth.password_sudo_timeout', lifespan_minutes: (lifespan / 60))
|
|
27
|
-
yield Tron.success(:password_sudo_needed, step: :sudo, public_message:)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def guard_with_otp
|
|
31
|
-
raise unless block_given?
|
|
32
|
-
return if otp?
|
|
33
|
-
|
|
34
|
-
debug { 'You need OTP sudo' }
|
|
35
|
-
public_message = I18n.t('booth.otp_sudo_timeout', lifespan_minutes: (lifespan / 60))
|
|
36
|
-
yield Tron.success(:otp_sudo_needed, step: :sudo, public_message:)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
19
|
def guard_with_webauth
|
|
40
20
|
raise unless block_given?
|
|
41
21
|
return if webauth?
|
|
42
22
|
|
|
43
|
-
|
|
23
|
+
log { 'You need Webauth sudo' }
|
|
44
24
|
public_message = I18n.t('booth.webauth_sudo_timeout', lifespan_minutes: (lifespan / 60))
|
|
45
25
|
yield Tron.success(:webauth_sudo_needed, step: :sudo, public_message:)
|
|
46
26
|
end
|
|
47
27
|
|
|
48
28
|
# Getters
|
|
49
29
|
|
|
50
|
-
def password?
|
|
51
|
-
return true if session[:password].to_i > lifespan.ago.to_i
|
|
52
|
-
|
|
53
|
-
session[:password] = nil
|
|
54
|
-
false
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def otp?
|
|
58
|
-
return true if session[:otp].to_i > lifespan.ago.to_i
|
|
59
|
-
|
|
60
|
-
session[:otp] = nil
|
|
61
|
-
false
|
|
62
|
-
end
|
|
63
|
-
|
|
64
30
|
def webauth?
|
|
65
31
|
return true if session[:webauth].to_i > lifespan.ago.to_i
|
|
66
32
|
|
|
@@ -74,26 +40,16 @@ module Booth
|
|
|
74
40
|
|
|
75
41
|
# Setters
|
|
76
42
|
|
|
77
|
-
def password!
|
|
78
|
-
debug { "Remembering sudo via password has been granted in scope #{scope}" }
|
|
79
|
-
session[:password] = Time.current.to_i
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def otp!
|
|
83
|
-
debug { "Remembering sudo via OTP has been granted in scope #{scope}" }
|
|
84
|
-
session[:otp] = Time.current.to_i
|
|
85
|
-
end
|
|
86
|
-
|
|
87
43
|
def webauth!
|
|
88
|
-
|
|
44
|
+
log { "Remembering sudo via WebAuth has been granted in scope #{scope}" }
|
|
89
45
|
session[:webauth] = Time.current.to_i
|
|
90
46
|
end
|
|
91
47
|
|
|
92
48
|
def webauthn_challenge=(new_challenge)
|
|
93
49
|
if new_challenge
|
|
94
|
-
|
|
50
|
+
log { "Persisting webauth challenge #{new_challenge.inspect} in sudo session for scope #{scope.inspect}" }
|
|
95
51
|
else
|
|
96
|
-
|
|
52
|
+
log { "Removing webauth challenge from sudo session for scope #{scope.inspect}" }
|
|
97
53
|
end
|
|
98
54
|
session[:webauthn_challenge] = new_challenge.presence
|
|
99
55
|
end
|
|
@@ -1,80 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Routes
|
|
5
|
+
# All Rails routes needed by Users.
|
|
3
6
|
class Userland
|
|
4
|
-
include
|
|
7
|
+
include Calls
|
|
5
8
|
|
|
6
|
-
option :
|
|
7
|
-
option :self_registration
|
|
8
|
-
option :self_recovery
|
|
9
|
+
option :skip_registration, default: -> { false }
|
|
9
10
|
|
|
10
11
|
def call
|
|
11
|
-
result = [mandatory_routes]
|
|
12
|
-
result.push self_registration_routes if self_registration
|
|
13
|
-
result.push self_recovery_routes if self_recovery
|
|
14
|
-
result.join
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
def response_path_with_fallback
|
|
20
|
-
return ':response' if response_path.blank?
|
|
21
|
-
|
|
22
|
-
# Just to avoid potential syntax errors, we sanitize the variable little bit.
|
|
23
|
-
response_path.to_sym.to_s.inspect
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# ---------
|
|
27
|
-
# Templates
|
|
28
|
-
# ---------
|
|
29
|
-
|
|
30
|
-
# There is probably no reason to avoid any of these routes.
|
|
31
|
-
def mandatory_routes
|
|
32
12
|
<<-RUBY
|
|
33
|
-
#
|
|
34
|
-
|
|
13
|
+
# Users creating their own accounts.
|
|
14
|
+
resource :registration, only: %i[new create]
|
|
35
15
|
|
|
36
|
-
#
|
|
16
|
+
# Logging in
|
|
37
17
|
resource :login, only: %i[new create destroy]
|
|
38
|
-
resource :
|
|
18
|
+
resource :remote_login, only: %i[show update], path: #{I18n.t('booth.remote_login_path').to_sym.inspect} # e.g. `path: :fernlogin`
|
|
19
|
+
|
|
20
|
+
# Onboarding
|
|
21
|
+
resources :onboardings, only: %i[show update], path: :onboard
|
|
39
22
|
|
|
40
|
-
# Self-service
|
|
23
|
+
# Self-service Portal
|
|
41
24
|
resources :sessions, only: %i[index show destroy] do
|
|
42
25
|
delete :destroy_all_others, on: :collection
|
|
43
26
|
end
|
|
44
|
-
resource :password, only: %i[show edit update destroy] do
|
|
45
|
-
collection do
|
|
46
|
-
get :remove
|
|
47
|
-
post :sudo
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
resource :otp, only: %i[show edit update destroy] do
|
|
51
|
-
post :sudo, on: :collection
|
|
52
|
-
end
|
|
53
27
|
resources :webauths, only: %i[index new create destroy] do
|
|
54
28
|
post :sudo, on: :collection
|
|
55
29
|
end
|
|
56
30
|
RUBY
|
|
57
31
|
end
|
|
58
|
-
|
|
59
|
-
# If users create their own accounts, you will need these routes.
|
|
60
|
-
def self_registration_routes
|
|
61
|
-
<<-RUBY
|
|
62
|
-
resources :registrations, only: %i[new create]
|
|
63
|
-
RUBY
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# If users can recover lost credentials (username/password) via email, you need these routes.
|
|
67
|
-
def self_recovery_routes
|
|
68
|
-
<<-RUBY
|
|
69
|
-
resources :recoveries, only: %i[new create] do
|
|
70
|
-
get :check_your_mail, on: :collection
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
resources :password_resets, only: %i[new create show update] do
|
|
74
|
-
get :check_your_mail, on: :collection
|
|
75
|
-
end
|
|
76
|
-
RUBY
|
|
77
|
-
end
|
|
78
32
|
end
|
|
79
33
|
end
|
|
80
34
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Booth
|
|
4
|
+
module Syntaxes
|
|
5
|
+
# Checks for a fully quantified domain name (FQDN).
|
|
6
|
+
class Domain
|
|
7
|
+
include Calls
|
|
8
|
+
|
|
9
|
+
param :input
|
|
10
|
+
|
|
11
|
+
# **Example:**
|
|
12
|
+
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# Booth::Syntaxes::Domain.call('example.com').valid_domain #=> 'example.com'
|
|
15
|
+
# Booth::Syntaxes::Domain.call('nonesense').valid_domain #=> 'nil'
|
|
16
|
+
# ```
|
|
17
|
+
#
|
|
18
|
+
# **Returns:**
|
|
19
|
+
#
|
|
20
|
+
# Tron `Data` object with
|
|
21
|
+
#
|
|
22
|
+
# - `#valid_domain` - +nil+ or the syntactically valid domain name as +String+.
|
|
23
|
+
#
|
|
24
|
+
def call
|
|
25
|
+
# Do we need to allow "localhost" in test env?
|
|
26
|
+
# Maybe it's simpler/safer to run tests against "example.localhost" instead.
|
|
27
|
+
return Tron.success(:valid_domain_syntax, valid_domain: input.to_s) if regexp.match(input)
|
|
28
|
+
|
|
29
|
+
Tron.failure(:invalid_domain_syntax, invalid_domain: input.to_s,
|
|
30
|
+
valid_domain: nil,
|
|
31
|
+
public_message:)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# RFC 1035
|
|
37
|
+
def regexp
|
|
38
|
+
/\A([a-z0-9]{1}[a-z0-9-]{,63}(?<!-)\.)+[a-z]{2,}\z/
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def public_message
|
|
42
|
+
I18n.t('booth.invalid_domain', domain: input)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/booth/syntaxes/email.rb
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Syntaxes
|
|
3
5
|
class Email
|
|
4
6
|
include ::Booth::Logging
|
|
5
|
-
include
|
|
7
|
+
include Calls
|
|
6
8
|
|
|
7
9
|
param :input
|
|
8
10
|
|
|
9
11
|
def call
|
|
10
|
-
|
|
12
|
+
log { "Checking email #{input.inspect} for valid syntax..." }
|
|
11
13
|
check_blank.on_success { check_too_short }
|
|
12
14
|
.on_success { check_too_long }
|
|
13
15
|
.on_success { check_characters }
|
|
@@ -19,7 +21,7 @@ module Booth
|
|
|
19
21
|
def check_blank
|
|
20
22
|
return Tron.success :email_present if input.present?
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
log { 'This email is blank.' }
|
|
23
25
|
Tron.failure :blank_email,
|
|
24
26
|
normalized_email: nil,
|
|
25
27
|
normalized_invalid_email: normalized_email,
|
|
@@ -29,7 +31,7 @@ module Booth
|
|
|
29
31
|
def check_too_short
|
|
30
32
|
return Tron.success :email_not_too_short if input.to_s.length >= min_length
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
log { "This email is less than #{min_length} characters long." }
|
|
33
35
|
Tron.failure :email_is_too_short,
|
|
34
36
|
normalized_email: nil,
|
|
35
37
|
normalized_invalid_email: normalized_email,
|
|
@@ -39,7 +41,7 @@ module Booth
|
|
|
39
41
|
def check_too_long
|
|
40
42
|
return Tron.success :email_not_too_long if input.to_s.length <= max_length
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
log { "This email is more than #{max_length} characters long." }
|
|
43
45
|
Tron.failure :email_is_too_long,
|
|
44
46
|
normalized_email: nil,
|
|
45
47
|
normalized_invalid_email: normalized_email,
|
|
@@ -49,7 +51,7 @@ module Booth
|
|
|
49
51
|
def check_characters
|
|
50
52
|
return Tron.success :all_characters_valid if input.to_s.length == normalized_email.length
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
log { 'This email contains invalid characters' }
|
|
53
55
|
Tron.failure :invalid_email_format,
|
|
54
56
|
normalized_email: nil,
|
|
55
57
|
normalized_invalid_email: normalized_email,
|
|
@@ -57,15 +59,16 @@ module Booth
|
|
|
57
59
|
end
|
|
58
60
|
|
|
59
61
|
# See https://github.com/heartcombo/devise/blob/8593801130f2df94a50863b5db535c272b00efe1/lib/devise.rb#L112-L116
|
|
62
|
+
# and https://github.com/janko/rodauth-rails/blob/62b64c6320334aca5a2805527db8a87d6e3feed8/lib/generators/rodauth/migration/active_record/base.erb#L10
|
|
60
63
|
def check_ampersand
|
|
61
64
|
if input.to_s.match(/\A[^@]+@[^@]+\z/)
|
|
62
|
-
|
|
65
|
+
log { 'This email has the correct syntax' }
|
|
63
66
|
return Tron.success :valid_email_syntax,
|
|
64
67
|
normalized_email:,
|
|
65
68
|
normalized_invalid_email: normalized_email
|
|
66
69
|
end
|
|
67
70
|
|
|
68
|
-
|
|
71
|
+
log { 'This email does not contain an ampersand' }
|
|
69
72
|
Tron.failure :email_ampersand_invalid,
|
|
70
73
|
normalized_email: nil,
|
|
71
74
|
normalized_invalid_email: normalized_email,
|
data/lib/booth/syntaxes/ip.rb
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Syntaxes
|
|
3
5
|
class Ip
|
|
4
6
|
include ::Booth::Logging
|
|
5
|
-
include
|
|
7
|
+
include Calls
|
|
6
8
|
|
|
7
9
|
param :input
|
|
8
10
|
|
|
9
11
|
def call
|
|
10
|
-
#
|
|
12
|
+
# log { "Checking IP address #{input.inspect} for valid syntax..." }
|
|
11
13
|
check_blank.on_success { check_validity }
|
|
12
14
|
end
|
|
13
15
|
|
|
@@ -16,14 +18,14 @@ module Booth
|
|
|
16
18
|
def check_blank
|
|
17
19
|
return Tron.success :ip_present if input.present?
|
|
18
20
|
|
|
19
|
-
#
|
|
21
|
+
# log { 'This IP is blank.' }
|
|
20
22
|
Tron.failure :blank_ip, normalized_ip: nil
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def check_validity
|
|
24
26
|
return Tron.success :ip_valid, normalized_ip: ip_addr.to_s if ip_addr
|
|
25
27
|
|
|
26
|
-
#
|
|
28
|
+
# log { 'This IP is invalid.' }
|
|
27
29
|
Tron.failure :invalid_ip, normalized_ip: nil
|
|
28
30
|
end
|
|
29
31
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Booth
|
|
4
|
+
module Syntaxes
|
|
5
|
+
class RemoteCode
|
|
6
|
+
include ::Booth::Logging
|
|
7
|
+
include Calls
|
|
8
|
+
|
|
9
|
+
param :input
|
|
10
|
+
|
|
11
|
+
def call
|
|
12
|
+
log { "Checking remote #{input.inspect} for valid syntax..." }
|
|
13
|
+
check_blank.on_success { check_characters }
|
|
14
|
+
.on_success { check_length }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def check_blank
|
|
20
|
+
return Tron.success :remote_code_present if input.present?
|
|
21
|
+
|
|
22
|
+
log { 'This remote is blank.' }
|
|
23
|
+
Tron.failure :blank_remote_code,
|
|
24
|
+
normalized_remote_code: nil,
|
|
25
|
+
public_message: I18n.t('booth.blank_remote_code')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check_characters
|
|
29
|
+
return Tron.success :remote_code_consists_of_digits if input_without_spaces.match?(allowed_regexp)
|
|
30
|
+
|
|
31
|
+
log { 'This remote contains invalid characters' }
|
|
32
|
+
Tron.failure :invalid_remote_code_format,
|
|
33
|
+
normalized_remote_code: nil,
|
|
34
|
+
public_message: I18n.t('booth.invalid_remote_code_format')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def check_length
|
|
38
|
+
if input_without_spaces.to_s.length == 6
|
|
39
|
+
return Tron.success :valid_remote_code_syntax,
|
|
40
|
+
normalized_remote_code: input_without_spaces
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
log { "This remote is not 6 characters long." }
|
|
44
|
+
Tron.failure :wrong_remote_code_length,
|
|
45
|
+
normalized_remote_code: nil,
|
|
46
|
+
public_message: I18n.t('booth.wrong_remote_code_length', digits: 6)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Helpers
|
|
50
|
+
|
|
51
|
+
def input_without_spaces
|
|
52
|
+
input.to_s.delete(' ')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def allowed_regexp
|
|
56
|
+
/\A\d+\z/
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
data/lib/booth/syntaxes/scope.rb
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Syntaxes
|
|
3
5
|
class Scope
|
|
4
6
|
include ::Booth::Logging
|
|
5
|
-
include
|
|
7
|
+
include Calls
|
|
6
8
|
|
|
7
9
|
param :input
|
|
8
10
|
|
|
9
11
|
def call
|
|
10
|
-
|
|
12
|
+
if regexp.match(input.to_s)
|
|
13
|
+
return Tron.success(:valid_scope_syntax, normalized_scope: input.to_sym)
|
|
14
|
+
end
|
|
11
15
|
|
|
12
16
|
raise ::Booth::Errors::InvalidScopeSyntax, input
|
|
13
17
|
end
|
|
14
18
|
|
|
15
19
|
# Same convention as a Ruby variable name.
|
|
16
20
|
def regexp
|
|
17
|
-
/\A[a-z]{1}[a-z0-9_]
|
|
21
|
+
/\A[a-z]{1}[a-z0-9_]{0,40}[a-z0-9]{1}\z/
|
|
18
22
|
end
|
|
19
23
|
end
|
|
20
24
|
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Booth
|
|
2
4
|
module Syntaxes
|
|
3
5
|
class SecretKey
|
|
4
6
|
include ::Booth::Logging
|
|
5
|
-
include
|
|
7
|
+
include Calls
|
|
6
8
|
|
|
7
9
|
param :input
|
|
8
10
|
|
|
9
11
|
def call
|
|
10
|
-
|
|
12
|
+
log { "Checking secret key #{input.inspect} for valid syntax..." }
|
|
11
13
|
check_missing.on_success { check_blank }
|
|
12
14
|
.on_success { check_length }
|
|
13
15
|
.on_success { check_characters }
|
|
@@ -18,7 +20,7 @@ module Booth
|
|
|
18
20
|
def check_missing
|
|
19
21
|
return Tron.success :secret_key_non_nil unless input.nil?
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
log { 'This secret key is nil.' }
|
|
22
24
|
Tron.failure :missing_secret_key,
|
|
23
25
|
normalized_secret_key: nil,
|
|
24
26
|
public_message: I18n.t('booth.missing_secret_key')
|
|
@@ -27,7 +29,7 @@ module Booth
|
|
|
27
29
|
def check_blank
|
|
28
30
|
return Tron.success :secret_key_present if input.present?
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
log { 'This secret key is blank.' }
|
|
31
33
|
Tron.failure :blank_secret_key,
|
|
32
34
|
normalized_secret_key: nil,
|
|
33
35
|
public_message: I18n.t('booth.blank_secret_key')
|
|
@@ -36,7 +38,7 @@ module Booth
|
|
|
36
38
|
def check_length
|
|
37
39
|
return Tron.success :secret_key_has_correct_length if input.to_s.length == 30
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
log { 'This secret key is not 30 characters long.' }
|
|
40
42
|
Tron.failure :wrong_secret_key_length,
|
|
41
43
|
normalized_secret_key: nil,
|
|
42
44
|
public_message: I18n.t('booth.wrong_secret_key_length')
|
|
@@ -48,7 +50,7 @@ module Booth
|
|
|
48
50
|
normalized_secret_key: input.to_s
|
|
49
51
|
end
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
log { 'This secret key contains invalid characters' }
|
|
52
54
|
Tron.failure :invalid_secret_key_format,
|
|
53
55
|
normalized_secret_key: nil,
|
|
54
56
|
public_message: I18n.t('booth.invalid_secret_key_format')
|