@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.
Files changed (389) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/build/assets/grafana/authkit-dashboard.json +118 -0
  4. package/build/commands/clients_create.d.ts +27 -0
  5. package/build/commands/clients_create.js +121 -0
  6. package/build/commands/commands.json +292 -0
  7. package/build/commands/configure.d.ts +2 -0
  8. package/build/commands/configure.js +45 -0
  9. package/build/commands/doctor.d.ts +10 -0
  10. package/build/commands/doctor.js +113 -0
  11. package/build/commands/eject.d.ts +11 -0
  12. package/build/commands/eject.js +96 -0
  13. package/build/commands/expire_scan.d.ts +28 -0
  14. package/build/commands/expire_scan.js +92 -0
  15. package/build/commands/import_users.d.ts +17 -0
  16. package/build/commands/import_users.js +80 -0
  17. package/build/commands/keys_rotate.d.ts +21 -0
  18. package/build/commands/keys_rotate.js +126 -0
  19. package/build/commands/main.d.ts +12 -0
  20. package/build/commands/main.js +38 -0
  21. package/build/commands/settings_get.d.ts +18 -0
  22. package/build/commands/settings_get.js +43 -0
  23. package/build/commands/settings_list.d.ts +17 -0
  24. package/build/commands/settings_list.js +39 -0
  25. package/build/commands/settings_set.d.ts +20 -0
  26. package/build/commands/settings_set.js +55 -0
  27. package/build/commands/settings_unset.d.ts +18 -0
  28. package/build/commands/settings_unset.js +46 -0
  29. package/build/commands/ui_preset.d.ts +4 -0
  30. package/build/commands/ui_preset.js +32 -0
  31. package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
  32. package/build/database/migrations/make_authkit_oidc_table.js +19 -0
  33. package/build/host/ui/admin.html +29 -0
  34. package/build/host/views/account/apps.edge +59 -0
  35. package/build/host/views/account/confirm.edge +70 -0
  36. package/build/host/views/account/email-confirmed.edge +16 -0
  37. package/build/host/views/account/login.edge +33 -0
  38. package/build/host/views/account/mfa.edge +152 -0
  39. package/build/host/views/account/orgs.edge +58 -0
  40. package/build/host/views/account/security.edge +215 -0
  41. package/build/host/views/account/tokens.edge +75 -0
  42. package/build/host/views/consent.edge +20 -0
  43. package/build/host/views/forgot.edge +43 -0
  44. package/build/host/views/login.edge +251 -0
  45. package/build/host/views/maintenance.edge +32 -0
  46. package/build/host/views/mfa-challenge.edge +107 -0
  47. package/build/host/views/otp-unlock.edge +40 -0
  48. package/build/host/views/partials/styles.edge +2 -0
  49. package/build/host/views/reset.edge +30 -0
  50. package/build/host/views/signup.edge +62 -0
  51. package/build/host/views/verify-email.edge +17 -0
  52. package/build/index.d.ts +115 -0
  53. package/build/index.js +76 -0
  54. package/build/password/common_passwords.txt +10000 -0
  55. package/build/providers/authkit_server_provider.d.ts +27 -0
  56. package/build/providers/authkit_server_provider.js +242 -0
  57. package/build/src/accounts/account_store.d.ts +578 -0
  58. package/build/src/accounts/account_store.js +60 -0
  59. package/build/src/accounts/lucid_account_store.d.ts +156 -0
  60. package/build/src/accounts/lucid_account_store.js +294 -0
  61. package/build/src/accounts/lucid_store/core.d.ts +9 -0
  62. package/build/src/accounts/lucid_store/core.js +306 -0
  63. package/build/src/accounts/lucid_store/mfa.d.ts +15 -0
  64. package/build/src/accounts/lucid_store/mfa.js +108 -0
  65. package/build/src/accounts/lucid_store/organizations.d.ts +13 -0
  66. package/build/src/accounts/lucid_store/organizations.js +294 -0
  67. package/build/src/accounts/lucid_store/password_hygiene.d.ts +20 -0
  68. package/build/src/accounts/lucid_store/password_hygiene.js +130 -0
  69. package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
  70. package/build/src/accounts/lucid_store/provider_identity.js +59 -0
  71. package/build/src/accounts/lucid_store/shared.d.ts +113 -0
  72. package/build/src/accounts/lucid_store/shared.js +130 -0
  73. package/build/src/accounts/lucid_store/status_profile.d.ts +34 -0
  74. package/build/src/accounts/lucid_store/status_profile.js +100 -0
  75. package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
  76. package/build/src/accounts/lucid_store/webauthn.js +140 -0
  77. package/build/src/accounts/lucid_stores.d.ts +45 -0
  78. package/build/src/accounts/lucid_stores.js +30 -0
  79. package/build/src/adapters/adapter_contract.d.ts +37 -0
  80. package/build/src/adapters/adapter_contract.js +1 -0
  81. package/build/src/adapters/database_adapter.d.ts +21 -0
  82. package/build/src/adapters/database_adapter.js +79 -0
  83. package/build/src/adapters/factory.d.ts +30 -0
  84. package/build/src/adapters/factory.js +43 -0
  85. package/build/src/adapters/redis_adapter.d.ts +24 -0
  86. package/build/src/adapters/redis_adapter.js +122 -0
  87. package/build/src/audit/audit_sink.d.ts +63 -0
  88. package/build/src/audit/audit_sink.js +1 -0
  89. package/build/src/audit/lucid_audit_sink.d.ts +10 -0
  90. package/build/src/audit/lucid_audit_sink.js +99 -0
  91. package/build/src/commands/expire_scan_command.d.ts +60 -0
  92. package/build/src/commands/expire_scan_command.js +229 -0
  93. package/build/src/commands/import_clients.d.ts +40 -0
  94. package/build/src/commands/import_clients.js +79 -0
  95. package/build/src/commands/import_users.d.ts +51 -0
  96. package/build/src/commands/import_users.js +94 -0
  97. package/build/src/commands/resolve_config.d.ts +13 -0
  98. package/build/src/commands/resolve_config.js +18 -0
  99. package/build/src/commands/settings_commands.d.ts +47 -0
  100. package/build/src/commands/settings_commands.js +270 -0
  101. package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
  102. package/build/src/controllers/oidc_callback_controller.js +33 -0
  103. package/build/src/define_config.d.ts +772 -0
  104. package/build/src/define_config.js +351 -0
  105. package/build/src/doctor/checks.d.ts +197 -0
  106. package/build/src/doctor/checks.js +858 -0
  107. package/build/src/events/dispatcher.d.ts +45 -0
  108. package/build/src/events/dispatcher.js +117 -0
  109. package/build/src/host/account_api/account_api_controller.d.ts +245 -0
  110. package/build/src/host/account_api/account_api_controller.js +827 -0
  111. package/build/src/host/account_deletion_ops.d.ts +80 -0
  112. package/build/src/host/account_deletion_ops.js +118 -0
  113. package/build/src/host/account_deletion_service.d.ts +63 -0
  114. package/build/src/host/account_deletion_service.js +133 -0
  115. package/build/src/host/account_export_service.d.ts +76 -0
  116. package/build/src/host/account_export_service.js +140 -0
  117. package/build/src/host/account_home.d.ts +11 -0
  118. package/build/src/host/account_home.js +11 -0
  119. package/build/src/host/account_lockout.d.ts +86 -0
  120. package/build/src/host/account_lockout.js +185 -0
  121. package/build/src/host/active_org_cookie.d.ts +28 -0
  122. package/build/src/host/active_org_cookie.js +47 -0
  123. package/build/src/host/admin_api/admin_api_guard.d.ts +16 -0
  124. package/build/src/host/admin_api/admin_api_guard.js +59 -0
  125. package/build/src/host/admin_api/admin_orgs_service.d.ts +125 -0
  126. package/build/src/host/admin_api/admin_orgs_service.js +324 -0
  127. package/build/src/host/admin_api/admin_users_service.d.ts +163 -0
  128. package/build/src/host/admin_api/admin_users_service.js +308 -0
  129. package/build/src/host/admin_api/api_clients_controller.d.ts +54 -0
  130. package/build/src/host/admin_api/api_clients_controller.js +89 -0
  131. package/build/src/host/admin_api/api_keys_controller.d.ts +19 -0
  132. package/build/src/host/admin_api/api_keys_controller.js +36 -0
  133. package/build/src/host/admin_api/api_misc_controller.d.ts +19 -0
  134. package/build/src/host/admin_api/api_misc_controller.js +44 -0
  135. package/build/src/host/admin_api/api_orgs_controller.d.ts +108 -0
  136. package/build/src/host/admin_api/api_orgs_controller.js +189 -0
  137. package/build/src/host/admin_api/api_settings_controller.d.ts +55 -0
  138. package/build/src/host/admin_api/api_settings_controller.js +134 -0
  139. package/build/src/host/admin_api/api_users_controller.d.ts +108 -0
  140. package/build/src/host/admin_api/api_users_controller.js +187 -0
  141. package/build/src/host/admin_api/dto.d.ts +131 -0
  142. package/build/src/host/admin_api/dto.js +122 -0
  143. package/build/src/host/admin_api/token_verify_service.d.ts +34 -0
  144. package/build/src/host/admin_api/token_verify_service.js +74 -0
  145. package/build/src/host/admin_clients_service.d.ts +88 -0
  146. package/build/src/host/admin_clients_service.js +181 -0
  147. package/build/src/host/admin_console/admin_shell_controller.d.ts +27 -0
  148. package/build/src/host/admin_console/admin_shell_controller.js +167 -0
  149. package/build/src/host/admin_console/console_audit_controller.d.ts +17 -0
  150. package/build/src/host/admin_console/console_audit_controller.js +25 -0
  151. package/build/src/host/admin_console/console_clients_controller.d.ts +53 -0
  152. package/build/src/host/admin_console/console_clients_controller.js +102 -0
  153. package/build/src/host/admin_console/console_impersonation_controller.d.ts +23 -0
  154. package/build/src/host/admin_console/console_impersonation_controller.js +45 -0
  155. package/build/src/host/admin_console/console_keys_controller.d.ts +24 -0
  156. package/build/src/host/admin_console/console_keys_controller.js +41 -0
  157. package/build/src/host/admin_console/console_orgs_controller.d.ts +96 -0
  158. package/build/src/host/admin_console/console_orgs_controller.js +238 -0
  159. package/build/src/host/admin_console/console_overview_controller.d.ts +27 -0
  160. package/build/src/host/admin_console/console_overview_controller.js +44 -0
  161. package/build/src/host/admin_console/console_roles_controller.d.ts +31 -0
  162. package/build/src/host/admin_console/console_roles_controller.js +108 -0
  163. package/build/src/host/admin_console/console_sessions_controller.d.ts +91 -0
  164. package/build/src/host/admin_console/console_sessions_controller.js +125 -0
  165. package/build/src/host/admin_console/console_settings_controller.d.ts +47 -0
  166. package/build/src/host/admin_console/console_settings_controller.js +115 -0
  167. package/build/src/host/admin_console/console_users_controller.d.ts +110 -0
  168. package/build/src/host/admin_console/console_users_controller.js +212 -0
  169. package/build/src/host/admin_prefix.d.ts +50 -0
  170. package/build/src/host/admin_prefix.js +77 -0
  171. package/build/src/host/admin_sessions_service.d.ts +119 -0
  172. package/build/src/host/admin_sessions_service.js +284 -0
  173. package/build/src/host/admin_stats_service.d.ts +44 -0
  174. package/build/src/host/admin_stats_service.js +130 -0
  175. package/build/src/host/admin_validators.d.ts +247 -0
  176. package/build/src/host/admin_validators.js +197 -0
  177. package/build/src/host/augmentations.d.ts +12 -0
  178. package/build/src/host/augmentations.js +1 -0
  179. package/build/src/host/auth_host_config.d.ts +22 -0
  180. package/build/src/host/auth_host_config.js +13 -0
  181. package/build/src/host/avatar_storage.d.ts +68 -0
  182. package/build/src/host/avatar_storage.js +166 -0
  183. package/build/src/host/bot_protection.d.ts +187 -0
  184. package/build/src/host/bot_protection.js +132 -0
  185. package/build/src/host/branding.d.ts +19 -0
  186. package/build/src/host/branding.js +8 -0
  187. package/build/src/host/config_locks.d.ts +38 -0
  188. package/build/src/host/config_locks.js +70 -0
  189. package/build/src/host/console_session.d.ts +27 -0
  190. package/build/src/host/console_session.js +36 -0
  191. package/build/src/host/controllers/account_apps_controller.d.ts +15 -0
  192. package/build/src/host/controllers/account_apps_controller.js +61 -0
  193. package/build/src/host/controllers/account_confirm_controller.d.ts +24 -0
  194. package/build/src/host/controllers/account_confirm_controller.js +144 -0
  195. package/build/src/host/controllers/account_mfa_controller.d.ts +28 -0
  196. package/build/src/host/controllers/account_mfa_controller.js +208 -0
  197. package/build/src/host/controllers/account_orgs_controller.d.ts +80 -0
  198. package/build/src/host/controllers/account_orgs_controller.js +401 -0
  199. package/build/src/host/controllers/account_security_controller.d.ts +43 -0
  200. package/build/src/host/controllers/account_security_controller.js +546 -0
  201. package/build/src/host/controllers/account_session_controller.d.ts +21 -0
  202. package/build/src/host/controllers/account_session_controller.js +113 -0
  203. package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
  204. package/build/src/host/controllers/account_tokens_controller.js +67 -0
  205. package/build/src/host/controllers/interaction_controller.d.ts +125 -0
  206. package/build/src/host/controllers/interaction_controller.js +981 -0
  207. package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
  208. package/build/src/host/controllers/pat_introspection_controller.js +46 -0
  209. package/build/src/host/controllers/registration_controller.d.ts +18 -0
  210. package/build/src/host/controllers/registration_controller.js +382 -0
  211. package/build/src/host/controllers/social_controller.d.ts +8 -0
  212. package/build/src/host/controllers/social_controller.js +89 -0
  213. package/build/src/host/csrf.d.ts +29 -0
  214. package/build/src/host/csrf.js +14 -0
  215. package/build/src/host/default_mailer.d.ts +112 -0
  216. package/build/src/host/default_mailer.js +417 -0
  217. package/build/src/host/durable/account_deletion_workflow.d.ts +48 -0
  218. package/build/src/host/durable/account_deletion_workflow.js +86 -0
  219. package/build/src/host/durable/account_export_workflow.d.ts +68 -0
  220. package/build/src/host/durable/account_export_workflow.js +93 -0
  221. package/build/src/host/durable/index.d.ts +68 -0
  222. package/build/src/host/durable/index.js +77 -0
  223. package/build/src/host/email_templates.d.ts +39 -0
  224. package/build/src/host/email_templates.js +69 -0
  225. package/build/src/host/geo.d.ts +22 -0
  226. package/build/src/host/geo.js +39 -0
  227. package/build/src/host/i18n.d.ts +1416 -0
  228. package/build/src/host/i18n.js +1583 -0
  229. package/build/src/host/impersonation.d.ts +25 -0
  230. package/build/src/host/impersonation.js +31 -0
  231. package/build/src/host/key_rotation.d.ts +14 -0
  232. package/build/src/host/key_rotation.js +27 -0
  233. package/build/src/host/key_rotation_actions.d.ts +42 -0
  234. package/build/src/host/key_rotation_actions.js +27 -0
  235. package/build/src/host/login_attempt.d.ts +98 -0
  236. package/build/src/host/login_attempt.js +211 -0
  237. package/build/src/host/login_notify.d.ts +27 -0
  238. package/build/src/host/login_notify.js +142 -0
  239. package/build/src/host/middleware/account_auth.d.ts +7 -0
  240. package/build/src/host/middleware/account_auth.js +11 -0
  241. package/build/src/host/otp_lockout.d.ts +103 -0
  242. package/build/src/host/otp_lockout.js +221 -0
  243. package/build/src/host/rate_limit.d.ts +39 -0
  244. package/build/src/host/rate_limit.js +94 -0
  245. package/build/src/host/register_auth_host.d.ts +97 -0
  246. package/build/src/host/register_auth_host.js +466 -0
  247. package/build/src/host/renderers/edge_renderer.d.ts +12 -0
  248. package/build/src/host/renderers/edge_renderer.js +38 -0
  249. package/build/src/host/renderers/inertia_renderer.d.ts +70 -0
  250. package/build/src/host/renderers/inertia_renderer.js +54 -0
  251. package/build/src/host/runtime_settings.d.ts +181 -0
  252. package/build/src/host/runtime_settings.js +307 -0
  253. package/build/src/host/runtime_toggles.d.ts +807 -0
  254. package/build/src/host/runtime_toggles.js +784 -0
  255. package/build/src/host/security_notice_service.d.ts +36 -0
  256. package/build/src/host/security_notice_service.js +87 -0
  257. package/build/src/host/session_context.d.ts +23 -0
  258. package/build/src/host/session_context.js +89 -0
  259. package/build/src/host/sudo_mode.d.ts +56 -0
  260. package/build/src/host/sudo_mode.js +99 -0
  261. package/build/src/host/svg_chart.d.ts +15 -0
  262. package/build/src/host/svg_chart.js +45 -0
  263. package/build/src/host/trusted_device.d.ts +61 -0
  264. package/build/src/host/trusted_device.js +65 -0
  265. package/build/src/host/ui-dist/assets/index-CRWcmsex.js +137 -0
  266. package/build/src/host/ui-dist/assets/index-DTSmD4RU.css +1 -0
  267. package/build/src/host/ui-dist/index.html +17 -0
  268. package/build/src/host/user_agent.d.ts +18 -0
  269. package/build/src/host/user_agent.js +50 -0
  270. package/build/src/host/validators.d.ts +127 -0
  271. package/build/src/host/validators.js +53 -0
  272. package/build/src/keys/jwks_manager.d.ts +6 -0
  273. package/build/src/keys/jwks_manager.js +11 -0
  274. package/build/src/keys/keystore.d.ts +52 -0
  275. package/build/src/keys/keystore.js +68 -0
  276. package/build/src/keys/keystore_codec.d.ts +20 -0
  277. package/build/src/keys/keystore_codec.js +42 -0
  278. package/build/src/keys/keystore_crypto.d.ts +9 -0
  279. package/build/src/keys/keystore_crypto.js +27 -0
  280. package/build/src/keys/keystore_manager.d.ts +43 -0
  281. package/build/src/keys/keystore_manager.js +104 -0
  282. package/build/src/keys/keystore_vault.d.ts +113 -0
  283. package/build/src/keys/keystore_vault.js +265 -0
  284. package/build/src/mixins/json_column.d.ts +33 -0
  285. package/build/src/mixins/json_column.js +38 -0
  286. package/build/src/mixins/with_audit_log.d.ts +19 -0
  287. package/build/src/mixins/with_audit_log.js +39 -0
  288. package/build/src/mixins/with_auth_user.d.ts +24 -0
  289. package/build/src/mixins/with_auth_user.js +46 -0
  290. package/build/src/mixins/with_credentials.d.ts +20 -0
  291. package/build/src/mixins/with_credentials.js +29 -0
  292. package/build/src/mixins/with_mfa.d.ts +35 -0
  293. package/build/src/mixins/with_mfa.js +21 -0
  294. package/build/src/mixins/with_personal_access_token.d.ts +19 -0
  295. package/build/src/mixins/with_personal_access_token.js +42 -0
  296. package/build/src/mixins/with_provider_identity.d.ts +20 -0
  297. package/build/src/mixins/with_provider_identity.js +32 -0
  298. package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
  299. package/build/src/mixins/with_webauthn_credential.js +46 -0
  300. package/build/src/observability/diagnostics_bridge.d.ts +6 -0
  301. package/build/src/observability/diagnostics_bridge.js +27 -0
  302. package/build/src/observability/metrics_controller.d.ts +5 -0
  303. package/build/src/observability/metrics_controller.js +24 -0
  304. package/build/src/observability/metrics_service.d.ts +2 -0
  305. package/build/src/observability/metrics_service.js +7 -0
  306. package/build/src/observability/otel_recorder.d.ts +10 -0
  307. package/build/src/observability/otel_recorder.js +59 -0
  308. package/build/src/observability/telescope/data_providers.d.ts +24 -0
  309. package/build/src/observability/telescope/data_providers.js +235 -0
  310. package/build/src/observability/telescope/extension.d.ts +29 -0
  311. package/build/src/observability/telescope/extension.js +167 -0
  312. package/build/src/observability/telescope/index.d.ts +8 -0
  313. package/build/src/observability/telescope/index.js +8 -0
  314. package/build/src/observability/wire_provider_events.d.ts +12 -0
  315. package/build/src/observability/wire_provider_events.js +30 -0
  316. package/build/src/password/common_passwords.d.ts +31 -0
  317. package/build/src/password/common_passwords.js +73 -0
  318. package/build/src/password/password_manager.d.ts +163 -0
  319. package/build/src/password/password_manager.js +191 -0
  320. package/build/src/password/policy.d.ts +71 -0
  321. package/build/src/password/policy.js +55 -0
  322. package/build/src/password/pwned.d.ts +36 -0
  323. package/build/src/password/pwned.js +52 -0
  324. package/build/src/pat/lucid_pat_store.d.ts +6 -0
  325. package/build/src/pat/lucid_pat_store.js +62 -0
  326. package/build/src/pat/pat_store.d.ts +31 -0
  327. package/build/src/pat/pat_store.js +1 -0
  328. package/build/src/pat/pat_tokens.d.ts +4 -0
  329. package/build/src/pat/pat_tokens.js +9 -0
  330. package/build/src/provider/build_provider.d.ts +45 -0
  331. package/build/src/provider/build_provider.js +219 -0
  332. package/build/src/provider/device_sources.d.ts +6 -0
  333. package/build/src/provider/device_sources.js +65 -0
  334. package/build/src/provider/interaction_actions.d.ts +36 -0
  335. package/build/src/provider/interaction_actions.js +55 -0
  336. package/build/src/provider/key_rotation_scheduler.d.ts +28 -0
  337. package/build/src/provider/key_rotation_scheduler.js +40 -0
  338. package/build/src/provider/keystore_reload.d.ts +21 -0
  339. package/build/src/provider/keystore_reload.js +39 -0
  340. package/build/src/provider/logout_sources.d.ts +13 -0
  341. package/build/src/provider/logout_sources.js +64 -0
  342. package/build/src/provider/oidc_service.d.ts +81 -0
  343. package/build/src/provider/oidc_service.js +254 -0
  344. package/build/src/provider/single_flight_lock.d.ts +18 -0
  345. package/build/src/provider/single_flight_lock.js +31 -0
  346. package/build/src/provider/token_exchange.d.ts +21 -0
  347. package/build/src/provider/token_exchange.js +124 -0
  348. package/build/src/register_routes.d.ts +16 -0
  349. package/build/src/register_routes.js +21 -0
  350. package/build/src/schema/ensure.d.ts +41 -0
  351. package/build/src/schema/ensure.js +262 -0
  352. package/build/stubs/config/authkit.stub +20 -0
  353. package/build/stubs/config/authkit_react.stub +52 -0
  354. package/build/stubs/main.d.ts +1 -0
  355. package/build/stubs/main.js +2 -0
  356. package/build/stubs/models/auth_user.stub +22 -0
  357. package/build/stubs/ui/edge/views/consent.edge +13 -0
  358. package/build/stubs/ui/edge/views/login.edge +19 -0
  359. package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
  360. package/build/stubs/ui/react/pages/account/login.tsx +56 -0
  361. package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
  362. package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
  363. package/build/stubs/ui/react/pages/consent.tsx +39 -0
  364. package/build/stubs/ui/react/pages/forgot.tsx +44 -0
  365. package/build/stubs/ui/react/pages/login.tsx +171 -0
  366. package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  367. package/build/stubs/ui/react/pages/reset.tsx +58 -0
  368. package/build/stubs/ui/react/pages/signup.tsx +78 -0
  369. package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
  370. package/build/types.d.ts +7 -0
  371. package/build/types.js +1 -0
  372. package/package.json +147 -0
  373. package/stubs/config/authkit.stub +20 -0
  374. package/stubs/config/authkit_react.stub +52 -0
  375. package/stubs/main.ts +2 -0
  376. package/stubs/models/auth_user.stub +22 -0
  377. package/stubs/ui/edge/views/consent.edge +13 -0
  378. package/stubs/ui/edge/views/login.edge +19 -0
  379. package/stubs/ui/react/components/auth_shell.tsx +67 -0
  380. package/stubs/ui/react/pages/account/login.tsx +56 -0
  381. package/stubs/ui/react/pages/account/mfa.tsx +132 -0
  382. package/stubs/ui/react/pages/account/tokens.tsx +88 -0
  383. package/stubs/ui/react/pages/consent.tsx +39 -0
  384. package/stubs/ui/react/pages/forgot.tsx +44 -0
  385. package/stubs/ui/react/pages/login.tsx +171 -0
  386. package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  387. package/stubs/ui/react/pages/reset.tsx +58 -0
  388. package/stubs/ui/react/pages/signup.tsx +78 -0
  389. package/stubs/ui/react/pages/verify-email.tsx +24 -0
@@ -0,0 +1,80 @@
1
+ import type { OidcService } from "../provider/oidc_service.js";
2
+ import type { ResolvedServerConfig } from "../define_config.js";
3
+ import type { AuthAccount } from "../accounts/account_store.js";
4
+ import type { DeletionActor } from "./account_deletion_service.js";
5
+ /**
6
+ * As 9 etapas do cascade de deleção de conta (LGPD/GDPR) extraídas em operações
7
+ * DISCRETAS e IDEMPOTENTES. Cada uma é chamável individualmente — re-executar uma
8
+ * etapa já concluída é um no-op seguro (o artefato já não existe / já está
9
+ * anonimizado). Isto permite que:
10
+ *
11
+ * - o {@link AccountDeletionService} síncrono as chame em sequência, na MESMA
12
+ * ordem e com a MESMA semântica best-effort de sempre (caminho inalterado);
13
+ * - o workflow durável (subpath `/durable`) envolva cada etapa em um `ctx.step`,
14
+ * ganhando retry por-etapa + resumabilidade SEM duplicar a lógica de negócio.
15
+ *
16
+ * Cada operação retorna o "delta" que produz; o caller acumula no
17
+ * {@link DeletionResult}. Nenhuma operação lança em condições esperadas — o
18
+ * tratamento best-effort (try/catch) é responsabilidade do caller, para manter o
19
+ * comportamento síncrono byte-idêntico ao original.
20
+ */
21
+ /** Snapshot mínimo da conta capturado ANTES da destruição (e-mail + avatar). */
22
+ export interface AccountSnapshot {
23
+ id: string;
24
+ email: string;
25
+ avatarUrl: string | null;
26
+ }
27
+ /**
28
+ * Carrega o snapshot da conta. Retorna null se a conta não existe (ou já foi
29
+ * deletada) — idempotente: re-executar após a deleção da linha devolve null.
30
+ */
31
+ export declare function snapshotAccount(cfg: ResolvedServerConfig, accountId: string): Promise<AccountSnapshot | null>;
32
+ /**
33
+ * 1) Emite o audit `account.deleted` ANTES de qualquer destruição, com os
34
+ * identificadores reais. Idempotente o suficiente: re-emitir registra uma segunda
35
+ * linha (que também será anonimizada) — inofensivo para a trilha de auditoria.
36
+ */
37
+ export declare function auditDeleted(cfg: ResolvedServerConfig, snapshot: AccountSnapshot, actor: DeletionActor): Promise<void>;
38
+ /** 2) Revoga TODAS as sessões + grants do oidc-provider (cascateia os tokens). */
39
+ export declare function revokeSessions(oidc: OidcService, accountId: string): Promise<{
40
+ sessions: number;
41
+ grants: number;
42
+ accessTokens: number;
43
+ refreshTokens: number;
44
+ }>;
45
+ /** 3) Revoga todos os Personal Access Tokens da conta (quando há patStore). */
46
+ export declare function revokePats(cfg: ResolvedServerConfig, accountId: string): Promise<{
47
+ pats: number;
48
+ }>;
49
+ /** 4) Remove todas as passkeys / credenciais WebAuthn (capability-probed). */
50
+ export declare function removePasskeys(cfg: ResolvedServerConfig, accountId: string): Promise<{
51
+ passkeys: number;
52
+ }>;
53
+ /** 5) Desliga o MFA (limpa segredo TOTP + recovery codes) (capability-probed). */
54
+ export declare function disableMfa(cfg: ResolvedServerConfig, accountId: string): Promise<void>;
55
+ /** 6) Desliga as identidades de provider linkadas (capability-probed). */
56
+ export declare function unlinkProviders(cfg: ResolvedServerConfig, accountId: string): Promise<{
57
+ providerIdentities: number;
58
+ }>;
59
+ /** 6b) Remove memberships + convites de organizations (capability-probed). */
60
+ export declare function removeFromOrgs(cfg: ResolvedServerConfig, accountId: string): Promise<{
61
+ orgMemberships: number;
62
+ orgInvitations: number;
63
+ }>;
64
+ /** 7) Apaga o avatar no drive (best-effort, fail-safe). */
65
+ export declare function deleteAccountAvatar(cfg: ResolvedServerConfig, avatarUrl: string | null): Promise<{
66
+ avatarDeleted: boolean;
67
+ }>;
68
+ /** 8) Anonimiza o histórico de audit da conta (quando o sink suporta). */
69
+ export declare function anonymizeAudit(cfg: ResolvedServerConfig, accountId: string): Promise<{
70
+ auditAnonymized: number;
71
+ }>;
72
+ /**
73
+ * 9) Deleta a linha da conta — a ÚLTIMA etapa (forward-only). Idempotente:
74
+ * re-executar após a linha já ter sido deletada devolve `false` (sem efeito).
75
+ */
76
+ export declare function deleteAccountRow(cfg: ResolvedServerConfig, accountId: string): Promise<{
77
+ ok: boolean;
78
+ }>;
79
+ /** Re-export do tipo usado pelos JSDoc acima, p/ conveniência dos consumidores. */
80
+ export type { AuthAccount };
@@ -0,0 +1,118 @@
1
+ import { supportsAccountDeletion, supportsMfa, supportsOrganizations, supportsPasskeys, supportsProviderIdentity, } from "../accounts/account_store.js";
2
+ import { AdminSessionsService } from "./admin_sessions_service.js";
3
+ import { deleteAvatar } from "./avatar_storage.js";
4
+ /**
5
+ * Carrega o snapshot da conta. Retorna null se a conta não existe (ou já foi
6
+ * deletada) — idempotente: re-executar após a deleção da linha devolve null.
7
+ */
8
+ export async function snapshotAccount(cfg, accountId) {
9
+ const account = await cfg.accountStore.findById(accountId);
10
+ if (!account)
11
+ return null;
12
+ return {
13
+ id: account.id,
14
+ email: account.email,
15
+ avatarUrl: account.avatarUrl ?? null,
16
+ };
17
+ }
18
+ /**
19
+ * 1) Emite o audit `account.deleted` ANTES de qualquer destruição, com os
20
+ * identificadores reais. Idempotente o suficiente: re-emitir registra uma segunda
21
+ * linha (que também será anonimizada) — inofensivo para a trilha de auditoria.
22
+ */
23
+ export async function auditDeleted(cfg, snapshot, actor) {
24
+ await cfg.audit?.record({
25
+ type: "account.deleted",
26
+ accountId: snapshot.id,
27
+ email: snapshot.email,
28
+ actorId: actor.actorId,
29
+ ip: actor.ip,
30
+ metadata: { actor: actor.source },
31
+ });
32
+ }
33
+ /** 2) Revoga TODAS as sessões + grants do oidc-provider (cascateia os tokens). */
34
+ export async function revokeSessions(oidc, accountId) {
35
+ const revoke = await new AdminSessionsService(oidc).revokeAll(accountId);
36
+ return {
37
+ sessions: revoke.sessions,
38
+ grants: revoke.grants,
39
+ accessTokens: revoke.accessTokens,
40
+ refreshTokens: revoke.refreshTokens,
41
+ };
42
+ }
43
+ /** 3) Revoga todos os Personal Access Tokens da conta (quando há patStore). */
44
+ export async function revokePats(cfg, accountId) {
45
+ if (!cfg.patStore)
46
+ return { pats: 0 };
47
+ let pats = 0;
48
+ const list = await cfg.patStore.listForAccount(accountId);
49
+ for (const pat of list) {
50
+ const ok = await cfg.patStore.revoke(accountId, pat.id);
51
+ if (ok)
52
+ pats++;
53
+ }
54
+ return { pats };
55
+ }
56
+ /** 4) Remove todas as passkeys / credenciais WebAuthn (capability-probed). */
57
+ export async function removePasskeys(cfg, accountId) {
58
+ const store = cfg.accountStore;
59
+ if (!supportsPasskeys(store))
60
+ return { passkeys: 0 };
61
+ let passkeys = 0;
62
+ const list = await store.listPasskeys(accountId);
63
+ for (const pk of list) {
64
+ await store.removePasskey(accountId, pk.id);
65
+ passkeys++;
66
+ }
67
+ return { passkeys };
68
+ }
69
+ /** 5) Desliga o MFA (limpa segredo TOTP + recovery codes) (capability-probed). */
70
+ export async function disableMfa(cfg, accountId) {
71
+ const store = cfg.accountStore;
72
+ if (!supportsMfa(store))
73
+ return;
74
+ await store.disableMfa(accountId);
75
+ }
76
+ /** 6) Desliga as identidades de provider linkadas (capability-probed). */
77
+ export async function unlinkProviders(cfg, accountId) {
78
+ const store = cfg.accountStore;
79
+ if (!supportsProviderIdentity(store))
80
+ return { providerIdentities: 0 };
81
+ const providerIdentities = await store.unlinkAllProviderIdentities(accountId);
82
+ return { providerIdentities };
83
+ }
84
+ /** 6b) Remove memberships + convites de organizations (capability-probed). */
85
+ export async function removeFromOrgs(cfg, accountId) {
86
+ const store = cfg.accountStore;
87
+ if (!supportsOrganizations(store))
88
+ return { orgMemberships: 0, orgInvitations: 0 };
89
+ const orgResult = await store.removeAccountFromAllOrgs(accountId);
90
+ return {
91
+ orgMemberships: orgResult.memberships,
92
+ orgInvitations: orgResult.invitations,
93
+ };
94
+ }
95
+ /** 7) Apaga o avatar no drive (best-effort, fail-safe). */
96
+ export async function deleteAccountAvatar(cfg, avatarUrl) {
97
+ const avatarDeleted = await deleteAvatar(cfg.uploads, avatarUrl);
98
+ return { avatarDeleted };
99
+ }
100
+ /** 8) Anonimiza o histórico de audit da conta (quando o sink suporta). */
101
+ export async function anonymizeAudit(cfg, accountId) {
102
+ if (cfg.audit && typeof cfg.audit.anonymizeAccount === "function") {
103
+ const auditAnonymized = await cfg.audit.anonymizeAccount(accountId);
104
+ return { auditAnonymized };
105
+ }
106
+ return { auditAnonymized: 0 };
107
+ }
108
+ /**
109
+ * 9) Deleta a linha da conta — a ÚLTIMA etapa (forward-only). Idempotente:
110
+ * re-executar após a linha já ter sido deletada devolve `false` (sem efeito).
111
+ */
112
+ export async function deleteAccountRow(cfg, accountId) {
113
+ const store = cfg.accountStore;
114
+ if (!supportsAccountDeletion(store))
115
+ return { ok: false };
116
+ const ok = await store.deleteAccount(accountId);
117
+ return { ok };
118
+ }
@@ -0,0 +1,63 @@
1
+ import type { OidcService } from "../provider/oidc_service.js";
2
+ /** Quem disparou a deleção (auditoria). 'self' = o próprio usuário; senão admin. */
3
+ export interface DeletionActor {
4
+ /** Id de quem agiu: o próprio user (self-service) ou o admin. null para admin-api. */
5
+ actorId: string | null;
6
+ /** IP da request, quando disponível. */
7
+ ip: string | null;
8
+ /**
9
+ * Origem da deleção (vai no metadata do audit):
10
+ * - 'self' → o próprio usuário no console de conta;
11
+ * - 'admin' → um admin pelo console HTML;
12
+ * - 'admin-api' → via Admin REST API / SDK.
13
+ */
14
+ source: "self" | "admin" | "admin-api";
15
+ }
16
+ /** Contagens do que foi removido no cascade (para auditoria/diagnóstico). */
17
+ export interface DeletionResult {
18
+ ok: boolean;
19
+ sessions: number;
20
+ grants: number;
21
+ accessTokens: number;
22
+ refreshTokens: number;
23
+ pats: number;
24
+ passkeys: number;
25
+ providerIdentities: number;
26
+ /** Linhas de audit anonimizadas (não deletadas). */
27
+ auditAnonymized: number;
28
+ /** Avatar removido do drive (best-effort). */
29
+ avatarDeleted: boolean;
30
+ /** Memberships em organizations removidas. */
31
+ orgMemberships: number;
32
+ /** Convites pendentes de organizations removidos. */
33
+ orgInvitations: number;
34
+ }
35
+ /**
36
+ * Orquestra a deleção COMPLETA de uma conta (LGPD/GDPR — "direito ao
37
+ * esquecimento"), compartilhada entre o self-service (console de conta) e o admin
38
+ * (console HTML + Admin REST API + SDK embedded). O cascade, na ordem:
39
+ *
40
+ * 1. emite o audit `account.deleted` ANTES de qualquer destruição (com o ator
41
+ * correto), para que o evento exista com os identificadores reais;
42
+ * 2. revoga TODAS as sessões + grants do oidc-provider (cascateia os tokens);
43
+ * 3. revoga todos os Personal Access Tokens da conta (quando há patStore);
44
+ * 4. remove todas as passkeys / credenciais WebAuthn (capability-probed);
45
+ * 5. desliga o MFA (limpa segredo TOTP + recovery codes) (capability-probed);
46
+ * 6. desliga as identidades de provider linkadas (capability-probed);
47
+ * 7. apaga o avatar no drive (best-effort, fail-safe);
48
+ * 8. ANONIMIZA o histórico de audit da conta (mantém as linhas, remove os
49
+ * identificadores pessoais) — só quando o sink suporta `anonymizeAccount`;
50
+ * 9. deleta a linha da conta (capability-probed: {@link AccountDeletionCapability}).
51
+ *
52
+ * Capability-probed: se o store não suporta delete, `delete()` retorna
53
+ * `{ ok: false }` e nada é destruído (a UI/admin não deve sequer oferecer a ação).
54
+ * Cada etapa é isolada (best-effort) — uma falha não impede as demais nem a
55
+ * destruição final da conta.
56
+ */
57
+ export declare class AccountDeletionService {
58
+ #private;
59
+ constructor(oidc: OidcService);
60
+ /** Indica se a deleção está disponível (o store suporta hard delete). */
61
+ get canDelete(): boolean;
62
+ delete(accountId: string, actor: DeletionActor): Promise<DeletionResult>;
63
+ }
@@ -0,0 +1,133 @@
1
+ import { supportsAccountDeletion } from "../accounts/account_store.js";
2
+ import { anonymizeAudit, auditDeleted, deleteAccountAvatar, deleteAccountRow, disableMfa, removeFromOrgs, removePasskeys, revokePats, revokeSessions, snapshotAccount, unlinkProviders, } from "./account_deletion_ops.js";
3
+ /**
4
+ * Orquestra a deleção COMPLETA de uma conta (LGPD/GDPR — "direito ao
5
+ * esquecimento"), compartilhada entre o self-service (console de conta) e o admin
6
+ * (console HTML + Admin REST API + SDK embedded). O cascade, na ordem:
7
+ *
8
+ * 1. emite o audit `account.deleted` ANTES de qualquer destruição (com o ator
9
+ * correto), para que o evento exista com os identificadores reais;
10
+ * 2. revoga TODAS as sessões + grants do oidc-provider (cascateia os tokens);
11
+ * 3. revoga todos os Personal Access Tokens da conta (quando há patStore);
12
+ * 4. remove todas as passkeys / credenciais WebAuthn (capability-probed);
13
+ * 5. desliga o MFA (limpa segredo TOTP + recovery codes) (capability-probed);
14
+ * 6. desliga as identidades de provider linkadas (capability-probed);
15
+ * 7. apaga o avatar no drive (best-effort, fail-safe);
16
+ * 8. ANONIMIZA o histórico de audit da conta (mantém as linhas, remove os
17
+ * identificadores pessoais) — só quando o sink suporta `anonymizeAccount`;
18
+ * 9. deleta a linha da conta (capability-probed: {@link AccountDeletionCapability}).
19
+ *
20
+ * Capability-probed: se o store não suporta delete, `delete()` retorna
21
+ * `{ ok: false }` e nada é destruído (a UI/admin não deve sequer oferecer a ação).
22
+ * Cada etapa é isolada (best-effort) — uma falha não impede as demais nem a
23
+ * destruição final da conta.
24
+ */
25
+ export class AccountDeletionService {
26
+ #cfg;
27
+ #oidc;
28
+ constructor(oidc) {
29
+ this.#oidc = oidc;
30
+ this.#cfg = oidc.config;
31
+ }
32
+ /** Indica se a deleção está disponível (o store suporta hard delete). */
33
+ get canDelete() {
34
+ return supportsAccountDeletion(this.#cfg.accountStore);
35
+ }
36
+ async delete(accountId, actor) {
37
+ const cfg = this.#cfg;
38
+ const store = cfg.accountStore;
39
+ const result = {
40
+ ok: false,
41
+ sessions: 0,
42
+ grants: 0,
43
+ accessTokens: 0,
44
+ refreshTokens: 0,
45
+ pats: 0,
46
+ passkeys: 0,
47
+ providerIdentities: 0,
48
+ auditAnonymized: 0,
49
+ avatarDeleted: false,
50
+ orgMemberships: 0,
51
+ orgInvitations: 0,
52
+ };
53
+ if (!supportsAccountDeletion(store))
54
+ return result;
55
+ // Snapshot da conta ANTES de destruir (precisamos do e-mail/avatar p/ audit + drive).
56
+ const snapshot = await snapshotAccount(cfg, accountId);
57
+ if (!snapshot)
58
+ return result;
59
+ // O cascade chama as MESMAS operações idempotentes do `account_deletion_ops`,
60
+ // na MESMA ordem e com a MESMA semântica best-effort (cada etapa isolada). O
61
+ // workflow durável (subpath `/durable`) envolve estas operações em `ctx.step`.
62
+ // 1) Audit `account.deleted` ANTES de anonimizar/destruir — registra com os
63
+ // identificadores reais (a anonimização posterior cuidará desta linha também).
64
+ await auditDeleted(cfg, snapshot, actor);
65
+ // 2) Sessões + grants (cascateia os tokens do oidc-provider).
66
+ try {
67
+ const revoke = await revokeSessions(this.#oidc, accountId);
68
+ result.sessions = revoke.sessions;
69
+ result.grants = revoke.grants;
70
+ result.accessTokens = revoke.accessTokens;
71
+ result.refreshTokens = revoke.refreshTokens;
72
+ }
73
+ catch {
74
+ // best-effort: a destruição da conta segue mesmo se a enumeração falhar.
75
+ }
76
+ // 3) Personal Access Tokens.
77
+ try {
78
+ result.pats = (await revokePats(cfg, accountId)).pats;
79
+ }
80
+ catch {
81
+ /* best-effort */
82
+ }
83
+ // 4) Passkeys / credenciais WebAuthn.
84
+ try {
85
+ result.passkeys = (await removePasskeys(cfg, accountId)).passkeys;
86
+ }
87
+ catch {
88
+ /* best-effort */
89
+ }
90
+ // 5) MFA / TOTP (segredo + recovery codes).
91
+ try {
92
+ await disableMfa(cfg, accountId);
93
+ }
94
+ catch {
95
+ /* best-effort */
96
+ }
97
+ // 6) Identidades de provider linkadas (Google, GitHub, …).
98
+ try {
99
+ result.providerIdentities = (await unlinkProviders(cfg, accountId)).providerIdentities;
100
+ }
101
+ catch {
102
+ /* best-effort */
103
+ }
104
+ // 6b) Organizations: remove memberships + convites da conta (best-effort).
105
+ // Nota: se a conta é o ÚNICO owner de uma org, a org fica sem owner e isso é
106
+ // documentado no JSDoc — a deleção NUNCA é bloqueada por LGPD/GDPR.
107
+ try {
108
+ const orgResult = await removeFromOrgs(cfg, accountId);
109
+ result.orgMemberships = orgResult.orgMemberships;
110
+ result.orgInvitations = orgResult.orgInvitations;
111
+ }
112
+ catch {
113
+ /* best-effort */
114
+ }
115
+ // 7) Avatar no drive (best-effort, fail-safe).
116
+ try {
117
+ result.avatarDeleted = (await deleteAccountAvatar(cfg, snapshot.avatarUrl)).avatarDeleted;
118
+ }
119
+ catch {
120
+ /* best-effort */
121
+ }
122
+ // 8) Anonimiza o histórico de audit (mantém as linhas, remove identificadores).
123
+ try {
124
+ result.auditAnonymized = (await anonymizeAudit(cfg, accountId)).auditAnonymized;
125
+ }
126
+ catch {
127
+ /* best-effort */
128
+ }
129
+ // 9) Deleta a linha da conta.
130
+ result.ok = (await deleteAccountRow(cfg, accountId)).ok;
131
+ return result;
132
+ }
133
+ }
@@ -0,0 +1,76 @@
1
+ import type { OidcService } from "../provider/oidc_service.js";
2
+ /** Payload de export de dados de uma conta (portabilidade — LGPD/GDPR). */
3
+ export interface AccountExport {
4
+ /** Versão do formato do export (para evolução futura). */
5
+ exportVersion: number;
6
+ /** Instante do export (ISO 8601). */
7
+ exportedAt: string;
8
+ /** Perfil (sem hash de senha nem segredos). */
9
+ profile: {
10
+ id: string;
11
+ email: string;
12
+ name: string | null;
13
+ avatarUrl: string | null;
14
+ globalRoles: string[];
15
+ };
16
+ /** Identidades de provider linkadas (SEM tokens). */
17
+ linkedIdentities: Array<{
18
+ provider: string;
19
+ providerUserId: string;
20
+ email: string | null;
21
+ }>;
22
+ /** Apps autorizados (grants), com contagens de tokens vivos — sem material de token. */
23
+ authorizedApps: Array<{
24
+ clientId: string | null;
25
+ accessTokens: number;
26
+ refreshTokens: number;
27
+ }>;
28
+ /** Metadados das sessões ativas (sem material de sessão/cookie). */
29
+ sessions: Array<{
30
+ id: string;
31
+ loginTs: number | null;
32
+ amr: string[];
33
+ }>;
34
+ /** Metadados das passkeys (sem chave pública nem counter). */
35
+ passkeys: Array<{
36
+ id: string;
37
+ label: string | null;
38
+ createdAt: string;
39
+ }>;
40
+ /** Eventos de auditoria do próprio usuário (já anonimizados de IP de terceiros? não — são seus). */
41
+ auditLog: Array<{
42
+ type: string;
43
+ clientId: string | null;
44
+ ip: string | null;
45
+ metadata: Record<string, unknown> | null;
46
+ createdAt: string | null;
47
+ }>;
48
+ /** Memberships em organizations (multi-tenancy). */
49
+ organizations?: Array<{
50
+ orgId: string;
51
+ name: string;
52
+ slug: string;
53
+ role: string;
54
+ }>;
55
+ }
56
+ /**
57
+ * Monta o pacote de dados de uma conta para portabilidade (LGPD/GDPR). NUNCA
58
+ * inclui segredos: hash de senha, segredo TOTP, recovery codes, chave pública de
59
+ * passkey, material de sessão/token ou tokens de provider. Tudo que é incluído é
60
+ * metadado ou dado de perfil que o próprio usuário forneceu.
61
+ */
62
+ export declare class AccountExportService {
63
+ #private;
64
+ constructor(oidc: OidcService);
65
+ /**
66
+ * Gera o export, ou null se a conta não existe. Caminho SÍNCRONO de sempre —
67
+ * apenas delega para {@link collect} (a coleta inline, byte-idêntica ao original).
68
+ */
69
+ export(accountId: string): Promise<AccountExport | null>;
70
+ /**
71
+ * Coleta + monta o payload de export (a lógica de sempre). Exposta como uma
72
+ * operação discreta para o workflow durável (`authkit.account.export`) reusar
73
+ * como um `ctx.step` — read-only, sem efeitos colaterais destrutivos.
74
+ */
75
+ collect(accountId: string): Promise<AccountExport | null>;
76
+ }
@@ -0,0 +1,140 @@
1
+ import { supportsOrganizations, supportsPasskeys, supportsProviderIdentity, } from "../accounts/account_store.js";
2
+ import { AdminSessionsService } from "./admin_sessions_service.js";
3
+ /** Limite de eventos de audit incluídos no export (evita payloads gigantes). */
4
+ const AUDIT_EXPORT_LIMIT = 1000;
5
+ /**
6
+ * Monta o pacote de dados de uma conta para portabilidade (LGPD/GDPR). NUNCA
7
+ * inclui segredos: hash de senha, segredo TOTP, recovery codes, chave pública de
8
+ * passkey, material de sessão/token ou tokens de provider. Tudo que é incluído é
9
+ * metadado ou dado de perfil que o próprio usuário forneceu.
10
+ */
11
+ export class AccountExportService {
12
+ #cfg;
13
+ #oidc;
14
+ constructor(oidc) {
15
+ this.#oidc = oidc;
16
+ this.#cfg = oidc.config;
17
+ }
18
+ /**
19
+ * Gera o export, ou null se a conta não existe. Caminho SÍNCRONO de sempre —
20
+ * apenas delega para {@link collect} (a coleta inline, byte-idêntica ao original).
21
+ */
22
+ async export(accountId) {
23
+ return this.collect(accountId);
24
+ }
25
+ /**
26
+ * Coleta + monta o payload de export (a lógica de sempre). Exposta como uma
27
+ * operação discreta para o workflow durável (`authkit.account.export`) reusar
28
+ * como um `ctx.step` — read-only, sem efeitos colaterais destrutivos.
29
+ */
30
+ async collect(accountId) {
31
+ const cfg = this.#cfg;
32
+ const store = cfg.accountStore;
33
+ const account = await store.findById(accountId);
34
+ if (!account)
35
+ return null;
36
+ // Identidades de provider (capability-probed; sem tokens).
37
+ let linkedIdentities = [];
38
+ if (supportsProviderIdentity(store)) {
39
+ try {
40
+ linkedIdentities = (await store.listProviderIdentities(accountId)).map((i) => ({
41
+ provider: i.provider,
42
+ providerUserId: i.providerUserId,
43
+ email: i.email ?? null,
44
+ }));
45
+ }
46
+ catch {
47
+ /* best-effort */
48
+ }
49
+ }
50
+ // Sessões + grants (apps autorizados) — só metadados, sem tokens.
51
+ let sessions = [];
52
+ let authorizedApps = [];
53
+ try {
54
+ const admin = new AdminSessionsService(this.#oidc);
55
+ sessions = (await admin.listSessions(accountId)).map((s) => ({
56
+ id: s.id,
57
+ loginTs: s.loginTs ?? null,
58
+ amr: s.amr ?? [],
59
+ }));
60
+ authorizedApps = (await admin.listGrants(accountId)).map((g) => ({
61
+ clientId: g.clientId ?? null,
62
+ accessTokens: g.accessTokens,
63
+ refreshTokens: g.refreshTokens,
64
+ }));
65
+ }
66
+ catch {
67
+ /* best-effort (adapter sem list) */
68
+ }
69
+ // Passkeys — só metadados (id/label/createdAt), nunca a chave pública.
70
+ let passkeys = [];
71
+ if (supportsPasskeys(store)) {
72
+ try {
73
+ passkeys = (await store.listPasskeys(accountId)).map((p) => ({
74
+ id: p.id,
75
+ label: p.label ?? null,
76
+ createdAt: p.createdAt,
77
+ }));
78
+ }
79
+ catch {
80
+ /* best-effort */
81
+ }
82
+ }
83
+ // Organizations (capability-probed).
84
+ let organizations = [];
85
+ if (supportsOrganizations(store)) {
86
+ try {
87
+ const orgs = await store.listOrgsForAccount(accountId);
88
+ organizations = orgs.map((o) => ({
89
+ orgId: o.id,
90
+ name: o.name,
91
+ slug: o.slug,
92
+ role: o.role,
93
+ }));
94
+ }
95
+ catch {
96
+ /* best-effort */
97
+ }
98
+ }
99
+ // Audit do próprio usuário (quando o sink suporta consulta).
100
+ let auditLog = [];
101
+ if (cfg.audit && typeof cfg.audit.list === "function") {
102
+ try {
103
+ const page = await cfg.audit.list({
104
+ subject: accountId,
105
+ page: 1,
106
+ limit: AUDIT_EXPORT_LIMIT,
107
+ });
108
+ auditLog = page.data.map((e) => ({
109
+ type: e.type,
110
+ clientId: e.clientId ?? null,
111
+ ip: e.ip ?? null,
112
+ metadata: e.metadata ?? null,
113
+ createdAt: typeof e.createdAt === "string"
114
+ ? e.createdAt
115
+ : (e.createdAt?.toISOString?.() ?? null),
116
+ }));
117
+ }
118
+ catch {
119
+ /* best-effort */
120
+ }
121
+ }
122
+ return {
123
+ exportVersion: 1,
124
+ exportedAt: new Date().toISOString(),
125
+ profile: {
126
+ id: account.id,
127
+ email: account.email,
128
+ name: account.name ?? null,
129
+ avatarUrl: account.avatarUrl ?? null,
130
+ globalRoles: account.globalRoles ?? [],
131
+ },
132
+ linkedIdentities,
133
+ authorizedApps,
134
+ sessions,
135
+ passkeys,
136
+ auditLog,
137
+ organizations,
138
+ };
139
+ }
140
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Destino default da área da conta (pós-login do console sem `return_to`,
3
+ * confirmações de e-mail, fallback de redirects).
4
+ *
5
+ * Configurável via `accountHome` no defineConfig; default '/account/security'
6
+ * (a "minha conta" natural — perfil, senha, sessões). Nunca '/account/tokens':
7
+ * aterrissar usuário comum numa tela de Personal Access Tokens é hostil.
8
+ */
9
+ export declare function accountHome(cfg: {
10
+ accountHome?: string;
11
+ }): string;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Destino default da área da conta (pós-login do console sem `return_to`,
3
+ * confirmações de e-mail, fallback de redirects).
4
+ *
5
+ * Configurável via `accountHome` no defineConfig; default '/account/security'
6
+ * (a "minha conta" natural — perfil, senha, sessões). Nunca '/account/tokens':
7
+ * aterrissar usuário comum numa tela de Personal Access Tokens é hostil.
8
+ */
9
+ export function accountHome(cfg) {
10
+ return cfg.accountHome ?? '/account/security';
11
+ }