plutonium 0.5.0

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 (346) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.ruby-version +1 -0
  4. data/.standard.yml +4 -0
  5. data/.vscode/extensions.json +15 -0
  6. data/.vscode/launch.json +7 -0
  7. data/.vscode/settings.json +35 -0
  8. data/CHANGELOG.md +5 -0
  9. data/LICENSE.txt +21 -0
  10. data/README copy.md +84 -0
  11. data/README.md +67 -0
  12. data/Rakefile +8 -0
  13. data/app/views/layouts/resource.html.erb +43 -0
  14. data/app/views/resource/_color_modes.html.erb +55 -0
  15. data/app/views/resource/_details.html.erb +6 -0
  16. data/app/views/resource/_empty_card.html.erb +12 -0
  17. data/app/views/resource/_flash.html.erb +9 -0
  18. data/app/views/resource/_form.html.erb +32 -0
  19. data/app/views/resource/_header.html.erb +8 -0
  20. data/app/views/resource/_interactive_resource_action_form.html.erb +67 -0
  21. data/app/views/resource/_messages.html.erb +1 -0
  22. data/app/views/resource/_metric_card.html.erb +16 -0
  23. data/app/views/resource/_nav_user.html.erb +4 -0
  24. data/app/views/resource/_pagination.html.erb +6 -0
  25. data/app/views/resource/_pagy_pagination.html.erb +15 -0
  26. data/app/views/resource/_resource.html.erb +1 -0
  27. data/app/views/resource/_resource.rabl +5 -0
  28. data/app/views/resource/_sidebar.html.erb +11 -0
  29. data/app/views/resource/_sidebar_menu.html.erb +1 -0
  30. data/app/views/resource/_tab_menu.html.erb +13 -0
  31. data/app/views/resource/_table.html.erb +78 -0
  32. data/app/views/resource/_table_actions.html.erb +15 -0
  33. data/app/views/resource/_toast.html.erb +26 -0
  34. data/app/views/resource/_toolbar.html.erb +22 -0
  35. data/app/views/resource/_toolbar_actions.html.erb +16 -0
  36. data/app/views/resource/_toolbar_breadcrumbs.html.erb +32 -0
  37. data/app/views/resource/_toolbar_search_input.erb +27 -0
  38. data/app/views/resource/edit.html.erb +10 -0
  39. data/app/views/resource/errors.rabl +3 -0
  40. data/app/views/resource/index.html.erb +19 -0
  41. data/app/views/resource/index.rabl +3 -0
  42. data/app/views/resource/interactive_resource_collection_action.html.erb +11 -0
  43. data/app/views/resource/interactive_resource_record_action.html.erb +11 -0
  44. data/app/views/resource/interactive_resource_recordless_action.html.erb +11 -0
  45. data/app/views/resource/new.html.erb +11 -0
  46. data/app/views/resource/readme.md +16 -0
  47. data/app/views/resource/show.html.erb +14 -0
  48. data/app/views/resource/show.rabl +3 -0
  49. data/brakeman.ignore +51 -0
  50. data/lib/active_model/validations/array_validator.rb +74 -0
  51. data/lib/active_model/validations/attached_validator.rb +17 -0
  52. data/lib/active_model/validations/url_validator.rb +51 -0
  53. data/lib/generators/pu/core/install/install_generator.rb +43 -0
  54. data/lib/generators/pu/core/install/templates/.keep +0 -0
  55. data/lib/generators/pu/core/install/templates/app/controllers/resource_controller.rb.tt +2 -0
  56. data/lib/generators/pu/core/install/templates/app/interactions/resource_interaction.rb.tt +2 -0
  57. data/lib/generators/pu/core/install/templates/app/models/resource_record.rb.tt +5 -0
  58. data/lib/generators/pu/core/install/templates/app/policies/resource_policy.rb.tt +2 -0
  59. data/lib/generators/pu/core/install/templates/app/presenters/resource_presenter.rb.tt +2 -0
  60. data/lib/generators/pu/core/install/templates/config/initializers/plutonium.rb +2 -0
  61. data/lib/generators/pu/core/install/templates/config/packages.rb +3 -0
  62. data/lib/generators/pu/gem/pagy/pagy_generator.rb +25 -0
  63. data/lib/generators/pu/gem/pagy/templates/.keep +0 -0
  64. data/lib/generators/pu/gem/pagy/templates/config/initializers/pagy.rb +4 -0
  65. data/lib/generators/pu/gem/rabl/rabl_generator.rb +25 -0
  66. data/lib/generators/pu/gem/rabl/templates/.keep +0 -0
  67. data/lib/generators/pu/gem/rabl/templates/config/initializers/rabl.rb +60 -0
  68. data/lib/generators/pu/gem/simple_form/simple_form_generator.rb +25 -0
  69. data/lib/generators/pu/gem/simple_form/templates/.keep +0 -0
  70. data/lib/generators/pu/gen/pug/pug_generator.rb +43 -0
  71. data/lib/generators/pu/gen/pug/templates/pug.rb.tt +23 -0
  72. data/lib/generators/pu/pkg/app/app_generator.rb +60 -0
  73. data/lib/generators/pu/pkg/app/templates/app/controllers/resource_controller.rb.tt +26 -0
  74. data/lib/generators/pu/pkg/app/templates/app/interactions/resource_interaction.rb.tt +4 -0
  75. data/lib/generators/pu/pkg/app/templates/app/policies/resource_policy.rb.tt +4 -0
  76. data/lib/generators/pu/pkg/app/templates/app/presenters/resource_presenter.rb.tt +4 -0
  77. data/lib/generators/pu/pkg/app/templates/config/routes.rb.tt +17 -0
  78. data/lib/generators/pu/pkg/app/templates/lib/engine.rb.tt +14 -0
  79. data/lib/generators/pu/pkg/feature/feature_generator.rb +44 -0
  80. data/lib/generators/pu/pkg/feature/templates/.keep +0 -0
  81. data/lib/generators/pu/pkg/feature/templates/app/controllers/resource_controller.rb.tt +7 -0
  82. data/lib/generators/pu/pkg/feature/templates/app/interactions/resource_interaction.rb.tt +4 -0
  83. data/lib/generators/pu/pkg/feature/templates/app/models/resource_record.rb.tt +5 -0
  84. data/lib/generators/pu/pkg/feature/templates/app/policies/resource_policy.rb.tt +4 -0
  85. data/lib/generators/pu/pkg/feature/templates/app/presenters/resource_presenter.rb.tt +4 -0
  86. data/lib/generators/pu/pkg/feature/templates/lib/engine.rb.tt +8 -0
  87. data/lib/generators/pu/resource/conn/conn_generator.rb +54 -0
  88. data/lib/generators/pu/resource/conn/templates/.keep +0 -0
  89. data/lib/generators/pu/resource/conn/templates/app/controllers/resource_controller.rb.tt +3 -0
  90. data/lib/generators/pu/resource/conn/templates/app/policies/resource_policy.rb.tt +3 -0
  91. data/lib/generators/pu/resource/conn/templates/app/presenters/resource_presenter.rb.tt +3 -0
  92. data/lib/generators/pu/resource/model/USAGE +113 -0
  93. data/lib/generators/pu/resource/model/model_generator.rb +163 -0
  94. data/lib/generators/pu/resource/model/templates/controller.rb.tt +5 -0
  95. data/lib/generators/pu/resource/model/templates/create_table_migration.rb.tt +26 -0
  96. data/lib/generators/pu/resource/model/templates/model.rb.tt +53 -0
  97. data/lib/generators/pu/resource/model/templates/module.rb.tt +7 -0
  98. data/lib/generators/pu/resource/model/templates/policy.rb.tt +4 -0
  99. data/lib/generators/pu/resource/model/templates/presenter.rb.tt +4 -0
  100. data/lib/generators/pu/resource/scaffold/scaffold_generator.rb +219 -0
  101. data/lib/generators/pu/resource/scaffold/templates/app/controllers/admin_resources/resource_controller.rb.tt +7 -0
  102. data/lib/generators/pu/resource/scaffold/templates/app/controllers/entity_resources/resource_controller.rb.tt +7 -0
  103. data/lib/generators/pu/resource/scaffold/templates/app/policies/resources/admin/resource_policy.rb.tt +22 -0
  104. data/lib/generators/pu/resource/scaffold/templates/app/policies/resources/entity/resource_policy.rb.tt +22 -0
  105. data/lib/generators/pu/resource/scaffold/templates/app/policies/resources/resource_policy.rb.tt +13 -0
  106. data/lib/generators/pu/resource/scaffold/templates/app/resources/resource/admin_presenter.rb.tt +7 -0
  107. data/lib/generators/pu/resource/scaffold/templates/app/resources/resource/entity_presenter.rb.tt +7 -0
  108. data/lib/generators/pu/resource/scaffold/templates/app/resources/resource/presenter.rb.tt +23 -0
  109. data/lib/generators/pu/resource/scaffold/templates/app/views/resources/resource/_resource.html.erb.tt +3 -0
  110. data/lib/generators/pu/resource/scaffold/templates/app/views/resources/resource/_resource.rabl +7 -0
  111. data/lib/generators/pu/rodauth/account_generator.rb +120 -0
  112. data/lib/generators/pu/rodauth/concerns/account_selector.rb +22 -0
  113. data/lib/generators/pu/rodauth/concerns/configuration.rb +211 -0
  114. data/lib/generators/pu/rodauth/concerns/feature_selector.rb +125 -0
  115. data/lib/generators/pu/rodauth/install_generator.rb +69 -0
  116. data/lib/generators/pu/rodauth/migration/active_record/account_expiration.erb +8 -0
  117. data/lib/generators/pu/rodauth/migration/active_record/active_sessions.erb +7 -0
  118. data/lib/generators/pu/rodauth/migration/active_record/audit_logging.erb +16 -0
  119. data/lib/generators/pu/rodauth/migration/active_record/base.erb +22 -0
  120. data/lib/generators/pu/rodauth/migration/active_record/disallow_password_reuse.erb +5 -0
  121. data/lib/generators/pu/rodauth/migration/active_record/email_auth.erb +8 -0
  122. data/lib/generators/pu/rodauth/migration/active_record/jwt_refresh.erb +7 -0
  123. data/lib/generators/pu/rodauth/migration/active_record/lockout.erb +13 -0
  124. data/lib/generators/pu/rodauth/migration/active_record/otp.erb +8 -0
  125. data/lib/generators/pu/rodauth/migration/active_record/password_expiration.erb +6 -0
  126. data/lib/generators/pu/rodauth/migration/active_record/recovery_codes.erb +6 -0
  127. data/lib/generators/pu/rodauth/migration/active_record/remember.erb +7 -0
  128. data/lib/generators/pu/rodauth/migration/active_record/reset_password.erb +8 -0
  129. data/lib/generators/pu/rodauth/migration/active_record/separate_passwords.erb +5 -0
  130. data/lib/generators/pu/rodauth/migration/active_record/single_session.erb +6 -0
  131. data/lib/generators/pu/rodauth/migration/active_record/sms_codes.erb +9 -0
  132. data/lib/generators/pu/rodauth/migration/active_record/verify_account.erb +8 -0
  133. data/lib/generators/pu/rodauth/migration/active_record/verify_login_change.erb +8 -0
  134. data/lib/generators/pu/rodauth/migration/active_record/webauthn.erb +13 -0
  135. data/lib/generators/pu/rodauth/migration/sequel/account_expiration.erb +7 -0
  136. data/lib/generators/pu/rodauth/migration/sequel/active_sessions.erb +8 -0
  137. data/lib/generators/pu/rodauth/migration/sequel/audit_logging.erb +17 -0
  138. data/lib/generators/pu/rodauth/migration/sequel/base.erb +25 -0
  139. data/lib/generators/pu/rodauth/migration/sequel/disallow_password_reuse.erb +6 -0
  140. data/lib/generators/pu/rodauth/migration/sequel/email_auth.erb +7 -0
  141. data/lib/generators/pu/rodauth/migration/sequel/jwt_refresh.erb +8 -0
  142. data/lib/generators/pu/rodauth/migration/sequel/lockout.erb +11 -0
  143. data/lib/generators/pu/rodauth/migration/sequel/otp.erb +7 -0
  144. data/lib/generators/pu/rodauth/migration/sequel/password_expiration.erb +5 -0
  145. data/lib/generators/pu/rodauth/migration/sequel/recovery_codes.erb +6 -0
  146. data/lib/generators/pu/rodauth/migration/sequel/remember.erb +6 -0
  147. data/lib/generators/pu/rodauth/migration/sequel/reset_password.erb +7 -0
  148. data/lib/generators/pu/rodauth/migration/sequel/separate_passwords.erb +6 -0
  149. data/lib/generators/pu/rodauth/migration/sequel/single_session.erb +5 -0
  150. data/lib/generators/pu/rodauth/migration/sequel/sms_codes.erb +8 -0
  151. data/lib/generators/pu/rodauth/migration/sequel/verify_account.erb +7 -0
  152. data/lib/generators/pu/rodauth/migration/sequel/verify_login_change.erb +7 -0
  153. data/lib/generators/pu/rodauth/migration/sequel/webauthn.erb +13 -0
  154. data/lib/generators/pu/rodauth/migration_generator.rb +190 -0
  155. data/lib/generators/pu/rodauth/templates/INSTRUCTIONS +52 -0
  156. data/lib/generators/pu/rodauth/templates/app/controllers/plugin_controller.rb.tt +6 -0
  157. data/lib/generators/pu/rodauth/templates/app/controllers/rodauth_controller.rb.tt +3 -0
  158. data/lib/generators/pu/rodauth/templates/app/mailers/account_mailer.rb.tt +4 -0
  159. data/lib/generators/pu/rodauth/templates/app/mailers/rodauth_mailer.rb.tt +62 -0
  160. data/lib/generators/pu/rodauth/templates/app/misc/account_rodauth_plugin.rb.tt +255 -0
  161. data/lib/generators/pu/rodauth/templates/app/misc/rodauth_app.rb.tt +24 -0
  162. data/lib/generators/pu/rodauth/templates/app/misc/rodauth_plugin.rb.tt +234 -0
  163. data/lib/generators/pu/rodauth/templates/app/models/account.rb.tt +40 -0
  164. data/lib/generators/pu/rodauth/templates/app/views/rodauth/_email_auth_request_form.html.erb +7 -0
  165. data/lib/generators/pu/rodauth/templates/app/views/rodauth/_login_form.html.erb +26 -0
  166. data/lib/generators/pu/rodauth/templates/app/views/rodauth/_login_form_footer.html.erb +9 -0
  167. data/lib/generators/pu/rodauth/templates/app/views/rodauth/add_recovery_codes.html.erb +6 -0
  168. data/lib/generators/pu/rodauth/templates/app/views/rodauth/change_login.html.erb +27 -0
  169. data/lib/generators/pu/rodauth/templates/app/views/rodauth/change_password.html.erb +27 -0
  170. data/lib/generators/pu/rodauth/templates/app/views/rodauth/close_account.html.erb +13 -0
  171. data/lib/generators/pu/rodauth/templates/app/views/rodauth/confirm_password.html.erb +11 -0
  172. data/lib/generators/pu/rodauth/templates/app/views/rodauth/create_account.html.erb +35 -0
  173. data/lib/generators/pu/rodauth/templates/app/views/rodauth/email_auth.html.erb +5 -0
  174. data/lib/generators/pu/rodauth/templates/app/views/rodauth/login.html.erb +4 -0
  175. data/lib/generators/pu/rodauth/templates/app/views/rodauth/logout.html.erb +14 -0
  176. data/lib/generators/pu/rodauth/templates/app/views/rodauth/multi_phase_login.html.erb +3 -0
  177. data/lib/generators/pu/rodauth/templates/app/views/rodauth/otp_auth.html.erb +15 -0
  178. data/lib/generators/pu/rodauth/templates/app/views/rodauth/otp_disable.html.erb +13 -0
  179. data/lib/generators/pu/rodauth/templates/app/views/rodauth/otp_setup.html.erb +41 -0
  180. data/lib/generators/pu/rodauth/templates/app/views/rodauth/recovery_auth.html.erb +11 -0
  181. data/lib/generators/pu/rodauth/templates/app/views/rodauth/recovery_codes.html.erb +13 -0
  182. data/lib/generators/pu/rodauth/templates/app/views/rodauth/remember.html.erb +22 -0
  183. data/lib/generators/pu/rodauth/templates/app/views/rodauth/reset_password.html.erb +19 -0
  184. data/lib/generators/pu/rodauth/templates/app/views/rodauth/reset_password_request.html.erb +17 -0
  185. data/lib/generators/pu/rodauth/templates/app/views/rodauth/sms_auth.html.erb +15 -0
  186. data/lib/generators/pu/rodauth/templates/app/views/rodauth/sms_confirm.html.erb +15 -0
  187. data/lib/generators/pu/rodauth/templates/app/views/rodauth/sms_disable.html.erb +13 -0
  188. data/lib/generators/pu/rodauth/templates/app/views/rodauth/sms_request.html.erb +5 -0
  189. data/lib/generators/pu/rodauth/templates/app/views/rodauth/sms_setup.html.erb +23 -0
  190. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/_email_auth_request_form.html.erb +5 -0
  191. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/_login_form.html.erb +24 -0
  192. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/_login_form_footer.html.erb +7 -0
  193. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/add_recovery_codes.html.erb +16 -0
  194. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/change_login.html.erb +25 -0
  195. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/change_password.html.erb +25 -0
  196. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/close_account.html.erb +11 -0
  197. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/confirm_password.html.erb +19 -0
  198. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/create_account.html.erb +33 -0
  199. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/email_auth.html.erb +3 -0
  200. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/login.html.erb +5 -0
  201. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/logout.html.erb +10 -0
  202. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/multi_phase_login.html.erb +5 -0
  203. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/otp_auth.html.erb +9 -0
  204. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/otp_disable.html.erb +11 -0
  205. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/otp_setup.html.erb +32 -0
  206. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/recovery_auth.html.erb +9 -0
  207. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/recovery_codes.html.erb +11 -0
  208. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/remember.html.erb +18 -0
  209. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/reset_password.html.erb +17 -0
  210. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/reset_password_request.html.erb +17 -0
  211. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/sms_auth.html.erb +9 -0
  212. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/sms_confirm.html.erb +9 -0
  213. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/sms_disable.html.erb +11 -0
  214. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/sms_request.html.erb +3 -0
  215. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/sms_setup.html.erb +17 -0
  216. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/two_factor_auth.html.erb +5 -0
  217. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/two_factor_disable.html.erb +11 -0
  218. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/two_factor_manage.html.erb +26 -0
  219. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/unlock_account.html.erb +15 -0
  220. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/unlock_account_request.html.erb +9 -0
  221. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/verify_account.html.erb +19 -0
  222. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/verify_account_resend.html.erb +17 -0
  223. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/verify_login_change.html.erb +3 -0
  224. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/webauthn_auth.html.erb +13 -0
  225. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/webauthn_autofill.html.erb +10 -0
  226. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/webauthn_remove.html.erb +21 -0
  227. data/lib/generators/pu/rodauth/templates/app/views/rodauth/tailwind/webauthn_setup.html.erb +21 -0
  228. data/lib/generators/pu/rodauth/templates/app/views/rodauth/two_factor_auth.html.erb +5 -0
  229. data/lib/generators/pu/rodauth/templates/app/views/rodauth/two_factor_disable.html.erb +13 -0
  230. data/lib/generators/pu/rodauth/templates/app/views/rodauth/two_factor_manage.html.erb +22 -0
  231. data/lib/generators/pu/rodauth/templates/app/views/rodauth/unlock_account.html.erb +15 -0
  232. data/lib/generators/pu/rodauth/templates/app/views/rodauth/unlock_account_request.html.erb +9 -0
  233. data/lib/generators/pu/rodauth/templates/app/views/rodauth/verify_account.html.erb +21 -0
  234. data/lib/generators/pu/rodauth/templates/app/views/rodauth/verify_account_resend.html.erb +17 -0
  235. data/lib/generators/pu/rodauth/templates/app/views/rodauth/verify_login_change.html.erb +5 -0
  236. data/lib/generators/pu/rodauth/templates/app/views/rodauth/webauthn_auth.html.erb +15 -0
  237. data/lib/generators/pu/rodauth/templates/app/views/rodauth/webauthn_autofill.html.erb +10 -0
  238. data/lib/generators/pu/rodauth/templates/app/views/rodauth/webauthn_remove.html.erb +23 -0
  239. data/lib/generators/pu/rodauth/templates/app/views/rodauth/webauthn_setup.html.erb +23 -0
  240. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/email_auth.text.erb +5 -0
  241. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/password_changed.text.erb +2 -0
  242. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/reset_password.text.erb +5 -0
  243. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/reset_password_notify.text.erb +2 -0
  244. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/unlock_account.text.erb +5 -0
  245. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/verify_account.text.erb +4 -0
  246. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/verify_login_change.text.erb +10 -0
  247. data/lib/generators/pu/rodauth/templates/config/initializers/rodauth.rb.tt +3 -0
  248. data/lib/generators/pu/rodauth/templates/db/migrate/create_rodauth.rb.tt +13 -0
  249. data/lib/generators/pu/rodauth/views_generator.rb +125 -0
  250. data/lib/plutonium/auth/public_access.rb +17 -0
  251. data/lib/plutonium/auth/rodauth.rb +35 -0
  252. data/lib/plutonium/auth.rb +12 -0
  253. data/lib/plutonium/config.rb +11 -0
  254. data/lib/plutonium/core/.DS_Store +0 -0
  255. data/lib/plutonium/core/action.rb +46 -0
  256. data/lib/plutonium/core/actions/basic_action.rb +16 -0
  257. data/lib/plutonium/core/actions/collection.rb +33 -0
  258. data/lib/plutonium/core/actions/destroy_action.rb +21 -0
  259. data/lib/plutonium/core/actions/edit_action.rb +19 -0
  260. data/lib/plutonium/core/actions/interactive_action.rb +64 -0
  261. data/lib/plutonium/core/actions/new_action.rb +18 -0
  262. data/lib/plutonium/core/actions/show_action.rb +17 -0
  263. data/lib/plutonium/core/actions.rb +17 -0
  264. data/lib/plutonium/core/app_controller.rb +121 -0
  265. data/lib/plutonium/core/autodiscovery/discoverer.rb +15 -0
  266. data/lib/plutonium/core/autodiscovery/input_discoverer.rb +33 -0
  267. data/lib/plutonium/core/autodiscovery/renderer_discoverer.rb +33 -0
  268. data/lib/plutonium/core/autodiscovery.rb +13 -0
  269. data/lib/plutonium/core/controllers/authorizable.rb +56 -0
  270. data/lib/plutonium/core/controllers/bootable.rb +44 -0
  271. data/lib/plutonium/core/controllers/crud_actions.rb +128 -0
  272. data/lib/plutonium/core/controllers/entity_scoping.rb +69 -0
  273. data/lib/plutonium/core/controllers/interactive_actions.rb +210 -0
  274. data/lib/plutonium/core/controllers/presentable.rb +59 -0
  275. data/lib/plutonium/core/controllers.rb +16 -0
  276. data/lib/plutonium/core/definers/action_definer.rb +25 -0
  277. data/lib/plutonium/core/definers/field_definer.rb +19 -0
  278. data/lib/plutonium/core/definers/input_definer.rb +37 -0
  279. data/lib/plutonium/core/definers/renderer_definer.rb +35 -0
  280. data/lib/plutonium/core/definers.rb +14 -0
  281. data/lib/plutonium/core/fields/inputs/association_input.rb +26 -0
  282. data/lib/plutonium/core/fields/inputs/basic_input.rb +42 -0
  283. data/lib/plutonium/core/fields/inputs/belongs_to_input.rb +15 -0
  284. data/lib/plutonium/core/fields/inputs/factory.rb +58 -0
  285. data/lib/plutonium/core/fields/inputs/has_many_input.rb +15 -0
  286. data/lib/plutonium/core/fields/inputs/noop_input.rb +19 -0
  287. data/lib/plutonium/core/fields/inputs.rb +18 -0
  288. data/lib/plutonium/core/fields/renderers/association_renderer.rb +25 -0
  289. data/lib/plutonium/core/fields/renderers/basic_renderer.rb +27 -0
  290. data/lib/plutonium/core/fields/renderers/factory.rb +52 -0
  291. data/lib/plutonium/core/fields/renderers.rb +15 -0
  292. data/lib/plutonium/core/fields.rb +12 -0
  293. data/lib/plutonium/core/ui/collection.rb +14 -0
  294. data/lib/plutonium/core/ui/detail.rb +11 -0
  295. data/lib/plutonium/core/ui/form.rb +11 -0
  296. data/lib/plutonium/core/ui.rb +13 -0
  297. data/lib/plutonium/core.rb +16 -0
  298. data/lib/plutonium/helpers/action_buttons_helper.rb +32 -0
  299. data/lib/plutonium/helpers/application_helper.rb +22 -0
  300. data/lib/plutonium/helpers/attachment_helper.rb +62 -0
  301. data/lib/plutonium/helpers/content_helper.rb +66 -0
  302. data/lib/plutonium/helpers/display_helper.rb +83 -0
  303. data/lib/plutonium/helpers/form_helper.rb +24 -0
  304. data/lib/plutonium/helpers/menu_helper.rb +69 -0
  305. data/lib/plutonium/helpers/pagination_helper.rb +9 -0
  306. data/lib/plutonium/helpers/turbo_helper.rb +13 -0
  307. data/lib/plutonium/helpers/turbo_stream_actions_helper.rb +9 -0
  308. data/lib/plutonium/helpers.rb +31 -0
  309. data/lib/plutonium/initializers/TODO +2 -0
  310. data/lib/plutonium/initializers/pagy.rb +5 -0
  311. data/lib/plutonium/initializers/patches.rb +2 -0
  312. data/lib/plutonium/initializers/rabl.rb +60 -0
  313. data/lib/plutonium/initializers/simple_form.rb +405 -0
  314. data/lib/plutonium/lib/after_commit.rb +34 -0
  315. data/lib/plutonium/lib/bit_flags.rb +36 -0
  316. data/lib/plutonium/packaging/app.rb +125 -0
  317. data/lib/plutonium/packaging/feature.rb +18 -0
  318. data/lib/plutonium/packaging/package.rb +22 -0
  319. data/lib/plutonium/packaging.rb +9 -0
  320. data/lib/plutonium/policy/initializer.rb +22 -0
  321. data/lib/plutonium/policy/scope.rb +19 -0
  322. data/lib/plutonium/policy.rb +8 -0
  323. data/lib/plutonium/preserved__/field.rb +65 -0
  324. data/lib/plutonium/preserved__/input.rb +93 -0
  325. data/lib/plutonium/reactor/core.rb +61 -0
  326. data/lib/plutonium/reactor/resource_context.rb +15 -0
  327. data/lib/plutonium/reactor/resource_controller.rb +108 -0
  328. data/lib/plutonium/reactor/resource_interaction.rb +8 -0
  329. data/lib/plutonium/reactor/resource_policy.rb +105 -0
  330. data/lib/plutonium/reactor/resource_presenter.rb +42 -0
  331. data/lib/plutonium/reactor/resource_record.rb +123 -0
  332. data/lib/plutonium/reactor.rb +13 -0
  333. data/lib/plutonium/refinements/parameter_refinements.rb +26 -0
  334. data/lib/plutonium/simple_form_components/attachment_component.rb +77 -0
  335. data/lib/plutonium/simple_form_components/input_group_component.rb +14 -0
  336. data/lib/plutonium/version.rb +3 -0
  337. data/lib/plutonium.rb +31 -0
  338. data/plutonium.gemspec +47 -0
  339. data/public/.keep +0 -0
  340. data/public/plutonium-assets/application.css +24280 -0
  341. data/public/plutonium-assets/application.js +31420 -0
  342. data/public/plutonium-assets/fonts/bootstrap-icons.woff +0 -0
  343. data/public/plutonium-assets/fonts/bootstrap-icons.woff2 +0 -0
  344. data/public/plutonium-assets/logo.png +0 -0
  345. data/sig/plutonium.rbs +4 -0
  346. metadata +519 -0
@@ -0,0 +1,255 @@
1
+ require "sequel/core"
2
+
3
+ class <%= table_prefix.classify %>RodauthPlugin < RodauthPlugin
4
+ configure do
5
+ # This block is running inside of
6
+ # plugin :rodauth do
7
+ # ...
8
+ # end
9
+
10
+ # ==> Features
11
+ # See the Rodauth documentation for the list of available config options:
12
+ # http://rodauth.jeremyevans.net/documentation.html
13
+
14
+ # List of authentication features that are loaded.
15
+ enable <%= selected_features.map(&:inspect).join ', ' %>
16
+
17
+ # ==> General
18
+
19
+ # Change prefix of table and foreign key column names from default "account"
20
+ # accounts_table: 'players'
21
+
22
+ # The secret key used for hashing public-facing tokens for various features.
23
+ # Defaults to Rails `secret_key_base`, but you can use your own secret key.
24
+ # hmac_secret "<SECRET_KEY>"
25
+
26
+ # Use path prefix for all routes.
27
+ <%= '# ' if primary? %>prefix "/<%= table_prefix.pluralize %>"
28
+ <% unless separate_passwords? -%>
29
+
30
+ # Store password hash in a column instead of a separate table.
31
+ account_password_hash_column :password_hash
32
+ <% end -%>
33
+
34
+ # Specify the controller used for view rendering, CSRF, and callbacks.
35
+ rails_controller { Rodauth::<%= "#{table_prefix.classify}" %>Controller }
36
+ <% if verify_account? -%>
37
+
38
+ # Set password when verifying account.
39
+ verify_account_set_password? false
40
+ <% end -%>
41
+
42
+ # Change some default param keys.
43
+ # login_param "email"
44
+ # password_confirm_param "confirm_password"
45
+
46
+ # Redirect back to originally requested location after authentication.
47
+ # login_return_to_requested_location? true
48
+ # two_factor_auth_return_to_requested_location? true # if using MFA
49
+
50
+ # Autologin the user after they have reset their password.
51
+ # reset_password_autologin? true
52
+
53
+ # Delete the account record when the user has closed their account.
54
+ # delete_account_on_close? true
55
+
56
+ # Redirect to the app from login and registration pages if already logged in.
57
+ # already_logged_in { redirect login_redirect }
58
+ <% if jwt? -%>
59
+
60
+ # ==> JWT
61
+
62
+ # Set JWT secret, which is used to cryptographically protect the token.
63
+ jwt_secret Rails.application.credentials.secret_key_base
64
+ <% end -%>
65
+ <% if only_json? -%>
66
+
67
+ # ==> Api only
68
+
69
+ # Accept only JSON requests.
70
+ only_json? true
71
+
72
+ # Handle login and password confirmation fields on the client side.
73
+ require_password_confirmation? false
74
+ require_login_confirmation? false
75
+ <% else -%>
76
+
77
+ # Accept both api and form requests
78
+ # Requires the JSON feature
79
+ <%= '# ' unless json? %>only_json? false
80
+ <% end -%>
81
+ <% if mails? -%>
82
+
83
+ # ==> Emails
84
+ # Use a custom mailer for delivering authentication emails.
85
+ <% if reset_password? -%>
86
+
87
+ create_reset_password_email do
88
+ Rodauth::<%= table_prefix.classify %>Mailer.reset_password(self.class.configuration_name, account_id, reset_password_key_value)
89
+ end
90
+ <% end -%>
91
+ <% if verify_account? -%>
92
+
93
+ create_verify_account_email do
94
+ Rodauth::<%= table_prefix.classify %>Mailer.verify_account(self.class.configuration_name, account_id, verify_account_key_value)
95
+ end
96
+ <% end -%>
97
+ <% if verify_login_change? -%>
98
+
99
+ create_verify_login_change_email do |_login|
100
+ Rodauth::<%= table_prefix.classify %>Mailer.verify_login_change(self.class.configuration_name, account_id, verify_login_change_key_value)
101
+ end
102
+ <% end -%>
103
+ <% if change_password_notify? -%>
104
+
105
+ create_password_changed_email do
106
+ Rodauth::<%= table_prefix.classify %>Mailer.change_password_notify(self.class.configuration_name, account_id)
107
+ end
108
+ <% end -%>
109
+ <% if reset_password_notify? -%>
110
+
111
+ create_reset_password_notify_email do
112
+ Rodauth::<%= table_prefix.classify %>Mailer.reset_password_notify(self.class.configuration_name, account_id)
113
+ end
114
+ <% end -%>
115
+ <% if email_auth? -%>
116
+
117
+ create_email_auth_email do
118
+ Rodauth::<%= table_prefix.classify %>Mailer.email_auth(self.class.configuration_name, account_id, email_auth_key_value)
119
+ end
120
+ <% end -%>
121
+ <% if lockout? -%>
122
+
123
+ create_unlock_account_email do
124
+ Rodauth::<%= table_prefix.classify %>Mailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
125
+ end
126
+ <% end -%>
127
+
128
+ send_email do |email|
129
+ # queue email delivery on the mailer after the transaction commits
130
+ db.after_commit { email.deliver_later }
131
+ end
132
+ <% end -%>
133
+ <% unless only_json? -%>
134
+
135
+ # ==> Flash
136
+ # Does not work with only_json?
137
+
138
+ # Match flash keys with ones already used in the Rails app.
139
+ # flash_notice_key :success # default is :notice
140
+ # flash_error_key :error # default is :alert
141
+
142
+ # Override default flash messages.
143
+ # create_account_notice_flash "Your account has been created. Please verify your account by visiting the confirmation link sent to your email address."
144
+ # require_login_error_flash "Login is required for accessing this page"
145
+ # login_notice_flash nil
146
+ <% end -%>
147
+
148
+ # ==> Validation
149
+ # Override default validation error messages.
150
+ # no_matching_login_message "user with this email address doesn't exist"
151
+ # already_an_account_with_this_login_message "user with this email address already exists"
152
+ # password_too_short_message { "needs to have at least #{password_minimum_length} characters" }
153
+ # login_does_not_meet_requirements_message { "invalid email#{", #{login_requirement_message}" if login_requirement_message}" }
154
+
155
+ # ==> Passwords
156
+
157
+ # Passwords shorter than 8 characters are considered weak according to OWASP.
158
+ <%= '# ' unless login? %>password_minimum_length 8
159
+
160
+ # Custom password complexity requirements (alternative to password_complexity feature).
161
+ # password_meets_requirements? do |password|
162
+ # super(password) && password_complex_enough?(password)
163
+ # end
164
+ # auth_class_eval do
165
+ # def password_complex_enough?(password)
166
+ # return true if password.match?(/\d/) && password.match?(/[^a-zA-Z\d]/)
167
+ # set_password_requirement_error_message(:password_simple, "requires one number and one special character")
168
+ # false
169
+ # end
170
+ # end
171
+ <% unless argon2? -%>
172
+
173
+ # = bcrypt
174
+
175
+ # bcrypt has a maximum input length of 72 bytes, truncating any extra bytes.
176
+ password_maximum_bytes 72 if respond_to?(:password_maximum_bytes)
177
+ <% else -%>
178
+
179
+ # = argon2
180
+
181
+ # Use a rotatable password pepper when hashing passwords with Argon2.
182
+ argon2_secret "TODO: <SECRET_KEY>"
183
+
184
+ # Since we're using argon2, prevent loading the bcrypt gem to save memory.
185
+ require_bcrypt? false
186
+
187
+ # Having a maximum password length set prevents long password DoS attacks.
188
+ password_maximum_length 64 if respond_to?(:password_maximum_length)
189
+ <% end -%>
190
+ <% if remember? -%>
191
+
192
+ # ==> Remember Feature
193
+
194
+ # Remember all logged in users.
195
+ after_login { remember_login }
196
+
197
+ # Or only remember users that have ticked a "Remember Me" checkbox on login.
198
+ # after_login { remember_login if param_or_nil("remember") }
199
+
200
+ # Extend user's remember period when remembered via a cookie
201
+ extend_remember_deadline? true
202
+
203
+ # Store the user's remember cookie under a namespace
204
+ remember_cookie_key "_<%= table_prefix %>_remember"
205
+ <% end -%>
206
+
207
+ # ==> Hooks
208
+
209
+ # Validate custom fields in the create account form.
210
+ # before_create_account do
211
+ # throw_error_status(422, "name", "must be present") if param("name").empty?
212
+ # end
213
+
214
+ # Perform additional actions after the account is created.
215
+ # after_create_account do
216
+ # Profile.create!(account_id: account_id, name: param("name"))
217
+ # end
218
+
219
+ # Do additional cleanup after the account is closed.
220
+ # after_close_account do
221
+ # Profile.find_by!(account_id: account_id).destroy
222
+ # end
223
+ <% unless only_json? -%>
224
+
225
+ # ==> Redirects
226
+ <% if logout? -%>
227
+
228
+ # Redirect to home page after logout.
229
+ logout_redirect "/"
230
+ <% end -%>
231
+ <% if verify_account? -%>
232
+
233
+ # Redirect to wherever login redirects to after account verification.
234
+ verify_account_redirect { login_redirect }
235
+ <% end -%>
236
+ <% if reset_password? -%>
237
+
238
+ # Redirect to login page after password reset.
239
+ reset_password_redirect { login_path }
240
+ <% end -%>
241
+
242
+ # Ensure requiring login follows login route changes.
243
+ require_login_redirect { login_path }
244
+ <% end -%>
245
+
246
+ # ==> Deadlines
247
+ # Change default deadlines for some actions.
248
+ # verify_account_grace_period 3.days.to_i
249
+ # reset_password_deadline_interval Hash[hours: 6]
250
+ # verify_login_change_deadline_interval Hash[days: 2]
251
+ <% unless only_json? -%>
252
+ # remember_deadline_interval Hash[days: 30]
253
+ <% end -%>
254
+ end
255
+ end
@@ -0,0 +1,24 @@
1
+ class RodauthApp < Rodauth::Rails::App
2
+ # auth configuration
3
+ # configure RodauthMain
4
+
5
+ route do |r|
6
+ # this block is running inside of a roda route
7
+ # see https://github.com/jeremyevans/roda#usage-
8
+
9
+ # auth route configuration
10
+ # r.rodauth
11
+
12
+ # plugin route configuration
13
+ # rodauth.load_memory # autologin remembered users
14
+
15
+ # ==> Authenticating requests
16
+ # Call `rodauth.require_account` for requests that you want to
17
+ # require authentication for. For example:
18
+ #
19
+ # # authenticate /dashboard/* and /account/* requests
20
+ # if r.path.start_with?("/dashboard") || r.path.start_with?("/account")
21
+ # rodauth.require_account
22
+ # end
23
+ end
24
+ end
@@ -0,0 +1,234 @@
1
+ require "sequel/core"
2
+
3
+ class RodauthPlugin < Rodauth::Rails::Auth
4
+ configure do
5
+ # ==> Features
6
+ # See the Rodauth documentation for the list of available config options:
7
+ # http://rodauth.jeremyevans.net/documentation.html
8
+
9
+ # List of authentication features that are loaded.
10
+ # enable :create_account, :verify_account, :verify_account_grace_period,
11
+ # :reset_password, :change_password, :change_password_notify,
12
+ # :login, :logout, :remember, :change_login, :verify_login_change, :close_account,
13
+ # :json, :jwt
14
+
15
+ # ==> General
16
+
17
+ <% if sequel_activerecord_integration? -%>
18
+ # Initialize Sequel and have it reuse Active Record's database connection.
19
+ <% if RUBY_ENGINE == "jruby" -%>
20
+ db Sequel.connect("jdbc:<%= sequel_adapter %>://", extensions: :activerecord_connection, keep_reference: false)
21
+ <% else -%>
22
+ db Sequel.<%= sequel_adapter %>(extensions: :activerecord_connection, keep_reference: false)
23
+ <% end -%>
24
+
25
+ # Prevent rodauth from introspecting the database if we are not using UUIDs
26
+ # https://github.com/janko/rodauth-rails/issues/244
27
+ convert_token_id_to_integer? true
28
+
29
+ <% end -%>
30
+ # Change prefix of table and foreign key column names from default "account"
31
+ # accounts_table :users
32
+ # verify_account_table :user_verification_keys
33
+ # verify_login_change_table :user_login_change_keys
34
+ # reset_password_table :user_password_reset_keys
35
+ # remember_table :user_remember_keys
36
+
37
+ # The secret key used for hashing public-facing tokens for various features.
38
+ # Defaults to Rails `secret_key_base`, but you can use your own secret key.
39
+ # hmac_secret "<SECRET_KEY>"
40
+
41
+ # Use path prefix for all routes.
42
+ # prefix "/accounts"
43
+
44
+ # Specify the controller used for view rendering, CSRF, and callbacks.
45
+ # rails_controller { RodauthController }
46
+
47
+ # Set in Rodauth controller instance with the title of the current page.
48
+ title_instance_variable :@page_title
49
+
50
+ # Store account status in an integer column without foreign key constraint.
51
+ account_status_column :status
52
+
53
+ # Set password when verifying account.
54
+ # verify_account_set_password? false
55
+
56
+ # Change some default param keys/labels.
57
+ login_label "Email"
58
+ login_param "email"
59
+ # password_confirm_param "confirm_password"
60
+
61
+ # Redirect back to originally requested location after authentication.
62
+ # login_return_to_requested_location? true
63
+ # two_factor_auth_return_to_requested_location? true # if using MFA
64
+
65
+ # Autologin the user after they have reset their password.
66
+ # reset_password_autologin? true
67
+
68
+ # Delete the account record when the user has closed their account.
69
+ # delete_account_on_close? true
70
+
71
+ # Redirect to the app from login and registration pages if already logged in.
72
+ # already_logged_in { redirect login_redirect }
73
+
74
+ # ==> JWT
75
+
76
+ # Set JWT secret, which is used to cryptographically protect the token.
77
+ # jwt_secret Rails.application.credentials.secret_key_base
78
+
79
+ # ==> Api only
80
+
81
+ # Accept only JSON requests.
82
+ # Requires the JSON feature
83
+ # only_json? true
84
+
85
+ # Handle login and password confirmation fields on the client side.
86
+ # require_password_confirmation? false
87
+ # require_login_confirmation? false
88
+
89
+ # ==> Emails
90
+ # Use a custom mailer for delivering authentication emails.
91
+ # Requires ActionMailer
92
+
93
+ # create_reset_password_email do
94
+ # RodauthMailer.reset_password(self.class.configuration_name, account_id, reset_password_key_value)
95
+ # end
96
+
97
+ # create_verify_account_email do
98
+ # RodauthMailer.verify_account(self.class.configuration_name, account_id, verify_account_key_value)
99
+ # end
100
+
101
+ # create_verify_login_change_email do |_login|
102
+ # RodauthMailer.verify_login_change(self.class.configuration_name, account_id, verify_login_change_key_value)
103
+ # end
104
+
105
+ # create_password_changed_email do
106
+ # RodauthMailer.change_password_notify(self.class.configuration_name, account_id)
107
+ # end
108
+
109
+ # create_reset_password_notify_email do
110
+ # RodauthMailer.reset_password_notify(self.class.configuration_name, account_id)
111
+ # end
112
+
113
+ # create_email_auth_email do
114
+ # RodauthMailer.email_auth(self.class.configuration_name, account_id, email_auth_key_value)
115
+ # end
116
+
117
+ # create_unlock_account_email do
118
+ # RodauthMailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
119
+ # end
120
+
121
+ # send_email do |email|
122
+ # # queue email delivery on the mailer after the transaction commits
123
+ # db.after_commit { email.deliver_later }
124
+ # end
125
+
126
+ # ==> Flash
127
+ # Does not work with only_json?
128
+
129
+ # Match flash keys with ones already used in the Rails app.
130
+ # flash_notice_key :success # default is :notice
131
+ # flash_error_key :error # default is :alert
132
+
133
+ # Override default flash messages.
134
+ # create_account_notice_flash "Your account has been created. Please verify your account by visiting the confirmation link sent to your email address."
135
+ # require_login_error_flash "Login is required for accessing this page"
136
+ # login_notice_flash nil
137
+
138
+ # ==> Validation
139
+ # Override default validation error messages.
140
+ # no_matching_login_message "user with this email address doesn't exist"
141
+ # already_an_account_with_this_login_message "user with this email address already exists"
142
+ # password_too_short_message { "needs to have at least #{password_minimum_length} characters" }
143
+ # login_does_not_meet_requirements_message { "invalid email#{", #{login_requirement_message}" if login_requirement_message}" }
144
+
145
+ # ==> Passwords
146
+
147
+ # Passwords shorter than 8 characters are considered weak according to OWASP.
148
+ # password_minimum_length 8
149
+
150
+ # Custom password complexity requirements (alternative to password_complexity feature).
151
+ # password_meets_requirements? do |password|
152
+ # super(password) && password_complex_enough?(password)
153
+ # end
154
+ # auth_class_eval do
155
+ # def password_complex_enough?(password)
156
+ # return true if password.match?(/\d/) && password.match?(/[^a-zA-Z\d]/)
157
+ # set_password_requirement_error_message(:password_simple, "requires one number and one special character")
158
+ # false
159
+ # end
160
+ # end
161
+
162
+ # = bcrypt
163
+
164
+ # bcrypt has a maximum input length of 72 bytes, truncating any extra bytes.
165
+ # password_maximum_bytes 72
166
+
167
+ # = argon2
168
+
169
+ # Use a rotatable password pepper when hashing passwords with Argon2.
170
+ # argon2_secret "<SECRET_KEY>"
171
+
172
+ # Since we're using argon2, prevent loading the bcrypt gem to save memory.
173
+ # require_bcrypt? false
174
+
175
+ # Having a maximum password length set prevents long password DoS attacks.
176
+ # password_maximum_length 64
177
+
178
+ # ==> Remember Feature
179
+ # Does not work with only_json?
180
+
181
+ # Remember all logged in users.
182
+ # after_login { remember_login }
183
+
184
+ # Or only remember users that have ticked a "Remember Me" checkbox on login.
185
+ # after_login { remember_login if param_or_nil("remember") }
186
+
187
+ # Extend user's remember period when remembered via a cookie
188
+ # extend_remember_deadline? true
189
+
190
+ # ==> Hooks
191
+
192
+ # Validate custom fields in the create account form.
193
+ # before_create_account do
194
+ # throw_error_status(422, "name", "must be present") if param("name").empty?
195
+ # end
196
+
197
+ # Perform additional actions after the account is created.
198
+ # after_create_account do
199
+ # Profile.create!(account_id: account_id, name: param("name"))
200
+ # end
201
+
202
+ # Do additional cleanup after the account is closed.
203
+ # after_close_account do
204
+ # Profile.find_by!(account_id: account_id).destroy
205
+ # end
206
+
207
+ # ==> Redirects
208
+ # Does not work with only_json?
209
+
210
+ # Redirect to home after login.
211
+ # login_redirect "/"
212
+
213
+ # Redirect to home page after logout.
214
+ # logout_redirect "/"
215
+
216
+ # Redirect to wherever login redirects to after account verification.
217
+ # verify_account_redirect { login_redirect }
218
+
219
+ # Redirect to login page after password reset.
220
+ # reset_password_redirect { login_path }
221
+
222
+ # Ensure requiring login follows login route changes.
223
+ # require_login_redirect { login_path }
224
+
225
+ # ==> Deadlines
226
+ # Change default deadlines for some actions.
227
+ # verify_account_grace_period 3.days.to_i
228
+ # reset_password_deadline_interval Hash[hours: 6]
229
+ # verify_login_change_deadline_interval Hash[days: 2]
230
+
231
+ # Does not work with only_json?
232
+ # remember_deadline_interval Hash[days: 30]
233
+ end
234
+ end
@@ -0,0 +1,40 @@
1
+ <% if defined?(ActiveRecord::Railtie) -%>
2
+ class <%= table_prefix.camelize %> < ApplicationRecord
3
+ include Rodauth::Rails.model<%= "(:#{table_prefix})" unless primary? %>
4
+ # add concerns above.
5
+
6
+ # add model configurations above.
7
+
8
+ # add belongs_to associations above.
9
+
10
+ # add has_one associations above.
11
+
12
+ # add has_many associations above.
13
+
14
+ # add attachments above.
15
+
16
+ <% if ActiveRecord.version >= Gem::Version.new("7.0") -%>
17
+ enum :status, unverified: 1, verified: 2, closed: 3
18
+ <% else -%>
19
+ enum status: { unverified: 1, verified: 2, closed: 3 }
20
+ <% end -%>
21
+ # add misc attribute macros above.
22
+
23
+ # add scopes above.
24
+
25
+ validates :email, presence: true
26
+ # add validations above.
27
+
28
+ # add callbacks above.
29
+
30
+ # add delegations above.
31
+
32
+ # add methods above.
33
+ end
34
+ <% else -%>
35
+ class <%= table_prefix.camelize %> < Sequel::Model
36
+ include Rodauth::Rails.model
37
+ plugin :enum
38
+ enum :status, unverified: 1, verified: 2, closed: 3
39
+ end
40
+ <% end -%>
@@ -0,0 +1,7 @@
1
+ <%= form_with url: rodauth.email_auth_request_path, method: :post, data: { turbo: false } do |form| %>
2
+ <%= form.hidden_field rodauth.login_param, value: params[rodauth.login_param] %>
3
+
4
+ <div class="form-group mb-3">
5
+ <%= form.submit rodauth.email_auth_request_button, class: "btn btn-primary" %>
6
+ </div>
7
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <%= form_with url: rodauth.login_path, method: :post, data: { turbo: false } do |form| %>
2
+ <% if rodauth.skip_login_field_on_login? %>
3
+ <div class="form-group mb-3">
4
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
5
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", readonly: true, class: "form-control-plaintext" %>
6
+ </div>
7
+ <% else %>
8
+ <div class="form-group mb-3">
9
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
10
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", autocomplete: rodauth.login_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_param)}", aria: ({ invalid: true, describedby: "login_error_message" } if rodauth.field_error(rodauth.login_param)) %>
11
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_param), class: "invalid-feedback", id: "login_error_message") if rodauth.field_error(rodauth.login_param) %>
12
+ </div>
13
+ <% end %>
14
+
15
+ <% unless rodauth.skip_password_field_on_login? %>
16
+ <div class="form-group mb-3">
17
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
18
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
19
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
20
+ </div>
21
+ <% end %>
22
+
23
+ <div class="form-group mb-3">
24
+ <%= form.submit rodauth.login_button, class: "btn btn-primary" %>
25
+ </div>
26
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <% unless rodauth.login_form_footer_links.empty? %>
2
+ <%== rodauth.login_form_footer_links_heading %>
3
+
4
+ <ul>
5
+ <% rodauth.login_form_footer_links.sort.each do |_, link, text| %>
6
+ <li><%= link_to text, link %></li>
7
+ <% end %>
8
+ </ul>
9
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <pre id="recovery-codes"><%= rodauth.recovery_codes.map { |s| h(s) }.join("\n\n") %></pre>
2
+
3
+ <% if rodauth.can_add_recovery_codes? %>
4
+ <%== rodauth.add_recovery_codes_heading %>
5
+ <%= render template: "rodauth/recovery_codes", layout: false %>
6
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <%= form_with url: rodauth.change_login_path, method: :post, data: { turbo: false } do |form| %>
2
+ <div class="form-group mb-3">
3
+ <%= form.label "login", rodauth.login_label, class: "form-label" %>
4
+ <%= form.email_field rodauth.login_param, value: params[rodauth.login_param], id: "login", autocomplete: "email", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_param)}", aria: ({ invalid: true, describedby: "login_error_message" } if rodauth.field_error(rodauth.login_param)) %>
5
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_param), class: "invalid-feedback", id: "login_error_message") if rodauth.field_error(rodauth.login_param) %>
6
+ </div>
7
+
8
+ <% if rodauth.require_login_confirmation? %>
9
+ <div class="form-group mb-3">
10
+ <%= form.label "login-confirm", rodauth.login_confirm_label, class: "form-label" %>
11
+ <%= form.email_field rodauth.login_confirm_param, value: params[rodauth.login_confirm_param], id: "login-confirm", autocomplete: "email", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.login_confirm_param)}", aria: ({ invalid: true, describedby: "login-confirm_error_message" } if rodauth.field_error(rodauth.login_confirm_param)) %>
12
+ <%= content_tag(:span, rodauth.field_error(rodauth.login_confirm_param), class: "invalid-feedback", id: "login-confirm_error_message") if rodauth.field_error(rodauth.login_confirm_param) %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <% if rodauth.change_login_requires_password? %>
17
+ <div class="form-group mb-3">
18
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
19
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
20
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
21
+ </div>
22
+ <% end %>
23
+
24
+ <div class="form-group mb-3">
25
+ <%= form.submit rodauth.change_login_button, class: "btn btn-primary" %>
26
+ </div>
27
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <%= form_with url: rodauth.change_password_path, method: :post, data: { turbo: false } do |form| %>
2
+ <% if rodauth.change_password_requires_password? %>
3
+ <div class="form-group mb-3">
4
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
5
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
6
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
7
+ </div>
8
+ <% end %>
9
+
10
+ <div class="form-group mb-3">
11
+ <%= form.label "new-password", rodauth.new_password_label, class: "form-label" %>
12
+ <%= form.password_field rodauth.new_password_param, value: "", id: "new-password", autocomplete: "new-password", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.new_password_param)}", aria: ({ invalid: true, describedby: "new-password_error_message" } if rodauth.field_error(rodauth.new_password_param)) %>
13
+ <%= content_tag(:span, rodauth.field_error(rodauth.new_password_param), class: "invalid-feedback", id: "new-password_error_message") if rodauth.field_error(rodauth.new_password_param) %>
14
+ </div>
15
+
16
+ <% if rodauth.require_password_confirmation? %>
17
+ <div class="form-group mb-3">
18
+ <%= form.label "password-confirm", rodauth.password_confirm_label, class: "form-label" %>
19
+ <%= form.password_field rodauth.password_confirm_param, value: "", id: "password-confirm", autocomplete: "new-password", required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_confirm_param)}", aria: ({ invalid: true, describedby: "password-confirm_error_message" } if rodauth.field_error(rodauth.password_confirm_param)) %>
20
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_confirm_param), class: "invalid-feedback", id: "password-confirm_error_message") if rodauth.field_error(rodauth.password_confirm_param) %>
21
+ </div>
22
+ <% end %>
23
+
24
+ <div class="form-group mb-3">
25
+ <%= form.submit rodauth.change_password_button, class: "btn btn-primary" %>
26
+ </div>
27
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%= form_with url: rodauth.close_account_path, method: :post, data: { turbo: false } do |form| %>
2
+ <% if rodauth.close_account_requires_password? %>
3
+ <div class="form-group mb-3">
4
+ <%= form.label "password", rodauth.password_label, class: "form-label" %>
5
+ <%= form.password_field rodauth.password_param, value: "", id: "password", autocomplete: rodauth.password_field_autocomplete_value, required: true, class: "form-control #{"is-invalid" if rodauth.field_error(rodauth.password_param)}", aria: ({ invalid: true, describedby: "password_error_message" } if rodauth.field_error(rodauth.password_param)) %>
6
+ <%= content_tag(:span, rodauth.field_error(rodauth.password_param), class: "invalid-feedback", id: "password_error_message") if rodauth.field_error(rodauth.password_param) %>
7
+ </div>
8
+ <% end %>
9
+
10
+ <div class="form-group mb-3">
11
+ <%= form.submit rodauth.close_account_button, class: "btn btn-danger" %>
12
+ </div>
13
+ <% end %>