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 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(id: session[:credential_for_username])
26
+ @credential_for_username = ::Booth::Models::Credential.find_by(
27
+ scope:,
28
+ id: session[:credential_for_username],
29
+ )
25
30
  end
26
31
 
27
- def contest_for_username
28
- return @contest_for_username if defined?(@contest_for_username)
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
- @contest_for_username = ::Booth::Models::Contest.find_by(id: session[:contest_for_username])
31
- end
37
+ log { "Deserializing Remote from Cookie in scope #{scope.inspect}" }
32
38
 
33
- def password_authenticated_credential
34
- return @password_authenticated_credential if defined?(@password_authenticated_credential)
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
- debug { "Persisting credential for username in browser session for scope #{scope.inspect}" }
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
- def contest_for_username=(new_contest)
64
- debug { "Persisting contest for username in browser session for scope #{scope.inspect}" }
65
- session[:contest_for_username] = new_contest.id
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
- def reset_credential_for_username
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
- def password_authenticated_credential=(new_credential)
76
- debug { "Persisting password authenticated credential in browser session for scope #{scope.inspect}" }
77
- session[:password_authenticated_credential] = new_credential.id
78
- @password_authenticated_credential = nil
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
- debug do
84
- "Persisting webauth challenge #{new_challenge.inspect} in browser session for scope #{scope.inspect}"
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
- debug { "Removing webauth challenge from browser session for scope #{scope.inspect}" }
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
@@ -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
 
@@ -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
- debug { 'You need Webauth sudo' }
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
- debug { "Remembering sudo via WebAuth has been granted in scope #{scope}" }
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
- debug { "Persisting webauth challenge #{new_challenge.inspect} in sudo session for scope #{scope.inspect}" }
50
+ log { "Persisting webauth challenge #{new_challenge.inspect} in sudo session for scope #{scope.inspect}" }
95
51
  else
96
- debug { "Removing webauth challenge from sudo session for scope #{scope.inspect}" }
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 ::Booth::MethodObject
7
+ include Calls
5
8
 
6
- option :response_path, default: -> {}
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
- # Registering credentials for the first time, such as Hardware keys.
34
- resources :onboardings, only: %i[show update]
13
+ # Users creating their own accounts.
14
+ resource :registration, only: %i[new create]
35
15
 
36
- # Login
16
+ # Logging in
37
17
  resource :login, only: %i[new create destroy]
38
- resource :response, only: %i[show update], path: #{response_path_with_fallback}
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 portal
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
@@ -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 ::Booth::MethodObject
7
+ include Calls
6
8
 
7
9
  param :input
8
10
 
9
11
  def call
10
- debug { "Checking email #{input.inspect} for valid syntax..." }
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
- debug { 'This email is blank.' }
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
- debug { "This email is less than #{min_length} characters long." }
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
- debug { "This email is more than #{max_length} characters long." }
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
- debug { 'This email contains invalid characters' }
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
- debug { 'This email has the correct syntax' }
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
- debug { 'This email does not contain an ampersand' }
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,
@@ -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 ::Booth::MethodObject
7
+ include Calls
6
8
 
7
9
  param :input
8
10
 
9
11
  def call
10
- # debug { "Checking IP address #{input.inspect} for valid syntax..." }
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
- # debug { 'This IP is blank.' }
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
- # debug { 'This IP is invalid.' }
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
@@ -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 ::Booth::MethodObject
7
+ include Calls
6
8
 
7
9
  param :input
8
10
 
9
11
  def call
10
- return Tron.success(:valid_scope_syntax, normalized_scope: input.to_sym) if regexp.match(input.to_s)
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_]+[a-z0-9]{1}\z/
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 ::Booth::MethodObject
7
+ include Calls
6
8
 
7
9
  param :input
8
10
 
9
11
  def call
10
- debug { "Checking secret key #{input.inspect} for valid syntax..." }
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
- debug { 'This secret key is nil.' }
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
- debug { 'This secret key is blank.' }
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
- debug { 'This secret key is not 30 characters long.' }
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
- debug { 'This secret key contains invalid characters' }
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')