hazo_auth 1.2.0 → 1.4.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 (495) hide show
  1. package/README.md +383 -774
  2. package/dist/components/index.d.ts +3 -0
  3. package/dist/components/index.d.ts.map +1 -0
  4. package/dist/components/index.js +5 -0
  5. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts +23 -0
  6. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts.map +1 -0
  7. package/dist/components/layouts/email_verification/config/email_verification_field_config.js +44 -0
  8. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts +31 -0
  9. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -0
  10. package/dist/components/layouts/email_verification/hooks/use_email_verification.js +222 -0
  11. package/dist/components/layouts/email_verification/index.d.ts +23 -0
  12. package/dist/components/layouts/email_verification/index.d.ts.map +1 -0
  13. package/dist/components/layouts/email_verification/index.js +61 -0
  14. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts +10 -0
  15. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts.map +1 -0
  16. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.js +33 -0
  17. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +22 -0
  18. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -0
  19. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +127 -0
  20. package/dist/components/layouts/forgot_password/index.d.ts +18 -0
  21. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -0
  22. package/dist/components/layouts/forgot_password/index.js +43 -0
  23. package/dist/components/layouts/index.d.ts +16 -0
  24. package/dist/components/layouts/index.d.ts.map +1 -0
  25. package/dist/components/layouts/index.js +11 -0
  26. package/dist/components/layouts/login/config/login_field_config.d.ts +11 -0
  27. package/dist/components/layouts/login/config/login_field_config.d.ts.map +1 -0
  28. package/dist/components/layouts/login/config/login_field_config.js +42 -0
  29. package/dist/components/layouts/login/hooks/use_login_form.d.ts +34 -0
  30. package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -0
  31. package/dist/components/layouts/login/hooks/use_login_form.js +196 -0
  32. package/dist/components/layouts/login/index.d.ts +31 -0
  33. package/dist/components/layouts/login/index.d.ts.map +1 -0
  34. package/dist/components/layouts/login/index.js +58 -0
  35. package/dist/components/layouts/my_settings/components/editable_field.d.ts +19 -0
  36. package/dist/components/layouts/my_settings/components/editable_field.d.ts.map +1 -0
  37. package/dist/components/layouts/my_settings/components/editable_field.js +73 -0
  38. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts +28 -0
  39. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts.map +1 -0
  40. package/dist/components/layouts/my_settings/components/password_change_dialog.js +138 -0
  41. package/dist/components/layouts/my_settings/components/profile_picture_dialog.d.ts +42 -0
  42. package/dist/components/layouts/my_settings/components/profile_picture_dialog.d.ts.map +1 -0
  43. package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +198 -0
  44. package/dist/components/layouts/my_settings/components/profile_picture_display.d.ts +16 -0
  45. package/dist/components/layouts/my_settings/components/profile_picture_display.d.ts.map +1 -0
  46. package/dist/components/layouts/my_settings/components/profile_picture_display.js +33 -0
  47. package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.d.ts +17 -0
  48. package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.d.ts.map +1 -0
  49. package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.js +48 -0
  50. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts +21 -0
  51. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts.map +1 -0
  52. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +144 -0
  53. package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.d.ts +23 -0
  54. package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.d.ts.map +1 -0
  55. package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.js +169 -0
  56. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts +19 -0
  57. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts.map +1 -0
  58. package/dist/components/layouts/my_settings/config/my_settings_field_config.js +26 -0
  59. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +46 -0
  60. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -0
  61. package/dist/components/layouts/my_settings/hooks/use_my_settings.js +354 -0
  62. package/dist/components/layouts/my_settings/index.d.ts +64 -0
  63. package/dist/components/layouts/my_settings/index.d.ts.map +1 -0
  64. package/dist/components/layouts/my_settings/index.js +65 -0
  65. package/dist/components/layouts/register/config/register_field_config.d.ts +14 -0
  66. package/dist/components/layouts/register/config/register_field_config.d.ts.map +1 -0
  67. package/dist/components/layouts/register/config/register_field_config.js +69 -0
  68. package/dist/components/layouts/register/hooks/use_register_form.d.ts +30 -0
  69. package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -0
  70. package/dist/components/layouts/register/hooks/use_register_form.js +184 -0
  71. package/dist/components/layouts/register/index.d.ts +23 -0
  72. package/dist/components/layouts/register/index.d.ts.map +1 -0
  73. package/dist/components/layouts/register/index.js +58 -0
  74. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts +13 -0
  75. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts.map +1 -0
  76. package/dist/components/layouts/reset_password/config/reset_password_field_config.js +53 -0
  77. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts +28 -0
  78. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -0
  79. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +201 -0
  80. package/dist/components/layouts/reset_password/index.d.ts +23 -0
  81. package/dist/components/layouts/reset_password/index.d.ts.map +1 -0
  82. package/dist/components/layouts/reset_password/index.js +53 -0
  83. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts +20 -0
  84. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts.map +1 -0
  85. package/dist/components/layouts/shared/components/already_logged_in_guard.js +32 -0
  86. package/dist/components/layouts/shared/components/auth_page_shell.d.ts +7 -0
  87. package/dist/components/layouts/shared/components/auth_page_shell.d.ts.map +1 -0
  88. package/dist/components/layouts/shared/components/auth_page_shell.js +12 -0
  89. package/dist/components/layouts/shared/components/field_error_message.d.ts +7 -0
  90. package/dist/components/layouts/shared/components/field_error_message.d.ts.map +1 -0
  91. package/dist/components/layouts/shared/components/field_error_message.js +6 -0
  92. package/dist/components/layouts/shared/components/form_action_buttons.d.ts +14 -0
  93. package/dist/components/layouts/shared/components/form_action_buttons.d.ts.map +1 -0
  94. package/dist/components/layouts/shared/components/form_action_buttons.js +15 -0
  95. package/dist/components/layouts/shared/components/form_field_wrapper.d.ts +11 -0
  96. package/dist/components/layouts/shared/components/form_field_wrapper.d.ts.map +1 -0
  97. package/dist/components/layouts/shared/components/form_field_wrapper.js +9 -0
  98. package/dist/components/layouts/shared/components/form_header.d.ts +10 -0
  99. package/dist/components/layouts/shared/components/form_header.d.ts.map +1 -0
  100. package/dist/components/layouts/shared/components/form_header.js +5 -0
  101. package/dist/components/layouts/shared/components/logout_button.d.ts +7 -0
  102. package/dist/components/layouts/shared/components/logout_button.d.ts.map +1 -0
  103. package/dist/components/layouts/shared/components/logout_button.js +44 -0
  104. package/dist/components/layouts/shared/components/password_field.d.ts +13 -0
  105. package/dist/components/layouts/shared/components/password_field.d.ts.map +1 -0
  106. package/dist/components/layouts/shared/components/password_field.js +13 -0
  107. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts +22 -0
  108. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -0
  109. package/dist/components/layouts/shared/components/profile_pic_menu.js +169 -0
  110. package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.d.ts +12 -0
  111. package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.d.ts.map +1 -0
  112. package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.js +16 -0
  113. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts +6 -0
  114. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts.map +1 -0
  115. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +15 -0
  116. package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts +11 -0
  117. package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts.map +1 -0
  118. package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +10 -0
  119. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts +12 -0
  120. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts.map +1 -0
  121. package/dist/components/layouts/shared/components/two_column_auth_layout.js +8 -0
  122. package/dist/components/layouts/shared/components/unauthorized_guard.d.ts +14 -0
  123. package/dist/components/layouts/shared/components/unauthorized_guard.d.ts.map +1 -0
  124. package/dist/components/layouts/shared/components/unauthorized_guard.js +30 -0
  125. package/dist/components/layouts/shared/components/visual_panel.d.ts +9 -0
  126. package/dist/components/layouts/shared/components/visual_panel.d.ts.map +1 -0
  127. package/dist/components/layouts/shared/components/visual_panel.js +10 -0
  128. package/dist/components/layouts/shared/config/layout_customization.d.ts +38 -0
  129. package/dist/components/layouts/shared/config/layout_customization.d.ts.map +1 -0
  130. package/dist/components/layouts/shared/config/layout_customization.js +19 -0
  131. package/dist/components/layouts/shared/data/layout_data_client.d.ts +6 -0
  132. package/dist/components/layouts/shared/data/layout_data_client.d.ts.map +1 -0
  133. package/dist/components/layouts/shared/data/layout_data_client.js +9 -0
  134. package/dist/components/layouts/shared/hooks/use_auth_status.d.ts +20 -0
  135. package/dist/components/layouts/shared/hooks/use_auth_status.d.ts.map +1 -0
  136. package/dist/components/layouts/shared/hooks/use_auth_status.js +71 -0
  137. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts +48 -0
  138. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -0
  139. package/dist/components/layouts/shared/hooks/use_hazo_auth.js +90 -0
  140. package/dist/components/layouts/shared/index.d.ts +24 -0
  141. package/dist/components/layouts/shared/index.d.ts.map +1 -0
  142. package/dist/components/layouts/shared/index.js +27 -0
  143. package/dist/components/layouts/shared/utils/ip_address.d.ts +7 -0
  144. package/dist/components/layouts/shared/utils/ip_address.d.ts.map +1 -0
  145. package/dist/components/layouts/shared/utils/ip_address.js +34 -0
  146. package/dist/components/layouts/shared/utils/validation.d.ts +15 -0
  147. package/dist/components/layouts/shared/utils/validation.d.ts.map +1 -0
  148. package/dist/components/layouts/shared/utils/validation.js +45 -0
  149. package/dist/components/layouts/user_management/components/roles_matrix.d.ts +29 -0
  150. package/dist/components/layouts/user_management/components/roles_matrix.d.ts.map +1 -0
  151. package/dist/components/layouts/user_management/components/roles_matrix.js +287 -0
  152. package/dist/components/layouts/user_management/index.d.ts +13 -0
  153. package/dist/components/layouts/user_management/index.d.ts.map +1 -0
  154. package/dist/components/layouts/user_management/index.js +495 -0
  155. package/dist/components/ui/alert-dialog.d.ts +21 -0
  156. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  157. package/dist/components/ui/alert-dialog.js +62 -0
  158. package/dist/components/ui/avatar.d.ts +7 -0
  159. package/dist/components/ui/avatar.d.ts.map +1 -0
  160. package/dist/components/ui/avatar.js +32 -0
  161. package/dist/components/ui/button.d.ts +12 -0
  162. package/dist/components/ui/button.d.ts.map +1 -0
  163. package/dist/components/ui/button.js +45 -0
  164. package/dist/components/ui/checkbox.d.ts +5 -0
  165. package/dist/components/ui/checkbox.d.ts.map +1 -0
  166. package/dist/components/ui/checkbox.js +23 -0
  167. package/dist/components/ui/dialog.d.ts +20 -0
  168. package/dist/components/ui/dialog.d.ts.map +1 -0
  169. package/dist/components/ui/dialog.js +52 -0
  170. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  171. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  172. package/dist/components/ui/dropdown-menu.js +72 -0
  173. package/dist/components/ui/hazo_ui_tooltip.d.ts +26 -0
  174. package/dist/components/ui/hazo_ui_tooltip.d.ts.map +1 -0
  175. package/dist/components/ui/hazo_ui_tooltip.js +17 -0
  176. package/dist/components/ui/index.d.ts +20 -0
  177. package/dist/components/ui/index.d.ts.map +1 -0
  178. package/dist/components/ui/index.js +21 -0
  179. package/dist/components/ui/input.d.ts +4 -0
  180. package/dist/components/ui/input.d.ts.map +1 -0
  181. package/dist/components/ui/input.js +20 -0
  182. package/dist/components/ui/label.d.ts +6 -0
  183. package/dist/components/ui/label.d.ts.map +1 -0
  184. package/dist/components/ui/label.js +24 -0
  185. package/dist/components/ui/separator.d.ts +5 -0
  186. package/dist/components/ui/separator.d.ts.map +1 -0
  187. package/dist/components/ui/separator.js +22 -0
  188. package/dist/components/ui/sheet.d.ts +23 -0
  189. package/dist/components/ui/sheet.d.ts.map +1 -0
  190. package/dist/components/ui/sheet.js +66 -0
  191. package/dist/components/ui/sidebar.d.ts +66 -0
  192. package/dist/components/ui/sidebar.d.ts.map +1 -0
  193. package/dist/components/ui/sidebar.js +267 -0
  194. package/dist/components/ui/skeleton.d.ts +3 -0
  195. package/dist/components/ui/skeleton.d.ts.map +1 -0
  196. package/dist/components/ui/skeleton.js +18 -0
  197. package/dist/components/ui/sonner.d.ts +5 -0
  198. package/dist/components/ui/sonner.d.ts.map +1 -0
  199. package/dist/components/ui/sonner.js +28 -0
  200. package/dist/components/ui/switch.d.ts +5 -0
  201. package/dist/components/ui/switch.d.ts.map +1 -0
  202. package/dist/components/ui/switch.js +22 -0
  203. package/dist/components/ui/table.d.ts +11 -0
  204. package/dist/components/ui/table.d.ts.map +1 -0
  205. package/dist/components/ui/table.js +55 -0
  206. package/dist/components/ui/tabs.d.ts +8 -0
  207. package/dist/components/ui/tabs.d.ts.map +1 -0
  208. package/dist/components/ui/tabs.js +33 -0
  209. package/dist/components/ui/tooltip.d.ts +8 -0
  210. package/dist/components/ui/tooltip.d.ts.map +1 -0
  211. package/dist/components/ui/tooltip.js +25 -0
  212. package/dist/components/ui/vertical-tabs.d.ts +8 -0
  213. package/dist/components/ui/vertical-tabs.d.ts.map +1 -0
  214. package/dist/components/ui/vertical-tabs.js +37 -0
  215. package/dist/hooks/use-mobile.d.ts +2 -0
  216. package/dist/hooks/use-mobile.d.ts.map +1 -0
  217. package/dist/hooks/use-mobile.js +15 -0
  218. package/dist/index.d.ts +3 -0
  219. package/dist/index.d.ts.map +1 -0
  220. package/dist/index.js +5 -0
  221. package/dist/lib/already_logged_in_config.server.d.ts +14 -0
  222. package/dist/lib/already_logged_in_config.server.d.ts.map +1 -0
  223. package/dist/lib/already_logged_in_config.server.js +29 -0
  224. package/dist/lib/app_logger.d.ts +12 -0
  225. package/dist/lib/app_logger.d.ts.map +1 -0
  226. package/dist/lib/app_logger.js +14 -0
  227. package/dist/lib/auth/auth_cache.d.ts +83 -0
  228. package/dist/lib/auth/auth_cache.d.ts.map +1 -0
  229. package/dist/lib/auth/auth_cache.js +158 -0
  230. package/dist/lib/auth/auth_rate_limiter.d.ts +39 -0
  231. package/dist/lib/auth/auth_rate_limiter.d.ts.map +1 -0
  232. package/dist/lib/auth/auth_rate_limiter.js +95 -0
  233. package/dist/lib/auth/auth_types.d.ts +53 -0
  234. package/dist/lib/auth/auth_types.d.ts.map +1 -0
  235. package/dist/lib/auth/auth_types.js +16 -0
  236. package/dist/lib/auth/auth_utils.server.d.ts +47 -0
  237. package/dist/lib/auth/auth_utils.server.d.ts.map +1 -0
  238. package/dist/lib/auth/auth_utils.server.js +150 -0
  239. package/dist/lib/auth/hazo_get_auth.server.d.ts +12 -0
  240. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -0
  241. package/dist/lib/auth/hazo_get_auth.server.js +256 -0
  242. package/dist/lib/auth/index.d.ts +9 -0
  243. package/dist/lib/auth/index.d.ts.map +1 -0
  244. package/dist/lib/auth/index.js +12 -0
  245. package/dist/lib/auth/server_auth.d.ts +26 -0
  246. package/dist/lib/auth/server_auth.d.ts.map +1 -0
  247. package/dist/lib/auth/server_auth.js +62 -0
  248. package/dist/lib/auth_utility_config.server.d.ts +20 -0
  249. package/dist/lib/auth_utility_config.server.d.ts.map +1 -0
  250. package/dist/lib/auth_utility_config.server.js +64 -0
  251. package/dist/lib/config/config_loader.server.d.ts +44 -0
  252. package/dist/lib/config/config_loader.server.d.ts.map +1 -0
  253. package/dist/lib/config/config_loader.server.js +122 -0
  254. package/dist/lib/email_verification_config.server.d.ts +14 -0
  255. package/dist/lib/email_verification_config.server.d.ts.map +1 -0
  256. package/dist/lib/email_verification_config.server.js +20 -0
  257. package/dist/lib/file_types_config.server.d.ts +11 -0
  258. package/dist/lib/file_types_config.server.d.ts.map +1 -0
  259. package/dist/lib/file_types_config.server.js +16 -0
  260. package/dist/lib/forgot_password_config.server.d.ts +14 -0
  261. package/dist/lib/forgot_password_config.server.d.ts.map +1 -0
  262. package/dist/lib/forgot_password_config.server.js +20 -0
  263. package/dist/lib/hazo_connect_instance.server.d.ts +17 -0
  264. package/dist/lib/hazo_connect_instance.server.d.ts.map +1 -0
  265. package/dist/lib/hazo_connect_instance.server.js +88 -0
  266. package/dist/lib/hazo_connect_setup.d.ts +2 -0
  267. package/dist/lib/hazo_connect_setup.d.ts.map +1 -0
  268. package/dist/lib/hazo_connect_setup.js +49 -0
  269. package/dist/lib/hazo_connect_setup.server.d.ts +20 -0
  270. package/dist/lib/hazo_connect_setup.server.d.ts.map +1 -0
  271. package/dist/lib/hazo_connect_setup.server.js +138 -0
  272. package/dist/lib/index.d.ts +28 -0
  273. package/dist/lib/index.d.ts.map +1 -0
  274. package/dist/lib/index.js +35 -0
  275. package/dist/lib/login_config.server.d.ts +20 -0
  276. package/dist/lib/login_config.server.d.ts.map +1 -0
  277. package/dist/lib/login_config.server.js +37 -0
  278. package/dist/lib/messages_config.server.d.ts +13 -0
  279. package/dist/lib/messages_config.server.d.ts.map +1 -0
  280. package/dist/lib/messages_config.server.js +18 -0
  281. package/dist/lib/migrations/apply_migration.d.ts +22 -0
  282. package/dist/lib/migrations/apply_migration.d.ts.map +1 -0
  283. package/dist/lib/migrations/apply_migration.js +78 -0
  284. package/dist/lib/my_settings_config.server.d.ts +65 -0
  285. package/dist/lib/my_settings_config.server.d.ts.map +1 -0
  286. package/dist/lib/my_settings_config.server.js +67 -0
  287. package/dist/lib/password_requirements_config.server.d.ts +15 -0
  288. package/dist/lib/password_requirements_config.server.d.ts.map +1 -0
  289. package/dist/lib/password_requirements_config.server.js +26 -0
  290. package/dist/lib/profile_pic_menu_config.server.d.ts +26 -0
  291. package/dist/lib/profile_pic_menu_config.server.d.ts.map +1 -0
  292. package/dist/lib/profile_pic_menu_config.server.js +95 -0
  293. package/dist/lib/profile_picture_config.server.d.ts +16 -0
  294. package/dist/lib/profile_picture_config.server.d.ts.map +1 -0
  295. package/dist/lib/profile_picture_config.server.js +40 -0
  296. package/dist/lib/register_config.server.d.ts +24 -0
  297. package/dist/lib/register_config.server.d.ts.map +1 -0
  298. package/dist/lib/register_config.server.js +39 -0
  299. package/dist/lib/reset_password_config.server.d.ts +25 -0
  300. package/dist/lib/reset_password_config.server.d.ts.map +1 -0
  301. package/dist/lib/reset_password_config.server.js +38 -0
  302. package/dist/lib/services/email_service.d.ts +44 -0
  303. package/dist/lib/services/email_service.d.ts.map +1 -0
  304. package/dist/lib/services/email_service.js +480 -0
  305. package/dist/lib/services/email_verification_service.d.ts +35 -0
  306. package/dist/lib/services/email_verification_service.d.ts.map +1 -0
  307. package/dist/lib/services/email_verification_service.js +208 -0
  308. package/dist/lib/services/index.d.ts +13 -0
  309. package/dist/lib/services/index.d.ts.map +1 -0
  310. package/dist/lib/services/index.js +14 -0
  311. package/dist/lib/services/login_service.d.ts +20 -0
  312. package/dist/lib/services/login_service.d.ts.map +1 -0
  313. package/dist/lib/services/login_service.js +94 -0
  314. package/dist/lib/services/password_change_service.d.ts +19 -0
  315. package/dist/lib/services/password_change_service.d.ts.map +1 -0
  316. package/dist/lib/services/password_change_service.js +118 -0
  317. package/dist/lib/services/password_reset_service.d.ts +52 -0
  318. package/dist/lib/services/password_reset_service.d.ts.map +1 -0
  319. package/dist/lib/services/password_reset_service.js +318 -0
  320. package/dist/lib/services/profile_picture_remove_service.d.ts +15 -0
  321. package/dist/lib/services/profile_picture_remove_service.d.ts.map +1 -0
  322. package/dist/lib/services/profile_picture_remove_service.js +94 -0
  323. package/dist/lib/services/profile_picture_service.d.ts +45 -0
  324. package/dist/lib/services/profile_picture_service.d.ts.map +1 -0
  325. package/dist/lib/services/profile_picture_service.js +183 -0
  326. package/dist/lib/services/profile_picture_source_mapper.d.ts +23 -0
  327. package/dist/lib/services/profile_picture_source_mapper.d.ts.map +1 -0
  328. package/dist/lib/services/profile_picture_source_mapper.js +45 -0
  329. package/dist/lib/services/registration_service.d.ts +20 -0
  330. package/dist/lib/services/registration_service.d.ts.map +1 -0
  331. package/dist/lib/services/registration_service.js +147 -0
  332. package/dist/lib/services/token_service.d.ts +20 -0
  333. package/dist/lib/services/token_service.d.ts.map +1 -0
  334. package/dist/lib/services/token_service.js +201 -0
  335. package/dist/lib/services/user_profiles_service.d.ts +31 -0
  336. package/dist/lib/services/user_profiles_service.d.ts.map +1 -0
  337. package/dist/lib/services/user_profiles_service.js +99 -0
  338. package/dist/lib/services/user_update_service.d.ts +23 -0
  339. package/dist/lib/services/user_update_service.d.ts.map +1 -0
  340. package/dist/lib/services/user_update_service.js +103 -0
  341. package/dist/lib/ui_shell_config.server.d.ts +16 -0
  342. package/dist/lib/ui_shell_config.server.d.ts.map +1 -0
  343. package/dist/lib/ui_shell_config.server.js +28 -0
  344. package/dist/lib/ui_sizes_config.server.d.ts +17 -0
  345. package/dist/lib/ui_sizes_config.server.d.ts.map +1 -0
  346. package/dist/lib/ui_sizes_config.server.js +22 -0
  347. package/dist/lib/user_fields_config.server.d.ts +13 -0
  348. package/dist/lib/user_fields_config.server.d.ts.map +1 -0
  349. package/dist/lib/user_fields_config.server.js +21 -0
  350. package/dist/lib/user_management_config.server.d.ts +10 -0
  351. package/dist/lib/user_management_config.server.d.ts.map +1 -0
  352. package/dist/lib/user_management_config.server.js +26 -0
  353. package/dist/lib/utils/api_route_helpers.d.ts +13 -0
  354. package/dist/lib/utils/api_route_helpers.d.ts.map +1 -0
  355. package/dist/lib/utils/api_route_helpers.js +58 -0
  356. package/dist/lib/utils/error_sanitizer.d.ts +16 -0
  357. package/dist/lib/utils/error_sanitizer.d.ts.map +1 -0
  358. package/dist/lib/utils/error_sanitizer.js +39 -0
  359. package/dist/lib/utils.d.ts +4 -0
  360. package/dist/lib/utils.d.ts.map +1 -0
  361. package/dist/lib/utils.js +9 -0
  362. package/dist/server/config/config_loader.d.ts +26 -0
  363. package/dist/server/config/config_loader.d.ts.map +1 -0
  364. package/dist/server/config/config_loader.js +329 -0
  365. package/dist/server/index.d.ts +2 -0
  366. package/dist/server/index.d.ts.map +1 -0
  367. package/dist/server/index.js +32 -0
  368. package/dist/server/logging/logger_service.d.ts +3 -0
  369. package/dist/server/logging/logger_service.d.ts.map +1 -0
  370. package/dist/server/logging/logger_service.js +37 -0
  371. package/dist/server/routes/root_router.d.ts +3 -0
  372. package/dist/server/routes/root_router.d.ts.map +1 -0
  373. package/dist/server/routes/root_router.js +14 -0
  374. package/dist/server/server.d.ts +3 -0
  375. package/dist/server/server.d.ts.map +1 -0
  376. package/dist/server/server.js +25 -0
  377. package/dist/server/types/app_types.d.ts +53 -0
  378. package/dist/server/types/app_types.d.ts.map +1 -0
  379. package/dist/server/types/app_types.js +1 -0
  380. package/migrations/003_add_url_on_logon_to_hazo_users.sql +8 -0
  381. package/next.config.mjs +12 -0
  382. package/package.json +39 -2
  383. package/scripts/init_users.ts +9 -9
  384. package/src/components/index.ts +7 -0
  385. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +2 -2
  386. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +3 -3
  387. package/src/components/layouts/email_verification/index.tsx +11 -11
  388. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +2 -2
  389. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +3 -3
  390. package/src/components/layouts/forgot_password/index.tsx +10 -10
  391. package/src/components/layouts/index.ts +26 -0
  392. package/src/components/layouts/login/config/login_field_config.ts +2 -2
  393. package/src/components/layouts/login/hooks/use_login_form.ts +5 -5
  394. package/src/components/layouts/login/index.tsx +11 -11
  395. package/src/components/layouts/my_settings/components/editable_field.tsx +3 -3
  396. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +5 -5
  397. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +7 -7
  398. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +2 -2
  399. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +3 -3
  400. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +5 -5
  401. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +4 -4
  402. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +2 -2
  403. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +2 -2
  404. package/src/components/layouts/my_settings/index.tsx +10 -10
  405. package/src/components/layouts/register/config/register_field_config.ts +2 -2
  406. package/src/components/layouts/register/hooks/use_register_form.ts +4 -4
  407. package/src/components/layouts/register/index.tsx +11 -11
  408. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +2 -2
  409. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +4 -4
  410. package/src/components/layouts/reset_password/index.tsx +10 -10
  411. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +4 -4
  412. package/src/components/layouts/shared/components/auth_page_shell.tsx +3 -3
  413. package/src/components/layouts/shared/components/form_action_buttons.tsx +2 -2
  414. package/src/components/layouts/shared/components/form_field_wrapper.tsx +2 -2
  415. package/src/components/layouts/shared/components/logout_button.tsx +2 -2
  416. package/src/components/layouts/shared/components/password_field.tsx +3 -3
  417. package/src/components/layouts/shared/components/profile_pic_menu.tsx +5 -5
  418. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +2 -2
  419. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +3 -3
  420. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +1 -1
  421. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +1 -1
  422. package/src/components/layouts/shared/components/unauthorized_guard.tsx +2 -2
  423. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +1 -1
  424. package/src/components/layouts/shared/index.ts +34 -0
  425. package/src/components/layouts/shared/utils/validation.ts +1 -1
  426. package/src/components/layouts/user_management/components/roles_matrix.tsx +7 -7
  427. package/src/components/layouts/user_management/index.tsx +11 -11
  428. package/src/components/ui/alert-dialog.tsx +2 -2
  429. package/src/components/ui/avatar.tsx +1 -1
  430. package/src/components/ui/button.tsx +1 -1
  431. package/src/components/ui/checkbox.tsx +1 -1
  432. package/src/components/ui/dialog.tsx +1 -1
  433. package/src/components/ui/dropdown-menu.tsx +1 -1
  434. package/src/components/ui/hazo_ui_tooltip.tsx +1 -1
  435. package/src/components/ui/index.ts +22 -0
  436. package/src/components/ui/input.tsx +1 -1
  437. package/src/components/ui/label.tsx +1 -1
  438. package/src/components/ui/separator.tsx +1 -1
  439. package/src/components/ui/sheet.tsx +1 -1
  440. package/src/components/ui/sidebar.tsx +8 -8
  441. package/src/components/ui/skeleton.tsx +1 -1
  442. package/src/components/ui/switch.tsx +1 -1
  443. package/src/components/ui/table.tsx +1 -1
  444. package/src/components/ui/tabs.tsx +1 -1
  445. package/src/components/ui/tooltip.tsx +1 -1
  446. package/src/components/ui/vertical-tabs.tsx +1 -1
  447. package/src/index.ts +7 -0
  448. package/src/lib/already_logged_in_config.server.ts +1 -1
  449. package/src/lib/app_logger.ts +1 -1
  450. package/src/lib/auth/auth_cache.ts +1 -1
  451. package/src/lib/auth/auth_utils.server.ts +2 -2
  452. package/src/lib/auth/hazo_get_auth.server.ts +8 -8
  453. package/src/lib/auth/index.ts +23 -0
  454. package/src/lib/auth/server_auth.ts +2 -2
  455. package/src/lib/auth_utility_config.server.ts +1 -1
  456. package/src/lib/config/config_loader.server.ts +1 -1
  457. package/src/lib/email_verification_config.server.ts +1 -1
  458. package/src/lib/file_types_config.server.ts +1 -1
  459. package/src/lib/forgot_password_config.server.ts +1 -1
  460. package/src/lib/hazo_connect_instance.server.ts +2 -2
  461. package/src/lib/hazo_connect_setup.server.ts +2 -2
  462. package/src/lib/index.ts +44 -0
  463. package/src/lib/login_config.server.ts +2 -2
  464. package/src/lib/messages_config.server.ts +1 -1
  465. package/src/lib/my_settings_config.server.ts +7 -7
  466. package/src/lib/password_requirements_config.server.ts +1 -1
  467. package/src/lib/profile_pic_menu_config.server.ts +1 -1
  468. package/src/lib/profile_picture_config.server.ts +2 -2
  469. package/src/lib/register_config.server.ts +4 -4
  470. package/src/lib/reset_password_config.server.ts +3 -3
  471. package/src/lib/services/email_service.ts +2 -2
  472. package/src/lib/services/email_verification_service.ts +3 -3
  473. package/src/lib/services/index.ts +15 -0
  474. package/src/lib/services/login_service.ts +3 -3
  475. package/src/lib/services/password_change_service.ts +3 -3
  476. package/src/lib/services/password_reset_service.ts +3 -3
  477. package/src/lib/services/profile_picture_remove_service.ts +3 -3
  478. package/src/lib/services/profile_picture_service.ts +5 -5
  479. package/src/lib/services/registration_service.ts +8 -8
  480. package/src/lib/services/token_service.ts +2 -2
  481. package/src/lib/services/user_profiles_service.ts +2 -2
  482. package/src/lib/services/user_update_service.ts +4 -4
  483. package/src/lib/ui_shell_config.server.ts +1 -1
  484. package/src/lib/ui_sizes_config.server.ts +1 -1
  485. package/src/lib/user_fields_config.server.ts +1 -1
  486. package/src/lib/user_management_config.server.ts +1 -2
  487. package/src/lib/utils/error_sanitizer.ts +1 -1
  488. package/src/routes/index.ts +34 -0
  489. package/src/server/config/config_loader.ts +2 -2
  490. package/src/server/index.ts +2 -2
  491. package/src/server/logging/logger_service.ts +1 -1
  492. package/src/server/server.ts +2 -2
  493. package/src/server/types/express.d.ts +1 -1
  494. package/tsconfig.build.json +39 -0
  495. package/tsconfig.json +5 -1
@@ -0,0 +1,208 @@
1
+ import { createCrudService } from "hazo_connect/server";
2
+ import argon2 from "argon2";
3
+ import { create_token } from "hazo_auth/lib/services/token_service";
4
+ import { send_template_email } from "hazo_auth/lib/services/email_service";
5
+ import { create_app_logger } from "hazo_auth/lib/app_logger";
6
+ // section: helpers
7
+ /**
8
+ * Verifies an email verification token
9
+ * Updates email_verified to true in hazo_users and deletes the token
10
+ * @param adapter - The hazo_connect adapter instance
11
+ * @param data - Email verification token data (token)
12
+ * @returns Email verification result with success status, user_id, email, or error
13
+ */
14
+ export async function verify_email_token(adapter, data) {
15
+ try {
16
+ const { token } = data;
17
+ // Create CRUD service for hazo_refresh_tokens table
18
+ const tokens_service = createCrudService(adapter, "hazo_refresh_tokens");
19
+ // Find all email verification tokens
20
+ // If token_type column doesn't exist, query all tokens and filter manually
21
+ let all_tokens = [];
22
+ try {
23
+ all_tokens = (await tokens_service.findBy({
24
+ token_type: "email_verification",
25
+ }));
26
+ }
27
+ catch (error) {
28
+ // If token_type column doesn't exist, get all tokens and we'll verify each one
29
+ const logger = create_app_logger();
30
+ const error_message = error instanceof Error ? error.message : "Unknown error";
31
+ logger.warn("email_verification_service_token_type_column_missing", {
32
+ filename: "email_verification_service.ts",
33
+ line_number: 0,
34
+ error: error_message,
35
+ note: "token_type column may not exist, querying all tokens",
36
+ });
37
+ try {
38
+ // Query all tokens (will need to verify each one)
39
+ all_tokens = (await tokens_service.findBy({}));
40
+ }
41
+ catch (fallbackError) {
42
+ const fallback_error_message = fallbackError instanceof Error ? fallbackError.message : "Unknown error";
43
+ logger.error("email_verification_service_query_tokens_failed", {
44
+ filename: "email_verification_service.ts",
45
+ line_number: 0,
46
+ error: fallback_error_message,
47
+ });
48
+ return {
49
+ success: false,
50
+ error: "Invalid or expired verification token",
51
+ };
52
+ }
53
+ }
54
+ if (!Array.isArray(all_tokens) || all_tokens.length === 0) {
55
+ return {
56
+ success: false,
57
+ error: "Invalid or expired verification token",
58
+ };
59
+ }
60
+ // Find the matching token by verifying the hash
61
+ let matching_token = null;
62
+ let user_id = null;
63
+ for (const stored_token of all_tokens) {
64
+ try {
65
+ const token_hash = stored_token.token_hash;
66
+ const is_valid = await argon2.verify(token_hash, token);
67
+ if (is_valid) {
68
+ matching_token = stored_token;
69
+ user_id = stored_token.user_id;
70
+ break;
71
+ }
72
+ }
73
+ catch (_a) {
74
+ // Continue to next token if verification fails
75
+ continue;
76
+ }
77
+ }
78
+ if (!matching_token || !user_id) {
79
+ return {
80
+ success: false,
81
+ error: "Invalid or expired verification token",
82
+ };
83
+ }
84
+ // Check if token has expired
85
+ const expires_at = new Date(matching_token.expires_at);
86
+ const now = new Date();
87
+ if (expires_at < now) {
88
+ // Delete expired token
89
+ await tokens_service.deleteById(matching_token.id);
90
+ return {
91
+ success: false,
92
+ error: "Verification token has expired",
93
+ };
94
+ }
95
+ // Get user email before updating
96
+ const users_service = createCrudService(adapter, "hazo_users");
97
+ const users = await users_service.findBy({
98
+ id: user_id,
99
+ });
100
+ if (!Array.isArray(users) || users.length === 0) {
101
+ return {
102
+ success: false,
103
+ error: "User not found",
104
+ };
105
+ }
106
+ const user = users[0];
107
+ const email = user.email_address;
108
+ // Update user's email_verified status
109
+ const now_iso = new Date().toISOString();
110
+ await users_service.updateById(user_id, {
111
+ email_verified: true,
112
+ changed_at: now_iso,
113
+ });
114
+ // Delete the used token
115
+ await tokens_service.deleteById(matching_token.id);
116
+ return {
117
+ success: true,
118
+ user_id,
119
+ email,
120
+ };
121
+ }
122
+ catch (error) {
123
+ const error_message = error instanceof Error ? error.message : "Unknown error";
124
+ return {
125
+ success: false,
126
+ error: error_message,
127
+ };
128
+ }
129
+ }
130
+ /**
131
+ * Resends an email verification token for a user
132
+ * Creates a new email verification token and stores it in hazo_refresh_tokens
133
+ * Invalidates any existing email verification tokens for the user before creating a new one
134
+ * @param adapter - The hazo_connect adapter instance
135
+ * @param data - Resend verification data (email)
136
+ * @returns Resend verification result with success status or error
137
+ */
138
+ export async function resend_verification_email(adapter, data) {
139
+ try {
140
+ const { email } = data;
141
+ // Create CRUD service for hazo_users table
142
+ const users_service = createCrudService(adapter, "hazo_users");
143
+ // Find user by email
144
+ const users = await users_service.findBy({
145
+ email_address: email,
146
+ });
147
+ // If user not found, return success anyway (to prevent email enumeration)
148
+ if (!Array.isArray(users) || users.length === 0) {
149
+ return {
150
+ success: true,
151
+ };
152
+ }
153
+ const user = users[0];
154
+ const user_id = user.id;
155
+ // Check if email is already verified
156
+ if (user.email_verified === true) {
157
+ return {
158
+ success: true,
159
+ };
160
+ }
161
+ // Create email verification token using shared token service
162
+ const token_result = await create_token({
163
+ adapter,
164
+ user_id,
165
+ token_type: "email_verification",
166
+ });
167
+ if (!token_result.success) {
168
+ return {
169
+ success: false,
170
+ error: token_result.error || "Failed to create email verification token",
171
+ };
172
+ }
173
+ // Send verification email if token was created successfully
174
+ if (token_result.raw_token) {
175
+ const email_result = await send_template_email("email_verification", email, {
176
+ token: token_result.raw_token,
177
+ user_email: email,
178
+ user_name: user.name,
179
+ });
180
+ if (!email_result.success) {
181
+ const logger = create_app_logger();
182
+ logger.error("email_verification_service_email_send_failed", {
183
+ filename: "email_verification_service.ts",
184
+ line_number: 0,
185
+ user_id,
186
+ email,
187
+ error: email_result.error,
188
+ note: "Verification token created but email failed to send",
189
+ });
190
+ // Return error if email sending failed (this is a technical error, not a security issue)
191
+ return {
192
+ success: false,
193
+ error: email_result.error || "Failed to send verification email",
194
+ };
195
+ }
196
+ }
197
+ return {
198
+ success: true,
199
+ };
200
+ }
201
+ catch (error) {
202
+ const error_message = error instanceof Error ? error.message : "Unknown error";
203
+ return {
204
+ success: false,
205
+ error: error_message,
206
+ };
207
+ }
208
+ }
@@ -0,0 +1,13 @@
1
+ export * from "./email_service";
2
+ export * from "./email_verification_service";
3
+ export * from "./login_service";
4
+ export * from "./password_change_service";
5
+ export * from "./password_reset_service";
6
+ export * from "./profile_picture_remove_service";
7
+ export * from "./profile_picture_service";
8
+ export * from "./profile_picture_source_mapper";
9
+ export * from "./registration_service";
10
+ export * from "./token_service";
11
+ export * from "./user_profiles_service";
12
+ export * from "./user_update_service";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/services/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC;AAChC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,14 @@
1
+ // file_description: barrel export for all services
2
+ // section: service_exports
3
+ export * from "./email_service";
4
+ export * from "./email_verification_service";
5
+ export * from "./login_service";
6
+ export * from "./password_change_service";
7
+ export * from "./password_reset_service";
8
+ export * from "./profile_picture_remove_service";
9
+ export * from "./profile_picture_service";
10
+ export * from "./profile_picture_source_mapper";
11
+ export * from "./registration_service";
12
+ export * from "./token_service";
13
+ export * from "./user_profiles_service";
14
+ export * from "./user_update_service";
@@ -0,0 +1,20 @@
1
+ import type { HazoConnectAdapter } from "hazo_connect";
2
+ export type LoginData = {
3
+ email: string;
4
+ password: string;
5
+ };
6
+ export type LoginResult = {
7
+ success: boolean;
8
+ user_id?: string;
9
+ error?: string;
10
+ email_not_verified?: boolean;
11
+ stored_url_on_logon?: string | null;
12
+ };
13
+ /**
14
+ * Authenticates a user by verifying email and password against hazo_users table
15
+ * @param adapter - The hazo_connect adapter instance
16
+ * @param data - Login data (email, password)
17
+ * @returns Login result with success status and user_id or error
18
+ */
19
+ export declare function authenticate_user(adapter: HazoConnectAdapter, data: LoginData): Promise<LoginResult>;
20
+ //# sourceMappingURL=login_service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login_service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/login_service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAQvD,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAGF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,WAAW,CAAC,CAmGtB"}
@@ -0,0 +1,94 @@
1
+ import { createCrudService } from "hazo_connect/server";
2
+ import argon2 from "argon2";
3
+ import { create_app_logger } from "hazo_auth/lib/app_logger";
4
+ import { sanitize_error_for_user } from "hazo_auth/lib/utils/error_sanitizer";
5
+ import { get_line_number } from "hazo_auth/lib/utils/api_route_helpers";
6
+ // section: helpers
7
+ /**
8
+ * Authenticates a user by verifying email and password against hazo_users table
9
+ * @param adapter - The hazo_connect adapter instance
10
+ * @param data - Login data (email, password)
11
+ * @returns Login result with success status and user_id or error
12
+ */
13
+ export async function authenticate_user(adapter, data) {
14
+ try {
15
+ const { email, password } = data;
16
+ // Create CRUD service for hazo_users table
17
+ const users_service = createCrudService(adapter, "hazo_users");
18
+ // Find user by email
19
+ const users = await users_service.findBy({
20
+ email_address: email,
21
+ });
22
+ // Check if user exists
23
+ if (!Array.isArray(users) || users.length === 0) {
24
+ return {
25
+ success: false,
26
+ error: "Invalid email or password",
27
+ };
28
+ }
29
+ const user = users[0];
30
+ // Check if user is active
31
+ if (user.is_active === false) {
32
+ return {
33
+ success: false,
34
+ error: "Account is inactive. Please contact support.",
35
+ };
36
+ }
37
+ // Verify password using argon2
38
+ const password_hash = user.password_hash;
39
+ const is_password_valid = await argon2.verify(password_hash, password);
40
+ if (!is_password_valid) {
41
+ // Increment login attempts on failed password
42
+ const current_attempts = user.login_attempts || 0;
43
+ const now = new Date().toISOString();
44
+ await users_service.updateById(user.id, {
45
+ login_attempts: current_attempts + 1,
46
+ changed_at: now,
47
+ });
48
+ return {
49
+ success: false,
50
+ error: "Invalid email or password",
51
+ };
52
+ }
53
+ // Check if email is verified
54
+ const email_verified = user.email_verified;
55
+ if (!email_verified) {
56
+ return {
57
+ success: false,
58
+ error: "Email address not verified. Please verify your email before logging in.",
59
+ email_not_verified: true,
60
+ };
61
+ }
62
+ // Password is valid and email is verified - update last_logon and reset login_attempts
63
+ const now = new Date().toISOString();
64
+ await users_service.updateById(user.id, {
65
+ last_logon: now,
66
+ login_attempts: 0,
67
+ changed_at: now,
68
+ url_on_logon: null, // Clear the stored redirect URL after successful login
69
+ });
70
+ return {
71
+ success: true,
72
+ user_id: user.id,
73
+ stored_url_on_logon: user.url_on_logon,
74
+ };
75
+ }
76
+ catch (error) {
77
+ const logger = create_app_logger();
78
+ const user_friendly_error = sanitize_error_for_user(error, {
79
+ logToConsole: true,
80
+ logToLogger: true,
81
+ logger,
82
+ context: {
83
+ filename: "login_service.ts",
84
+ line_number: get_line_number(),
85
+ email: data.email,
86
+ operation: "authenticate_user",
87
+ },
88
+ });
89
+ return {
90
+ success: false,
91
+ error: user_friendly_error,
92
+ };
93
+ }
94
+ }
@@ -0,0 +1,19 @@
1
+ import type { HazoConnectAdapter } from "hazo_connect";
2
+ export type PasswordChangeData = {
3
+ current_password: string;
4
+ new_password: string;
5
+ };
6
+ export type PasswordChangeResult = {
7
+ success: boolean;
8
+ error?: string;
9
+ };
10
+ /**
11
+ * Changes a user's password
12
+ * Verifies the current password, validates the new password, and updates the password hash
13
+ * @param adapter - The hazo_connect adapter instance
14
+ * @param user_id - The user ID to update
15
+ * @param data - Password change data (current_password, new_password)
16
+ * @returns Password change result with success status or error
17
+ */
18
+ export declare function change_password(adapter: HazoConnectAdapter, user_id: string, data: PasswordChangeData): Promise<PasswordChangeResult>;
19
+ //# sourceMappingURL=password_change_service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password_change_service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/password_change_service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAQvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAuH/B"}
@@ -0,0 +1,118 @@
1
+ import { createCrudService } from "hazo_connect/server";
2
+ import argon2 from "argon2";
3
+ import { get_password_requirements_config } from "hazo_auth/lib/password_requirements_config.server";
4
+ import { send_template_email } from "hazo_auth/lib/services/email_service";
5
+ import { create_app_logger } from "hazo_auth/lib/app_logger";
6
+ // section: helpers
7
+ /**
8
+ * Changes a user's password
9
+ * Verifies the current password, validates the new password, and updates the password hash
10
+ * @param adapter - The hazo_connect adapter instance
11
+ * @param user_id - The user ID to update
12
+ * @param data - Password change data (current_password, new_password)
13
+ * @returns Password change result with success status or error
14
+ */
15
+ export async function change_password(adapter, user_id, data) {
16
+ try {
17
+ const { current_password, new_password } = data;
18
+ // Create CRUD service for hazo_users table
19
+ const users_service = createCrudService(adapter, "hazo_users");
20
+ // Get current user data
21
+ const users = await users_service.findBy({
22
+ id: user_id,
23
+ });
24
+ if (!Array.isArray(users) || users.length === 0) {
25
+ return {
26
+ success: false,
27
+ error: "User not found",
28
+ };
29
+ }
30
+ const user = users[0];
31
+ const password_hash = user.password_hash;
32
+ const email = user.email_address;
33
+ const user_name = user.name;
34
+ // Verify current password
35
+ try {
36
+ const is_valid = await argon2.verify(password_hash, current_password);
37
+ if (!is_valid) {
38
+ return {
39
+ success: false,
40
+ error: "Current password is incorrect",
41
+ };
42
+ }
43
+ }
44
+ catch (error) {
45
+ return {
46
+ success: false,
47
+ error: "Failed to verify current password",
48
+ };
49
+ }
50
+ // Get password requirements from config
51
+ const password_requirements = get_password_requirements_config();
52
+ // Validate new password
53
+ if (!new_password || new_password.length < password_requirements.minimum_length) {
54
+ return {
55
+ success: false,
56
+ error: `Password must be at least ${password_requirements.minimum_length} characters long`,
57
+ };
58
+ }
59
+ if (password_requirements.require_uppercase && !/[A-Z]/.test(new_password)) {
60
+ return {
61
+ success: false,
62
+ error: "Password must contain at least one uppercase letter",
63
+ };
64
+ }
65
+ if (password_requirements.require_lowercase && !/[a-z]/.test(new_password)) {
66
+ return {
67
+ success: false,
68
+ error: "Password must contain at least one lowercase letter",
69
+ };
70
+ }
71
+ if (password_requirements.require_number && !/[0-9]/.test(new_password)) {
72
+ return {
73
+ success: false,
74
+ error: "Password must contain at least one number",
75
+ };
76
+ }
77
+ if (password_requirements.require_special && !/[^A-Za-z0-9]/.test(new_password)) {
78
+ return {
79
+ success: false,
80
+ error: "Password must contain at least one special character",
81
+ };
82
+ }
83
+ // Hash the new password
84
+ const new_password_hash = await argon2.hash(new_password);
85
+ // Update password hash in database
86
+ const now = new Date().toISOString();
87
+ await users_service.updateById(user_id, {
88
+ password_hash: new_password_hash,
89
+ changed_at: now,
90
+ });
91
+ // Send password changed notification email
92
+ const email_result = await send_template_email("password_changed", email, {
93
+ user_email: email,
94
+ user_name: user_name,
95
+ });
96
+ if (!email_result.success) {
97
+ const logger = create_app_logger();
98
+ logger.error("password_change_service_email_failed", {
99
+ filename: "password_change_service.ts",
100
+ line_number: 0,
101
+ user_id,
102
+ email,
103
+ error: email_result.error,
104
+ note: "Password was changed successfully but notification email failed to send",
105
+ });
106
+ }
107
+ return {
108
+ success: true,
109
+ };
110
+ }
111
+ catch (error) {
112
+ const error_message = error instanceof Error ? error.message : "Unknown error";
113
+ return {
114
+ success: false,
115
+ error: error_message,
116
+ };
117
+ }
118
+ }
@@ -0,0 +1,52 @@
1
+ import type { HazoConnectAdapter } from "hazo_connect";
2
+ export type PasswordResetRequestData = {
3
+ email: string;
4
+ };
5
+ export type PasswordResetRequestResult = {
6
+ success: boolean;
7
+ error?: string;
8
+ };
9
+ export type PasswordResetData = {
10
+ token: string;
11
+ new_password: string;
12
+ minimum_length?: number;
13
+ };
14
+ export type PasswordResetResult = {
15
+ success: boolean;
16
+ user_id?: string;
17
+ email?: string;
18
+ error?: string;
19
+ };
20
+ export type PasswordResetTokenValidationData = {
21
+ token: string;
22
+ };
23
+ export type PasswordResetTokenValidationResult = {
24
+ success: boolean;
25
+ error?: string;
26
+ };
27
+ /**
28
+ * Requests a password reset for a user by email
29
+ * Generates a secure token, hashes it, and stores it in hazo_refresh_tokens with token_type = 'password_reset'
30
+ * Invalidates any existing password reset tokens for the user before creating a new one
31
+ * @param adapter - The hazo_connect adapter instance
32
+ * @param data - Password reset request data (email)
33
+ * @returns Password reset request result with success status or error
34
+ */
35
+ export declare function request_password_reset(adapter: HazoConnectAdapter, data: PasswordResetRequestData): Promise<PasswordResetRequestResult>;
36
+ /**
37
+ * Validates a password reset token without resetting the password
38
+ * Verifies the token exists and checks if it has expired
39
+ * @param adapter - The hazo_connect adapter instance
40
+ * @param data - Token validation data (token)
41
+ * @returns Token validation result with success status or error
42
+ */
43
+ export declare function validate_password_reset_token(adapter: HazoConnectAdapter, data: PasswordResetTokenValidationData): Promise<PasswordResetTokenValidationResult>;
44
+ /**
45
+ * Resets a user's password using a password reset token
46
+ * Verifies the token, checks expiration, updates password, and deletes the token
47
+ * @param adapter - The hazo_connect adapter instance
48
+ * @param data - Password reset data (token, new_password)
49
+ * @returns Password reset result with success status, user_id, email, or error
50
+ */
51
+ export declare function reset_password(adapter: HazoConnectAdapter, data: PasswordResetData): Promise<PasswordResetResult>;
52
+ //# sourceMappingURL=password_reset_service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password_reset_service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/password_reset_service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAQvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAqErC;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,gCAAgC,GACrC,OAAO,CAAC,kCAAkC,CAAC,CAgG7C;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAiK9B"}