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.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/LICENSE.md +1 -2
  4. data/README.md +37 -6
  5. data/app/assets/images/booth/browsers/README.md +1 -2
  6. data/app/assets/images/booth/browsers/chrome.svg +1 -1
  7. data/app/assets/images/booth/browsers/edge.svg +1 -1
  8. data/app/assets/images/booth/browsers/firefox.svg +1 -1
  9. data/app/assets/images/booth/browsers/opera.svg +1 -1
  10. data/app/assets/images/booth/browsers/safari.svg +1 -1
  11. data/app/assets/images/booth/fido/passkey_mark_a.svg +10 -0
  12. data/app/assets/images/booth/fido/passkey_mark_a_black.svg +32 -0
  13. data/app/assets/images/booth/fido/passkey_mark_a_reverse.svg +33 -0
  14. data/app/assets/images/booth/fido/passkey_mark_a_white.svg +32 -0
  15. data/app/assets/images/booth/fido/passkey_mark_b_black.svg +1 -0
  16. data/app/assets/images/booth/platforms/android.svg +1 -6
  17. data/app/assets/images/booth/platforms/apple.svg +1 -6
  18. data/app/assets/images/booth/platforms/linux.svg +1 -6
  19. data/app/assets/images/booth/platforms/windows.svg +1 -6
  20. data/app/assets/javascripts/booth/authentication.js +29 -0
  21. data/app/assets/javascripts/booth/authentication.js.map +1 -0
  22. data/app/assets/javascripts/booth/error.js +38 -0
  23. data/app/assets/javascripts/booth/error.js.map +1 -0
  24. data/app/assets/javascripts/booth/form.js +78 -0
  25. data/app/assets/javascripts/booth/form.js.map +1 -0
  26. data/app/assets/javascripts/booth/gui.js +53 -0
  27. data/app/assets/javascripts/booth/gui.js.map +1 -0
  28. data/app/assets/javascripts/booth/registration.js +29 -0
  29. data/app/assets/javascripts/booth/registration.js.map +1 -0
  30. data/app/assets/javascripts/booth/setup.js +14 -0
  31. data/app/assets/javascripts/booth/verification.js +49 -0
  32. data/app/assets/javascripts/booth/verification.js.map +1 -0
  33. data/app/assets/javascripts/declarations/authentication.d.ts +6 -0
  34. data/app/assets/javascripts/declarations/error.d.ts +36 -0
  35. data/app/assets/javascripts/declarations/form.d.ts +8 -0
  36. data/app/assets/javascripts/declarations/gui.d.ts +4 -0
  37. data/app/assets/javascripts/declarations/registration.d.ts +6 -0
  38. data/app/assets/javascripts/declarations/setup.d.ts +3 -0
  39. data/app/assets/javascripts/declarations/verification.d.ts +6 -0
  40. data/app/assets/javascripts/src/authentication.ts +41 -0
  41. data/app/assets/javascripts/src/error.ts +35 -0
  42. data/app/assets/javascripts/src/form.ts +90 -0
  43. data/app/assets/javascripts/src/gui.ts +59 -0
  44. data/app/assets/javascripts/src/registration.ts +44 -0
  45. data/app/assets/javascripts/src/verification.ts +61 -0
  46. data/app/assets/stylesheets/booth/booth.css +3 -0
  47. data/config/importmap.rb +11 -0
  48. data/config/locales/de.yml +14 -38
  49. data/config/locales/en.yml +17 -36
  50. data/data/combined_aaguid.json +1 -0
  51. data/lib/booth/adminland/credentials/create.rb +10 -12
  52. data/lib/booth/adminland/credentials/index.rb +31 -0
  53. data/lib/booth/adminland/onboardings/create.rb +24 -15
  54. data/lib/booth/adminland/onboardings/destroy.rb +8 -4
  55. data/lib/booth/adminland/onboardings/find.rb +52 -45
  56. data/lib/booth/adminland/onboardings/find_unconsumed.rb +61 -0
  57. data/lib/booth/adminland/onboardings/index.rb +6 -3
  58. data/lib/booth/adminland/periodic_cleanup.rb +7 -2
  59. data/lib/booth/adminland.rb +17 -18
  60. data/lib/booth/coercers/domain.rb +11 -0
  61. data/lib/booth/coercers/request.rb +51 -0
  62. data/lib/booth/coercers/scope.rb +11 -0
  63. data/lib/booth/comparisons/domain.rb +38 -0
  64. data/lib/booth/comparisons/scope.rb +38 -0
  65. data/lib/booth/concerns/action.rb +25 -13
  66. data/lib/booth/concerns/transition.rb +5 -2
  67. data/lib/booth/configuration.rb +14 -73
  68. data/lib/booth/configure.rb +3 -10
  69. data/lib/booth/{audits/register → core/audit}/completed_onboarding.rb +8 -6
  70. data/lib/booth/core/audit/credential_created.rb +24 -0
  71. data/lib/booth/core/audit/logout.rb +24 -0
  72. data/lib/booth/core/authenticators/confirm.rb +30 -0
  73. data/lib/booth/core/authenticators/step.rb +24 -0
  74. data/lib/booth/core/cooldowns/distance_of_time.rb +50 -0
  75. data/lib/booth/core/cooldowns/strategies/exponential.rb +88 -0
  76. data/lib/booth/core/cooldowns/strategies/global.rb +66 -0
  77. data/lib/booth/core/cooldowns/strategies/result.rb +27 -0
  78. data/lib/booth/core/credentials/create.rb +32 -0
  79. data/lib/booth/core/credentials/find_by_username.rb +63 -0
  80. data/lib/booth/core/credentials/index.rb +15 -0
  81. data/lib/booth/core/credentials/webauth_challenge.rb +37 -0
  82. data/lib/booth/core/geolocation.rb +25 -0
  83. data/lib/booth/core/onboardings/find.rb +92 -0
  84. data/lib/booth/core/onboardings/step.rb +19 -0
  85. data/lib/booth/core/remotes/get.rb +45 -0
  86. data/lib/booth/core/remotes/respond.rb +82 -0
  87. data/lib/booth/core/remotes/set_for_login.rb +31 -0
  88. data/lib/booth/core/sessions/create_and_login.rb +63 -0
  89. data/lib/booth/core/sessions/historical_locations.rb +22 -0
  90. data/lib/booth/core/sessions/index.rb +66 -0
  91. data/lib/booth/core/sessions/revoke.rb +59 -0
  92. data/lib/booth/core/sessions/revoke_all_others.rb +49 -0
  93. data/lib/booth/core/sessions/to_passport.rb +35 -0
  94. data/lib/booth/core/webauth/authentication_verification.rb +76 -0
  95. data/lib/booth/core/webauth/options_for_create.rb +56 -0
  96. data/lib/booth/core/webauth/options_for_get.rb +30 -0
  97. data/lib/booth/core/webauth/provider.rb +36 -0
  98. data/lib/booth/core/webauth/registration_verification.rb +100 -0
  99. data/lib/booth/credential.rb +35 -0
  100. data/lib/booth/engine.rb +15 -4
  101. data/lib/booth/errors.rb +2 -0
  102. data/lib/booth/hooks/after_fetch.rb +14 -6
  103. data/lib/booth/hooks/before_logout.rb +5 -3
  104. data/lib/booth/hooks/serialize_from_session.rb +13 -5
  105. data/lib/booth/hooks/serialize_into_session.rb +6 -3
  106. data/lib/booth/logging.rb +13 -42
  107. data/lib/booth/models/application_record.rb +3 -0
  108. data/lib/booth/models/audit.rb +10 -11
  109. data/lib/booth/models/authenticator.rb +6 -9
  110. data/lib/booth/models/credential.rb +17 -20
  111. data/lib/booth/models/onboarding.rb +16 -39
  112. data/lib/booth/models/{contest.rb → remote.rb} +13 -14
  113. data/lib/booth/models/remotes/scopes/recently_created.rb +26 -0
  114. data/lib/booth/models/remotes/scopes/recently_responded.rb +35 -0
  115. data/lib/booth/models/session.rb +15 -10
  116. data/lib/booth/models/user_agent.rb +2 -0
  117. data/lib/booth/request.rb +43 -22
  118. data/lib/booth/requests/agent.rb +3 -1
  119. data/lib/booth/requests/authentication.rb +15 -5
  120. data/lib/booth/requests/ip.rb +4 -2
  121. data/lib/booth/requests/return_path.rb +4 -2
  122. data/lib/booth/requests/session.rb +6 -4
  123. data/lib/booth/requests/storage.rb +5 -31
  124. data/lib/booth/requests/storages/login.rb +35 -29
  125. data/lib/booth/requests/storages/registration.rb +2 -0
  126. data/lib/booth/requests/storages/webauth.rb +3 -0
  127. data/lib/booth/requests/sudo.rb +6 -50
  128. data/lib/booth/routes/userland.rb +13 -59
  129. data/lib/booth/syntaxes/domain.rb +46 -0
  130. data/lib/booth/syntaxes/email.rb +11 -8
  131. data/lib/booth/syntaxes/ip.rb +6 -4
  132. data/lib/booth/syntaxes/remote_code.rb +60 -0
  133. data/lib/booth/syntaxes/scope.rb +7 -3
  134. data/lib/booth/syntaxes/secret_key.rb +8 -6
  135. data/lib/booth/syntaxes/username.rb +23 -10
  136. data/lib/booth/syntaxes/uuid.rb +3 -1
  137. data/lib/booth/test.rb +27 -22
  138. data/lib/booth/testing/incorporation_test_case.rb +29 -0
  139. data/lib/booth/testing/shortcuts.rb +77 -0
  140. data/lib/booth/testing/support/assert_all_partials_were_covered.rb +69 -0
  141. data/lib/booth/testing/support/assert_logged_in.rb +68 -0
  142. data/lib/booth/{test → testing}/support/assert_logged_out.rb +7 -4
  143. data/lib/booth/testing/support/assert_partial.rb +56 -0
  144. data/lib/booth/{test → testing}/support/force_login.rb +10 -4
  145. data/lib/booth/{test → testing}/support/get_session_value.rb +8 -6
  146. data/lib/booth/testing/support/scenario.rb +23 -0
  147. data/lib/booth/testing/support/shortcuts/create_and_onboard.rb +56 -0
  148. data/lib/booth/testing/support/shortcuts/login_with_passkey.rb +55 -0
  149. data/lib/booth/testing/support/shortcuts/register_new_passkey.rb +51 -0
  150. data/lib/booth/testing/support/soft_reset_session.rb +24 -0
  151. data/lib/booth/testing/support/virtual_authenticators/create.rb +34 -0
  152. data/lib/booth/testing/support/virtual_authenticators/destroy.rb +20 -0
  153. data/lib/booth/testing/support/virtual_authenticators/enable.rb +24 -0
  154. data/lib/booth/testing/support/virtual_authenticators/load.rb +38 -0
  155. data/lib/booth/testing/support/virtual_authenticators/manager.rb +124 -0
  156. data/lib/booth/testing/support/visit.rb +62 -0
  157. data/lib/booth/testing/userland/login_remotely.rb +100 -0
  158. data/lib/booth/testing/userland/onboarding_first_time.rb +81 -0
  159. data/lib/booth/testing/userland/onboarding_to_reset_passkeys.rb +129 -0
  160. data/lib/booth/testing/userland/registration_with_passkey.rb +93 -0
  161. data/lib/booth/testing/userland/registration_without_passkey.rb +101 -0
  162. data/lib/booth/testing/userland/sessions_manage_behavior.rb +68 -0
  163. data/lib/booth/testing/userland/sessions_revoke_all_others.rb +17 -0
  164. data/lib/booth/testing/userland/sessions_revoke_one.rb +17 -0
  165. data/lib/booth/testing/userland.rb +36 -0
  166. data/lib/booth/to_struct.rb +9 -2
  167. data/lib/booth/userland/extract_flash_messages.rb +10 -3
  168. data/lib/booth/userland/logins/create.rb +8 -6
  169. data/lib/booth/userland/logins/destroy.rb +23 -6
  170. data/lib/booth/userland/logins/new.rb +23 -25
  171. data/lib/booth/userland/logins/transitions/create/choose_username.rb +62 -27
  172. data/lib/booth/userland/logins/transitions/create/skip_remotes.rb +18 -14
  173. data/lib/booth/userland/logins/transitions/create/webauth_authentication_initiation.rb +54 -48
  174. data/lib/booth/userland/logins/transitions/create/webauth_authentication_verification.rb +62 -58
  175. data/lib/booth/userland/logins/transitions/new/already_logged_in.rb +4 -3
  176. data/lib/booth/userland/logins/transitions/new/fallible.rb +4 -0
  177. data/lib/booth/userland/logins/transitions/new/{mode_username_and_password.rb → missing_authenticators.rb} +5 -4
  178. data/lib/booth/userland/logins/transitions/new/mode_username_and_webauth.rb +6 -4
  179. data/lib/booth/userland/logins/transitions/new/no_username_chosen.rb +3 -1
  180. data/lib/booth/userland/logins/transitions/new/remote_session_available.rb +20 -13
  181. data/lib/booth/userland/logins/transitions/new/timed_out.rb +3 -1
  182. data/lib/booth/userland/onboardings/show.rb +65 -39
  183. data/lib/booth/userland/onboardings/update.rb +46 -38
  184. data/lib/booth/userland/registrations/create.rb +51 -20
  185. data/lib/booth/userland/registrations/new.rb +6 -7
  186. data/lib/booth/userland/remotes/show.rb +56 -0
  187. data/lib/booth/userland/{personal_contests → remotes}/update.rb +5 -3
  188. data/lib/booth/userland/sessions/destroy_one_or_other.rb +3 -16
  189. data/lib/booth/userland/sessions/index.rb +4 -2
  190. data/lib/booth/userland/sessions/show.rb +5 -6
  191. data/lib/booth/userland/sessions/transitions/destroy/enter_webauth.rb +8 -6
  192. data/lib/booth/userland/sessions/transitions/destroy/webauth_authentication_initiation.rb +8 -6
  193. data/lib/booth/userland/sessions/transitions/destroy/webauth_authentication_verification.rb +7 -5
  194. data/lib/booth/userland/sessions/transitions/show/enter_webauth.rb +8 -6
  195. data/lib/booth/userland/webauths/create.rb +20 -17
  196. data/lib/booth/userland/webauths/destroy.rb +6 -16
  197. data/lib/booth/userland/webauths/guards/sudo.rb +10 -5
  198. data/lib/booth/userland/webauths/index.rb +4 -2
  199. data/lib/booth/userland/webauths/new.rb +7 -22
  200. data/lib/booth/userland/webauths/sudo.rb +3 -1
  201. data/lib/booth/userland/webauths/transitions/create/authentication_initiation.rb +8 -11
  202. data/lib/booth/userland/webauths/transitions/create/authentication_verification.rb +11 -13
  203. data/lib/booth/userland/webauths/transitions/create/choose_nickname.rb +8 -5
  204. data/lib/booth/userland/webauths/transitions/create/registration_initiation.rb +15 -14
  205. data/lib/booth/userland/webauths/transitions/create/registration_verification.rb +34 -28
  206. data/lib/booth/userland/webauths/transitions/create/reset.rb +2 -0
  207. data/lib/booth/userland/webauths/transitions/new/step.rb +3 -1
  208. data/lib/booth/userland/webauths/transitions/sudo/authentication_initiation.rb +5 -10
  209. data/lib/booth/userland/webauths/transitions/sudo/authentication_verification.rb +4 -2
  210. data/lib/booth/userland.rb +53 -109
  211. data/lib/booth/version.rb +3 -1
  212. data/lib/booth.rb +6 -236
  213. data/lib/generators/booth/migration/migration_generator.rb +2 -1
  214. data/lib/generators/booth/migration/templates/add_credential_to_users.erb +6 -4
  215. data/lib/generators/booth/migration/templates/create_booth_tables.erb +61 -72
  216. metadata +124 -571
  217. data/app/assets/config/booth_manifest.js +0 -15
  218. data/app/assets/images/booth/browsers/internet_explorer.svg +0 -1
  219. data/app/assets/javascripts/booth/all.js +0 -162
  220. data/app/assets/javascripts/booth/all.js.map +0 -1
  221. data/app/assets/javascripts/booth/booth.ts +0 -194
  222. data/app/assets/javascripts/booth/webauthn-json.ts +0 -99
  223. data/lib/booth/adminland/recoveries/consume.rb +0 -70
  224. data/lib/booth/audits/register/added_otp.rb +0 -22
  225. data/lib/booth/audits/register/changed_otp.rb +0 -22
  226. data/lib/booth/audits/register/correct_otp.rb +0 -42
  227. data/lib/booth/audits/register/correct_password.rb +0 -43
  228. data/lib/booth/audits/register/logout.rb +0 -22
  229. data/lib/booth/audits/register/requested_password_reset.rb +0 -22
  230. data/lib/booth/audits/register/wrong_otp.rb +0 -22
  231. data/lib/booth/audits/register/wrong_password.rb +0 -25
  232. data/lib/booth/authenticators/confirm.rb +0 -34
  233. data/lib/booth/authenticators/credential_mode_after_confirmation.rb +0 -25
  234. data/lib/booth/authenticators/step.rb +0 -19
  235. data/lib/booth/contests/get.rb +0 -36
  236. data/lib/booth/contests/respond.rb +0 -78
  237. data/lib/booth/contests/set_for_login.rb +0 -28
  238. data/lib/booth/cooldowns/distance_of_time.rb +0 -46
  239. data/lib/booth/cooldowns/otp.rb +0 -22
  240. data/lib/booth/cooldowns/password.rb +0 -44
  241. data/lib/booth/cooldowns/password_reset.rb +0 -24
  242. data/lib/booth/cooldowns/strategies/exponential.rb +0 -82
  243. data/lib/booth/cooldowns/strategies/global.rb +0 -62
  244. data/lib/booth/cooldowns/strategies/result.rb +0 -22
  245. data/lib/booth/credentials/create.rb +0 -28
  246. data/lib/booth/credentials/create_with_onboarding.rb +0 -26
  247. data/lib/booth/credentials/find_by_username.rb +0 -45
  248. data/lib/booth/credentials/mode.rb +0 -69
  249. data/lib/booth/credentials/modes/otp_addable.rb +0 -23
  250. data/lib/booth/credentials/modes/otp_changeable.rb +0 -23
  251. data/lib/booth/credentials/modes/otp_manageable.rb +0 -17
  252. data/lib/booth/credentials/modes/otp_removable.rb +0 -23
  253. data/lib/booth/credentials/modes/password_addable.rb +0 -29
  254. data/lib/booth/credentials/modes/password_changeable.rb +0 -31
  255. data/lib/booth/credentials/modes/password_manageable.rb +0 -17
  256. data/lib/booth/credentials/modes/password_removable.rb +0 -24
  257. data/lib/booth/credentials/modes/password_removal_requires_user_verifiable_webauth.rb +0 -16
  258. data/lib/booth/credentials/modes/webauth_addable.rb +0 -26
  259. data/lib/booth/credentials/modes/webauth_manageable.rb +0 -16
  260. data/lib/booth/credentials/modes/webauth_removable.rb +0 -25
  261. data/lib/booth/credentials/otp_authentication.rb +0 -59
  262. data/lib/booth/credentials/password_authentication.rb +0 -72
  263. data/lib/booth/credentials/webauth_challenge.rb +0 -28
  264. data/lib/booth/geolocation.rb +0 -20
  265. data/lib/booth/logger.rb +0 -41
  266. data/lib/booth/method_object.rb +0 -73
  267. data/lib/booth/mode.rb +0 -22
  268. data/lib/booth/models/concerns/modeable.rb +0 -50
  269. data/lib/booth/models/concerns/otpable.rb +0 -37
  270. data/lib/booth/models/concerns/passwordable.rb +0 -58
  271. data/lib/booth/models/contests/scopes/recently_created.rb +0 -23
  272. data/lib/booth/models/contests/scopes/recently_responded.rb +0 -32
  273. data/lib/booth/models/password_reset.rb +0 -41
  274. data/lib/booth/models/recovery.rb +0 -32
  275. data/lib/booth/models/registration.rb +0 -10
  276. data/lib/booth/modes/base.rb +0 -25
  277. data/lib/booth/modes/username_and_password.rb +0 -7
  278. data/lib/booth/modes/username_and_webauth.rb +0 -7
  279. data/lib/booth/modes/username_password_and_otp.rb +0 -7
  280. data/lib/booth/modes/username_password_and_webauth.rb +0 -7
  281. data/lib/booth/onboardings/find.rb +0 -35
  282. data/lib/booth/onboardings/propagate_to_credential.rb +0 -63
  283. data/lib/booth/onboardings/step.rb +0 -68
  284. data/lib/booth/password_resets/create.rb +0 -57
  285. data/lib/booth/password_resets/find.rb +0 -36
  286. data/lib/booth/password_resets/propagate_to_credential.rb +0 -36
  287. data/lib/booth/password_resets/step.rb +0 -18
  288. data/lib/booth/recoveries/create.rb +0 -45
  289. data/lib/booth/requests/storages/otp.rb +0 -54
  290. data/lib/booth/requests/storages/password.rb +0 -49
  291. data/lib/booth/requests/storages/password_reset.rb +0 -35
  292. data/lib/booth/requests/storages/recovery.rb +0 -35
  293. data/lib/booth/sessions/create_and_login.rb +0 -46
  294. data/lib/booth/sessions/historical_locations.rb +0 -18
  295. data/lib/booth/sessions/index.rb +0 -59
  296. data/lib/booth/sessions/revoke.rb +0 -51
  297. data/lib/booth/sessions/revoke_all_others.rb +0 -43
  298. data/lib/booth/sessions/to_passport.rb +0 -51
  299. data/lib/booth/syntaxes/contest_code.rb +0 -58
  300. data/lib/booth/syntaxes/otp.rb +0 -57
  301. data/lib/booth/syntaxes/scope_comparison.rb +0 -28
  302. data/lib/booth/test/helpers.rb +0 -63
  303. data/lib/booth/test/support/assert_all_partials_were_covered.rb +0 -63
  304. data/lib/booth/test/support/assert_logged_in.rb +0 -49
  305. data/lib/booth/test/support/assert_partial.rb +0 -29
  306. data/lib/booth/test/support/otp_code_from_session.rb +0 -30
  307. data/lib/booth/test/support/soft_reset_session.rb +0 -22
  308. data/lib/booth/test/userland/logins/missing_authenticators.rb +0 -72
  309. data/lib/booth/test/userland/logins/missing_onboarding.rb +0 -35
  310. data/lib/booth/test/userland/logins/username_and_password.rb +0 -40
  311. data/lib/booth/test/userland/logins/username_and_webauth.rb +0 -75
  312. data/lib/booth/test/userland/logins/username_password_and_otp.rb +0 -45
  313. data/lib/booth/test/userland/logins/username_password_and_webauth.rb +0 -86
  314. data/lib/booth/test/userland/onboardings/already_logged_in.rb +0 -64
  315. data/lib/booth/test/userland/onboardings/otp.rb +0 -63
  316. data/lib/booth/test/userland/onboardings/password.rb +0 -49
  317. data/lib/booth/test/userland/onboardings/timeout.rb +0 -47
  318. data/lib/booth/test/userland/otps/manage.rb +0 -86
  319. data/lib/booth/test/userland/password_resets/reset.rb +0 -102
  320. data/lib/booth/test/userland.rb +0 -38
  321. data/lib/booth/test/webauthn/disable.rb +0 -17
  322. data/lib/booth/test/webauthn/enable.rb +0 -19
  323. data/lib/booth/test/webauthn/virtual_authenticators/create.rb +0 -38
  324. data/lib/booth/test/webauthn/virtual_authenticators/destroy.rb +0 -20
  325. data/lib/booth/userland/logins/transitions/create/enter_otp.rb +0 -70
  326. data/lib/booth/userland/logins/transitions/create/verify_password.rb +0 -70
  327. data/lib/booth/userland/logins/transitions/new/mode_first_time.rb +0 -20
  328. data/lib/booth/userland/logins/transitions/new/mode_username_password_and_otp.rb +0 -24
  329. data/lib/booth/userland/logins/transitions/new/mode_username_password_and_webauth.rb +0 -24
  330. data/lib/booth/userland/onboardings/transitions/update/choose_mode.rb +0 -58
  331. data/lib/booth/userland/onboardings/transitions/update/choose_password.rb +0 -41
  332. data/lib/booth/userland/onboardings/transitions/update/choose_webauth_nickname.rb +0 -50
  333. data/lib/booth/userland/onboardings/transitions/update/confirm_otp.rb +0 -58
  334. data/lib/booth/userland/onboardings/transitions/update/confirm_password.rb +0 -49
  335. data/lib/booth/userland/onboardings/transitions/update/register_otp.rb +0 -31
  336. data/lib/booth/userland/onboardings/transitions/update/reset_otp.rb +0 -40
  337. data/lib/booth/userland/onboardings/transitions/update/reset_password.rb +0 -35
  338. data/lib/booth/userland/onboardings/transitions/update/reset_webauth.rb +0 -46
  339. data/lib/booth/userland/onboardings/transitions/update/webauth_authentication_initiation.rb +0 -40
  340. data/lib/booth/userland/onboardings/transitions/update/webauth_authentication_verification.rb +0 -59
  341. data/lib/booth/userland/onboardings/transitions/update/webauth_registration_initiation.rb +0 -46
  342. data/lib/booth/userland/onboardings/transitions/update/webauth_registration_verification.rb +0 -56
  343. data/lib/booth/userland/otps/destroy.rb +0 -42
  344. data/lib/booth/userland/otps/edit.rb +0 -72
  345. data/lib/booth/userland/otps/guards/manageable.rb +0 -21
  346. data/lib/booth/userland/otps/guards/sudo.rb +0 -23
  347. data/lib/booth/userland/otps/show.rb +0 -36
  348. data/lib/booth/userland/otps/sudo.rb +0 -51
  349. data/lib/booth/userland/otps/transitions/update/confirm.rb +0 -84
  350. data/lib/booth/userland/otps/transitions/update/register.rb +0 -40
  351. data/lib/booth/userland/otps/transitions/update/reset.rb +0 -31
  352. data/lib/booth/userland/otps/update.rb +0 -34
  353. data/lib/booth/userland/password_resets/create.rb +0 -73
  354. data/lib/booth/userland/password_resets/guards/logged_out.rb +0 -21
  355. data/lib/booth/userland/password_resets/new.rb +0 -57
  356. data/lib/booth/userland/password_resets/show.rb +0 -77
  357. data/lib/booth/userland/password_resets/transitions/update/choose_password.rb +0 -48
  358. data/lib/booth/userland/password_resets/transitions/update/confirm_password.rb +0 -54
  359. data/lib/booth/userland/password_resets/transitions/update/reset_password.rb +0 -29
  360. data/lib/booth/userland/password_resets/update.rb +0 -65
  361. data/lib/booth/userland/passwords/destroy.rb +0 -41
  362. data/lib/booth/userland/passwords/edit.rb +0 -54
  363. data/lib/booth/userland/passwords/guards/manageable.rb +0 -21
  364. data/lib/booth/userland/passwords/guards/removable.rb +0 -21
  365. data/lib/booth/userland/passwords/guards/sudo.rb +0 -21
  366. data/lib/booth/userland/passwords/remove.rb +0 -34
  367. data/lib/booth/userland/passwords/show.rb +0 -32
  368. data/lib/booth/userland/passwords/sudo.rb +0 -55
  369. data/lib/booth/userland/passwords/transitions/remove/step.rb +0 -27
  370. data/lib/booth/userland/passwords/transitions/update/choose_password.rb +0 -62
  371. data/lib/booth/userland/passwords/transitions/update/confirm_password.rb +0 -82
  372. data/lib/booth/userland/passwords/update.rb +0 -33
  373. data/lib/booth/userland/personal_contests/show.rb +0 -60
  374. data/lib/booth/userland/recoveries/create.rb +0 -48
  375. data/lib/booth/userland/recoveries/new.rb +0 -35
  376. data/lib/booth/userland/sessions/transitions/destroy/enter_password.rb +0 -50
  377. data/lib/booth/userland/sessions/transitions/destroy/verify_password.rb +0 -83
  378. data/lib/booth/userland/webauths/guards/manageable.rb +0 -21
  379. data/lib/booth/webauth/authentication_verification.rb +0 -68
  380. data/lib/booth/webauth/demand_user_verification.rb +0 -29
  381. data/lib/booth/webauth/options_for_create.rb +0 -46
  382. data/lib/booth/webauth/options_for_get.rb +0 -29
  383. 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
@@ -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