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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Onboardings
@@ -8,61 +10,85 @@ module Booth
8
10
  request.must_be_get!
9
11
  request.must_be_html!
10
12
 
11
- do_find_onboarding
12
- .on_success { do_check_logged_out }
13
- .on_success { do_access_onboarding }
13
+ do_find
14
+ .on_success { do_check_consummation }
15
+ .on_success { do_check_not_logged_in_as_wrong_user }
16
+ .on_success { do_check_onboarding_not_needed }
17
+ .on_success { do_access }
14
18
  end
15
19
 
16
- def do_find_onboarding
17
- finding = ::Booth::Onboardings::Find.call(secret_key:)
18
- finding.on_failure do
19
- return Tron.failure finding.failure, step: :not_found, public_message: finding.public_message
20
+ private
21
+
22
+ attr_accessor :onboarding
23
+
24
+ def do_find
25
+ finding = ::Booth::Core::Onboardings::Find.call(domain: request.host,
26
+ scope:,
27
+ secret_key:,
28
+ consumed: :any)
29
+
30
+ if finding.success?
31
+ self.onboarding = finding.onboarding
32
+ return finding
20
33
  end
21
34
 
22
- @onboarding = finding.onboarding
23
- finding
35
+ step = case finding.failure
36
+ when :credential_blocked then :blocked
37
+ when :onboarding_outdated then :timed_out
38
+ else :not_found
39
+ end
40
+
41
+ Tron.failure(finding.failure, step:,
42
+ public_message: finding.try(:public_message))
24
43
  end
25
44
 
26
- def do_check_logged_out
27
- unless request.authentication.logged_in?
28
- debug { "Good, nobody happens to be already logged in in scope #{@onboarding.scope}" }
29
- return Tron.success :not_logged_in
30
- end
45
+ def do_check_consummation
46
+ return Tron.success :onboarding_can_be_consumed unless onboarding.consumed?
31
47
 
32
- if request.authentication.logged_in_as?(credential: @onboarding.credential)
33
- debug { "#{@onboarding.credential.username} is already logged in in scope #{@onboarding.scope}" }
34
- return Tron.success :logged_in_as_same_credential
48
+ if request.authentication.logged_in_as?(credential: onboarding.credential)
49
+ Tron.failure(:onboarding_completed, username: onboarding.username, step: :success)
50
+ else
51
+ Tron.failure(:onboarding_already_consumed, step: :already_used)
35
52
  end
53
+ end
54
+
55
+ def do_check_not_logged_in_as_wrong_user
56
+ if request.authentication.logged_out? ||
57
+ request.authentication.logged_in_as?(credential: onboarding.credential)
36
58
 
37
- debug do
38
- "Logged in as user #{request.authentication.username.inspect} but trying to onboard as #{@onboarding.username.inspect}"
59
+ log { "No wrong user is logged in in scope #{onboarding.scope}" }
60
+ return Tron.success :not_logged_in_as_wrong_user
39
61
  end
40
62
 
41
- Tron.failure :already_logged_in, step: :already_logged_in,
42
- secret_key: @onboarding.secret_key,
43
- username: @onboarding.username
63
+ log { "Cannot onboard #{onboarding.username} because #{request.authentication.username}" }
64
+ Tron.failure :wrong_user_logged_in, step: :wrong_user,
65
+ secret_key: onboarding.secret_key,
66
+ username: onboarding.username
44
67
  end
45
68
 
46
- # TODO: Check recently created?
69
+ def do_check_onboarding_not_needed
70
+ if request.authentication.logged_in_as?(credential: onboarding.credential) &&
71
+ !onboarding.credential.registered_authenticators?
72
+
73
+ log { "#{onboarding.credential.username} already logged in scope #{onboarding.scope}" }
74
+ # TODO: Incapacitate the onboarding and audit to explain what happened
75
+ return Tron.failure :onboarding_not_needed, step: :not_needed
76
+ end
47
77
 
48
- def do_access_onboarding
49
- @onboarding.update! accessed_at: Time.current if @onboarding.accessed_at.blank?
78
+ Tron.success :onboarding_might_be_needed
79
+ end
50
80
 
51
- debug do
52
- "Accessed Onboarding #{@onboarding.id.inspect} (Step #{@onboarding.step}) and Credential #{@onboarding.credential_id.inspect}"
81
+ def do_access
82
+ if onboarding.accessed_at.blank?
83
+ onboarding.update! accessed_at: Time.current
84
+ log { "Accessed Onboarding #{onboarding.id} of Credential #{onboarding.credential_id}" }
53
85
  end
54
- Tron.success :onboarding_accessed, credential_id: @onboarding.credential_id,
55
- step: @onboarding.step,
56
- username: @onboarding.username,
57
- mode: ::Booth::Mode.find(@onboarding.mode),
58
- secret_key: @onboarding.secret_key,
59
- allowed_modes: ::Booth::Mode.wrap(@onboarding.allowed_modes),
60
- authenticator_id: @onboarding.authenticator_id.presence,
61
- authenticator_nickname: @onboarding.authenticator_nickname.presence,
62
- otp_provisioning_svg: @onboarding.otp_provisioning_svg,
63
- otp_provisioning_url: @onboarding.otp_provisioning_url,
64
- minlength: @onboarding.class.password_minlength,
65
- passwordrules: @onboarding.class.passwordrules
86
+
87
+ Tron.success :onboarding_accessed, credential_id: onboarding.credential_id,
88
+ username: onboarding.username,
89
+ secret_key: onboarding.secret_key,
90
+ authenticator_count: onboarding.credential.registered_authenticator_ids.count,
91
+ step: :redeem
66
92
  end
67
93
 
68
94
  def secret_key
@@ -1,66 +1,74 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Onboardings
6
+ # Consume an Onboarding.
4
7
  class Update
5
8
  include ::Booth::Concerns::Action
6
9
 
10
+ # TODO: Audit and Throttle
7
11
  def call
8
12
  request.must_be_patch!
9
13
 
10
- do_find_onboarding
11
- .on_success { do_check_propagation }
12
- .on_success { do_transition }
14
+ do_find
15
+ .on_success { do_check_not_logged_in_as_wrong_user }
16
+ .on_success { do_destroy_authenticators }
17
+ .on_success { do_consume }
13
18
  end
14
19
 
15
20
  private
16
21
 
17
- def do_find_onboarding
18
- finding = ::Booth::Onboardings::Find.call(secret_key: params[:id])
19
- return finding if finding.failure?
22
+ attr_accessor :onboarding
23
+
24
+ def do_find
25
+ finding = ::Booth::Core::Onboardings::Find.call(domain: request.host,
26
+ scope:,
27
+ secret_key:,
28
+ consumed: false)
29
+
30
+ if finding.success?
31
+ self.onboarding = finding.onboarding
32
+ return finding
33
+ end
20
34
 
21
- @onboarding = finding.onboarding
22
- finding
35
+ Tron.failure(finding.failure, public_message: finding.try(:public_message))
23
36
  end
24
37
 
25
- def do_check_propagation
26
- return Tron.success :not_yet_propagated unless @onboarding.propagated?
38
+ def do_check_not_logged_in_as_wrong_user
39
+ if request.authentication.logged_out? ||
40
+ request.authentication.logged_in_as?(credential: onboarding.credential)
27
41
 
28
- Tron.failure :already_propagated
42
+ return Tron.success :not_logged_in_as_wrong_user
43
+ end
44
+
45
+ log { "Cannot onboard #{onboarding.username} because #{request.authentication.username}" }
46
+ Tron.failure :wrong_user_logged_in
29
47
  end
30
48
 
31
- def initialize_transition
32
- transition.call(onboarding: @onboarding, request:)
49
+ def do_destroy_authenticators
50
+ onboarding.credential.authenticators.each do |authenticator|
51
+ authenticator.destroy!
52
+ log { "Destroyed authenticator #{authenticator.id} of credential #{onboarding.credential.id}" }
53
+ end
54
+
55
+ Tron.success :authenticators_destroyed
33
56
  end
34
57
 
35
- def after_transition
36
- @onboarding.reload # Ensure the onboarding instance is in an invalid state after a failed update attempt.
37
- debug { "Onboarding updated, now in step #{@onboarding.step}" }
38
- return unless @onboarding.completed?
58
+ def do_consume
59
+ onboarding.update! consumed_at: Time.current
60
+ log { "Consumed Onboarding #{onboarding.id} of Credential #{onboarding.credential_id}" }
39
61
 
40
- ::Booth::Onboardings::PropagateToCredential.call(@onboarding, ip: request.ip, agent: request.agent)
41
- # The `CreateRegistration` flow may already have logged you in.
42
- return if request.authentication.logged_in?
62
+ ::Booth::Core::Sessions::CreateAndLogin.call(domain: request.host,
63
+ scope:,
64
+ credential: onboarding.credential,
65
+ request:)
43
66
 
44
- debug { 'Nobody is logged in, so this Onboarding was without prior self-registration. Logging you in now...'}
45
- ::Booth::Sessions::CreateAndLogin.call(credential: @onboarding.credential, request:)
67
+ Tron.success :onboarding_consumed
46
68
  end
47
69
 
48
- def transitions # rubocop:disable Metrics/MethodLength
49
- [
50
- ::Booth::Userland::Onboardings::Transitions::Update::ChooseMode,
51
- ::Booth::Userland::Onboardings::Transitions::Update::ChoosePassword,
52
- ::Booth::Userland::Onboardings::Transitions::Update::ChooseWebauthNickname,
53
- ::Booth::Userland::Onboardings::Transitions::Update::ConfirmOtp,
54
- ::Booth::Userland::Onboardings::Transitions::Update::ConfirmPassword,
55
- ::Booth::Userland::Onboardings::Transitions::Update::RegisterOtp,
56
- ::Booth::Userland::Onboardings::Transitions::Update::ResetOtp,
57
- ::Booth::Userland::Onboardings::Transitions::Update::ResetPassword,
58
- ::Booth::Userland::Onboardings::Transitions::Update::ResetWebauth,
59
- ::Booth::Userland::Onboardings::Transitions::Update::WebauthAuthenticationInitiation,
60
- ::Booth::Userland::Onboardings::Transitions::Update::WebauthAuthenticationVerification,
61
- ::Booth::Userland::Onboardings::Transitions::Update::WebauthRegistrationInitiation,
62
- ::Booth::Userland::Onboardings::Transitions::Update::WebauthRegistrationVerification,
63
- ]
70
+ def secret_key
71
+ params[:id]
64
72
  end
65
73
  end
66
74
  end
@@ -1,46 +1,77 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Registrations
6
+ # User posts a form to self-register a new username.
4
7
  class Create
5
8
  include ::Booth::Concerns::Action
6
9
 
7
- option :allowed_modes
8
-
9
10
  def call
10
11
  request.must_be_post!
11
12
 
12
- debug { "You want to register the username #{username_param.inspect}, let's see if it is taken." }
13
- finding = ::Booth::Credentials::FindByUsername.call(username: username_param)
13
+ do_check_domain
14
+ .on_success { do_check_logged_in }
15
+ .on_success { do_check_taken }
16
+ .on_success { do_create }
17
+ end
18
+
19
+ private
20
+
21
+ attr_accessor :domain, :username
22
+
23
+ def do_check_domain
24
+ check = ::Booth::Syntaxes::Domain.call(request.host)
25
+ self.domain = check.valid_domain
26
+ check
27
+ end
28
+
29
+ def do_check_logged_in
30
+ if request.authentication.logged_in?
31
+ log { "Looks like you're already logged in (e.g. POST from a stale form)" }
32
+ return Tron.failure :already_logged_in
33
+ end
34
+
35
+ Tron.success :currently_not_logged_in
36
+ end
37
+
38
+ def do_check_taken # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
39
+ log { "You want to register the username #{username_param.inspect}, let's see if taken." }
40
+ finding = ::Booth::Core::Credentials::FindByUsername.call(username: username_param)
41
+ self.username = finding.normalized_username
14
42
  registration_storage.username = finding.normalized_invalid_username
15
43
 
16
44
  finding.on_success do
17
- debug { 'That username is taken. You should try to login instead.' }
45
+ log { 'That username is taken. You should try to login instead.' }
18
46
  login_storage.credential_for_username = finding.credential
19
47
  public_message = I18n.t('booth.username_already_exists')
20
- return Tron.success :username_exists, public_message:
48
+ return Tron.failure :username_exists, public_message:
21
49
  end
22
50
 
23
- debug { 'That username is available.' }
51
+ log { 'That username is available.' }
24
52
  return finding unless finding.failure == :credential_not_found
25
53
 
26
- creation = ::Booth::Credentials::CreateWithOnboarding.call(
27
- username: finding.normalized_username,
28
- allowed_modes:,
29
- scope:
30
- )
54
+ Tron.success :username_available
55
+ end
31
56
 
32
- creation.on_success do
33
- ::Booth::Sessions::CreateAndLogin.call(credential: creation.credential, request:)
34
- return Tron.success :username_is_available, public_message: 'You have registered an account.'
35
- end
57
+ def do_create # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
58
+ ::Booth::Models::Credential.transaction do
59
+ creation = ::Booth::Core::Credentials::Create.call(username:, scope:, domain:)
36
60
 
37
- Tron.failure :registration_failed, error: creation.error
38
- end
61
+ creation.on_success do
62
+ ::Booth::Core::Audit::CredentialCreated.call(credential: creation.credential,
63
+ ip: request.ip, agent: request.agent)
64
+ ::Booth::Core::Sessions::CreateAndLogin.call(domain: request.host, scope:, credential: creation.credential, request:)
65
+ return Tron.success :username_is_available, credential_id: creation.credential.id,
66
+ public_message: 'You have registered an account.'
67
+ end
39
68
 
40
- private
69
+ Tron.failure :registration_failed, error: creation.error
70
+ end
71
+ end
41
72
 
42
73
  def username_param
43
- params.require(:registration).permit(:username)[:username]
74
+ params.expect(registration: [:username])[:username]
44
75
  end
45
76
 
46
77
  def login_storage
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Registrations
6
+ # Create a Credential for yourself.
4
7
  class New
5
8
  include ::Booth::Concerns::Action
6
9
 
@@ -11,25 +14,21 @@ module Booth
11
14
  if already_logged_in?
12
15
  call_already_logged_in
13
16
  else
14
- Tron.failure :choose_username, step: :choose_username, username: storage.username
17
+ Tron.failure(:choose_username, step: :choose_username, username: storage.username)
15
18
  end
16
19
  end
17
20
 
18
21
  private
19
22
 
20
23
  def call_already_logged_in
21
- debug { "Looks like you're already logged in" }
22
- Tron.success :logged_in, step: :already_logged_in
24
+ log { "Looks like you're already logged in" }
25
+ Tron.failure :logged_in, step: :already_logged_in
23
26
  end
24
27
 
25
28
  def already_logged_in?
26
29
  request.authentication.logged_in?
27
30
  end
28
31
 
29
- def username
30
- storage.username
31
- end
32
-
33
32
  def storage
34
33
  request.storage.registration
35
34
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Booth
4
+ module Userland
5
+ module Remotes
6
+ class Show
7
+ include ::Booth::Concerns::Action
8
+
9
+ def call
10
+ request.must_be_get!
11
+ request.must_be_html!
12
+ request.must_be_logged_in!
13
+
14
+ log { 'You want to receive your personal remote...' }
15
+
16
+ if remote.failure?
17
+ log { "This credential doesn't have any remote right now." }
18
+ return Tron.success :no_remote, step: :no_remote
19
+ end
20
+
21
+ if remote.recently_responded
22
+ log { 'The current remote has already been responded to' }
23
+ return Tron.success :remote_responded, step: :remote_solved
24
+ end
25
+
26
+ log { 'You have a remote to respond to' }
27
+ Tron.success :you_can_login_remotely,
28
+ ip: remote.ip,
29
+ agent: remote.agent.presence,
30
+ location: remote.location.presence,
31
+ browser_name: remote.browser_name,
32
+ platform_name: remote.platform_name,
33
+ browser_image_path: remote.browser_image_path,
34
+ platform_image_path: remote.platform_image_path,
35
+ step: :remote_login
36
+ end
37
+
38
+ private
39
+
40
+ def credential
41
+ return @credential if defined?(@credential)
42
+
43
+ id = request.authentication.credential_id
44
+ @credential = ::Booth::Models::Credential.find_by(id:)
45
+ end
46
+
47
+ def remote
48
+ return unless credential
49
+ return @remote if defined?(@remote)
50
+
51
+ @remote = ::Booth::Core::Remotes::Get.call(credential_id: credential.id)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
- module PersonalContests
5
+ module Remotes
4
6
  class Update
5
7
  include ::Booth::Concerns::Action
6
8
 
@@ -18,12 +20,12 @@ module Booth
18
20
  end
19
21
 
20
22
  def do_respond
21
- ::Booth::Contests::Respond.call(scope:, contest: credential.contest, request:)
23
+ ::Booth::Core::Remotes::Respond.call(scope:, remote: credential.remote, request:)
22
24
  end
23
25
 
24
26
  private
25
27
 
26
- delegate :contest, to: :credential, private: true
28
+ delegate :remote, to: :credential, private: true
27
29
 
28
30
  def credential
29
31
  return @credential if defined?(@credential)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
@@ -14,25 +16,10 @@ module Booth
14
16
  private
15
17
 
16
18
  def transitions
17
- if request.authentication.mode == :username_and_webauth
18
- webauth_transitions
19
- else
20
- password_transitions
21
- end
22
- end
23
-
24
- def webauth_transitions
25
19
  [
26
20
  ::Booth::Userland::Sessions::Transitions::Destroy::EnterWebauth,
27
21
  ::Booth::Userland::Sessions::Transitions::Destroy::WebauthAuthenticationInitiation,
28
- ::Booth::Userland::Sessions::Transitions::Destroy::WebauthAuthenticationVerification,
29
- ]
30
- end
31
-
32
- def password_transitions
33
- [
34
- ::Booth::Userland::Sessions::Transitions::Destroy::EnterPassword,
35
- ::Booth::Userland::Sessions::Transitions::Destroy::VerifyPassword,
22
+ ::Booth::Userland::Sessions::Transitions::Destroy::WebauthAuthenticationVerification
36
23
  ]
37
24
  end
38
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
@@ -14,8 +16,8 @@ module Booth
14
16
  private
15
17
 
16
18
  def do_fetch_sessions
17
- ::Booth::Sessions::Index.call credential_id: authentication.credential_id,
18
- current_session_id: authentication.session_id
19
+ ::Booth::Core::Sessions::Index.call credential_id: authentication.credential_id,
20
+ current_session_id: authentication.session_id
19
21
  end
20
22
 
21
23
  def authentication
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
4
6
  # `DELETE /sessions/123` may present a page with a WebAuth authentication challenge.
5
7
  # That challenge is responded to asynchronously and in that response the server destroys the session.
6
8
  # After that, the page is reloaded by JS using `GET /sessions/123`, which is the `show` action.
7
- # But we don't actually have a show action for sessions. We just informatively redirect to the index action.
9
+ # But we don't actually have a show action for sessions. We just redirect to the index action
10
+ # with an informative flash message that the session was now deleted.
8
11
  class Show
9
12
  include ::Booth::Concerns::Action
10
13
 
@@ -13,11 +16,7 @@ module Booth
13
16
  request.must_be_html!
14
17
  request.must_be_logged_in!
15
18
 
16
- unless request.authentication.mode == :username_and_webauth
17
- return Tron.failure :only_applicable_when_passwordless
18
- end
19
-
20
- ::Booth::Userland::Sessions::Transitions::Show::EnterWebauth.call request:
19
+ ::Booth::Userland::Sessions::Transitions::Show::EnterWebauth.call request:, scope:
21
20
  end
22
21
 
23
22
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
@@ -13,13 +15,13 @@ module Booth
13
15
  def call
14
16
  if sudo.webauth?
15
17
  if session_id_param
16
- debug { 'Having webauth sudo, revoking the desired session...' }
17
- return ::Booth::Sessions::Revoke.call credential_id: authentication.credential_id,
18
- session_id: session_id_param
18
+ log { 'Having webauth sudo, revoking the desired session...' }
19
+ return ::Booth::Core::Sessions::Revoke.call credential_id: authentication.credential_id,
20
+ session_id: session_id_param
19
21
  else
20
- debug { 'Having webauth sudo, revoking all other sessions...' }
21
- return ::Booth::Sessions::RevokeAllOthers.call credential_id: authentication.credential_id,
22
- surviving_session_id: authentication.session_id
22
+ log { 'Having webauth sudo, revoking all other sessions...' }
23
+ return ::Booth::Core::Sessions::RevokeAllOthers.call credential_id: authentication.credential_id,
24
+ surviving_session_id: authentication.session_id
23
25
  end
24
26
  end
25
27
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
@@ -7,17 +9,17 @@ module Booth
7
9
  include ::Booth::Concerns::Transition
8
10
 
9
11
  def self.applicable?(params:)
10
- params[:webauth] && !params[:type]
12
+ params[:webauth] && !params.key?(:handshake)
11
13
  end
12
14
 
13
15
  def call
14
- debug { 'Preparing webauth challenge...' }
16
+ log { 'Preparing webauth challenge...' }
15
17
  credential = ::Booth::Models::Credential.find(authentication.credential_id)
16
- challenging = Booth::Credentials::WebauthChallenge.call(credential:)
17
- result = Tron.success :webauth_for_you, public_json: challenging.options_for_get, http_status: :ok
18
- debug { "The challenge is #{challenging.challenge}" }
18
+ challenging = Booth::Core::Credentials::WebauthChallenge.call(credential:, request:)
19
+ result = Tron.success :webauth_for_you, public_json: challenging.options_for_get, http_status: :created
20
+ log { "The challenge is #{challenging.challenge}" }
19
21
  sudo.webauthn_challenge = challenging.challenge
20
- debug { "Responding with JSON: #{result.public_json}" }
22
+ log { "Responding with JSON: #{result.public_json}" }
21
23
  result
22
24
  end
23
25
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Booth
2
4
  module Userland
3
5
  module Sessions
@@ -7,7 +9,7 @@ module Booth
7
9
  include ::Booth::Concerns::Transition
8
10
 
9
11
  def self.applicable?(params:)
10
- params[:webauth] && params[:type]
12
+ params[:webauth] && params[:handshake]&.key?(:type)
11
13
  end
12
14
 
13
15
  def call
@@ -20,12 +22,12 @@ module Booth
20
22
  def do_find_challenge
21
23
  return Tron.success :challenge_ongoing if sudo.webauthn_challenge.present?
22
24
 
23
- debug { 'There is no corresponding challenge in the session' }
25
+ log { 'There is no corresponding challenge in the session' }
24
26
  Tron.failure :no_session_challenge, public_json: {}, http_status: :unprocessable_entity
25
27
  end
26
28
 
27
29
  def do_check_webauth
28
- verification = ::Booth::Webauth::AuthenticationVerification.call(
30
+ verification = ::Booth::Core::Webauth::AuthenticationVerification.call(
29
31
  request:,
30
32
  credential_id: authentication.credential_id,
31
33
  challenge: sudo.webauthn_challenge
@@ -33,10 +35,10 @@ module Booth
33
35
  return verification if verification.failure?
34
36
 
35
37
  if session_id_param
36
- ::Booth::Sessions::Revoke.call credential_id: authentication.credential_id,
38
+ ::Booth::Core::Sessions::Revoke.call credential_id: authentication.credential_id,
37
39
  session_id: session_id_param
38
40
  else
39
- ::Booth::Sessions::RevokeAllOthers.call credential_id: authentication.credential_id,
41
+ ::Booth::Core::Sessions::RevokeAllOthers.call credential_id: authentication.credential_id,
40
42
  surviving_session_id: authentication.session_id
41
43
  end
42
44