@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,167 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { extname } from 'node:path';
|
|
3
|
+
import { getAdminPrefix } from '../admin_prefix.js';
|
|
4
|
+
// ─── Shell HTML cache ─────────────────────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Points to the Vite-built index.html inside build/host/ui-dist/.
|
|
7
|
+
* Falls back to the old placeholder in src/host/ui/admin.html when the dist
|
|
8
|
+
* is absent (dev environment without a prior build).
|
|
9
|
+
*/
|
|
10
|
+
const UI_DIST_URL = new URL('../../host/ui-dist/index.html', import.meta.url);
|
|
11
|
+
const UI_FALLBACK_URL = new URL('../ui/admin.html', import.meta.url);
|
|
12
|
+
/** Cached raw shell HTML (loaded once per process). */
|
|
13
|
+
let _shellHtml = null;
|
|
14
|
+
let _shellSource = null;
|
|
15
|
+
async function loadShell() {
|
|
16
|
+
if (_shellHtml !== null && _shellSource !== null) {
|
|
17
|
+
return { html: _shellHtml, source: _shellSource };
|
|
18
|
+
}
|
|
19
|
+
// Try the built dist first.
|
|
20
|
+
try {
|
|
21
|
+
_shellHtml = await readFile(UI_DIST_URL, 'utf-8');
|
|
22
|
+
_shellSource = 'dist';
|
|
23
|
+
return { html: _shellHtml, source: 'dist' };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Fall through to legacy placeholder.
|
|
27
|
+
}
|
|
28
|
+
// Try legacy placeholder.
|
|
29
|
+
try {
|
|
30
|
+
_shellHtml = await readFile(UI_FALLBACK_URL, 'utf-8');
|
|
31
|
+
_shellSource = 'fallback';
|
|
32
|
+
return { html: _shellHtml, source: 'fallback' };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Return a minimal error shell.
|
|
36
|
+
const err = `<!doctype html><html><head><title>AuthKit Admin — Build Required</title>
|
|
37
|
+
<style>body{font-family:system-ui;background:#07070d;color:#e9e9f4;display:flex;align-items:center;justify-content:center;height:100vh;margin:0}
|
|
38
|
+
.box{max-width:480px;text-align:center;padding:32px}h1{font-size:18px;margin-bottom:12px;color:#625fff}
|
|
39
|
+
p{color:#9292ac;font-size:13px;line-height:1.6}code{background:#12121f;border:1px solid rgba(151,151,196,.15);padding:2px 8px;border-radius:4px;font-family:monospace}</style>
|
|
40
|
+
</head><body><div class="box">
|
|
41
|
+
<h1>AuthKit Admin — Build Required</h1>
|
|
42
|
+
<p>The React SPA has not been built yet. Run:<br><code>pnpm --filter @adonis-agora/authkit-server build</code><br>
|
|
43
|
+
then restart the server.</p>
|
|
44
|
+
</div></body></html>`;
|
|
45
|
+
_shellHtml = err;
|
|
46
|
+
_shellSource = 'fallback';
|
|
47
|
+
return { html: err, source: 'fallback' };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ─── Config injection ─────────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Injects `window.__AUTHKIT__` into the HTML shell right after `<body>`.
|
|
53
|
+
* Also rewrites `/__AUTHKIT_BASE__/` → actual adminBase so all asset URLs
|
|
54
|
+
* produced by Vite (base: '/__AUTHKIT_BASE__/') resolve correctly at runtime.
|
|
55
|
+
*/
|
|
56
|
+
function prepareShell(html, config) {
|
|
57
|
+
const adminBase = config.adminBase;
|
|
58
|
+
// 1. Rewrite the Vite placeholder base in ALL occurrences (src/href attributes).
|
|
59
|
+
// Vite puts `/__AUTHKIT_BASE__/assets/foo.js` so we rewrite `/__AUTHKIT_BASE__/`
|
|
60
|
+
// to `${adminBase}/` so asset URLs become `${adminBase}/assets/foo.js`.
|
|
61
|
+
const rewritten = html.replaceAll('/__AUTHKIT_BASE__/', `${adminBase}/`);
|
|
62
|
+
// 2. Inject config script right after <body>.
|
|
63
|
+
const script = `<script>window.__AUTHKIT__=${JSON.stringify(config)};</script>`;
|
|
64
|
+
const bodyIdx = rewritten.indexOf('<body');
|
|
65
|
+
if (bodyIdx === -1)
|
|
66
|
+
return script + rewritten;
|
|
67
|
+
const closeIdx = rewritten.indexOf('>', bodyIdx);
|
|
68
|
+
if (closeIdx === -1)
|
|
69
|
+
return script + rewritten;
|
|
70
|
+
return rewritten.slice(0, closeIdx + 1) + script + rewritten.slice(closeIdx + 1);
|
|
71
|
+
}
|
|
72
|
+
// ─── MIME types for static assets ────────────────────────────────────────────
|
|
73
|
+
const MIME = {
|
|
74
|
+
'.js': 'application/javascript; charset=utf-8',
|
|
75
|
+
'.mjs': 'application/javascript; charset=utf-8',
|
|
76
|
+
'.css': 'text/css; charset=utf-8',
|
|
77
|
+
'.svg': 'image/svg+xml',
|
|
78
|
+
'.png': 'image/png',
|
|
79
|
+
'.jpg': 'image/jpeg',
|
|
80
|
+
'.jpeg': 'image/jpeg',
|
|
81
|
+
'.gif': 'image/gif',
|
|
82
|
+
'.webp': 'image/webp',
|
|
83
|
+
'.woff': 'font/woff',
|
|
84
|
+
'.woff2': 'font/woff2',
|
|
85
|
+
'.ttf': 'font/ttf',
|
|
86
|
+
'.ico': 'image/x-icon',
|
|
87
|
+
'.json': 'application/json',
|
|
88
|
+
'.map': 'application/json',
|
|
89
|
+
};
|
|
90
|
+
// ─── Controller ───────────────────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Controla o serving do console admin React (Missão B).
|
|
93
|
+
*
|
|
94
|
+
* `serve` — serve o shell HTML (SPA) para TODAS as rotas de página do console.
|
|
95
|
+
* `serveAsset` — serve arquivos estáticos do build (JS/CSS/fonts/images) com cache.
|
|
96
|
+
*
|
|
97
|
+
* O shell HTML é o index.html produzido pelo Vite build em `build/host/ui-dist/`.
|
|
98
|
+
* O servidor injeta `window.__AUTHKIT__` e reescreve o placeholder de base dinâmica
|
|
99
|
+
* `/__AUTHKIT_BASE__/` → `${adminBase}/assets/` para que todos os imports de assets
|
|
100
|
+
* Vite resolvam corretamente independente do prefixo admin configurado.
|
|
101
|
+
*
|
|
102
|
+
* Se o dist não existir (ambiente de dev sem build prévia), serve o placeholder HTML
|
|
103
|
+
* legado de `src/host/ui/admin.html` com uma mensagem de instrução.
|
|
104
|
+
*/
|
|
105
|
+
export default class AdminShellController {
|
|
106
|
+
/**
|
|
107
|
+
* GET {prefix} — serve o shell HTML da SPA.
|
|
108
|
+
* GET {prefix}/* — idem (qualquer rota de página é tratada pela SPA via hash-routing).
|
|
109
|
+
*/
|
|
110
|
+
async serve(ctx) {
|
|
111
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
112
|
+
const cfg = service.config;
|
|
113
|
+
// Resolve currentUser da sessão ativa.
|
|
114
|
+
const { ACCOUNT_SESSION_KEY } = await import('../middleware/account_auth.js');
|
|
115
|
+
const accountId = ctx.session?.get(ACCOUNT_SESSION_KEY);
|
|
116
|
+
let currentUser = null;
|
|
117
|
+
if (accountId) {
|
|
118
|
+
const account = await cfg.accountStore.findById(accountId);
|
|
119
|
+
if (account) {
|
|
120
|
+
currentUser = {
|
|
121
|
+
id: account.id,
|
|
122
|
+
email: account.email,
|
|
123
|
+
roles: account.globalRoles ?? [],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const adminBase = getAdminPrefix();
|
|
128
|
+
const authkitConfig = {
|
|
129
|
+
adminBase,
|
|
130
|
+
csrfToken: ctx.request.csrfToken ?? null,
|
|
131
|
+
locale: cfg.locale ?? 'en',
|
|
132
|
+
messages: cfg.messages ?? {},
|
|
133
|
+
currentUser,
|
|
134
|
+
endpoints: {
|
|
135
|
+
api: `${adminBase}/api`,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
const { html: rawHtml } = await loadShell();
|
|
139
|
+
const html = prepareShell(rawHtml, authkitConfig);
|
|
140
|
+
ctx.response.type('text/html').send(html);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* GET {prefix}/assets/:file(*) — serve assets estáticos do Vite build.
|
|
144
|
+
* Os assets do Vite têm hash no nome → cache agressivo (1 ano).
|
|
145
|
+
*/
|
|
146
|
+
async serveAsset(ctx) {
|
|
147
|
+
// AdonisJS wildcard route `*` → params['*'] is an array of path segments.
|
|
148
|
+
const wildcardParams = ctx.request.params()['*'];
|
|
149
|
+
const file = Array.isArray(wildcardParams) ? wildcardParams.join('/') : String(wildcardParams ?? '');
|
|
150
|
+
if (!file || file.includes('..') || file.includes('\0')) {
|
|
151
|
+
return ctx.response.notFound();
|
|
152
|
+
}
|
|
153
|
+
const assetUrl = new URL(`../../host/ui-dist/assets/${file}`, import.meta.url);
|
|
154
|
+
try {
|
|
155
|
+
const content = await readFile(assetUrl);
|
|
156
|
+
const ext = extname(file).toLowerCase();
|
|
157
|
+
const mime = MIME[ext] ?? 'application/octet-stream';
|
|
158
|
+
ctx.response
|
|
159
|
+
.type(mime)
|
|
160
|
+
.header('Cache-Control', 'public, max-age=31536000, immutable')
|
|
161
|
+
.send(content);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
ctx.response.notFound();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoints JSON do log de auditoria do console admin React.
|
|
5
|
+
*
|
|
6
|
+
* GET {prefix}/api/audit?type=&page=&limit= → listagem paginada
|
|
7
|
+
*
|
|
8
|
+
* 404 honesto (`capability_unsupported`) quando o sink não suporta consulta.
|
|
9
|
+
*/
|
|
10
|
+
export default class ConsoleAuditController {
|
|
11
|
+
index(ctx: HttpContext): Promise<void | {
|
|
12
|
+
data: any;
|
|
13
|
+
total: any;
|
|
14
|
+
page: number;
|
|
15
|
+
limit: number;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { auditDto, apiError } from '../admin_api/dto.js';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoints JSON do log de auditoria do console admin React.
|
|
5
|
+
*
|
|
6
|
+
* GET {prefix}/api/audit?type=&page=&limit= → listagem paginada
|
|
7
|
+
*
|
|
8
|
+
* 404 honesto (`capability_unsupported`) quando o sink não suporta consulta.
|
|
9
|
+
*/
|
|
10
|
+
export default class ConsoleAuditController {
|
|
11
|
+
async index(ctx) {
|
|
12
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
13
|
+
const cfg = service.config;
|
|
14
|
+
const sink = cfg.audit;
|
|
15
|
+
if (!sink || typeof sink.list !== 'function') {
|
|
16
|
+
return ctx.response.notFound(apiError('capability_unsupported', 'O sink de auditoria configurado não suporta consulta.'));
|
|
17
|
+
}
|
|
18
|
+
const page = Math.max(1, Number.parseInt(ctx.request.input('page', '1'), 10) || 1);
|
|
19
|
+
const limit = Math.max(1, Math.min(100, Number.parseInt(ctx.request.input('limit', '20'), 10) || 20));
|
|
20
|
+
const type = ctx.request.input('type')?.trim() || undefined;
|
|
21
|
+
const subject = ctx.request.input('subject')?.trim() || undefined;
|
|
22
|
+
const result = await sink.list({ page, limit, type, subject });
|
|
23
|
+
return { data: result.data.map(auditDto), total: result.total, page, limit };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoints JSON de clients OIDC do console admin React.
|
|
5
|
+
*
|
|
6
|
+
* GET {prefix}/api/clients → lista clients dinâmicos
|
|
7
|
+
* POST {prefix}/api/clients → criar client (secret retornado UMA vez)
|
|
8
|
+
* PATCH {prefix}/api/clients/:id → atualizar metadata
|
|
9
|
+
* DELETE {prefix}/api/clients/:id → remover client
|
|
10
|
+
* POST {prefix}/api/clients/:id/regenerate-secret → gerar novo secret
|
|
11
|
+
*/
|
|
12
|
+
export default class ConsoleClientsController {
|
|
13
|
+
/** GET {prefix}/api/clients */
|
|
14
|
+
index(ctx: HttpContext): Promise<{
|
|
15
|
+
data: {
|
|
16
|
+
clientId: string;
|
|
17
|
+
confidential: boolean;
|
|
18
|
+
grants: string[];
|
|
19
|
+
redirectUris: string[];
|
|
20
|
+
postLogoutRedirectUris: string[];
|
|
21
|
+
tokenEndpointAuthMethod: string;
|
|
22
|
+
backchannelLogoutUri: string | null;
|
|
23
|
+
backchannelLogoutSessionRequired: boolean;
|
|
24
|
+
}[];
|
|
25
|
+
canList: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
/** POST {prefix}/api/clients */
|
|
28
|
+
store(ctx: HttpContext): Promise<{
|
|
29
|
+
clientId: string;
|
|
30
|
+
clientSecret: string | null;
|
|
31
|
+
}>;
|
|
32
|
+
/** PATCH {prefix}/api/clients/:id */
|
|
33
|
+
update(ctx: HttpContext): Promise<void | {
|
|
34
|
+
clientId: string;
|
|
35
|
+
confidential: boolean;
|
|
36
|
+
grants: string[];
|
|
37
|
+
redirectUris: string[];
|
|
38
|
+
postLogoutRedirectUris: string[];
|
|
39
|
+
tokenEndpointAuthMethod: string;
|
|
40
|
+
backchannelLogoutUri: string | null;
|
|
41
|
+
backchannelLogoutSessionRequired: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
/** DELETE {prefix}/api/clients/:id */
|
|
44
|
+
destroy(ctx: HttpContext): Promise<void | {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
deleted: string;
|
|
47
|
+
}>;
|
|
48
|
+
/** POST {prefix}/api/clients/:id/regenerate-secret */
|
|
49
|
+
regenerateSecret(ctx: HttpContext): Promise<void | {
|
|
50
|
+
clientId: string;
|
|
51
|
+
clientSecret: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { AdminClientsService } from '../admin_clients_service.js';
|
|
3
|
+
import { clientDto, createdClientDto, apiError } from '../admin_api/dto.js';
|
|
4
|
+
import { clientInputValidator, clientCreateInput, clientPartialInput } from '../admin_validators.js';
|
|
5
|
+
/**
|
|
6
|
+
* Endpoints JSON de clients OIDC do console admin React.
|
|
7
|
+
*
|
|
8
|
+
* GET {prefix}/api/clients → lista clients dinâmicos
|
|
9
|
+
* POST {prefix}/api/clients → criar client (secret retornado UMA vez)
|
|
10
|
+
* PATCH {prefix}/api/clients/:id → atualizar metadata
|
|
11
|
+
* DELETE {prefix}/api/clients/:id → remover client
|
|
12
|
+
* POST {prefix}/api/clients/:id/regenerate-secret → gerar novo secret
|
|
13
|
+
*/
|
|
14
|
+
export default class ConsoleClientsController {
|
|
15
|
+
/** GET {prefix}/api/clients */
|
|
16
|
+
async index(ctx) {
|
|
17
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
18
|
+
const svc = new AdminClientsService(service);
|
|
19
|
+
if (!svc.canList) {
|
|
20
|
+
return { data: [], canList: false };
|
|
21
|
+
}
|
|
22
|
+
const clients = await svc.list();
|
|
23
|
+
return { data: clients.map(clientDto), canList: true };
|
|
24
|
+
}
|
|
25
|
+
/** POST {prefix}/api/clients */
|
|
26
|
+
async store(ctx) {
|
|
27
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
28
|
+
const cfg = service.config;
|
|
29
|
+
const svc = new AdminClientsService(service);
|
|
30
|
+
const input = clientCreateInput(await ctx.request.validateUsing(clientInputValidator));
|
|
31
|
+
const created = await svc.create(input);
|
|
32
|
+
await cfg.audit?.record({
|
|
33
|
+
type: 'client.created',
|
|
34
|
+
clientId: created.clientId,
|
|
35
|
+
ip: ctx.request.ip?.() ?? null,
|
|
36
|
+
metadata: { actor: 'admin-console' },
|
|
37
|
+
});
|
|
38
|
+
ctx.response.status(201);
|
|
39
|
+
return createdClientDto(created);
|
|
40
|
+
}
|
|
41
|
+
/** PATCH {prefix}/api/clients/:id */
|
|
42
|
+
async update(ctx) {
|
|
43
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
44
|
+
const cfg = service.config;
|
|
45
|
+
const svc = new AdminClientsService(service);
|
|
46
|
+
const id = ctx.request.param('id');
|
|
47
|
+
const existing = await svc.find(id);
|
|
48
|
+
if (!existing)
|
|
49
|
+
return ctx.response.notFound(apiError('not_found', 'Client não encontrado.'));
|
|
50
|
+
await svc.update(id, clientPartialInput(await ctx.request.validateUsing(clientInputValidator)));
|
|
51
|
+
await cfg.audit?.record({
|
|
52
|
+
type: 'client.updated',
|
|
53
|
+
clientId: id,
|
|
54
|
+
ip: ctx.request.ip?.() ?? null,
|
|
55
|
+
metadata: { actor: 'admin-console' },
|
|
56
|
+
});
|
|
57
|
+
const updated = await svc.find(id);
|
|
58
|
+
return clientDto(updated);
|
|
59
|
+
}
|
|
60
|
+
/** DELETE {prefix}/api/clients/:id */
|
|
61
|
+
async destroy(ctx) {
|
|
62
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
63
|
+
const cfg = service.config;
|
|
64
|
+
const svc = new AdminClientsService(service);
|
|
65
|
+
const id = ctx.request.param('id');
|
|
66
|
+
const existing = await svc.find(id);
|
|
67
|
+
if (!existing)
|
|
68
|
+
return ctx.response.notFound(apiError('not_found', 'Client não encontrado.'));
|
|
69
|
+
await svc.delete(id);
|
|
70
|
+
await cfg.audit?.record({
|
|
71
|
+
type: 'client.deleted',
|
|
72
|
+
clientId: id,
|
|
73
|
+
ip: ctx.request.ip?.() ?? null,
|
|
74
|
+
metadata: { actor: 'admin-console' },
|
|
75
|
+
});
|
|
76
|
+
return { ok: true, deleted: id };
|
|
77
|
+
}
|
|
78
|
+
/** POST {prefix}/api/clients/:id/regenerate-secret */
|
|
79
|
+
async regenerateSecret(ctx) {
|
|
80
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
81
|
+
const cfg = service.config;
|
|
82
|
+
const svc = new AdminClientsService(service);
|
|
83
|
+
const id = ctx.request.param('id');
|
|
84
|
+
const existing = await svc.find(id);
|
|
85
|
+
if (!existing)
|
|
86
|
+
return ctx.response.notFound(apiError('not_found', 'Client não encontrado.'));
|
|
87
|
+
let newSecret;
|
|
88
|
+
try {
|
|
89
|
+
newSecret = await svc.regenerateSecret(id);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return ctx.response.status(409).send(apiError('not_applicable', err.message ?? 'Cannot regenerate secret for a public client.'));
|
|
93
|
+
}
|
|
94
|
+
await cfg.audit?.record({
|
|
95
|
+
type: 'client.secret_regenerated',
|
|
96
|
+
clientId: id,
|
|
97
|
+
ip: ctx.request.ip?.() ?? null,
|
|
98
|
+
metadata: { actor: 'admin-console' },
|
|
99
|
+
});
|
|
100
|
+
return { clientId: id, clientSecret: newSecret };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoint JSON do painel de impersonation do console admin React.
|
|
5
|
+
*
|
|
6
|
+
* GET {prefix}/api/impersonation/:userId
|
|
7
|
+
*
|
|
8
|
+
* Retorna os parâmetros RFC 8693 (token exchange) para o admin assumir a
|
|
9
|
+
* identidade de um usuário-alvo. 404 quando impersonation está desabilitado na
|
|
10
|
+
* config ou quando nenhum client tem o grant token-exchange habilitado.
|
|
11
|
+
*/
|
|
12
|
+
export default class ConsoleImpersonationController {
|
|
13
|
+
handle(ctx: HttpContext): Promise<void | {
|
|
14
|
+
tokenEndpoint: string;
|
|
15
|
+
grantType: string;
|
|
16
|
+
subjectTokenType: string;
|
|
17
|
+
requestedSubject: string;
|
|
18
|
+
clientId: string;
|
|
19
|
+
curl: string;
|
|
20
|
+
targetUserId: string;
|
|
21
|
+
targetEmail: any;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { buildImpersonationPanel } from '../impersonation.js';
|
|
3
|
+
import { apiError } from '../admin_api/dto.js';
|
|
4
|
+
import { ACCOUNT_SESSION_KEY } from '../middleware/account_auth.js';
|
|
5
|
+
/**
|
|
6
|
+
* Endpoint JSON do painel de impersonation do console admin React.
|
|
7
|
+
*
|
|
8
|
+
* GET {prefix}/api/impersonation/:userId
|
|
9
|
+
*
|
|
10
|
+
* Retorna os parâmetros RFC 8693 (token exchange) para o admin assumir a
|
|
11
|
+
* identidade de um usuário-alvo. 404 quando impersonation está desabilitado na
|
|
12
|
+
* config ou quando nenhum client tem o grant token-exchange habilitado.
|
|
13
|
+
*/
|
|
14
|
+
export default class ConsoleImpersonationController {
|
|
15
|
+
async handle(ctx) {
|
|
16
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
17
|
+
const cfg = service.config;
|
|
18
|
+
// Impersonation precisa estar explicitamente habilitado no config.
|
|
19
|
+
if (!cfg.admin.impersonation) {
|
|
20
|
+
return ctx.response.notFound(apiError('capability_unsupported', 'Impersonation não está habilitado nesta instalação.'));
|
|
21
|
+
}
|
|
22
|
+
const targetId = ctx.request.param('userId');
|
|
23
|
+
const account = await cfg.accountStore.findById(targetId);
|
|
24
|
+
if (!account) {
|
|
25
|
+
return ctx.response.notFound(apiError('not_found', 'Usuário não encontrado.'));
|
|
26
|
+
}
|
|
27
|
+
const panel = buildImpersonationPanel(cfg, targetId);
|
|
28
|
+
if (!panel) {
|
|
29
|
+
return ctx.response.notFound(apiError('no_token_exchange_client', 'Nenhum client habilitado ao grant token-exchange encontrado.'));
|
|
30
|
+
}
|
|
31
|
+
// Auditoria: acessar o painel é uma intenção de impersonation.
|
|
32
|
+
await cfg.audit?.record({
|
|
33
|
+
type: 'impersonation.started',
|
|
34
|
+
accountId: targetId,
|
|
35
|
+
actorId: ctx.session?.get(ACCOUNT_SESSION_KEY) ?? null,
|
|
36
|
+
ip: ctx.request.ip?.() ?? null,
|
|
37
|
+
metadata: { clientId: panel.clientId, channel: 'admin-console' },
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
targetUserId: targetId,
|
|
41
|
+
targetEmail: account.email,
|
|
42
|
+
...panel,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoints JSON de gestão da chave de assinatura managed para o console admin React.
|
|
5
|
+
*
|
|
6
|
+
* GET {prefix}/api/keys → status da chave (idade + política + ETA)
|
|
7
|
+
* POST {prefix}/api/keys/rotate → rotaciona agora; body: { retire?, keep? }
|
|
8
|
+
*
|
|
9
|
+
* Autenticado por sessão + admin role (adminGuard upstream, NÃO Bearer).
|
|
10
|
+
* Retorna 501 (`not_implemented`) quando o jwks não é managed+store.
|
|
11
|
+
* Espelha a lógica da Admin REST API (api_keys_controller) reutilizando os
|
|
12
|
+
* helpers compartilhados buildKeysStatus/rotateNow de key_rotation_actions.
|
|
13
|
+
*/
|
|
14
|
+
export default class ConsoleKeysController {
|
|
15
|
+
/** GET {prefix}/api/keys — status da chave de assinatura managed (idade + política + ETA). */
|
|
16
|
+
status(ctx: HttpContext): Promise<void | import("../key_rotation_actions.js").KeysStatus>;
|
|
17
|
+
/** POST {prefix}/api/keys/rotate — { retire?, keep? } → rotaciona agora. */
|
|
18
|
+
rotate(ctx: HttpContext): Promise<void | {
|
|
19
|
+
rotated: true;
|
|
20
|
+
newKid: string;
|
|
21
|
+
retiredKids: string[];
|
|
22
|
+
keptKids: string[];
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { resolveRuntimeSettings } from '../runtime_settings.js';
|
|
3
|
+
import { apiError } from '../admin_api/dto.js';
|
|
4
|
+
import { buildKeysStatus, rotateNow } from '../key_rotation_actions.js';
|
|
5
|
+
function notSupported(ctx) {
|
|
6
|
+
return ctx.response
|
|
7
|
+
.status(501)
|
|
8
|
+
.send(apiError('not_implemented', 'jwks não é managed+store.'));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Endpoints JSON de gestão da chave de assinatura managed para o console admin React.
|
|
12
|
+
*
|
|
13
|
+
* GET {prefix}/api/keys → status da chave (idade + política + ETA)
|
|
14
|
+
* POST {prefix}/api/keys/rotate → rotaciona agora; body: { retire?, keep? }
|
|
15
|
+
*
|
|
16
|
+
* Autenticado por sessão + admin role (adminGuard upstream, NÃO Bearer).
|
|
17
|
+
* Retorna 501 (`not_implemented`) quando o jwks não é managed+store.
|
|
18
|
+
* Espelha a lógica da Admin REST API (api_keys_controller) reutilizando os
|
|
19
|
+
* helpers compartilhados buildKeysStatus/rotateNow de key_rotation_actions.
|
|
20
|
+
*/
|
|
21
|
+
export default class ConsoleKeysController {
|
|
22
|
+
/** GET {prefix}/api/keys — status da chave de assinatura managed (idade + política + ETA). */
|
|
23
|
+
async status(ctx) {
|
|
24
|
+
const svc = await ctx.containerResolver.make('authkit.server');
|
|
25
|
+
// RuntimeSettings é opcional (tabela auth_settings ausente → política default).
|
|
26
|
+
const settings = await resolveRuntimeSettings(ctx);
|
|
27
|
+
const status = await buildKeysStatus(svc, settings);
|
|
28
|
+
if (!status)
|
|
29
|
+
return notSupported(ctx);
|
|
30
|
+
return status;
|
|
31
|
+
}
|
|
32
|
+
/** POST {prefix}/api/keys/rotate — { retire?, keep? } → rotaciona agora. */
|
|
33
|
+
async rotate(ctx) {
|
|
34
|
+
const svc = await ctx.containerResolver.make('authkit.server');
|
|
35
|
+
if (typeof svc.rotateKeys !== 'function' ||
|
|
36
|
+
(await svc.keystoreAgeDays?.().catch(() => null)) === null) {
|
|
37
|
+
return notSupported(ctx);
|
|
38
|
+
}
|
|
39
|
+
return rotateNow(svc, ctx.request.body());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
/**
|
|
4
|
+
* Endpoints JSON de organizações do console admin React.
|
|
5
|
+
* 404 honesto quando o store não suporta organizações (`capability_unsupported`).
|
|
6
|
+
*
|
|
7
|
+
* GET {prefix}/api/orgs → lista orgs com contagem de membros
|
|
8
|
+
* POST {prefix}/api/orgs → cria uma org
|
|
9
|
+
* GET {prefix}/api/orgs/:id → detalhe da org (membros + convites)
|
|
10
|
+
* PATCH {prefix}/api/orgs/:id → edita nome/slug/logo
|
|
11
|
+
* DELETE {prefix}/api/orgs/:id → remove a org
|
|
12
|
+
* POST {prefix}/api/orgs/:id/members → adiciona membro (accountId + role)
|
|
13
|
+
* DELETE {prefix}/api/orgs/:id/members/:accountId → remove membro
|
|
14
|
+
* PATCH {prefix}/api/orgs/:id/members/:accountId → altera role do membro
|
|
15
|
+
* POST {prefix}/api/orgs/:id/invitations → cria convite (email + role)
|
|
16
|
+
* DELETE {prefix}/api/orgs/:id/invitations/:invitationId → revoga convite
|
|
17
|
+
*/
|
|
18
|
+
export default class ConsoleOrgsController {
|
|
19
|
+
private svc;
|
|
20
|
+
private actor;
|
|
21
|
+
/** Resolve RuntimeSettings (fail-safe → null) para validação do catálogo de roles. */
|
|
22
|
+
private settings;
|
|
23
|
+
/** GET {prefix}/api/orgs */
|
|
24
|
+
index(ctx: HttpContext): Promise<void | {
|
|
25
|
+
data: {
|
|
26
|
+
memberCount?: number | undefined;
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
slug: string;
|
|
30
|
+
logoUrl: string | null;
|
|
31
|
+
metadata: Record<string, unknown> | null;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
35
|
+
/** POST {prefix}/api/orgs */
|
|
36
|
+
store(ctx: HttpContext): Promise<void>;
|
|
37
|
+
/** GET {prefix}/api/orgs/:id */
|
|
38
|
+
show(ctx: HttpContext): Promise<void | {
|
|
39
|
+
members: {
|
|
40
|
+
accountId: string;
|
|
41
|
+
email: string | null;
|
|
42
|
+
role: string;
|
|
43
|
+
joinedAt: string;
|
|
44
|
+
}[];
|
|
45
|
+
pendingInvitations: {
|
|
46
|
+
id: string;
|
|
47
|
+
organizationId: string;
|
|
48
|
+
email: string;
|
|
49
|
+
role: string;
|
|
50
|
+
invitedBy: string;
|
|
51
|
+
expiresAt: string;
|
|
52
|
+
acceptedAt: string | null;
|
|
53
|
+
createdAt: string;
|
|
54
|
+
}[];
|
|
55
|
+
memberCount?: number | undefined;
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
slug: string;
|
|
59
|
+
logoUrl: string | null;
|
|
60
|
+
metadata: Record<string, unknown> | null;
|
|
61
|
+
createdAt: string;
|
|
62
|
+
}>;
|
|
63
|
+
/** PATCH {prefix}/api/orgs/:id */
|
|
64
|
+
update(ctx: HttpContext): Promise<void | {
|
|
65
|
+
memberCount?: number | undefined;
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
slug: string;
|
|
69
|
+
logoUrl: string | null;
|
|
70
|
+
metadata: Record<string, unknown> | null;
|
|
71
|
+
createdAt: string;
|
|
72
|
+
}>;
|
|
73
|
+
/** DELETE {prefix}/api/orgs/:id */
|
|
74
|
+
destroy(ctx: HttpContext): Promise<void | {
|
|
75
|
+
id: string;
|
|
76
|
+
deleted: boolean;
|
|
77
|
+
}>;
|
|
78
|
+
/** POST {prefix}/api/orgs/:id/members */
|
|
79
|
+
addMember(ctx: HttpContext): Promise<void | {
|
|
80
|
+
ok: boolean;
|
|
81
|
+
}>;
|
|
82
|
+
/** DELETE {prefix}/api/orgs/:id/members/:accountId */
|
|
83
|
+
removeMember(ctx: HttpContext): Promise<void | {
|
|
84
|
+
ok: boolean;
|
|
85
|
+
}>;
|
|
86
|
+
/** PATCH {prefix}/api/orgs/:id/members/:accountId */
|
|
87
|
+
updateMemberRole(ctx: HttpContext): Promise<void | {
|
|
88
|
+
ok: boolean;
|
|
89
|
+
}>;
|
|
90
|
+
/** POST {prefix}/api/orgs/:id/invitations */
|
|
91
|
+
createInvitation(ctx: HttpContext): Promise<void>;
|
|
92
|
+
/** DELETE {prefix}/api/orgs/:id/invitations/:invitationId */
|
|
93
|
+
revokeInvitation(ctx: HttpContext): Promise<void | {
|
|
94
|
+
ok: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
}
|