@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,294 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { DateTime } from 'luxon';
3
+ function toOrgSummary(row) {
4
+ return {
5
+ id: row.id,
6
+ name: row.name,
7
+ slug: row.slug,
8
+ logoUrl: row.logoUrl ?? null,
9
+ metadata: row.metadata ?? null,
10
+ createdAt: toDateStr(row.createdAt),
11
+ };
12
+ }
13
+ function toDateStr(val) {
14
+ if (!val)
15
+ return new Date().toISOString();
16
+ if (typeof val === 'object' && 'toISO' in val)
17
+ return val.toISO() ?? new Date().toISOString();
18
+ if (val instanceof Date)
19
+ return val.toISOString();
20
+ return String(val);
21
+ }
22
+ function toDateStrOrNull(val) {
23
+ if (!val)
24
+ return null;
25
+ if (typeof val === 'object' && 'toISO' in val)
26
+ return val.toISO() ?? null;
27
+ if (val instanceof Date)
28
+ return val.toISOString();
29
+ return String(val);
30
+ }
31
+ function toOrgInvitation(row) {
32
+ return {
33
+ id: row.id,
34
+ organizationId: row.organizationId,
35
+ email: row.email,
36
+ role: row.role,
37
+ invitedBy: row.invitedBy,
38
+ expiresAt: toDateStr(row.expiresAt),
39
+ acceptedAt: toDateStrOrNull(row.acceptedAt),
40
+ createdAt: toDateStr(row.createdAt),
41
+ };
42
+ }
43
+ /** Conta os owners ativos de uma org. */
44
+ async function countOwners(MemberModel, orgId) {
45
+ const result = await MemberModel.query()
46
+ .where('organization_id', orgId)
47
+ .where('role', 'owner')
48
+ .count('* as total');
49
+ return Number(result[0]?.$extras?.total ?? 0);
50
+ }
51
+ export function buildOrganizations(ctx) {
52
+ const { OrgModel, MemberModel, InvitationModel, findAccountEmail } = ctx;
53
+ return {
54
+ async createOrg(input) {
55
+ const { randomUUID } = await import('node:crypto');
56
+ const org = await OrgModel.create({
57
+ id: randomUUID(),
58
+ name: input.name,
59
+ slug: input.slug,
60
+ logoUrl: input.logoUrl ?? null,
61
+ metadata: input.metadata ?? null,
62
+ });
63
+ // Cria a membership do owner automaticamente
64
+ await MemberModel.create({
65
+ id: randomUUID(),
66
+ organizationId: org.id,
67
+ accountId: input.ownerAccountId,
68
+ role: 'owner',
69
+ });
70
+ return toOrgSummary(org);
71
+ },
72
+ async findOrgById(orgId) {
73
+ const row = await OrgModel.find(orgId);
74
+ return row ? toOrgSummary(row) : null;
75
+ },
76
+ async findOrgBySlug(slug) {
77
+ const row = await OrgModel.query().where('slug', slug).first();
78
+ return row ? toOrgSummary(row) : null;
79
+ },
80
+ async listOrgsForAccount(accountId) {
81
+ const memberships = await MemberModel.query().where('account_id', accountId);
82
+ const result = [];
83
+ for (const m of memberships) {
84
+ const org = await OrgModel.find(m.organizationId);
85
+ if (org)
86
+ result.push({ ...toOrgSummary(org), role: m.role });
87
+ }
88
+ return result;
89
+ },
90
+ async updateOrg(orgId, patch) {
91
+ const row = await OrgModel.find(orgId);
92
+ if (!row)
93
+ return null;
94
+ if (patch.name !== undefined)
95
+ row.name = patch.name;
96
+ if (patch.logoUrl !== undefined)
97
+ row.logoUrl = patch.logoUrl;
98
+ if (patch.metadata !== undefined)
99
+ row.metadata = patch.metadata;
100
+ await row.save();
101
+ return toOrgSummary(row);
102
+ },
103
+ async deleteOrg(orgId) {
104
+ const row = await OrgModel.find(orgId);
105
+ if (!row)
106
+ return false;
107
+ await MemberModel.query().where('organization_id', orgId).delete();
108
+ await InvitationModel.query().where('organization_id', orgId).delete();
109
+ await row.delete();
110
+ return true;
111
+ },
112
+ async listOrgMembers(orgId) {
113
+ const rows = await MemberModel.query().where('organization_id', orgId);
114
+ return rows.map((r) => ({
115
+ accountId: r.accountId,
116
+ email: null, // o caller enriquece com findById se necessário
117
+ role: r.role,
118
+ joinedAt: toDateStr(r.createdAt),
119
+ }));
120
+ },
121
+ async addOrgMember(orgId, accountId, role) {
122
+ const { randomUUID } = await import('node:crypto');
123
+ // Upsert: se já existe, atualiza a role
124
+ const existing = await MemberModel.query()
125
+ .where('organization_id', orgId)
126
+ .where('account_id', accountId)
127
+ .first();
128
+ if (existing) {
129
+ existing.role = role;
130
+ await existing.save();
131
+ }
132
+ else {
133
+ await MemberModel.create({ id: randomUUID(), organizationId: orgId, accountId, role });
134
+ }
135
+ },
136
+ async removeOrgMember(orgId, accountId) {
137
+ const row = await MemberModel.query()
138
+ .where('organization_id', orgId)
139
+ .where('account_id', accountId)
140
+ .first();
141
+ if (!row)
142
+ return { ok: false, reason: 'not_found' };
143
+ // Invariante: org deve ter sempre >= 1 owner
144
+ if (row.role === 'owner') {
145
+ const ownerCount = await countOwners(MemberModel, orgId);
146
+ if (ownerCount <= 1)
147
+ return { ok: false, reason: 'last_owner' };
148
+ }
149
+ await row.delete();
150
+ return { ok: true };
151
+ },
152
+ async updateOrgMemberRole(orgId, accountId, newRole) {
153
+ const row = await MemberModel.query()
154
+ .where('organization_id', orgId)
155
+ .where('account_id', accountId)
156
+ .first();
157
+ if (!row)
158
+ return { ok: false, reason: 'not_found' };
159
+ // Invariante: não rebaixa o último owner
160
+ if (row.role === 'owner' && newRole !== 'owner') {
161
+ const ownerCount = await countOwners(MemberModel, orgId);
162
+ if (ownerCount <= 1)
163
+ return { ok: false, reason: 'last_owner' };
164
+ }
165
+ row.role = newRole;
166
+ await row.save();
167
+ return { ok: true };
168
+ },
169
+ async getOrgMembership(orgId, accountId) {
170
+ const row = await MemberModel.query()
171
+ .where('organization_id', orgId)
172
+ .where('account_id', accountId)
173
+ .first();
174
+ return row ? { role: row.role } : null;
175
+ },
176
+ async createOrgInvitation(input) {
177
+ const { randomUUID } = await import('node:crypto');
178
+ const token = randomBytes(32).toString('hex');
179
+ const tokenHash = createHash('sha256').update(token).digest('hex');
180
+ const expiresAt = DateTime.now().plus({ hours: input.ttlHours });
181
+ const inv = await InvitationModel.create({
182
+ id: randomUUID(),
183
+ organizationId: input.organizationId,
184
+ email: input.email,
185
+ role: input.role,
186
+ tokenHash,
187
+ invitedBy: input.invitedBy,
188
+ expiresAt,
189
+ acceptedAt: null,
190
+ });
191
+ return { invitation: toOrgInvitation(inv), token };
192
+ },
193
+ async findInvitationByTokenHash(tokenHash) {
194
+ const row = await InvitationModel.query().where('token_hash', tokenHash).first();
195
+ return row ? toOrgInvitation(row) : null;
196
+ },
197
+ async listPendingInvitationsForOrg(orgId) {
198
+ const rows = await InvitationModel.query()
199
+ .where('organization_id', orgId)
200
+ .whereNull('accepted_at');
201
+ return rows.map(toOrgInvitation);
202
+ },
203
+ async listPendingInvitationsForEmail(email) {
204
+ const rows = await InvitationModel.query()
205
+ .where('email', email)
206
+ .whereNull('accepted_at');
207
+ return rows.map(toOrgInvitation);
208
+ },
209
+ async acceptInvitation(invitationId, accountId) {
210
+ const inv = await InvitationModel.find(invitationId);
211
+ if (!inv)
212
+ return { ok: false, reason: 'not_found' };
213
+ // Verifica expiração (expiresAt pode ser DateTime Luxon, Date, ou string do SQLite)
214
+ let expiresMs;
215
+ const rawExpiry = inv.expiresAt;
216
+ if (rawExpiry && typeof rawExpiry === 'object' && 'toMillis' in rawExpiry) {
217
+ expiresMs = rawExpiry.toMillis();
218
+ }
219
+ else if (rawExpiry instanceof Date) {
220
+ expiresMs = rawExpiry.getTime();
221
+ }
222
+ else if (rawExpiry) {
223
+ // SQLite may return "YYYY-MM-DD HH:MM:SS" without T/Z
224
+ const normalized = String(rawExpiry).replace(' ', 'T') + (String(rawExpiry).includes('Z') ? '' : 'Z');
225
+ expiresMs = new Date(normalized).getTime();
226
+ }
227
+ else {
228
+ expiresMs = 0;
229
+ }
230
+ if (isNaN(expiresMs) || expiresMs < Date.now())
231
+ return { ok: false, reason: 'expired' };
232
+ // Verifica e-mail
233
+ const accountEmail = await findAccountEmail(accountId);
234
+ if (!accountEmail || accountEmail.toLowerCase() !== inv.email.toLowerCase()) {
235
+ return { ok: false, reason: 'email_mismatch' };
236
+ }
237
+ // Verifica se já é membro
238
+ const existing = await MemberModel.query()
239
+ .where('organization_id', inv.organizationId)
240
+ .where('account_id', accountId)
241
+ .first();
242
+ if (existing) {
243
+ // Já membro: marca aceito mesmo assim (idempotência)
244
+ inv.acceptedAt = DateTime.now();
245
+ await inv.save();
246
+ return { ok: true };
247
+ }
248
+ // Cria membership + marca accepted_at
249
+ const { randomUUID } = await import('node:crypto');
250
+ await MemberModel.create({
251
+ id: randomUUID(),
252
+ organizationId: inv.organizationId,
253
+ accountId,
254
+ role: inv.role,
255
+ });
256
+ inv.acceptedAt = DateTime.now();
257
+ await inv.save();
258
+ return { ok: true };
259
+ },
260
+ async revokeInvitation(organizationId, invitationId) {
261
+ // Escopado por org: exige que o convite pertença à org informada antes de
262
+ // deletar. Sem esse filtro, um owner/admin de qualquer org revogaria
263
+ // convites de outra org sabendo apenas o invitationId (IDOR cross-org).
264
+ const inv = await InvitationModel.query()
265
+ .where('id', invitationId)
266
+ .where('organization_id', organizationId)
267
+ .first();
268
+ if (!inv)
269
+ return false;
270
+ await inv.delete();
271
+ return true;
272
+ },
273
+ async removeAccountFromAllOrgs(accountId) {
274
+ // Memberships: remove todas, mesmo se for único owner (LGPD não pode bloquear)
275
+ const memberships = await MemberModel.query().where('account_id', accountId);
276
+ for (const m of memberships) {
277
+ await m.delete();
278
+ }
279
+ // Convites (pendentes) para o e-mail da conta
280
+ const email = await findAccountEmail(accountId);
281
+ let invCount = 0;
282
+ if (email) {
283
+ const invitations = await InvitationModel.query()
284
+ .where('email', email)
285
+ .whereNull('accepted_at');
286
+ for (const inv of invitations) {
287
+ await inv.delete();
288
+ invCount++;
289
+ }
290
+ }
291
+ return { memberships: memberships.length, invitations: invCount };
292
+ },
293
+ };
294
+ }
@@ -0,0 +1,20 @@
1
+ import type { PasswordExpirationCapability, PasswordHistoryCapability } from '../account_store.js';
2
+ import type { LucidStoreContext } from './shared.js';
3
+ /**
4
+ * Histórico de senhas (disallow_password_reuse). Só deve ser montado quando a
5
+ * tabela `auth_password_history` está presente (capability-probed via
6
+ * {@link hasTable} no `lucidAccountStore`).
7
+ *
8
+ * Tabela: `auth_password_history`
9
+ * id UUID/SERIAL PK
10
+ * account_id TEXT NOT NULL
11
+ * password_hash TEXT NOT NULL
12
+ * created_at TIMESTAMP NOT NULL
13
+ */
14
+ export declare function buildPasswordHistory(ctx: LucidStoreContext, db: any): PasswordHistoryCapability;
15
+ /**
16
+ * Expiração de senha. Só deve ser montado quando o model tem a propriedade
17
+ * `passwordChangedAt` (coluna `password_changed_at`) — capability-probed via
18
+ * {@link hasColumn} no `lucidAccountStore`.
19
+ */
20
+ export declare function buildPasswordExpiration(ctx: LucidStoreContext): PasswordExpirationCapability;
@@ -0,0 +1,130 @@
1
+ import { DateTime } from 'luxon';
2
+ /** Stub de noop para quando não há verify disponível (fail-safe: não bloqueia). */
3
+ const _noopVerify = async (_hash, _plain) => false;
4
+ /**
5
+ * Histórico de senhas (disallow_password_reuse). Só deve ser montado quando a
6
+ * tabela `auth_password_history` está presente (capability-probed via
7
+ * {@link hasTable} no `lucidAccountStore`).
8
+ *
9
+ * Tabela: `auth_password_history`
10
+ * id UUID/SERIAL PK
11
+ * account_id TEXT NOT NULL
12
+ * password_hash TEXT NOT NULL
13
+ * created_at TIMESTAMP NOT NULL
14
+ */
15
+ export function buildPasswordHistory(ctx, db) {
16
+ /**
17
+ * Helper para query raw da tabela de histórico.
18
+ * Lucid expõe `db.query().from(table)` para SELECT e `db.table(table).insert()` para INSERT.
19
+ * Para DELETE usamos `db.query().from(table)`.
20
+ */
21
+ function qFrom() {
22
+ return db.query().from('auth_password_history');
23
+ }
24
+ return {
25
+ async isPasswordReused(accountId, plainPassword, count, nativeVerify) {
26
+ try {
27
+ const rows = await qFrom()
28
+ .where('account_id', accountId)
29
+ .orderBy('created_at', 'desc')
30
+ .limit(count);
31
+ if (!rows || rows.length === 0)
32
+ return false;
33
+ // Usa o hook do chamador quando fornecido; fallback: ctx.nativeVerifyHash.
34
+ const verify = (nativeVerify ?? null) || ctx.nativeVerifyHash || _noopVerify;
35
+ // Verifica a senha candidata contra cada hash do histórico.
36
+ for (const row of rows) {
37
+ try {
38
+ const matches = await verify(row.password_hash, plainPassword);
39
+ if (matches)
40
+ return true;
41
+ }
42
+ catch {
43
+ // falha ao verificar um hash individual → ignora (hash de sistema legado etc.)
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ catch {
49
+ // Falha de DB → fail-safe: não bloqueia (prefere availability).
50
+ return false;
51
+ }
52
+ },
53
+ async recordPasswordHistory(accountId, oldHash) {
54
+ try {
55
+ await db.table('auth_password_history').insert({
56
+ account_id: accountId,
57
+ password_hash: oldHash,
58
+ created_at: DateTime.now().toISO(),
59
+ });
60
+ }
61
+ catch {
62
+ // Best-effort: falha silenciosa não impede a troca de senha.
63
+ }
64
+ },
65
+ async prunePasswordHistory(accountId, count) {
66
+ try {
67
+ // Busca os IDs dos últimos `count` registros.
68
+ const rows = await qFrom()
69
+ .where('account_id', accountId)
70
+ .orderBy('created_at', 'desc')
71
+ .limit(count)
72
+ .select('id');
73
+ if (rows.length < count)
74
+ return; // menos registros que o limite → nada a podar
75
+ // Apaga os mais antigos (todos exceto os últimos `count`).
76
+ const keepIds = rows.map((r) => r.id);
77
+ await qFrom()
78
+ .where('account_id', accountId)
79
+ .whereNotIn('id', keepIds)
80
+ .delete();
81
+ }
82
+ catch {
83
+ // Best-effort.
84
+ }
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * Expiração de senha. Só deve ser montado quando o model tem a propriedade
90
+ * `passwordChangedAt` (coluna `password_changed_at`) — capability-probed via
91
+ * {@link hasColumn} no `lucidAccountStore`.
92
+ */
93
+ export function buildPasswordExpiration(ctx) {
94
+ const { Model } = ctx;
95
+ return {
96
+ async getPasswordChangedAt(accountId) {
97
+ try {
98
+ const row = await Model.find(accountId);
99
+ if (!row)
100
+ return null;
101
+ const val = row.passwordChangedAt;
102
+ if (!val)
103
+ return null;
104
+ // Suporta tanto DateTime do Luxon quanto Date nativo.
105
+ if (val instanceof Date)
106
+ return val;
107
+ if (val && typeof val.toJSDate === 'function')
108
+ return val.toJSDate();
109
+ if (typeof val === 'string')
110
+ return new Date(val);
111
+ return null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ },
117
+ async touchPasswordChangedAt(accountId) {
118
+ try {
119
+ const row = await Model.find(accountId);
120
+ if (!row)
121
+ return;
122
+ row.passwordChangedAt = DateTime.now();
123
+ await row.save();
124
+ }
125
+ catch {
126
+ // Best-effort.
127
+ }
128
+ },
129
+ };
130
+ }
@@ -0,0 +1,8 @@
1
+ import type { ProviderIdentityCapability } from '../account_store.js';
2
+ import type { LucidStoreContext } from './shared.js';
3
+ /**
4
+ * Capacidade de account linking por identidade de provider (Google, GitHub, …).
5
+ * Só é montada quando o `providerIdentityModel` é fornecido — quando ausente, a
6
+ * capacidade inteira fica ABSENTE do store (sem método presente-mas-lançando).
7
+ */
8
+ export declare function buildProviderIdentity(ctx: LucidStoreContext, ProviderIdentityModel: any): ProviderIdentityCapability;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Capacidade de account linking por identidade de provider (Google, GitHub, …).
3
+ * Só é montada quando o `providerIdentityModel` é fornecido — quando ausente, a
4
+ * capacidade inteira fica ABSENTE do store (sem método presente-mas-lançando).
5
+ */
6
+ export function buildProviderIdentity(ctx, ProviderIdentityModel) {
7
+ const { Model, toAccount } = ctx;
8
+ return {
9
+ async findByProviderIdentity(provider, providerUserId) {
10
+ const identity = await ProviderIdentityModel.query()
11
+ .where('provider', provider)
12
+ .where('providerUserId', providerUserId)
13
+ .first();
14
+ if (!identity)
15
+ return null;
16
+ const row = await Model.find(identity.accountId);
17
+ return row ? toAccount(row) : null;
18
+ },
19
+ async linkProviderIdentity(data) {
20
+ // Upsert idempotente na chave única (provider, providerUserId): atualiza
21
+ // account/email se já existir, cria caso contrário.
22
+ const existing = await ProviderIdentityModel.query()
23
+ .where('provider', data.provider)
24
+ .where('providerUserId', data.providerUserId)
25
+ .first();
26
+ if (existing) {
27
+ existing.accountId = data.accountId;
28
+ if (data.email !== undefined)
29
+ existing.email = data.email;
30
+ await existing.save();
31
+ return;
32
+ }
33
+ await ProviderIdentityModel.create({
34
+ provider: data.provider,
35
+ providerUserId: data.providerUserId,
36
+ accountId: data.accountId,
37
+ email: data.email ?? null,
38
+ });
39
+ },
40
+ async unlinkAllProviderIdentities(accountId) {
41
+ const rows = await ProviderIdentityModel.query().where('accountId', accountId);
42
+ let count = 0;
43
+ for (const row of rows) {
44
+ await row.delete();
45
+ count++;
46
+ }
47
+ return count;
48
+ },
49
+ async listProviderIdentities(accountId) {
50
+ const rows = await ProviderIdentityModel.query().where('accountId', accountId);
51
+ // NUNCA expõe tokens — só os identificadores estáveis do provider + email.
52
+ return rows.map((r) => ({
53
+ provider: r.provider,
54
+ providerUserId: r.providerUserId,
55
+ email: r.email ?? null,
56
+ }));
57
+ },
58
+ };
59
+ }
@@ -0,0 +1,113 @@
1
+ import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse } from '@simplewebauthn/server';
2
+ import type { AuthAccount } from '../account_store.js';
3
+ import type { AuditSink } from '../../audit/audit_sink.js';
4
+ import type { PasswordManager } from '../../password/password_manager.js';
5
+ /**
6
+ * Encripta/decripta um valor (ex.: o segredo TOTP) em repouso. Mantém a lib
7
+ * desacoplada do serviço de encryption do app — qualquer implementação que
8
+ * faça round-trip serve (em prod, normalmente o `@adonisjs/core/services/encryption`).
9
+ * `decrypt` retorna `null` se o valor foi adulterado/é inválido.
10
+ */
11
+ export interface AccountSecretEncrypter {
12
+ encrypt(value: string): string;
13
+ decrypt(value: string): string | null;
14
+ }
15
+ /**
16
+ * Funções das cerimônias WebAuthn. Espelham a assinatura do `@simplewebauthn/server`
17
+ * (subconjunto usado). Injetáveis via {@link LucidAccountStoreOptions.webauthnCeremonies}
18
+ * para testes.
19
+ */
20
+ export interface WebauthnCeremonies {
21
+ generateRegistrationOptions: typeof generateRegistrationOptions;
22
+ verifyRegistrationResponse: typeof verifyRegistrationResponse;
23
+ generateAuthenticationOptions: typeof generateAuthenticationOptions;
24
+ verifyAuthenticationResponse: typeof verifyAuthenticationResponse;
25
+ }
26
+ /** RP (Relying Party) do WebAuthn usado nas cerimônias. */
27
+ export interface ResolvedRp {
28
+ rpName: string;
29
+ rpId: string;
30
+ origin: string | string[];
31
+ }
32
+ /**
33
+ * Contexto compartilhado pelos builders de capacidade. Carrega o model principal,
34
+ * os helpers de segredo e (quando configurados) os models/parametros das capacidades.
35
+ */
36
+ export interface LucidStoreContext {
37
+ Model: any;
38
+ mfaIssuer: string;
39
+ recoveryCodeCount: number;
40
+ /** Encripta o segredo antes de persistir (no-op sem encrypter). */
41
+ sealSecret(secret: string): string;
42
+ /** Decripta o segredo armazenado; null em falha/adulteração (no-op sem encrypter). */
43
+ openSecret(stored: string | null | undefined): string | null;
44
+ toAccount(row: any): AuthAccount;
45
+ /**
46
+ * Gerência de senha: validação de política/vazamento (ao definir) e
47
+ * verificação com lazy rehash + legacy verifier (ao autenticar).
48
+ */
49
+ passwords: PasswordManager;
50
+ /**
51
+ * Sink de auditoria (best-effort), usado para o evento `password.rehashed`.
52
+ * Ausente → o evento não é emitido (capability-probed).
53
+ */
54
+ audit?: AuditSink;
55
+ /**
56
+ * Verifica uma senha em claro contra um hash armazenado usando o hasher nativo
57
+ * do app (Scrypt). Injetado pelo `lucidAccountStore` a partir do modelo. Usado
58
+ * pela verificação de histórico de senhas.
59
+ */
60
+ nativeVerifyHash?: (hash: string, plain: string) => Promise<boolean>;
61
+ }
62
+ export declare const sha256: (value: string) => string;
63
+ /** Recovery code legível: 10 chars hex em duas metades (ex.: a1b2c-3d4e5). */
64
+ export declare function generateRecoveryCode(): string;
65
+ /** Comparação de hashes hex resistente a timing. */
66
+ export declare function hashesEqual(a: string, b: string): boolean;
67
+ /**
68
+ * Indica se o model Lucid tem sua tabela registrada no adapter do DB (runtime probe).
69
+ * Usado para detectar tabelas opcionais como auth_organizations/members/invitations.
70
+ * Mais robusto do que checar colunas: detecta a presença da tabela inteira.
71
+ * Em testes, as tabelas existem se foram criadas na migration do teste.
72
+ */
73
+ export declare function hasTable(db: any, tableName: string): Promise<boolean>;
74
+ /**
75
+ * Estado de MFA (lido de `auth_mfa`). Forma normalizada usada pela {@link MfaCapability}:
76
+ * - `mfaEnabledAt` em EPOCH MS (ou null) — o trusted-device compara contra isso.
77
+ * - `recoveryCodes` já desserializado (array de hashes) — o repo cuida do JSON.
78
+ */
79
+ export interface MfaState {
80
+ totpSecret: string | null;
81
+ mfaEnabledAt: number | null;
82
+ recoveryCodes: string[] | null;
83
+ lastTotpStep: number | null;
84
+ }
85
+ /** Patch parcial para o upsert em `auth_mfa` — campos ausentes são preservados. */
86
+ export interface MfaStatePatch {
87
+ totpSecret?: string | null;
88
+ /** Epoch ms (ou null para limpar). */
89
+ mfaEnabledAt?: number | null;
90
+ recoveryCodes?: string[] | null;
91
+ lastTotpStep?: number | null;
92
+ }
93
+ /**
94
+ * Repositório do estado de MFA na tabela LIB-OWNED `auth_mfa`, keyed por
95
+ * `account_id`. Acessa o banco pela CONEXÃO do próprio model (`Model.query().client`),
96
+ * a mesma usada pelo restante do store — sem exigir migration no host.
97
+ *
98
+ * O `upsert` é portável (sqlite + pg sem UPSERT nativo): tenta UPDATE pela PK;
99
+ * se não afetou nenhuma linha, faz INSERT. `recovery_codes` é serializado como
100
+ * JSON (string) na escrita e desserializado na leitura (aceita tanto string —
101
+ * sqlite/text — quanto array já parseado — pg jsonb).
102
+ */
103
+ export declare function buildMfaStateRepo(Model: any): {
104
+ /** Lê o estado de MFA da conta; null se não há linha em `auth_mfa`. */
105
+ read(accountId: string): Promise<MfaState | null>;
106
+ /**
107
+ * Upsert parcial: cria a linha se não existir, senão atualiza apenas os campos
108
+ * presentes no patch (campos ausentes preservados). Portável (sqlite + pg).
109
+ */
110
+ upsert(accountId: string, patch: MfaStatePatch): Promise<void>;
111
+ /** Remove o estado de MFA da conta (disable / reset total). No-op se ausente. */
112
+ clear(accountId: string): Promise<void>;
113
+ };