hazo_auth 1.3.0 → 1.4.1
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.
- package/README.md +398 -773
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +5 -0
- package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts +23 -0
- package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts.map +1 -0
- package/dist/components/layouts/email_verification/config/email_verification_field_config.js +44 -0
- package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts +31 -0
- package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -0
- package/dist/components/layouts/email_verification/hooks/use_email_verification.js +222 -0
- package/dist/components/layouts/email_verification/index.d.ts +23 -0
- package/dist/components/layouts/email_verification/index.d.ts.map +1 -0
- package/dist/components/layouts/email_verification/index.js +61 -0
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts +10 -0
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts.map +1 -0
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.js +33 -0
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +22 -0
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -0
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +127 -0
- package/dist/components/layouts/forgot_password/index.d.ts +18 -0
- package/dist/components/layouts/forgot_password/index.d.ts.map +1 -0
- package/dist/components/layouts/forgot_password/index.js +43 -0
- package/dist/components/layouts/index.d.ts +16 -0
- package/dist/components/layouts/index.d.ts.map +1 -0
- package/dist/components/layouts/index.js +11 -0
- package/dist/components/layouts/login/config/login_field_config.d.ts +11 -0
- package/dist/components/layouts/login/config/login_field_config.d.ts.map +1 -0
- package/dist/components/layouts/login/config/login_field_config.js +42 -0
- package/dist/components/layouts/login/hooks/use_login_form.d.ts +34 -0
- package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -0
- package/dist/components/layouts/login/hooks/use_login_form.js +196 -0
- package/dist/components/layouts/login/index.d.ts +31 -0
- package/dist/components/layouts/login/index.d.ts.map +1 -0
- package/dist/components/layouts/login/index.js +58 -0
- package/dist/components/layouts/my_settings/components/editable_field.d.ts +19 -0
- package/dist/components/layouts/my_settings/components/editable_field.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/editable_field.js +73 -0
- package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts +28 -0
- package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/password_change_dialog.js +138 -0
- package/dist/components/layouts/my_settings/components/profile_picture_dialog.d.ts +42 -0
- package/dist/components/layouts/my_settings/components/profile_picture_dialog.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +198 -0
- package/dist/components/layouts/my_settings/components/profile_picture_display.d.ts +16 -0
- package/dist/components/layouts/my_settings/components/profile_picture_display.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/profile_picture_display.js +33 -0
- package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.d.ts +17 -0
- package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.js +48 -0
- package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts +21 -0
- package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +144 -0
- package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.d.ts +23 -0
- package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.js +169 -0
- package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts +19 -0
- package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/config/my_settings_field_config.js +26 -0
- package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +46 -0
- package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/hooks/use_my_settings.js +354 -0
- package/dist/components/layouts/my_settings/index.d.ts +64 -0
- package/dist/components/layouts/my_settings/index.d.ts.map +1 -0
- package/dist/components/layouts/my_settings/index.js +65 -0
- package/dist/components/layouts/register/config/register_field_config.d.ts +14 -0
- package/dist/components/layouts/register/config/register_field_config.d.ts.map +1 -0
- package/dist/components/layouts/register/config/register_field_config.js +69 -0
- package/dist/components/layouts/register/hooks/use_register_form.d.ts +30 -0
- package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -0
- package/dist/components/layouts/register/hooks/use_register_form.js +184 -0
- package/dist/components/layouts/register/index.d.ts +23 -0
- package/dist/components/layouts/register/index.d.ts.map +1 -0
- package/dist/components/layouts/register/index.js +58 -0
- package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts +13 -0
- package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts.map +1 -0
- package/dist/components/layouts/reset_password/config/reset_password_field_config.js +53 -0
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts +28 -0
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -0
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +201 -0
- package/dist/components/layouts/reset_password/index.d.ts +23 -0
- package/dist/components/layouts/reset_password/index.d.ts.map +1 -0
- package/dist/components/layouts/reset_password/index.js +53 -0
- package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts +20 -0
- package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/already_logged_in_guard.js +32 -0
- package/dist/components/layouts/shared/components/auth_page_shell.d.ts +7 -0
- package/dist/components/layouts/shared/components/auth_page_shell.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/auth_page_shell.js +12 -0
- package/dist/components/layouts/shared/components/field_error_message.d.ts +7 -0
- package/dist/components/layouts/shared/components/field_error_message.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/field_error_message.js +6 -0
- package/dist/components/layouts/shared/components/form_action_buttons.d.ts +14 -0
- package/dist/components/layouts/shared/components/form_action_buttons.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/form_action_buttons.js +15 -0
- package/dist/components/layouts/shared/components/form_field_wrapper.d.ts +11 -0
- package/dist/components/layouts/shared/components/form_field_wrapper.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/form_field_wrapper.js +9 -0
- package/dist/components/layouts/shared/components/form_header.d.ts +10 -0
- package/dist/components/layouts/shared/components/form_header.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/form_header.js +5 -0
- package/dist/components/layouts/shared/components/logout_button.d.ts +7 -0
- package/dist/components/layouts/shared/components/logout_button.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/logout_button.js +44 -0
- package/dist/components/layouts/shared/components/password_field.d.ts +13 -0
- package/dist/components/layouts/shared/components/password_field.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/password_field.js +13 -0
- package/dist/components/layouts/shared/components/profile_pic_menu.d.ts +22 -0
- package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/profile_pic_menu.js +169 -0
- package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.d.ts +12 -0
- package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.js +16 -0
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts +6 -0
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +15 -0
- package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts +11 -0
- package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +10 -0
- package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts +12 -0
- package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/two_column_auth_layout.js +8 -0
- package/dist/components/layouts/shared/components/unauthorized_guard.d.ts +14 -0
- package/dist/components/layouts/shared/components/unauthorized_guard.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/unauthorized_guard.js +30 -0
- package/dist/components/layouts/shared/components/visual_panel.d.ts +9 -0
- package/dist/components/layouts/shared/components/visual_panel.d.ts.map +1 -0
- package/dist/components/layouts/shared/components/visual_panel.js +10 -0
- package/dist/components/layouts/shared/config/layout_customization.d.ts +38 -0
- package/dist/components/layouts/shared/config/layout_customization.d.ts.map +1 -0
- package/dist/components/layouts/shared/config/layout_customization.js +19 -0
- package/dist/components/layouts/shared/data/layout_data_client.d.ts +6 -0
- package/dist/components/layouts/shared/data/layout_data_client.d.ts.map +1 -0
- package/dist/components/layouts/shared/data/layout_data_client.js +9 -0
- package/dist/components/layouts/shared/hooks/use_auth_status.d.ts +20 -0
- package/dist/components/layouts/shared/hooks/use_auth_status.d.ts.map +1 -0
- package/dist/components/layouts/shared/hooks/use_auth_status.js +71 -0
- package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts +48 -0
- package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -0
- package/dist/components/layouts/shared/hooks/use_hazo_auth.js +90 -0
- package/dist/components/layouts/shared/index.d.ts +24 -0
- package/dist/components/layouts/shared/index.d.ts.map +1 -0
- package/dist/components/layouts/shared/index.js +27 -0
- package/dist/components/layouts/shared/utils/ip_address.d.ts +7 -0
- package/dist/components/layouts/shared/utils/ip_address.d.ts.map +1 -0
- package/dist/components/layouts/shared/utils/ip_address.js +34 -0
- package/dist/components/layouts/shared/utils/validation.d.ts +15 -0
- package/dist/components/layouts/shared/utils/validation.d.ts.map +1 -0
- package/dist/components/layouts/shared/utils/validation.js +45 -0
- package/dist/components/layouts/user_management/components/roles_matrix.d.ts +29 -0
- package/dist/components/layouts/user_management/components/roles_matrix.d.ts.map +1 -0
- package/dist/components/layouts/user_management/components/roles_matrix.js +287 -0
- package/dist/components/layouts/user_management/index.d.ts +13 -0
- package/dist/components/layouts/user_management/index.d.ts.map +1 -0
- package/dist/components/layouts/user_management/index.js +495 -0
- package/dist/components/ui/alert-dialog.d.ts +21 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.js +62 -0
- package/dist/components/ui/avatar.d.ts +7 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +32 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +45 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +23 -0
- package/dist/components/ui/dialog.d.ts +20 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +52 -0
- package/dist/components/ui/dropdown-menu.d.ts +28 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +72 -0
- package/dist/components/ui/hazo_ui_tooltip.d.ts +26 -0
- package/dist/components/ui/hazo_ui_tooltip.d.ts.map +1 -0
- package/dist/components/ui/hazo_ui_tooltip.js +17 -0
- package/dist/components/ui/index.d.ts +20 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +21 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +20 -0
- package/dist/components/ui/label.d.ts +6 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +24 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +22 -0
- package/dist/components/ui/sheet.d.ts +23 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +66 -0
- package/dist/components/ui/sidebar.d.ts +66 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +267 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +18 -0
- package/dist/components/ui/sonner.d.ts +5 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/sonner.js +28 -0
- package/dist/components/ui/switch.d.ts +5 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +22 -0
- package/dist/components/ui/table.d.ts +11 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +55 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +33 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +25 -0
- package/dist/components/ui/vertical-tabs.d.ts +8 -0
- package/dist/components/ui/vertical-tabs.d.ts.map +1 -0
- package/dist/components/ui/vertical-tabs.js +37 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/lib/already_logged_in_config.server.d.ts +14 -0
- package/dist/lib/already_logged_in_config.server.d.ts.map +1 -0
- package/dist/lib/already_logged_in_config.server.js +29 -0
- package/dist/lib/app_logger.d.ts +12 -0
- package/dist/lib/app_logger.d.ts.map +1 -0
- package/dist/lib/app_logger.js +14 -0
- package/dist/lib/auth/auth_cache.d.ts +83 -0
- package/dist/lib/auth/auth_cache.d.ts.map +1 -0
- package/dist/lib/auth/auth_cache.js +158 -0
- package/dist/lib/auth/auth_rate_limiter.d.ts +39 -0
- package/dist/lib/auth/auth_rate_limiter.d.ts.map +1 -0
- package/dist/lib/auth/auth_rate_limiter.js +95 -0
- package/dist/lib/auth/auth_types.d.ts +53 -0
- package/dist/lib/auth/auth_types.d.ts.map +1 -0
- package/dist/lib/auth/auth_types.js +16 -0
- package/dist/lib/auth/auth_utils.server.d.ts +47 -0
- package/dist/lib/auth/auth_utils.server.d.ts.map +1 -0
- package/dist/lib/auth/auth_utils.server.js +150 -0
- package/dist/lib/auth/hazo_get_auth.server.d.ts +12 -0
- package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -0
- package/dist/lib/auth/hazo_get_auth.server.js +256 -0
- package/dist/lib/auth/index.d.ts +9 -0
- package/dist/lib/auth/index.d.ts.map +1 -0
- package/dist/lib/auth/index.js +12 -0
- package/dist/lib/auth/server_auth.d.ts +26 -0
- package/dist/lib/auth/server_auth.d.ts.map +1 -0
- package/dist/lib/auth/server_auth.js +62 -0
- package/dist/lib/auth_utility_config.server.d.ts +20 -0
- package/dist/lib/auth_utility_config.server.d.ts.map +1 -0
- package/dist/lib/auth_utility_config.server.js +64 -0
- package/dist/lib/config/config_loader.server.d.ts +44 -0
- package/dist/lib/config/config_loader.server.d.ts.map +1 -0
- package/dist/lib/config/config_loader.server.js +122 -0
- package/dist/lib/email_verification_config.server.d.ts +14 -0
- package/dist/lib/email_verification_config.server.d.ts.map +1 -0
- package/dist/lib/email_verification_config.server.js +20 -0
- package/dist/lib/file_types_config.server.d.ts +11 -0
- package/dist/lib/file_types_config.server.d.ts.map +1 -0
- package/dist/lib/file_types_config.server.js +16 -0
- package/dist/lib/forgot_password_config.server.d.ts +14 -0
- package/dist/lib/forgot_password_config.server.d.ts.map +1 -0
- package/dist/lib/forgot_password_config.server.js +20 -0
- package/dist/lib/hazo_connect_instance.server.d.ts +17 -0
- package/dist/lib/hazo_connect_instance.server.d.ts.map +1 -0
- package/dist/lib/hazo_connect_instance.server.js +88 -0
- package/dist/lib/hazo_connect_setup.d.ts +2 -0
- package/dist/lib/hazo_connect_setup.d.ts.map +1 -0
- package/dist/lib/hazo_connect_setup.js +49 -0
- package/dist/lib/hazo_connect_setup.server.d.ts +20 -0
- package/dist/lib/hazo_connect_setup.server.d.ts.map +1 -0
- package/dist/lib/hazo_connect_setup.server.js +138 -0
- package/dist/lib/index.d.ts +28 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +35 -0
- package/dist/lib/login_config.server.d.ts +20 -0
- package/dist/lib/login_config.server.d.ts.map +1 -0
- package/dist/lib/login_config.server.js +37 -0
- package/dist/lib/messages_config.server.d.ts +13 -0
- package/dist/lib/messages_config.server.d.ts.map +1 -0
- package/dist/lib/messages_config.server.js +18 -0
- package/dist/lib/migrations/apply_migration.d.ts +22 -0
- package/dist/lib/migrations/apply_migration.d.ts.map +1 -0
- package/dist/lib/migrations/apply_migration.js +78 -0
- package/dist/lib/my_settings_config.server.d.ts +65 -0
- package/dist/lib/my_settings_config.server.d.ts.map +1 -0
- package/dist/lib/my_settings_config.server.js +67 -0
- package/dist/lib/password_requirements_config.server.d.ts +15 -0
- package/dist/lib/password_requirements_config.server.d.ts.map +1 -0
- package/dist/lib/password_requirements_config.server.js +26 -0
- package/dist/lib/profile_pic_menu_config.server.d.ts +26 -0
- package/dist/lib/profile_pic_menu_config.server.d.ts.map +1 -0
- package/dist/lib/profile_pic_menu_config.server.js +95 -0
- package/dist/lib/profile_picture_config.server.d.ts +16 -0
- package/dist/lib/profile_picture_config.server.d.ts.map +1 -0
- package/dist/lib/profile_picture_config.server.js +40 -0
- package/dist/lib/register_config.server.d.ts +24 -0
- package/dist/lib/register_config.server.d.ts.map +1 -0
- package/dist/lib/register_config.server.js +39 -0
- package/dist/lib/reset_password_config.server.d.ts +25 -0
- package/dist/lib/reset_password_config.server.d.ts.map +1 -0
- package/dist/lib/reset_password_config.server.js +38 -0
- package/dist/lib/services/email_service.d.ts +44 -0
- package/dist/lib/services/email_service.d.ts.map +1 -0
- package/dist/lib/services/email_service.js +480 -0
- package/dist/lib/services/email_verification_service.d.ts +35 -0
- package/dist/lib/services/email_verification_service.d.ts.map +1 -0
- package/dist/lib/services/email_verification_service.js +208 -0
- package/dist/lib/services/index.d.ts +13 -0
- package/dist/lib/services/index.d.ts.map +1 -0
- package/dist/lib/services/index.js +14 -0
- package/dist/lib/services/login_service.d.ts +20 -0
- package/dist/lib/services/login_service.d.ts.map +1 -0
- package/dist/lib/services/login_service.js +94 -0
- package/dist/lib/services/password_change_service.d.ts +19 -0
- package/dist/lib/services/password_change_service.d.ts.map +1 -0
- package/dist/lib/services/password_change_service.js +118 -0
- package/dist/lib/services/password_reset_service.d.ts +52 -0
- package/dist/lib/services/password_reset_service.d.ts.map +1 -0
- package/dist/lib/services/password_reset_service.js +318 -0
- package/dist/lib/services/profile_picture_remove_service.d.ts +15 -0
- package/dist/lib/services/profile_picture_remove_service.d.ts.map +1 -0
- package/dist/lib/services/profile_picture_remove_service.js +94 -0
- package/dist/lib/services/profile_picture_service.d.ts +45 -0
- package/dist/lib/services/profile_picture_service.d.ts.map +1 -0
- package/dist/lib/services/profile_picture_service.js +183 -0
- package/dist/lib/services/profile_picture_source_mapper.d.ts +23 -0
- package/dist/lib/services/profile_picture_source_mapper.d.ts.map +1 -0
- package/dist/lib/services/profile_picture_source_mapper.js +45 -0
- package/dist/lib/services/registration_service.d.ts +20 -0
- package/dist/lib/services/registration_service.d.ts.map +1 -0
- package/dist/lib/services/registration_service.js +147 -0
- package/dist/lib/services/token_service.d.ts +20 -0
- package/dist/lib/services/token_service.d.ts.map +1 -0
- package/dist/lib/services/token_service.js +201 -0
- package/dist/lib/services/user_profiles_service.d.ts +31 -0
- package/dist/lib/services/user_profiles_service.d.ts.map +1 -0
- package/dist/lib/services/user_profiles_service.js +99 -0
- package/dist/lib/services/user_update_service.d.ts +23 -0
- package/dist/lib/services/user_update_service.d.ts.map +1 -0
- package/dist/lib/services/user_update_service.js +103 -0
- package/dist/lib/ui_shell_config.server.d.ts +16 -0
- package/dist/lib/ui_shell_config.server.d.ts.map +1 -0
- package/dist/lib/ui_shell_config.server.js +28 -0
- package/dist/lib/ui_sizes_config.server.d.ts +17 -0
- package/dist/lib/ui_sizes_config.server.d.ts.map +1 -0
- package/dist/lib/ui_sizes_config.server.js +22 -0
- package/dist/lib/user_fields_config.server.d.ts +13 -0
- package/dist/lib/user_fields_config.server.d.ts.map +1 -0
- package/dist/lib/user_fields_config.server.js +21 -0
- package/dist/lib/user_management_config.server.d.ts +10 -0
- package/dist/lib/user_management_config.server.d.ts.map +1 -0
- package/dist/lib/user_management_config.server.js +26 -0
- package/dist/lib/utils/api_route_helpers.d.ts +13 -0
- package/dist/lib/utils/api_route_helpers.d.ts.map +1 -0
- package/dist/lib/utils/api_route_helpers.js +58 -0
- package/dist/lib/utils/error_sanitizer.d.ts +16 -0
- package/dist/lib/utils/error_sanitizer.d.ts.map +1 -0
- package/dist/lib/utils/error_sanitizer.js +39 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/server/config/config_loader.d.ts +26 -0
- package/dist/server/config/config_loader.d.ts.map +1 -0
- package/dist/server/config/config_loader.js +329 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +32 -0
- package/dist/server/logging/logger_service.d.ts +3 -0
- package/dist/server/logging/logger_service.d.ts.map +1 -0
- package/dist/server/logging/logger_service.js +37 -0
- package/dist/server/routes/root_router.d.ts +3 -0
- package/dist/server/routes/root_router.d.ts.map +1 -0
- package/dist/server/routes/root_router.js +14 -0
- package/dist/server/server.d.ts +3 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +25 -0
- package/dist/server/types/app_types.d.ts +53 -0
- package/dist/server/types/app_types.d.ts.map +1 -0
- package/dist/server/types/app_types.js +1 -0
- package/migrations/003_add_url_on_logon_to_hazo_users.sql +8 -0
- package/next.config.mjs +12 -0
- package/package.json +150 -1
- package/src/components/index.ts +7 -0
- package/src/components/layouts/email_verification/config/email_verification_field_config.ts +2 -2
- package/src/components/layouts/email_verification/hooks/use_email_verification.ts +3 -3
- package/src/components/layouts/email_verification/index.tsx +11 -11
- package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +2 -2
- package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +3 -3
- package/src/components/layouts/forgot_password/index.tsx +10 -10
- package/src/components/layouts/index.ts +26 -0
- package/src/components/layouts/login/config/login_field_config.ts +2 -2
- package/src/components/layouts/login/hooks/use_login_form.ts +5 -5
- package/src/components/layouts/login/index.tsx +11 -11
- package/src/components/layouts/my_settings/components/editable_field.tsx +3 -3
- package/src/components/layouts/my_settings/components/password_change_dialog.tsx +5 -5
- package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +7 -7
- package/src/components/layouts/my_settings/components/profile_picture_display.tsx +2 -2
- package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +3 -3
- package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +5 -5
- package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +4 -4
- package/src/components/layouts/my_settings/config/my_settings_field_config.ts +2 -2
- package/src/components/layouts/my_settings/hooks/use_my_settings.ts +2 -2
- package/src/components/layouts/my_settings/index.tsx +10 -10
- package/src/components/layouts/register/config/register_field_config.ts +2 -2
- package/src/components/layouts/register/hooks/use_register_form.ts +4 -4
- package/src/components/layouts/register/index.tsx +11 -11
- package/src/components/layouts/reset_password/config/reset_password_field_config.ts +2 -2
- package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +4 -4
- package/src/components/layouts/reset_password/index.tsx +10 -10
- package/src/components/layouts/shared/components/already_logged_in_guard.tsx +4 -4
- package/src/components/layouts/shared/components/auth_page_shell.tsx +3 -3
- package/src/components/layouts/shared/components/form_action_buttons.tsx +2 -2
- package/src/components/layouts/shared/components/form_field_wrapper.tsx +2 -2
- package/src/components/layouts/shared/components/logout_button.tsx +2 -2
- package/src/components/layouts/shared/components/password_field.tsx +3 -3
- package/src/components/layouts/shared/components/profile_pic_menu.tsx +5 -5
- package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +2 -2
- package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +3 -3
- package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +1 -1
- package/src/components/layouts/shared/components/two_column_auth_layout.tsx +1 -1
- package/src/components/layouts/shared/components/unauthorized_guard.tsx +2 -2
- package/src/components/layouts/shared/hooks/use_hazo_auth.ts +1 -1
- package/src/components/layouts/shared/index.ts +34 -0
- package/src/components/layouts/shared/utils/validation.ts +1 -1
- package/src/components/layouts/user_management/components/roles_matrix.tsx +7 -7
- package/src/components/layouts/user_management/index.tsx +11 -11
- package/src/components/ui/alert-dialog.tsx +2 -2
- package/src/components/ui/avatar.tsx +1 -1
- package/src/components/ui/button.tsx +1 -1
- package/src/components/ui/checkbox.tsx +1 -1
- package/src/components/ui/dialog.tsx +1 -1
- package/src/components/ui/dropdown-menu.tsx +1 -1
- package/src/components/ui/hazo_ui_tooltip.tsx +1 -1
- package/src/components/ui/index.ts +22 -0
- package/src/components/ui/input.tsx +1 -1
- package/src/components/ui/label.tsx +1 -1
- package/src/components/ui/separator.tsx +1 -1
- package/src/components/ui/sheet.tsx +1 -1
- package/src/components/ui/sidebar.tsx +8 -8
- package/src/components/ui/skeleton.tsx +1 -1
- package/src/components/ui/switch.tsx +1 -1
- package/src/components/ui/table.tsx +1 -1
- package/src/components/ui/tabs.tsx +1 -1
- package/src/components/ui/tooltip.tsx +1 -1
- package/src/components/ui/vertical-tabs.tsx +1 -1
- package/src/index.ts +7 -0
- package/src/lib/already_logged_in_config.server.ts +1 -1
- package/src/lib/app_logger.ts +1 -1
- package/src/lib/auth/auth_cache.ts +1 -1
- package/src/lib/auth/auth_utils.server.ts +2 -2
- package/src/lib/auth/hazo_get_auth.server.ts +8 -8
- package/src/lib/auth/index.ts +23 -0
- package/src/lib/auth/server_auth.ts +2 -2
- package/src/lib/auth_utility_config.server.ts +1 -1
- package/src/lib/config/config_loader.server.ts +1 -1
- package/src/lib/email_verification_config.server.ts +1 -1
- package/src/lib/file_types_config.server.ts +1 -1
- package/src/lib/forgot_password_config.server.ts +1 -1
- package/src/lib/hazo_connect_instance.server.ts +2 -2
- package/src/lib/hazo_connect_setup.server.ts +2 -2
- package/src/lib/index.ts +44 -0
- package/src/lib/login_config.server.ts +2 -2
- package/src/lib/messages_config.server.ts +1 -1
- package/src/lib/my_settings_config.server.ts +7 -7
- package/src/lib/password_requirements_config.server.ts +1 -1
- package/src/lib/profile_pic_menu_config.server.ts +1 -1
- package/src/lib/profile_picture_config.server.ts +2 -2
- package/src/lib/register_config.server.ts +4 -4
- package/src/lib/reset_password_config.server.ts +3 -3
- package/src/lib/services/email_service.ts +2 -2
- package/src/lib/services/email_verification_service.ts +3 -3
- package/src/lib/services/index.ts +15 -0
- package/src/lib/services/login_service.ts +3 -3
- package/src/lib/services/password_change_service.ts +3 -3
- package/src/lib/services/password_reset_service.ts +3 -3
- package/src/lib/services/profile_picture_remove_service.ts +3 -3
- package/src/lib/services/profile_picture_service.ts +5 -5
- package/src/lib/services/registration_service.ts +8 -8
- package/src/lib/services/token_service.ts +2 -2
- package/src/lib/services/user_profiles_service.ts +2 -2
- package/src/lib/services/user_update_service.ts +4 -4
- package/src/lib/ui_shell_config.server.ts +1 -1
- package/src/lib/ui_sizes_config.server.ts +1 -1
- package/src/lib/user_fields_config.server.ts +1 -1
- package/src/lib/user_management_config.server.ts +1 -2
- package/src/lib/utils/error_sanitizer.ts +1 -1
- package/src/routes/index.ts +34 -0
- package/src/server/config/config_loader.ts +2 -2
- package/src/server/index.ts +2 -2
- package/src/server/logging/logger_service.ts +1 -1
- package/src/server/server.ts +2 -2
- package/src/server/types/express.d.ts +1 -1
- package/tsconfig.build.json +39 -0
- package/tsconfig.json +5 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// file_description: bootstrap configuration handling for the hazo_auth server
|
|
2
|
+
// section: imports
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import axios from "axios";
|
|
6
|
+
import { HazoConfig } from "hazo_config/dist/lib";
|
|
7
|
+
import { create_logger_service } from "hazo_auth/server/logging/logger_service";
|
|
8
|
+
const is_string_record = (value) => !!value &&
|
|
9
|
+
typeof value === "object" &&
|
|
10
|
+
!Array.isArray(value) &&
|
|
11
|
+
Object.values(value).every((entry) => typeof entry === "string");
|
|
12
|
+
const sanitize_configuration_options = (options, logger) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
if (!options || typeof options !== "object") {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const sanitized = {};
|
|
18
|
+
if (typeof options.config_file_path === "string" && options.config_file_path.length > 0) {
|
|
19
|
+
sanitized.config_file_path = options.config_file_path;
|
|
20
|
+
}
|
|
21
|
+
if (options.direct_configuration && typeof options.direct_configuration === "object") {
|
|
22
|
+
const direct_config = {};
|
|
23
|
+
const provided = options.direct_configuration;
|
|
24
|
+
if (Array.isArray(provided.permission_names)) {
|
|
25
|
+
direct_config.permission_names = provided.permission_names.filter((permission) => typeof permission === "string");
|
|
26
|
+
}
|
|
27
|
+
if (is_string_record(provided.templates)) {
|
|
28
|
+
direct_config.templates = provided.templates;
|
|
29
|
+
}
|
|
30
|
+
if (is_string_record(provided.labels)) {
|
|
31
|
+
direct_config.labels = provided.labels;
|
|
32
|
+
}
|
|
33
|
+
if (is_string_record(provided.styles)) {
|
|
34
|
+
direct_config.styles = provided.styles;
|
|
35
|
+
}
|
|
36
|
+
if (provided.emailer &&
|
|
37
|
+
typeof provided.emailer === "object" &&
|
|
38
|
+
typeof provided.emailer.base_url === "string") {
|
|
39
|
+
direct_config.emailer = {
|
|
40
|
+
base_url: provided.emailer.base_url,
|
|
41
|
+
api_key: typeof provided.emailer.api_key === "string" ? provided.emailer.api_key : undefined,
|
|
42
|
+
headers: is_string_record(provided.emailer.headers) ? provided.emailer.headers : undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (provided.logger) {
|
|
46
|
+
direct_config.logger = provided.logger;
|
|
47
|
+
}
|
|
48
|
+
if (provided.password_policy) {
|
|
49
|
+
direct_config.password_policy = {
|
|
50
|
+
min_length: typeof provided.password_policy.min_length === "number"
|
|
51
|
+
? provided.password_policy.min_length
|
|
52
|
+
: undefined,
|
|
53
|
+
requires_lowercase: provided.password_policy.requires_lowercase,
|
|
54
|
+
requires_uppercase: provided.password_policy.requires_uppercase,
|
|
55
|
+
requires_number: provided.password_policy.requires_number,
|
|
56
|
+
requires_symbol: provided.password_policy.requires_symbol,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (provided.token_settings) {
|
|
60
|
+
direct_config.token_settings = {
|
|
61
|
+
access_token_ttl_seconds: provided.token_settings.access_token_ttl_seconds,
|
|
62
|
+
refresh_token_ttl_seconds: provided.token_settings.refresh_token_ttl_seconds,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (provided.rate_limit) {
|
|
66
|
+
direct_config.rate_limit = {
|
|
67
|
+
max_attempts: provided.rate_limit.max_attempts,
|
|
68
|
+
window_minutes: provided.rate_limit.window_minutes,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (provided.captcha) {
|
|
72
|
+
direct_config.captcha = provided.captcha;
|
|
73
|
+
}
|
|
74
|
+
(_b = (_a = direct_config.logger) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.call(_a, "config_direct_override_detected", { fields: Object.keys(direct_config) });
|
|
75
|
+
sanitized.direct_configuration = direct_config;
|
|
76
|
+
}
|
|
77
|
+
return sanitized;
|
|
78
|
+
};
|
|
79
|
+
// section: defaults
|
|
80
|
+
const default_config_path = path.resolve(process.cwd(), "config.ini");
|
|
81
|
+
const default_password_policy = {
|
|
82
|
+
min_length: 12,
|
|
83
|
+
requires_uppercase: true,
|
|
84
|
+
requires_lowercase: true,
|
|
85
|
+
requires_number: true,
|
|
86
|
+
requires_symbol: true,
|
|
87
|
+
};
|
|
88
|
+
const default_token_settings = {
|
|
89
|
+
access_token_ttl_seconds: 15 * 60,
|
|
90
|
+
refresh_token_ttl_seconds: 60 * 60 * 24 * 30,
|
|
91
|
+
};
|
|
92
|
+
const default_rate_limit = {
|
|
93
|
+
max_attempts: 5,
|
|
94
|
+
window_minutes: 5,
|
|
95
|
+
};
|
|
96
|
+
const read_ini_section = (instance, section) => {
|
|
97
|
+
var _a;
|
|
98
|
+
if (instance === undefined) {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
return (_a = instance.getSection(section)) !== null && _a !== void 0 ? _a : {};
|
|
102
|
+
};
|
|
103
|
+
// section: helper_functions
|
|
104
|
+
const resolve_permissions = (direct_permissions, permission_section, logger) => {
|
|
105
|
+
var _a;
|
|
106
|
+
if (direct_permissions && direct_permissions.length > 0) {
|
|
107
|
+
logger.info("config_permissions_direct_override", { count: direct_permissions.length });
|
|
108
|
+
return direct_permissions;
|
|
109
|
+
}
|
|
110
|
+
const configured = (_a = permission_section.list) === null || _a === void 0 ? void 0 : _a.split(",").map((value) => value.trim()).filter((value) => value.length > 0);
|
|
111
|
+
if (configured && configured.length > 0) {
|
|
112
|
+
logger.info("config_permissions_from_file", { count: configured.length });
|
|
113
|
+
return configured;
|
|
114
|
+
}
|
|
115
|
+
logger.warn("config_permissions_default", {});
|
|
116
|
+
return [];
|
|
117
|
+
};
|
|
118
|
+
const resolve_password_policy = (direct_policy, auth_section, logger) => {
|
|
119
|
+
const resolved = Object.assign({}, default_password_policy);
|
|
120
|
+
const apply_value = (key, value) => {
|
|
121
|
+
if (value === undefined) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (key === "min_length") {
|
|
125
|
+
const parsed = Number(value);
|
|
126
|
+
if (!Number.isNaN(parsed)) {
|
|
127
|
+
resolved[key] = parsed;
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
resolved[key] = value === "true";
|
|
132
|
+
};
|
|
133
|
+
apply_value("min_length", auth_section.min_length);
|
|
134
|
+
apply_value("requires_uppercase", auth_section.requires_uppercase);
|
|
135
|
+
apply_value("requires_lowercase", auth_section.requires_lowercase);
|
|
136
|
+
apply_value("requires_number", auth_section.requires_number);
|
|
137
|
+
apply_value("requires_symbol", auth_section.requires_symbol);
|
|
138
|
+
if (direct_policy) {
|
|
139
|
+
Object.assign(resolved, direct_policy);
|
|
140
|
+
logger.info("config_password_policy_direct_override", resolved);
|
|
141
|
+
}
|
|
142
|
+
return resolved;
|
|
143
|
+
};
|
|
144
|
+
const resolve_token_settings = (direct_tokens, auth_section, logger) => {
|
|
145
|
+
const resolved = Object.assign({}, default_token_settings);
|
|
146
|
+
const access_token_value = Number(auth_section.access_token_ttl_seconds);
|
|
147
|
+
if (!Number.isNaN(access_token_value) && access_token_value > 0) {
|
|
148
|
+
resolved.access_token_ttl_seconds = access_token_value;
|
|
149
|
+
}
|
|
150
|
+
const refresh_token_value = Number(auth_section.refresh_token_ttl_seconds);
|
|
151
|
+
if (!Number.isNaN(refresh_token_value) && refresh_token_value > 0) {
|
|
152
|
+
resolved.refresh_token_ttl_seconds = refresh_token_value;
|
|
153
|
+
}
|
|
154
|
+
if (direct_tokens) {
|
|
155
|
+
Object.assign(resolved, direct_tokens);
|
|
156
|
+
logger.info("config_token_settings_direct_override", resolved);
|
|
157
|
+
}
|
|
158
|
+
return resolved;
|
|
159
|
+
};
|
|
160
|
+
const resolve_rate_limit = (direct_rate_limit, rate_section, logger) => {
|
|
161
|
+
const resolved = Object.assign({}, default_rate_limit);
|
|
162
|
+
const max_attempts = Number(rate_section.max_attempts);
|
|
163
|
+
if (!Number.isNaN(max_attempts) && max_attempts > 0) {
|
|
164
|
+
resolved.max_attempts = max_attempts;
|
|
165
|
+
}
|
|
166
|
+
const window_minutes = Number(rate_section.window_minutes);
|
|
167
|
+
if (!Number.isNaN(window_minutes) && window_minutes > 0) {
|
|
168
|
+
resolved.window_minutes = window_minutes;
|
|
169
|
+
}
|
|
170
|
+
if (direct_rate_limit) {
|
|
171
|
+
Object.assign(resolved, direct_rate_limit);
|
|
172
|
+
logger.info("config_rate_limit_direct_override", resolved);
|
|
173
|
+
}
|
|
174
|
+
return resolved;
|
|
175
|
+
};
|
|
176
|
+
const resolve_captcha = (direct_captcha, captcha_section, logger) => {
|
|
177
|
+
if (direct_captcha) {
|
|
178
|
+
logger.info("config_captcha_direct_override", { provider: direct_captcha.provider });
|
|
179
|
+
return direct_captcha;
|
|
180
|
+
}
|
|
181
|
+
if (captcha_section.provider && captcha_section.secret_key) {
|
|
182
|
+
logger.info("config_captcha_from_file", { provider: captcha_section.provider });
|
|
183
|
+
return {
|
|
184
|
+
provider: captcha_section.provider,
|
|
185
|
+
secret_key: captcha_section.secret_key,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
logger.warn("config_captcha_missing", {});
|
|
189
|
+
return undefined;
|
|
190
|
+
};
|
|
191
|
+
const resolve_dictionary = (direct_values, section_values, logger, metric_name) => {
|
|
192
|
+
if (direct_values && Object.keys(direct_values).length > 0) {
|
|
193
|
+
logger.info(`${metric_name}_direct_override`, { keys: Object.keys(direct_values) });
|
|
194
|
+
return direct_values;
|
|
195
|
+
}
|
|
196
|
+
if (Object.keys(section_values).length > 0) {
|
|
197
|
+
logger.info(`${metric_name}_from_file`, { keys: Object.keys(section_values) });
|
|
198
|
+
return section_values;
|
|
199
|
+
}
|
|
200
|
+
logger.warn(`${metric_name}_empty`, {});
|
|
201
|
+
return {};
|
|
202
|
+
};
|
|
203
|
+
const read_template_file = (file_path, logger) => {
|
|
204
|
+
const absolute_path = path.isAbsolute(file_path)
|
|
205
|
+
? file_path
|
|
206
|
+
: path.resolve(process.cwd(), file_path);
|
|
207
|
+
try {
|
|
208
|
+
const content = fs.readFileSync(absolute_path, "utf-8");
|
|
209
|
+
logger.info("config_template_loaded", { file_path: absolute_path });
|
|
210
|
+
return content;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger.error("config_template_load_failed", {
|
|
214
|
+
file_path: absolute_path,
|
|
215
|
+
error: error.message,
|
|
216
|
+
});
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const resolve_templates = (direct_templates, template_section, logger) => {
|
|
221
|
+
const resolved_templates = {};
|
|
222
|
+
Object.entries(template_section).forEach(([template_name, template_path]) => {
|
|
223
|
+
const template_content = read_template_file(template_path, logger);
|
|
224
|
+
if (template_content) {
|
|
225
|
+
resolved_templates[template_name] = template_content;
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
if (direct_templates) {
|
|
229
|
+
Object.entries(direct_templates).forEach(([template_name, template_body]) => {
|
|
230
|
+
resolved_templates[template_name] = template_body;
|
|
231
|
+
});
|
|
232
|
+
logger.info("config_templates_direct_override", { count: Object.keys(direct_templates).length });
|
|
233
|
+
}
|
|
234
|
+
return resolved_templates;
|
|
235
|
+
};
|
|
236
|
+
const create_emailer_client = (emailer_options, logger) => {
|
|
237
|
+
var _a;
|
|
238
|
+
if (!emailer_options) {
|
|
239
|
+
return {
|
|
240
|
+
send_message: async () => {
|
|
241
|
+
logger.warn("emailer_placeholder_invoked", {});
|
|
242
|
+
return { success: true };
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const client = axios.create({
|
|
247
|
+
baseURL: emailer_options.base_url,
|
|
248
|
+
headers: Object.assign(Object.assign(Object.assign({}, ((_a = emailer_options.headers) !== null && _a !== void 0 ? _a : {})), (emailer_options.api_key ? { Authorization: `Bearer ${emailer_options.api_key}` } : {})), { "Content-Type": "application/json" }),
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
send_message: async (payload) => {
|
|
252
|
+
try {
|
|
253
|
+
logger.info("emailer_request_initiated", { payload });
|
|
254
|
+
await client.post("/send", payload);
|
|
255
|
+
logger.info("emailer_request_success", {});
|
|
256
|
+
return { success: true };
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
logger.error("emailer_request_failed", { error: error.message });
|
|
260
|
+
return { success: false };
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
// section: loader
|
|
266
|
+
export const load_runtime_configuration = (options) => {
|
|
267
|
+
var _a, _b, _c;
|
|
268
|
+
const fallback_logger = create_logger_service("hazo_auth_config");
|
|
269
|
+
const parsed_options = sanitize_configuration_options(options, fallback_logger);
|
|
270
|
+
const direct_configuration = parsed_options.direct_configuration;
|
|
271
|
+
const logger = (_a = direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.logger) !== null && _a !== void 0 ? _a : fallback_logger;
|
|
272
|
+
let hazo_config;
|
|
273
|
+
try {
|
|
274
|
+
const config_file_path = (_b = parsed_options === null || parsed_options === void 0 ? void 0 : parsed_options.config_file_path) !== null && _b !== void 0 ? _b : default_config_path;
|
|
275
|
+
if (fs.existsSync(config_file_path)) {
|
|
276
|
+
hazo_config = new HazoConfig({
|
|
277
|
+
filePath: config_file_path,
|
|
278
|
+
logger,
|
|
279
|
+
});
|
|
280
|
+
logger.info("config_file_loaded", { config_file_path });
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
logger.warn("config_file_missing", { config_file_path });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
logger.error("config_file_error", { error: error.message });
|
|
288
|
+
}
|
|
289
|
+
const permission_section = read_ini_section(hazo_config, "permissions");
|
|
290
|
+
const auth_section = read_ini_section(hazo_config, "auth");
|
|
291
|
+
const rate_section = read_ini_section(hazo_config, "rate_limit");
|
|
292
|
+
const label_section = read_ini_section(hazo_config, "labels");
|
|
293
|
+
const style_section = read_ini_section(hazo_config, "styles");
|
|
294
|
+
const template_section = read_ini_section(hazo_config, "templates");
|
|
295
|
+
const emailer_section = read_ini_section(hazo_config, "emailer");
|
|
296
|
+
const captcha_section = read_ini_section(hazo_config, "captcha");
|
|
297
|
+
const permission_names = resolve_permissions(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.permission_names, permission_section, logger);
|
|
298
|
+
const password_policy = resolve_password_policy(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.password_policy, auth_section, logger);
|
|
299
|
+
const token_settings = resolve_token_settings(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.token_settings, auth_section, logger);
|
|
300
|
+
const rate_limit = resolve_rate_limit(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.rate_limit, rate_section, logger);
|
|
301
|
+
const labels = resolve_dictionary(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.labels, label_section, logger, "config_labels");
|
|
302
|
+
const styles = resolve_dictionary(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.styles, style_section, logger, "config_styles");
|
|
303
|
+
const templates = resolve_templates(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.templates, template_section, logger);
|
|
304
|
+
const resolved_emailer_options = (_c = direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.emailer) !== null && _c !== void 0 ? _c : (emailer_section.base_url
|
|
305
|
+
? {
|
|
306
|
+
base_url: emailer_section.base_url,
|
|
307
|
+
api_key: emailer_section.api_key,
|
|
308
|
+
headers: emailer_section.headers ? JSON.parse(emailer_section.headers) : undefined,
|
|
309
|
+
}
|
|
310
|
+
: undefined);
|
|
311
|
+
const emailer = create_emailer_client(resolved_emailer_options, logger);
|
|
312
|
+
const captcha = resolve_captcha(direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.captcha, captcha_section, logger);
|
|
313
|
+
return {
|
|
314
|
+
permission_names,
|
|
315
|
+
logger,
|
|
316
|
+
emailer,
|
|
317
|
+
templates,
|
|
318
|
+
labels,
|
|
319
|
+
styles,
|
|
320
|
+
password_policy,
|
|
321
|
+
token_settings,
|
|
322
|
+
rate_limit,
|
|
323
|
+
captcha,
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
// section: context_factory
|
|
327
|
+
export const create_app_context = (options) => ({
|
|
328
|
+
config: load_runtime_configuration(options),
|
|
329
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAgBjD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
// file_description: bootstrap entry point for the hazo_auth express server
|
|
3
|
+
// section: imports
|
|
4
|
+
import http from "http";
|
|
5
|
+
import { create_server_app } from "hazo_auth/server/server";
|
|
6
|
+
import { create_logger_service } from "hazo_auth/server/logging/logger_service";
|
|
7
|
+
// section: constants
|
|
8
|
+
const default_port = Number((_a = process.env.PORT) !== null && _a !== void 0 ? _a : 4100);
|
|
9
|
+
const server_namespace = "hazo_auth_server";
|
|
10
|
+
// section: bootstrap_runner
|
|
11
|
+
export const start_server = async () => {
|
|
12
|
+
const logger = create_logger_service(server_namespace);
|
|
13
|
+
const app = create_server_app();
|
|
14
|
+
const http_server = http.createServer(app);
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
http_server.listen(default_port, () => {
|
|
17
|
+
logger.info("server_started", { port: default_port });
|
|
18
|
+
resolve();
|
|
19
|
+
});
|
|
20
|
+
http_server.on("error", (error) => {
|
|
21
|
+
logger.error("server_start_failed", { error: error.message });
|
|
22
|
+
reject(error);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
// section: direct_execution_guard
|
|
27
|
+
const resolved_module_path = new URL(import.meta.url).pathname;
|
|
28
|
+
const entry_module_path = process.argv[1] !== undefined ? new URL(`file://${process.argv[1]}`).pathname : undefined;
|
|
29
|
+
const is_primary_module = entry_module_path !== undefined && entry_module_path === resolved_module_path;
|
|
30
|
+
if (is_primary_module) {
|
|
31
|
+
void start_server();
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger_service.d.ts","sourceRoot":"","sources":["../../../src/server/logging/logger_service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,kCAAkC,CAAC;AA2BtF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,kBAAkB,OAAO,CAAC,cAAc,CAAC,KACxC,cAsBF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// section: helper_functions
|
|
2
|
+
const create_console_logger = (namespace) => {
|
|
3
|
+
const write = (level, message, data) => {
|
|
4
|
+
const timestamp = new Date().toISOString();
|
|
5
|
+
// eslint-disable-next-line no-console
|
|
6
|
+
console.log(JSON.stringify({
|
|
7
|
+
namespace,
|
|
8
|
+
level,
|
|
9
|
+
message,
|
|
10
|
+
data,
|
|
11
|
+
timestamp,
|
|
12
|
+
}));
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
debug: (message, data) => write("debug", message, data),
|
|
16
|
+
info: (message, data) => write("info", message, data),
|
|
17
|
+
warn: (message, data) => write("warn", message, data),
|
|
18
|
+
error: (message, data) => write("error", message, data),
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
// section: factory
|
|
22
|
+
export const create_logger_service = (namespace, external_logger) => {
|
|
23
|
+
const console_logger = create_console_logger(namespace);
|
|
24
|
+
const safe_bind = (level, fallback) => {
|
|
25
|
+
const candidate = external_logger === null || external_logger === void 0 ? void 0 : external_logger[level];
|
|
26
|
+
if (typeof candidate === "function") {
|
|
27
|
+
return (message, data) => candidate(message, data);
|
|
28
|
+
}
|
|
29
|
+
return fallback;
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
debug: safe_bind("debug", console_logger.debug),
|
|
33
|
+
info: safe_bind("info", console_logger.info),
|
|
34
|
+
warn: safe_bind("warn", console_logger.warn),
|
|
35
|
+
error: safe_bind("error", console_logger.error),
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root_router.d.ts","sourceRoot":"","sources":["../../../src/server/routes/root_router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,eAAO,MAAM,kBAAkB,QAAO,MASrC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// file_description: declares the primary express router for the hazo_auth backend
|
|
2
|
+
// section: imports
|
|
3
|
+
import { Router } from "express";
|
|
4
|
+
// section: router_factory
|
|
5
|
+
export const create_root_router = () => {
|
|
6
|
+
const root_router = Router();
|
|
7
|
+
// section: health_endpoint
|
|
8
|
+
root_router.get("/health", (_request, response) => {
|
|
9
|
+
response.status(200).json({
|
|
10
|
+
status: "ok",
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
return root_router;
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C,eAAO,MAAM,iBAAiB,QAAO,WAcpC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// file_description: configure and export the express application for hazo_auth
|
|
2
|
+
// section: imports
|
|
3
|
+
import express from "express";
|
|
4
|
+
import helmet from "helmet";
|
|
5
|
+
import cors from "cors";
|
|
6
|
+
import cookie_parser from "cookie-parser";
|
|
7
|
+
import compression from "compression";
|
|
8
|
+
import { create_root_router } from "hazo_auth/server/routes/root_router";
|
|
9
|
+
import { create_app_context } from "hazo_auth/server/config/config_loader";
|
|
10
|
+
// section: app_factory
|
|
11
|
+
export const create_server_app = () => {
|
|
12
|
+
const server_app = express();
|
|
13
|
+
server_app.use(helmet({ crossOriginResourcePolicy: false }));
|
|
14
|
+
server_app.use(cors({ credentials: true, origin: true }));
|
|
15
|
+
server_app.use(express.json({ limit: "1mb" }));
|
|
16
|
+
server_app.use(express.urlencoded({ extended: true }));
|
|
17
|
+
server_app.use(cookie_parser());
|
|
18
|
+
server_app.use(compression());
|
|
19
|
+
server_app.use((request, _response, next) => {
|
|
20
|
+
request.context = create_app_context();
|
|
21
|
+
next();
|
|
22
|
+
});
|
|
23
|
+
server_app.use(create_root_router());
|
|
24
|
+
return server_app;
|
|
25
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
export type logger_method = (message: string, data?: Record<string, unknown>) => void;
|
|
3
|
+
export type logger_service = {
|
|
4
|
+
debug: logger_method;
|
|
5
|
+
info: logger_method;
|
|
6
|
+
warn: logger_method;
|
|
7
|
+
error: logger_method;
|
|
8
|
+
};
|
|
9
|
+
export type emailer_client = {
|
|
10
|
+
send_message: (payload: Record<string, unknown>) => Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
export type handlebars_templates = Record<string, string>;
|
|
15
|
+
export type password_policy = {
|
|
16
|
+
min_length: number;
|
|
17
|
+
requires_uppercase: boolean;
|
|
18
|
+
requires_lowercase: boolean;
|
|
19
|
+
requires_number: boolean;
|
|
20
|
+
requires_symbol: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type token_settings = {
|
|
23
|
+
access_token_ttl_seconds: number;
|
|
24
|
+
refresh_token_ttl_seconds: number;
|
|
25
|
+
};
|
|
26
|
+
export type rate_limit_settings = {
|
|
27
|
+
max_attempts: number;
|
|
28
|
+
window_minutes: number;
|
|
29
|
+
};
|
|
30
|
+
export type captcha_settings = {
|
|
31
|
+
provider: "recaptcha_v2" | "recaptcha_v3" | "hcaptcha";
|
|
32
|
+
secret_key: string;
|
|
33
|
+
} | undefined;
|
|
34
|
+
export type runtime_configuration = {
|
|
35
|
+
permission_names: string[];
|
|
36
|
+
logger: logger_service;
|
|
37
|
+
emailer: emailer_client;
|
|
38
|
+
templates: handlebars_templates;
|
|
39
|
+
labels: Record<string, string>;
|
|
40
|
+
styles: Record<string, string>;
|
|
41
|
+
password_policy: password_policy;
|
|
42
|
+
token_settings: token_settings;
|
|
43
|
+
rate_limit: rate_limit_settings;
|
|
44
|
+
captcha: captcha_settings;
|
|
45
|
+
};
|
|
46
|
+
export type app_context = {
|
|
47
|
+
config: runtime_configuration;
|
|
48
|
+
};
|
|
49
|
+
export type context_request<T = unknown> = Request & {
|
|
50
|
+
body: T;
|
|
51
|
+
context: app_context;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=app_types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app_types.d.ts","sourceRoot":"","sources":["../../../src/server/types/app_types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,IAAI,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,CACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,EAAE,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,GACD,SAAS,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAGF,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG;IACnD,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- file_description: migration to add url_on_logon column to hazo_users table
|
|
2
|
+
-- This migration adds a url_on_logon text field to store the URL to redirect to after successful login
|
|
3
|
+
|
|
4
|
+
-- Add url_on_logon column (nullable, as this is an optional redirect URL)
|
|
5
|
+
ALTER TABLE hazo_users
|
|
6
|
+
ADD COLUMN url_on_logon TEXT;
|
|
7
|
+
|
|
8
|
+
|
package/next.config.mjs
CHANGED
|
@@ -22,6 +22,18 @@ const next_config = {
|
|
|
22
22
|
// Using webpack externals configuration instead (see webpack section below)
|
|
23
23
|
// section: webpack_configuration
|
|
24
24
|
webpack: (config, { isServer }) => {
|
|
25
|
+
// section: hazo_auth_alias_resolution
|
|
26
|
+
// Add hazo_auth/* alias to resolve to ./src/* during local development
|
|
27
|
+
// This allows package-style imports to work during development
|
|
28
|
+
config.resolve.alias = {
|
|
29
|
+
...config.resolve.alias,
|
|
30
|
+
"hazo_auth/components": path.resolve(__dirname, "src/components"),
|
|
31
|
+
"hazo_auth/lib": path.resolve(__dirname, "src/lib"),
|
|
32
|
+
"hazo_auth/hooks": path.resolve(__dirname, "src/hooks"),
|
|
33
|
+
"hazo_auth/server": path.resolve(__dirname, "src/server"),
|
|
34
|
+
"hazo_auth/app": path.resolve(__dirname, "src/app"),
|
|
35
|
+
};
|
|
36
|
+
|
|
25
37
|
// Exclude sql.js from webpack bundling for API routes
|
|
26
38
|
// These packages use Node.js module.exports which doesn't work in webpack context
|
|
27
39
|
if (isServer) {
|