@adonis-agora/authkit-server 0.34.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.
- package/LICENSE +21 -0
- package/README.md +158 -0
- package/build/assets/grafana/authkit-dashboard.json +118 -0
- package/build/commands/clients_create.d.ts +27 -0
- package/build/commands/clients_create.js +121 -0
- package/build/commands/commands.json +292 -0
- package/build/commands/configure.d.ts +2 -0
- package/build/commands/configure.js +45 -0
- package/build/commands/doctor.d.ts +10 -0
- package/build/commands/doctor.js +113 -0
- package/build/commands/eject.d.ts +11 -0
- package/build/commands/eject.js +96 -0
- package/build/commands/expire_scan.d.ts +28 -0
- package/build/commands/expire_scan.js +92 -0
- package/build/commands/import_users.d.ts +17 -0
- package/build/commands/import_users.js +80 -0
- package/build/commands/keys_rotate.d.ts +21 -0
- package/build/commands/keys_rotate.js +126 -0
- package/build/commands/main.d.ts +12 -0
- package/build/commands/main.js +38 -0
- package/build/commands/settings_get.d.ts +18 -0
- package/build/commands/settings_get.js +43 -0
- package/build/commands/settings_list.d.ts +17 -0
- package/build/commands/settings_list.js +39 -0
- package/build/commands/settings_set.d.ts +20 -0
- package/build/commands/settings_set.js +55 -0
- package/build/commands/settings_unset.d.ts +18 -0
- package/build/commands/settings_unset.js +46 -0
- package/build/commands/ui_preset.d.ts +4 -0
- package/build/commands/ui_preset.js +32 -0
- package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
- package/build/database/migrations/make_authkit_oidc_table.js +19 -0
- package/build/host/ui/admin.html +29 -0
- package/build/host/views/account/apps.edge +59 -0
- package/build/host/views/account/confirm.edge +70 -0
- package/build/host/views/account/email-confirmed.edge +16 -0
- package/build/host/views/account/login.edge +33 -0
- package/build/host/views/account/mfa.edge +152 -0
- package/build/host/views/account/orgs.edge +58 -0
- package/build/host/views/account/security.edge +215 -0
- package/build/host/views/account/tokens.edge +75 -0
- package/build/host/views/consent.edge +20 -0
- package/build/host/views/forgot.edge +43 -0
- package/build/host/views/login.edge +251 -0
- package/build/host/views/maintenance.edge +32 -0
- package/build/host/views/mfa-challenge.edge +107 -0
- package/build/host/views/otp-unlock.edge +40 -0
- package/build/host/views/partials/styles.edge +2 -0
- package/build/host/views/reset.edge +30 -0
- package/build/host/views/signup.edge +62 -0
- package/build/host/views/verify-email.edge +17 -0
- package/build/index.d.ts +115 -0
- package/build/index.js +76 -0
- package/build/password/common_passwords.txt +10000 -0
- package/build/providers/authkit_server_provider.d.ts +27 -0
- package/build/providers/authkit_server_provider.js +242 -0
- package/build/src/accounts/account_store.d.ts +578 -0
- package/build/src/accounts/account_store.js +60 -0
- package/build/src/accounts/lucid_account_store.d.ts +156 -0
- package/build/src/accounts/lucid_account_store.js +294 -0
- package/build/src/accounts/lucid_store/core.d.ts +9 -0
- package/build/src/accounts/lucid_store/core.js +306 -0
- package/build/src/accounts/lucid_store/mfa.d.ts +15 -0
- package/build/src/accounts/lucid_store/mfa.js +108 -0
- package/build/src/accounts/lucid_store/organizations.d.ts +13 -0
- package/build/src/accounts/lucid_store/organizations.js +294 -0
- package/build/src/accounts/lucid_store/password_hygiene.d.ts +20 -0
- package/build/src/accounts/lucid_store/password_hygiene.js +130 -0
- package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
- package/build/src/accounts/lucid_store/provider_identity.js +59 -0
- package/build/src/accounts/lucid_store/shared.d.ts +113 -0
- package/build/src/accounts/lucid_store/shared.js +130 -0
- package/build/src/accounts/lucid_store/status_profile.d.ts +34 -0
- package/build/src/accounts/lucid_store/status_profile.js +100 -0
- package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
- package/build/src/accounts/lucid_store/webauthn.js +140 -0
- package/build/src/accounts/lucid_stores.d.ts +45 -0
- package/build/src/accounts/lucid_stores.js +30 -0
- package/build/src/adapters/adapter_contract.d.ts +37 -0
- package/build/src/adapters/adapter_contract.js +1 -0
- package/build/src/adapters/database_adapter.d.ts +21 -0
- package/build/src/adapters/database_adapter.js +79 -0
- package/build/src/adapters/factory.d.ts +30 -0
- package/build/src/adapters/factory.js +43 -0
- package/build/src/adapters/redis_adapter.d.ts +24 -0
- package/build/src/adapters/redis_adapter.js +122 -0
- package/build/src/audit/audit_sink.d.ts +63 -0
- package/build/src/audit/audit_sink.js +1 -0
- package/build/src/audit/lucid_audit_sink.d.ts +10 -0
- package/build/src/audit/lucid_audit_sink.js +99 -0
- package/build/src/commands/expire_scan_command.d.ts +60 -0
- package/build/src/commands/expire_scan_command.js +229 -0
- package/build/src/commands/import_clients.d.ts +40 -0
- package/build/src/commands/import_clients.js +79 -0
- package/build/src/commands/import_users.d.ts +51 -0
- package/build/src/commands/import_users.js +94 -0
- package/build/src/commands/resolve_config.d.ts +13 -0
- package/build/src/commands/resolve_config.js +18 -0
- package/build/src/commands/settings_commands.d.ts +47 -0
- package/build/src/commands/settings_commands.js +270 -0
- package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
- package/build/src/controllers/oidc_callback_controller.js +33 -0
- package/build/src/define_config.d.ts +772 -0
- package/build/src/define_config.js +351 -0
- package/build/src/doctor/checks.d.ts +197 -0
- package/build/src/doctor/checks.js +858 -0
- package/build/src/events/dispatcher.d.ts +45 -0
- package/build/src/events/dispatcher.js +117 -0
- package/build/src/host/account_api/account_api_controller.d.ts +245 -0
- package/build/src/host/account_api/account_api_controller.js +827 -0
- package/build/src/host/account_deletion_ops.d.ts +80 -0
- package/build/src/host/account_deletion_ops.js +118 -0
- package/build/src/host/account_deletion_service.d.ts +63 -0
- package/build/src/host/account_deletion_service.js +133 -0
- package/build/src/host/account_export_service.d.ts +76 -0
- package/build/src/host/account_export_service.js +140 -0
- package/build/src/host/account_home.d.ts +11 -0
- package/build/src/host/account_home.js +11 -0
- package/build/src/host/account_lockout.d.ts +86 -0
- package/build/src/host/account_lockout.js +185 -0
- package/build/src/host/active_org_cookie.d.ts +28 -0
- package/build/src/host/active_org_cookie.js +47 -0
- package/build/src/host/admin_api/admin_api_guard.d.ts +16 -0
- package/build/src/host/admin_api/admin_api_guard.js +59 -0
- package/build/src/host/admin_api/admin_orgs_service.d.ts +125 -0
- package/build/src/host/admin_api/admin_orgs_service.js +324 -0
- package/build/src/host/admin_api/admin_users_service.d.ts +163 -0
- package/build/src/host/admin_api/admin_users_service.js +308 -0
- package/build/src/host/admin_api/api_clients_controller.d.ts +54 -0
- package/build/src/host/admin_api/api_clients_controller.js +89 -0
- package/build/src/host/admin_api/api_keys_controller.d.ts +19 -0
- package/build/src/host/admin_api/api_keys_controller.js +36 -0
- package/build/src/host/admin_api/api_misc_controller.d.ts +19 -0
- package/build/src/host/admin_api/api_misc_controller.js +44 -0
- package/build/src/host/admin_api/api_orgs_controller.d.ts +108 -0
- package/build/src/host/admin_api/api_orgs_controller.js +189 -0
- package/build/src/host/admin_api/api_settings_controller.d.ts +55 -0
- package/build/src/host/admin_api/api_settings_controller.js +134 -0
- package/build/src/host/admin_api/api_users_controller.d.ts +108 -0
- package/build/src/host/admin_api/api_users_controller.js +187 -0
- package/build/src/host/admin_api/dto.d.ts +131 -0
- package/build/src/host/admin_api/dto.js +122 -0
- package/build/src/host/admin_api/token_verify_service.d.ts +34 -0
- package/build/src/host/admin_api/token_verify_service.js +74 -0
- package/build/src/host/admin_clients_service.d.ts +88 -0
- package/build/src/host/admin_clients_service.js +181 -0
- package/build/src/host/admin_console/admin_shell_controller.d.ts +27 -0
- package/build/src/host/admin_console/admin_shell_controller.js +167 -0
- package/build/src/host/admin_console/console_audit_controller.d.ts +17 -0
- package/build/src/host/admin_console/console_audit_controller.js +25 -0
- package/build/src/host/admin_console/console_clients_controller.d.ts +53 -0
- package/build/src/host/admin_console/console_clients_controller.js +102 -0
- package/build/src/host/admin_console/console_impersonation_controller.d.ts +23 -0
- package/build/src/host/admin_console/console_impersonation_controller.js +45 -0
- package/build/src/host/admin_console/console_keys_controller.d.ts +24 -0
- package/build/src/host/admin_console/console_keys_controller.js +41 -0
- package/build/src/host/admin_console/console_orgs_controller.d.ts +96 -0
- package/build/src/host/admin_console/console_orgs_controller.js +238 -0
- package/build/src/host/admin_console/console_overview_controller.d.ts +27 -0
- package/build/src/host/admin_console/console_overview_controller.js +44 -0
- package/build/src/host/admin_console/console_roles_controller.d.ts +31 -0
- package/build/src/host/admin_console/console_roles_controller.js +108 -0
- package/build/src/host/admin_console/console_sessions_controller.d.ts +91 -0
- package/build/src/host/admin_console/console_sessions_controller.js +125 -0
- package/build/src/host/admin_console/console_settings_controller.d.ts +47 -0
- package/build/src/host/admin_console/console_settings_controller.js +115 -0
- package/build/src/host/admin_console/console_users_controller.d.ts +110 -0
- package/build/src/host/admin_console/console_users_controller.js +212 -0
- package/build/src/host/admin_prefix.d.ts +50 -0
- package/build/src/host/admin_prefix.js +77 -0
- package/build/src/host/admin_sessions_service.d.ts +119 -0
- package/build/src/host/admin_sessions_service.js +284 -0
- package/build/src/host/admin_stats_service.d.ts +44 -0
- package/build/src/host/admin_stats_service.js +130 -0
- package/build/src/host/admin_validators.d.ts +247 -0
- package/build/src/host/admin_validators.js +197 -0
- package/build/src/host/augmentations.d.ts +12 -0
- package/build/src/host/augmentations.js +1 -0
- package/build/src/host/auth_host_config.d.ts +22 -0
- package/build/src/host/auth_host_config.js +13 -0
- package/build/src/host/avatar_storage.d.ts +68 -0
- package/build/src/host/avatar_storage.js +166 -0
- package/build/src/host/bot_protection.d.ts +187 -0
- package/build/src/host/bot_protection.js +132 -0
- package/build/src/host/branding.d.ts +19 -0
- package/build/src/host/branding.js +8 -0
- package/build/src/host/config_locks.d.ts +38 -0
- package/build/src/host/config_locks.js +70 -0
- package/build/src/host/console_session.d.ts +27 -0
- package/build/src/host/console_session.js +36 -0
- package/build/src/host/controllers/account_apps_controller.d.ts +15 -0
- package/build/src/host/controllers/account_apps_controller.js +61 -0
- package/build/src/host/controllers/account_confirm_controller.d.ts +24 -0
- package/build/src/host/controllers/account_confirm_controller.js +144 -0
- package/build/src/host/controllers/account_mfa_controller.d.ts +28 -0
- package/build/src/host/controllers/account_mfa_controller.js +208 -0
- package/build/src/host/controllers/account_orgs_controller.d.ts +80 -0
- package/build/src/host/controllers/account_orgs_controller.js +401 -0
- package/build/src/host/controllers/account_security_controller.d.ts +43 -0
- package/build/src/host/controllers/account_security_controller.js +546 -0
- package/build/src/host/controllers/account_session_controller.d.ts +21 -0
- package/build/src/host/controllers/account_session_controller.js +113 -0
- package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
- package/build/src/host/controllers/account_tokens_controller.js +67 -0
- package/build/src/host/controllers/interaction_controller.d.ts +125 -0
- package/build/src/host/controllers/interaction_controller.js +981 -0
- package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
- package/build/src/host/controllers/pat_introspection_controller.js +46 -0
- package/build/src/host/controllers/registration_controller.d.ts +18 -0
- package/build/src/host/controllers/registration_controller.js +382 -0
- package/build/src/host/controllers/social_controller.d.ts +8 -0
- package/build/src/host/controllers/social_controller.js +89 -0
- package/build/src/host/csrf.d.ts +29 -0
- package/build/src/host/csrf.js +14 -0
- package/build/src/host/default_mailer.d.ts +112 -0
- package/build/src/host/default_mailer.js +417 -0
- package/build/src/host/durable/account_deletion_workflow.d.ts +48 -0
- package/build/src/host/durable/account_deletion_workflow.js +86 -0
- package/build/src/host/durable/account_export_workflow.d.ts +68 -0
- package/build/src/host/durable/account_export_workflow.js +93 -0
- package/build/src/host/durable/index.d.ts +68 -0
- package/build/src/host/durable/index.js +77 -0
- package/build/src/host/email_templates.d.ts +39 -0
- package/build/src/host/email_templates.js +69 -0
- package/build/src/host/geo.d.ts +22 -0
- package/build/src/host/geo.js +39 -0
- package/build/src/host/i18n.d.ts +1416 -0
- package/build/src/host/i18n.js +1583 -0
- package/build/src/host/impersonation.d.ts +25 -0
- package/build/src/host/impersonation.js +31 -0
- package/build/src/host/key_rotation.d.ts +14 -0
- package/build/src/host/key_rotation.js +27 -0
- package/build/src/host/key_rotation_actions.d.ts +42 -0
- package/build/src/host/key_rotation_actions.js +27 -0
- package/build/src/host/login_attempt.d.ts +98 -0
- package/build/src/host/login_attempt.js +211 -0
- package/build/src/host/login_notify.d.ts +27 -0
- package/build/src/host/login_notify.js +142 -0
- package/build/src/host/middleware/account_auth.d.ts +7 -0
- package/build/src/host/middleware/account_auth.js +11 -0
- package/build/src/host/otp_lockout.d.ts +103 -0
- package/build/src/host/otp_lockout.js +221 -0
- package/build/src/host/rate_limit.d.ts +39 -0
- package/build/src/host/rate_limit.js +94 -0
- package/build/src/host/register_auth_host.d.ts +97 -0
- package/build/src/host/register_auth_host.js +466 -0
- package/build/src/host/renderers/edge_renderer.d.ts +12 -0
- package/build/src/host/renderers/edge_renderer.js +38 -0
- package/build/src/host/renderers/inertia_renderer.d.ts +70 -0
- package/build/src/host/renderers/inertia_renderer.js +54 -0
- package/build/src/host/runtime_settings.d.ts +181 -0
- package/build/src/host/runtime_settings.js +307 -0
- package/build/src/host/runtime_toggles.d.ts +807 -0
- package/build/src/host/runtime_toggles.js +784 -0
- package/build/src/host/security_notice_service.d.ts +36 -0
- package/build/src/host/security_notice_service.js +87 -0
- package/build/src/host/session_context.d.ts +23 -0
- package/build/src/host/session_context.js +89 -0
- package/build/src/host/sudo_mode.d.ts +56 -0
- package/build/src/host/sudo_mode.js +99 -0
- package/build/src/host/svg_chart.d.ts +15 -0
- package/build/src/host/svg_chart.js +45 -0
- package/build/src/host/trusted_device.d.ts +61 -0
- package/build/src/host/trusted_device.js +65 -0
- package/build/src/host/ui-dist/assets/index-CRWcmsex.js +137 -0
- package/build/src/host/ui-dist/assets/index-DTSmD4RU.css +1 -0
- package/build/src/host/ui-dist/index.html +17 -0
- package/build/src/host/user_agent.d.ts +18 -0
- package/build/src/host/user_agent.js +50 -0
- package/build/src/host/validators.d.ts +127 -0
- package/build/src/host/validators.js +53 -0
- package/build/src/keys/jwks_manager.d.ts +6 -0
- package/build/src/keys/jwks_manager.js +11 -0
- package/build/src/keys/keystore.d.ts +52 -0
- package/build/src/keys/keystore.js +68 -0
- package/build/src/keys/keystore_codec.d.ts +20 -0
- package/build/src/keys/keystore_codec.js +42 -0
- package/build/src/keys/keystore_crypto.d.ts +9 -0
- package/build/src/keys/keystore_crypto.js +27 -0
- package/build/src/keys/keystore_manager.d.ts +43 -0
- package/build/src/keys/keystore_manager.js +104 -0
- package/build/src/keys/keystore_vault.d.ts +113 -0
- package/build/src/keys/keystore_vault.js +265 -0
- package/build/src/mixins/json_column.d.ts +33 -0
- package/build/src/mixins/json_column.js +38 -0
- package/build/src/mixins/with_audit_log.d.ts +19 -0
- package/build/src/mixins/with_audit_log.js +39 -0
- package/build/src/mixins/with_auth_user.d.ts +24 -0
- package/build/src/mixins/with_auth_user.js +46 -0
- package/build/src/mixins/with_credentials.d.ts +20 -0
- package/build/src/mixins/with_credentials.js +29 -0
- package/build/src/mixins/with_mfa.d.ts +35 -0
- package/build/src/mixins/with_mfa.js +21 -0
- package/build/src/mixins/with_personal_access_token.d.ts +19 -0
- package/build/src/mixins/with_personal_access_token.js +42 -0
- package/build/src/mixins/with_provider_identity.d.ts +20 -0
- package/build/src/mixins/with_provider_identity.js +32 -0
- package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
- package/build/src/mixins/with_webauthn_credential.js +46 -0
- package/build/src/observability/diagnostics_bridge.d.ts +6 -0
- package/build/src/observability/diagnostics_bridge.js +27 -0
- package/build/src/observability/metrics_controller.d.ts +5 -0
- package/build/src/observability/metrics_controller.js +24 -0
- package/build/src/observability/metrics_service.d.ts +2 -0
- package/build/src/observability/metrics_service.js +7 -0
- package/build/src/observability/otel_recorder.d.ts +10 -0
- package/build/src/observability/otel_recorder.js +59 -0
- package/build/src/observability/telescope/data_providers.d.ts +24 -0
- package/build/src/observability/telescope/data_providers.js +235 -0
- package/build/src/observability/telescope/extension.d.ts +29 -0
- package/build/src/observability/telescope/extension.js +167 -0
- package/build/src/observability/telescope/index.d.ts +8 -0
- package/build/src/observability/telescope/index.js +8 -0
- package/build/src/observability/wire_provider_events.d.ts +12 -0
- package/build/src/observability/wire_provider_events.js +30 -0
- package/build/src/password/common_passwords.d.ts +31 -0
- package/build/src/password/common_passwords.js +73 -0
- package/build/src/password/password_manager.d.ts +163 -0
- package/build/src/password/password_manager.js +191 -0
- package/build/src/password/policy.d.ts +71 -0
- package/build/src/password/policy.js +55 -0
- package/build/src/password/pwned.d.ts +36 -0
- package/build/src/password/pwned.js +52 -0
- package/build/src/pat/lucid_pat_store.d.ts +6 -0
- package/build/src/pat/lucid_pat_store.js +62 -0
- package/build/src/pat/pat_store.d.ts +31 -0
- package/build/src/pat/pat_store.js +1 -0
- package/build/src/pat/pat_tokens.d.ts +4 -0
- package/build/src/pat/pat_tokens.js +9 -0
- package/build/src/provider/build_provider.d.ts +45 -0
- package/build/src/provider/build_provider.js +219 -0
- package/build/src/provider/device_sources.d.ts +6 -0
- package/build/src/provider/device_sources.js +65 -0
- package/build/src/provider/interaction_actions.d.ts +36 -0
- package/build/src/provider/interaction_actions.js +55 -0
- package/build/src/provider/key_rotation_scheduler.d.ts +28 -0
- package/build/src/provider/key_rotation_scheduler.js +40 -0
- package/build/src/provider/keystore_reload.d.ts +21 -0
- package/build/src/provider/keystore_reload.js +39 -0
- package/build/src/provider/logout_sources.d.ts +13 -0
- package/build/src/provider/logout_sources.js +64 -0
- package/build/src/provider/oidc_service.d.ts +81 -0
- package/build/src/provider/oidc_service.js +254 -0
- package/build/src/provider/single_flight_lock.d.ts +18 -0
- package/build/src/provider/single_flight_lock.js +31 -0
- package/build/src/provider/token_exchange.d.ts +21 -0
- package/build/src/provider/token_exchange.js +124 -0
- package/build/src/register_routes.d.ts +16 -0
- package/build/src/register_routes.js +21 -0
- package/build/src/schema/ensure.d.ts +41 -0
- package/build/src/schema/ensure.js +262 -0
- package/build/stubs/config/authkit.stub +20 -0
- package/build/stubs/config/authkit_react.stub +52 -0
- package/build/stubs/main.d.ts +1 -0
- package/build/stubs/main.js +2 -0
- package/build/stubs/models/auth_user.stub +22 -0
- package/build/stubs/ui/edge/views/consent.edge +13 -0
- package/build/stubs/ui/edge/views/login.edge +19 -0
- package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
- package/build/stubs/ui/react/pages/account/login.tsx +56 -0
- package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
- package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
- package/build/stubs/ui/react/pages/consent.tsx +39 -0
- package/build/stubs/ui/react/pages/forgot.tsx +44 -0
- package/build/stubs/ui/react/pages/login.tsx +171 -0
- package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
- package/build/stubs/ui/react/pages/reset.tsx +58 -0
- package/build/stubs/ui/react/pages/signup.tsx +78 -0
- package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
- package/build/types.d.ts +7 -0
- package/build/types.js +1 -0
- package/package.json +147 -0
- package/stubs/config/authkit.stub +20 -0
- package/stubs/config/authkit_react.stub +52 -0
- package/stubs/main.ts +2 -0
- package/stubs/models/auth_user.stub +22 -0
- package/stubs/ui/edge/views/consent.edge +13 -0
- package/stubs/ui/edge/views/login.edge +19 -0
- package/stubs/ui/react/components/auth_shell.tsx +67 -0
- package/stubs/ui/react/pages/account/login.tsx +56 -0
- package/stubs/ui/react/pages/account/mfa.tsx +132 -0
- package/stubs/ui/react/pages/account/tokens.tsx +88 -0
- package/stubs/ui/react/pages/consent.tsx +39 -0
- package/stubs/ui/react/pages/forgot.tsx +44 -0
- package/stubs/ui/react/pages/login.tsx +171 -0
- package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
- package/stubs/ui/react/pages/reset.tsx +58 -0
- package/stubs/ui/react/pages/signup.tsx +78 -0
- package/stubs/ui/react/pages/verify-email.tsx +24 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { AccountStore } from './account_store.js';
|
|
2
|
+
import { type AccountSecretEncrypter, type WebauthnCeremonies } from './lucid_store/shared.js';
|
|
3
|
+
import { type PasswordConfigInput } from '../password/password_manager.js';
|
|
4
|
+
import type { AuditSink } from '../audit/audit_sink.js';
|
|
5
|
+
import type { PwnedLogger, FetchLike } from '../password/pwned.js';
|
|
6
|
+
export type { AccountSecretEncrypter, WebauthnCeremonies };
|
|
7
|
+
/**
|
|
8
|
+
* Serviço de encryption do app (APP_KEY), carregado LAZY via import dinâmico.
|
|
9
|
+
*
|
|
10
|
+
* Não importamos `@adonisjs/core/services/encryption` no topo do módulo de
|
|
11
|
+
* propósito: esse módulo faz `await app.booted()` na carga, o que quebra em
|
|
12
|
+
* contextos sem app (harness de teste). O import dinâmico é disparado na
|
|
13
|
+
* construção do encrypter (boot) e resolve antes da primeira request; até lá (e
|
|
14
|
+
* em testes sem app, onde o import rejeita) o encrypter degrada p/ plaintext.
|
|
15
|
+
*/
|
|
16
|
+
interface EncryptionService {
|
|
17
|
+
encrypt(value: string): string;
|
|
18
|
+
decrypt<T = string>(value: string): T | null;
|
|
19
|
+
}
|
|
20
|
+
/** Reset do cache de encryption — uso em testes. */
|
|
21
|
+
export declare function __resetAppKeyEncryption(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Injeta um serviço de encryption fake — uso EXCLUSIVO em testes. Permite exercitar
|
|
24
|
+
* o caminho fail-closed do {@link appKeyEncrypter} (decrypt que lança → null) sem
|
|
25
|
+
* precisar de um app AdonisJS booted. Marca `encLoading` como resolvido para que o
|
|
26
|
+
* encrypter use o serviço imediatamente.
|
|
27
|
+
*/
|
|
28
|
+
export declare function __setAppKeyEncryptionForTesting(svc: EncryptionService | undefined): void;
|
|
29
|
+
/**
|
|
30
|
+
* Encrypter default do AuthKit, baseado no `APP_KEY` (`@adonisjs/core/services/encryption`).
|
|
31
|
+
* É o default do {@link lucidAccountStore} — o segredo TOTP é encriptado em repouso
|
|
32
|
+
* sem nenhum wiring no app. Passe `encrypter: false` p/ desligar (plaintext).
|
|
33
|
+
*
|
|
34
|
+
* Resiliente: enquanto o serviço de encryption não está disponível (boot inicial /
|
|
35
|
+
* testes sem app), opera em plaintext; uma vez carregado, encripta de verdade.
|
|
36
|
+
*/
|
|
37
|
+
export declare function appKeyEncrypter(): AccountSecretEncrypter;
|
|
38
|
+
/** Opções do {@link lucidAccountStore}. */
|
|
39
|
+
export interface LucidAccountStoreOptions {
|
|
40
|
+
/** Label de issuer mostrado no app autenticador (keyuri). Default: 'AuthKit'. */
|
|
41
|
+
mfaIssuer?: string;
|
|
42
|
+
/** Quantidade de recovery codes gerados no enrollment. Default: 8. */
|
|
43
|
+
recoveryCodeCount?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Encripta o segredo TOTP em repouso. **Default: {@link appKeyEncrypter} (APP_KEY)** —
|
|
46
|
+
* seguro por padrão, sem wiring. Passe um encrypter custom para usar outro KMS, ou
|
|
47
|
+
* `false` para desligar (segredo em claro; ex.: testes / migração).
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ Breaking (0.x): segredos TOTP gravados em CLARO por versões anteriores deixam de
|
|
50
|
+
* decriptar sob o default. Migre (re-encriptar) ou passe `encrypter: false`.
|
|
51
|
+
*/
|
|
52
|
+
encrypter?: AccountSecretEncrypter | false;
|
|
53
|
+
/**
|
|
54
|
+
* Model Lucid das identidades de provider (composto de `withProviderIdentity()`),
|
|
55
|
+
* usado por `findByProviderIdentity`/`linkProviderIdentity` (account linking
|
|
56
|
+
* social). Ausente → a capacidade de account linking fica AUSENTE do store (os
|
|
57
|
+
* métodos não existem; hosts email-only continuam funcionando).
|
|
58
|
+
*/
|
|
59
|
+
providerIdentityModel?: any;
|
|
60
|
+
/**
|
|
61
|
+
* Model Lucid das credenciais WebAuthn / passkeys (composto de
|
|
62
|
+
* `withWebauthnCredential()`), usado pelos métodos `*Passkey*`. Ausente → a
|
|
63
|
+
* capacidade de passkeys fica AUSENTE do store (os métodos não existem; a UI
|
|
64
|
+
* esconde a seção de passkeys).
|
|
65
|
+
*/
|
|
66
|
+
webauthnCredentialModel?: any;
|
|
67
|
+
/**
|
|
68
|
+
* Parâmetros do Relying Party (RP) usados nas cerimônias WebAuthn. Resolvidos a
|
|
69
|
+
* partir do `issuer` no `define_config` quando omitidos. Necessários sempre que
|
|
70
|
+
* `webauthnCredentialModel` é fornecido.
|
|
71
|
+
*/
|
|
72
|
+
webauthn?: {
|
|
73
|
+
/** Nome do RP mostrado pelo authenticator. Default: `mfaIssuer`. */
|
|
74
|
+
rpName: string;
|
|
75
|
+
/** RP ID — normalmente o hostname (sem porta) do issuer. */
|
|
76
|
+
rpId: string;
|
|
77
|
+
/** Origin(s) esperada(s) na verificação (scheme://host[:port]). */
|
|
78
|
+
origin: string | string[];
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Seam de injeção das cerimônias WebAuthn (generate/verify). Default: as funções
|
|
82
|
+
* reais do `@simplewebauthn/server`. Existe para testes (mockar a verificação SEM
|
|
83
|
+
* um authenticator real) — produção não precisa fornecer.
|
|
84
|
+
*/
|
|
85
|
+
webauthnCeremonies?: Partial<WebauthnCeremonies>;
|
|
86
|
+
/**
|
|
87
|
+
* Gerência de senha: verificador de hashes legados (import de outros sistemas),
|
|
88
|
+
* política de complexidade e checagem contra vazamentos (HIBP). Tudo opcional —
|
|
89
|
+
* sem config, a política cai no default (min 8) e o lazy rehash usa só o hasher
|
|
90
|
+
* nativo do model. Veja {@link PasswordConfigInput}.
|
|
91
|
+
*/
|
|
92
|
+
password?: PasswordConfigInput;
|
|
93
|
+
/**
|
|
94
|
+
* Sink de auditoria (best-effort), usado para emitir `password.rehashed` quando
|
|
95
|
+
* o lazy rehash acontece. Ausente → o evento não é emitido. Normalmente o
|
|
96
|
+
* `define_config` injeta o `audit` resolvido aqui.
|
|
97
|
+
*/
|
|
98
|
+
audit?: AuditSink;
|
|
99
|
+
/**
|
|
100
|
+
* Logger do app (subconjunto `warn`), usado pela checagem de vazamento para
|
|
101
|
+
* registrar falhas fail-safe (timeout/rede). Ausente → silencioso.
|
|
102
|
+
*/
|
|
103
|
+
logger?: PwnedLogger;
|
|
104
|
+
/**
|
|
105
|
+
* Seam de injeção do cliente HTTP da checagem de vazamento (HIBP). Default: o
|
|
106
|
+
* `fetch` nativo. Existe para testes — produção não precisa fornecer.
|
|
107
|
+
*/
|
|
108
|
+
pwnedFetch?: FetchLike;
|
|
109
|
+
/**
|
|
110
|
+
* Models Lucid para organizations (multi-tenancy). Quando os três forem fornecidos,
|
|
111
|
+
* a capacidade `OrganizationsCapability` fica disponível no store. Os models devem
|
|
112
|
+
* ser tabelas `auth_organizations`, `auth_organization_members` e
|
|
113
|
+
* `auth_organization_invitations`. Ausente → capability AUSENTE (sem tabelas = desligado).
|
|
114
|
+
*/
|
|
115
|
+
organizationModels?: {
|
|
116
|
+
OrgModel: any;
|
|
117
|
+
MemberModel: any;
|
|
118
|
+
InvitationModel: any;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Implementação default do {@link AccountStore} sobre um model Lucid composto
|
|
123
|
+
* de `withAuthUser()` + `withCredentials()` (+ opcionalmente `withMfa()`). O
|
|
124
|
+
* model carrega `connection`/`table` (app-específico) e, por convenção, uma
|
|
125
|
+
* coluna `fullName` (mapeada de `name`).
|
|
126
|
+
*
|
|
127
|
+
* Composição por CAPACIDADE: o núcleo + MFA são sempre montados; passkeys
|
|
128
|
+
* (WebAuthn) e account linking por provider só são montados quando o model
|
|
129
|
+
* correspondente é fornecido — caso contrário a capacidade fica ABSENTE (os
|
|
130
|
+
* métodos não existem no objeto retornado, em vez de presentes-mas-lançando).
|
|
131
|
+
*
|
|
132
|
+
* @remarks Para capabilities que dependem de tabelas opcionais (ex.:
|
|
133
|
+
* `auth_password_history`), use {@link lucidAccountStoreAsync} que probe o DB
|
|
134
|
+
* e monta o store já com as capabilities detectadas, sem a necessidade de
|
|
135
|
+
* fornecer um model separado. A versão síncrona (`lucidAccountStore`) é mantida
|
|
136
|
+
* por back-compat — capabilities de tabela ficam AUSENTES nela.
|
|
137
|
+
*/
|
|
138
|
+
export declare function lucidAccountStore(Model: any, options?: LucidAccountStoreOptions): AccountStore;
|
|
139
|
+
/**
|
|
140
|
+
* Options estendidas para uso em testes ou quando o DB é injetado diretamente
|
|
141
|
+
* para o probe de histórico de senhas. Uso interno/avançado.
|
|
142
|
+
*/
|
|
143
|
+
export interface LucidAccountStoreAsyncOptions extends LucidAccountStoreOptions {
|
|
144
|
+
/**
|
|
145
|
+
* Instância de DB Lucid. Quando fornecida, o factory faz o probe da tabela
|
|
146
|
+
* `auth_password_history` e monta a capability automaticamente.
|
|
147
|
+
*/
|
|
148
|
+
db?: any;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Versão assíncrona do {@link lucidAccountStore} que faz o probe de DB para
|
|
152
|
+
* detectar tabelas opcionais (`auth_password_history`) e monta as capabilities
|
|
153
|
+
* correspondentes. Use esta versão quando o `db` está disponível no momento do
|
|
154
|
+
* boot (ex.: no `register_auth_host.ts` ou no `app/providers/auth_provider.ts`).
|
|
155
|
+
*/
|
|
156
|
+
export declare function lucidAccountStoreAsync(Model: any, options?: LucidAccountStoreAsyncOptions): Promise<AccountStore>;
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse, } from '@simplewebauthn/server';
|
|
2
|
+
import { hasTable, } from './lucid_store/shared.js';
|
|
3
|
+
import { buildCore } from './lucid_store/core.js';
|
|
4
|
+
import { buildMfa } from './lucid_store/mfa.js';
|
|
5
|
+
import { buildProviderIdentity } from './lucid_store/provider_identity.js';
|
|
6
|
+
import { buildWebauthn } from './lucid_store/webauthn.js';
|
|
7
|
+
import { buildStatus, buildProfile, buildEmailVerificationStatus, buildDeletion, hasColumn, } from './lucid_store/status_profile.js';
|
|
8
|
+
import { buildOrganizations } from './lucid_store/organizations.js';
|
|
9
|
+
import { buildPasswordHistory, buildPasswordExpiration } from './lucid_store/password_hygiene.js';
|
|
10
|
+
import { PasswordManager } from '../password/password_manager.js';
|
|
11
|
+
let encSvc;
|
|
12
|
+
let encLoading;
|
|
13
|
+
/** Resolve quando o `loadEncryption()` corrente terminar (sucesso OU falha). */
|
|
14
|
+
function loadEncryption() {
|
|
15
|
+
if (encSvc)
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
if (encLoading)
|
|
18
|
+
return encLoading;
|
|
19
|
+
encLoading = import('@adonisjs/core/services/encryption')
|
|
20
|
+
.then((m) => {
|
|
21
|
+
encSvc = m.default;
|
|
22
|
+
})
|
|
23
|
+
.catch(() => {
|
|
24
|
+
/* sem app booted (ex.: testes) → encSvc fica undefined → plaintext */
|
|
25
|
+
});
|
|
26
|
+
return encLoading;
|
|
27
|
+
}
|
|
28
|
+
/** Reset do cache de encryption — uso em testes. */
|
|
29
|
+
export function __resetAppKeyEncryption() {
|
|
30
|
+
encSvc = undefined;
|
|
31
|
+
encLoading = undefined;
|
|
32
|
+
appKeyEncrypterPlaintextWarned = false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Injeta um serviço de encryption fake — uso EXCLUSIVO em testes. Permite exercitar
|
|
36
|
+
* o caminho fail-closed do {@link appKeyEncrypter} (decrypt que lança → null) sem
|
|
37
|
+
* precisar de um app AdonisJS booted. Marca `encLoading` como resolvido para que o
|
|
38
|
+
* encrypter use o serviço imediatamente.
|
|
39
|
+
*/
|
|
40
|
+
export function __setAppKeyEncryptionForTesting(svc) {
|
|
41
|
+
encSvc = svc;
|
|
42
|
+
encLoading = Promise.resolve();
|
|
43
|
+
}
|
|
44
|
+
/** Garante que só logamos UMA vez o aviso de degradação para plaintext (evita flood). */
|
|
45
|
+
let appKeyEncrypterPlaintextWarned = false;
|
|
46
|
+
/**
|
|
47
|
+
* Encrypter default do AuthKit, baseado no `APP_KEY` (`@adonisjs/core/services/encryption`).
|
|
48
|
+
* É o default do {@link lucidAccountStore} — o segredo TOTP é encriptado em repouso
|
|
49
|
+
* sem nenhum wiring no app. Passe `encrypter: false` p/ desligar (plaintext).
|
|
50
|
+
*
|
|
51
|
+
* Resiliente: enquanto o serviço de encryption não está disponível (boot inicial /
|
|
52
|
+
* testes sem app), opera em plaintext; uma vez carregado, encripta de verdade.
|
|
53
|
+
*/
|
|
54
|
+
export function appKeyEncrypter() {
|
|
55
|
+
// Dispara o carregamento do serviço de encryption no boot. A primeira request
|
|
56
|
+
// já o encontra pronto; o `await` interno de `loadEncryption()` é exposto para
|
|
57
|
+
// call-sites que precisem garantir o serviço antes de aceitar escrita.
|
|
58
|
+
loadEncryption();
|
|
59
|
+
return {
|
|
60
|
+
encrypt: (value) => {
|
|
61
|
+
try {
|
|
62
|
+
if (encSvc)
|
|
63
|
+
return encSvc.encrypt(value);
|
|
64
|
+
// M4: degradação para plaintext NÃO é silenciosa. Em vez de gravar o
|
|
65
|
+
// segredo em claro sem rastro, logamos um aviso CLARO (uma vez) para que
|
|
66
|
+
// o operador detecte a anomalia. O valor ainda é retornado as-is para não
|
|
67
|
+
// quebrar contextos de boot/teste sem app, mas o sinal fica visível.
|
|
68
|
+
if (!appKeyEncrypterPlaintextWarned) {
|
|
69
|
+
appKeyEncrypterPlaintextWarned = true;
|
|
70
|
+
console.warn('[authkit] appKeyEncrypter: serviço de encryption indisponível — ' +
|
|
71
|
+
'segredo TOTP sendo gravado em PLAINTEXT. Garanta que o app esteja ' +
|
|
72
|
+
'booted antes da primeira escrita, ou passe `encrypter: false` para ' +
|
|
73
|
+
'opt-out explícito.');
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
decrypt: (value) => {
|
|
82
|
+
try {
|
|
83
|
+
// Com serviço: decrypt real; falha de integridade/formato → null (negar).
|
|
84
|
+
if (encSvc)
|
|
85
|
+
return encSvc.decrypt(value) ?? null;
|
|
86
|
+
// Sem serviço (boot/teste sem app): o valor foi gravado em plaintext (ver
|
|
87
|
+
// encrypt acima), então devolvê-lo as-is é o round-trip correto.
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// M4 (fail-closed): adulteração / ciphertext inválido NÃO degrada para o
|
|
92
|
+
// valor cru (que mascararia a adulteração e poderia devolver o ciphertext
|
|
93
|
+
// como se fosse o segredo). Negamos o fator retornando null.
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Implementação default do {@link AccountStore} sobre um model Lucid composto
|
|
101
|
+
* de `withAuthUser()` + `withCredentials()` (+ opcionalmente `withMfa()`). O
|
|
102
|
+
* model carrega `connection`/`table` (app-específico) e, por convenção, uma
|
|
103
|
+
* coluna `fullName` (mapeada de `name`).
|
|
104
|
+
*
|
|
105
|
+
* Composição por CAPACIDADE: o núcleo + MFA são sempre montados; passkeys
|
|
106
|
+
* (WebAuthn) e account linking por provider só são montados quando o model
|
|
107
|
+
* correspondente é fornecido — caso contrário a capacidade fica ABSENTE (os
|
|
108
|
+
* métodos não existem no objeto retornado, em vez de presentes-mas-lançando).
|
|
109
|
+
*
|
|
110
|
+
* @remarks Para capabilities que dependem de tabelas opcionais (ex.:
|
|
111
|
+
* `auth_password_history`), use {@link lucidAccountStoreAsync} que probe o DB
|
|
112
|
+
* e monta o store já com as capabilities detectadas, sem a necessidade de
|
|
113
|
+
* fornecer um model separado. A versão síncrona (`lucidAccountStore`) é mantida
|
|
114
|
+
* por back-compat — capabilities de tabela ficam AUSENTES nela.
|
|
115
|
+
*/
|
|
116
|
+
export function lucidAccountStore(Model, options = {}) {
|
|
117
|
+
const mfaIssuer = options.mfaIssuer ?? 'AuthKit';
|
|
118
|
+
const recoveryCodeCount = options.recoveryCodeCount ?? 8;
|
|
119
|
+
// Default seguro: encripta o TOTP com APP_KEY. `false` desliga (plaintext).
|
|
120
|
+
const encrypter = options.encrypter === false ? undefined : (options.encrypter ?? appKeyEncrypter());
|
|
121
|
+
const ProviderIdentityModel = options.providerIdentityModel;
|
|
122
|
+
const WebauthnCredentialModel = options.webauthnCredentialModel;
|
|
123
|
+
const OrgModels = options.organizationModels;
|
|
124
|
+
// RP do WebAuthn: usado nas cerimônias. Default do rpName cai no mfaIssuer.
|
|
125
|
+
const webauthn = options.webauthn ?? {
|
|
126
|
+
rpName: mfaIssuer,
|
|
127
|
+
rpId: 'localhost',
|
|
128
|
+
origin: 'http://localhost',
|
|
129
|
+
};
|
|
130
|
+
// Cerimônias WebAuthn: reais por default, injetáveis para testes.
|
|
131
|
+
const ceremonies = {
|
|
132
|
+
generateRegistrationOptions,
|
|
133
|
+
verifyRegistrationResponse,
|
|
134
|
+
generateAuthenticationOptions,
|
|
135
|
+
verifyAuthenticationResponse,
|
|
136
|
+
...options.webauthnCeremonies,
|
|
137
|
+
};
|
|
138
|
+
const passwords = new PasswordManager(options.password, {
|
|
139
|
+
logger: options.logger,
|
|
140
|
+
fetchImpl: options.pwnedFetch,
|
|
141
|
+
});
|
|
142
|
+
const ctx = {
|
|
143
|
+
Model,
|
|
144
|
+
mfaIssuer,
|
|
145
|
+
recoveryCodeCount,
|
|
146
|
+
passwords,
|
|
147
|
+
audit: options.audit,
|
|
148
|
+
// Encripta o segredo antes de persistir (no-op sem encrypter).
|
|
149
|
+
sealSecret: (secret) => (encrypter ? encrypter.encrypt(secret) : secret),
|
|
150
|
+
// Decripta o segredo armazenado; retorna null em falha/adulteração (no-op sem encrypter).
|
|
151
|
+
openSecret: (stored) => {
|
|
152
|
+
if (!stored)
|
|
153
|
+
return null;
|
|
154
|
+
if (!encrypter)
|
|
155
|
+
return stored;
|
|
156
|
+
return encrypter.decrypt(stored);
|
|
157
|
+
},
|
|
158
|
+
toAccount: (row) => ({
|
|
159
|
+
id: row.id,
|
|
160
|
+
email: row.email,
|
|
161
|
+
globalRoles: row.globalRoles ?? [],
|
|
162
|
+
name: row.fullName ?? undefined,
|
|
163
|
+
avatarUrl: row.avatarUrl ?? undefined,
|
|
164
|
+
}),
|
|
165
|
+
// nativeVerifyHash: usa o verifyPassword do model para verificar hashes históricos.
|
|
166
|
+
nativeVerifyHash: async (hash, plain) => {
|
|
167
|
+
// Cria uma instância temporária do model só para usar o método de hash.
|
|
168
|
+
try {
|
|
169
|
+
const tempRow = new Model();
|
|
170
|
+
tempRow.password = hash;
|
|
171
|
+
// verifyPassword é injetado pelo mixin withAuthUser.
|
|
172
|
+
if (typeof tempRow.verifyPassword === 'function') {
|
|
173
|
+
return tempRow.verifyPassword(plain);
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
// Núcleo + MFA são sempre presentes. Passkeys e provider-identity só entram
|
|
183
|
+
// quando o model correspondente foi fornecido (capacidade genuinamente ausente
|
|
184
|
+
// quando não configurada).
|
|
185
|
+
const store = {
|
|
186
|
+
...buildCore(ctx),
|
|
187
|
+
...buildMfa(ctx),
|
|
188
|
+
...(ProviderIdentityModel ? buildProviderIdentity(ctx, ProviderIdentityModel) : {}),
|
|
189
|
+
...(WebauthnCredentialModel
|
|
190
|
+
? buildWebauthn(ctx, WebauthnCredentialModel, webauthn, ceremonies)
|
|
191
|
+
: {}),
|
|
192
|
+
// Status (disable/enable) só quando o model tem a coluna `disabled_at`.
|
|
193
|
+
...(hasColumn(Model, 'disabledAt') ? buildStatus(ctx) : {}),
|
|
194
|
+
// Perfil (nome/avatar) só quando o model tem ao menos uma das colunas.
|
|
195
|
+
...(hasColumn(Model, 'fullName') || hasColumn(Model, 'avatarUrl')
|
|
196
|
+
? buildProfile(ctx)
|
|
197
|
+
: {}),
|
|
198
|
+
// Estado de verificação de e-mail (leitura) só quando o model tem a coluna.
|
|
199
|
+
...(hasColumn(Model, 'emailVerifiedAt') ? buildEmailVerificationStatus(ctx) : {}),
|
|
200
|
+
// Deleção da conta: sempre disponível (qualquer model Lucid pode deletar).
|
|
201
|
+
...buildDeletion(ctx),
|
|
202
|
+
// Expiração de senha: só quando o model tem a coluna `password_changed_at`.
|
|
203
|
+
...(hasColumn(Model, 'passwordChangedAt') ? buildPasswordExpiration(ctx) : {}),
|
|
204
|
+
// Organizations (multi-tenancy): só quando os três models foram fornecidos.
|
|
205
|
+
...(OrgModels
|
|
206
|
+
? buildOrganizations({
|
|
207
|
+
OrgModel: OrgModels.OrgModel,
|
|
208
|
+
MemberModel: OrgModels.MemberModel,
|
|
209
|
+
InvitationModel: OrgModels.InvitationModel,
|
|
210
|
+
findAccountEmail: async (accountId) => {
|
|
211
|
+
const row = await Model.find(accountId);
|
|
212
|
+
return row?.email ?? null;
|
|
213
|
+
},
|
|
214
|
+
})
|
|
215
|
+
: {}),
|
|
216
|
+
// Config de senha resolvida — exposta (não-enumerável) para o authkit:doctor
|
|
217
|
+
// inspecionar policy/checkPwned. NÃO faz parte do contrato AccountStore.
|
|
218
|
+
__passwordConfig: passwords.config,
|
|
219
|
+
// Pepper configurado — exposto para o doctor verificar.
|
|
220
|
+
__pepper: passwords.pepper,
|
|
221
|
+
// PasswordManager exposto para controllers poderem aplicar pepper e verificar.
|
|
222
|
+
__passwordManager: passwords,
|
|
223
|
+
// Helper para o controller buscar o hash atual antes de gravar no histórico.
|
|
224
|
+
__getRawRow: async (accountId) => {
|
|
225
|
+
try {
|
|
226
|
+
return await Model.find(accountId);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
/**
|
|
233
|
+
* Nome da conexão Lucid usada por este store (deriva de `Model.connection`).
|
|
234
|
+
* Exposto para que os call-sites de RuntimeSettings possam passar
|
|
235
|
+
* `{ connection: store.connectionName }` e usar a conexão correta.
|
|
236
|
+
* Undefined quando o model usa a conexão default (back-compat total).
|
|
237
|
+
* NÃO faz parte do contrato AccountStore.
|
|
238
|
+
*/
|
|
239
|
+
connectionName: Model.connection ?? undefined,
|
|
240
|
+
/**
|
|
241
|
+
* mfaIssuer/webauthn deste store — expostos para o `defineConfig` REUSAR e o
|
|
242
|
+
* consumidor declarar UMA vez (evita repetir mfaIssuer/webauthn no top-level do
|
|
243
|
+
* defineConfig E aqui). NÃO fazem parte do contrato AccountStore.
|
|
244
|
+
*/
|
|
245
|
+
__mfaIssuer: mfaIssuer,
|
|
246
|
+
__webauthn: options.webauthn,
|
|
247
|
+
};
|
|
248
|
+
// Histórico de senhas: capability-probed via tabela `auth_password_history`.
|
|
249
|
+
// A versão síncrona não pode fazer o probe de DB, então a capability fica
|
|
250
|
+
// AUSENTE aqui. Use `lucidAccountStoreAsync` para probe automático, OU injete
|
|
251
|
+
// o `passwordHistoryDb` nas options para montagem síncrona com DB explícito.
|
|
252
|
+
const passwordHistoryDb = options.passwordHistoryDb;
|
|
253
|
+
if (passwordHistoryDb) {
|
|
254
|
+
Object.assign(store, buildPasswordHistory(ctx, passwordHistoryDb));
|
|
255
|
+
}
|
|
256
|
+
return store;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Versão assíncrona do {@link lucidAccountStore} que faz o probe de DB para
|
|
260
|
+
* detectar tabelas opcionais (`auth_password_history`) e monta as capabilities
|
|
261
|
+
* correspondentes. Use esta versão quando o `db` está disponível no momento do
|
|
262
|
+
* boot (ex.: no `register_auth_host.ts` ou no `app/providers/auth_provider.ts`).
|
|
263
|
+
*/
|
|
264
|
+
export async function lucidAccountStoreAsync(Model, options = {}) {
|
|
265
|
+
const { db, ...rest } = options;
|
|
266
|
+
const base = lucidAccountStore(Model, rest);
|
|
267
|
+
if (db) {
|
|
268
|
+
// Probe da tabela auth_password_history.
|
|
269
|
+
const historyPresent = await hasTable(db, 'auth_password_history');
|
|
270
|
+
if (historyPresent) {
|
|
271
|
+
const ctx = {
|
|
272
|
+
Model,
|
|
273
|
+
mfaIssuer: options.mfaIssuer ?? 'AuthKit',
|
|
274
|
+
recoveryCodeCount: options.recoveryCodeCount ?? 8,
|
|
275
|
+
passwords: new PasswordManager(options.password, {
|
|
276
|
+
logger: options.logger,
|
|
277
|
+
fetchImpl: options.pwnedFetch,
|
|
278
|
+
}),
|
|
279
|
+
audit: options.audit,
|
|
280
|
+
sealSecret: (s) => s,
|
|
281
|
+
openSecret: (s) => s ?? null,
|
|
282
|
+
toAccount: (row) => ({
|
|
283
|
+
id: row.id,
|
|
284
|
+
email: row.email,
|
|
285
|
+
globalRoles: row.globalRoles ?? [],
|
|
286
|
+
name: row.fullName ?? undefined,
|
|
287
|
+
avatarUrl: row.avatarUrl ?? undefined,
|
|
288
|
+
}),
|
|
289
|
+
};
|
|
290
|
+
Object.assign(base, buildPasswordHistory(ctx, db));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return base;
|
|
294
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AccountImportCapability, AccountSecurityCapability, CoreAccountStore, MagicLinkCapability } from '../account_store.js';
|
|
2
|
+
import type { LucidStoreContext } from './shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Núcleo SEMPRE presente do {@link CoreAccountStore} sobre um model Lucid:
|
|
5
|
+
* identidade, cadastro, reset de senha, verificação de e-mail, administração
|
|
6
|
+
* (listagem paginada + roles globais) e o self-service de segurança
|
|
7
|
+
* ({@link AccountSecurityCapability}: trocar senha/e-mail).
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildCore(ctx: LucidStoreContext): CoreAccountStore & AccountSecurityCapability & MagicLinkCapability & AccountImportCapability;
|