@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,401 @@
1
+ import '../augmentations.js';
2
+ import { supportsOrganizations } from '../../accounts/account_store.js';
3
+ import { ACCOUNT_SESSION_KEY } from '../middleware/account_auth.js';
4
+ import { resolveRuntimeSettings } from '../runtime_settings.js';
5
+ import { isRoleInCatalog } from '../runtime_toggles.js';
6
+ import { ACTIVE_ORG_COOKIE, ACTIVE_ORG_COOKIE_TTL, encodeActiveOrgCookie, } from '../active_org_cookie.js';
7
+ /**
8
+ * Console de conta — Organizations. Server-rendered, padrão dos outros controllers
9
+ * de conta (account_tokens_controller, account_security_controller, etc.).
10
+ *
11
+ * Rotas montadas em register_auth_host quando supportsOrganizations(store) — capability-probed.
12
+ * O guard `accountGuard` (já existente) protege todas as rotas de /account/* abaixo.
13
+ */
14
+ export default class AccountOrgsController {
15
+ async index(ctx) {
16
+ const { session, response, request } = ctx;
17
+ const service = await ctx.containerResolver.make('authkit.server');
18
+ const cfg = service.config;
19
+ const store = cfg.accountStore;
20
+ const messages = cfg.messages;
21
+ if (!supportsOrganizations(store)) {
22
+ return cfg.render
23
+ ? cfg.render(ctx, 'account/orgs', { supported: false, messages })
24
+ : response.notFound();
25
+ }
26
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
27
+ const account = await store.findById(accountId);
28
+ if (!account)
29
+ return response.redirect('/account/login');
30
+ const orgs = await store.listOrgsForAccount(accountId);
31
+ const pendingInvitations = await store.listPendingInvitationsForEmail(account.email);
32
+ // Enriquece convites com o nome da org
33
+ const invitationsWithOrg = await Promise.all(pendingInvitations.map(async (inv) => {
34
+ const org = await store.findOrgById(inv.organizationId);
35
+ return { ...inv, orgName: org?.name ?? inv.organizationId };
36
+ }));
37
+ // Detecta org ativa do cookie
38
+ const activeOrgRaw = request.cookie(ACTIVE_ORG_COOKIE);
39
+ const activeOrgId = activeOrgRaw ? activeOrgRaw.split('\t')[0] : null;
40
+ // Para cada org onde o user é owner/admin, carrega membros
41
+ const orgsWithMembers = await Promise.all(orgs.map(async (org) => {
42
+ const canManage = org.role === 'owner' || org.role === 'admin';
43
+ const members = canManage ? await store.listOrgMembers(org.id) : [];
44
+ return { ...org, members, canManage, isActive: org.id === activeOrgId };
45
+ }));
46
+ const props = {
47
+ supported: true,
48
+ orgs: orgsWithMembers,
49
+ pendingInvitations: invitationsWithOrg,
50
+ allowSelfCreate: cfg.organizations.allowSelfCreate,
51
+ availableRoles: cfg.organizations.roles,
52
+ messages,
53
+ };
54
+ return cfg.render
55
+ ? cfg.render(ctx, 'account/orgs', props)
56
+ : response.notFound();
57
+ }
58
+ /** POST /account/orgs — criar nova org (requer allowSelfCreate). */
59
+ async store(ctx) {
60
+ const { session, response, request } = ctx;
61
+ const service = await ctx.containerResolver.make('authkit.server');
62
+ const cfg = service.config;
63
+ const store = cfg.accountStore;
64
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
65
+ if (!supportsOrganizations(store) || !cfg.organizations.allowSelfCreate) {
66
+ return response.forbidden();
67
+ }
68
+ const name = request.input('name', '').trim();
69
+ const slug = request.input('slug', '').trim();
70
+ if (!name || !slug)
71
+ return response.redirect('/account/orgs');
72
+ try {
73
+ await store.createOrg({ name, slug, ownerAccountId: accountId });
74
+ await cfg.audit?.record({ type: 'organization.created', accountId, metadata: { slug } });
75
+ }
76
+ catch {
77
+ // slug duplicado ou outro erro — redireciona sem mensagem de erro específica
78
+ }
79
+ return response.redirect('/account/orgs');
80
+ }
81
+ /** POST /account/orgs/:id/activate — define org ativa (valida membership). */
82
+ async activate(ctx) {
83
+ const { session, response, params } = ctx;
84
+ const service = await ctx.containerResolver.make('authkit.server');
85
+ const cfg = service.config;
86
+ const store = cfg.accountStore;
87
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
88
+ if (!supportsOrganizations(store))
89
+ return response.forbidden();
90
+ const orgId = params.id;
91
+ const membership = await store.getOrgMembership(orgId, accountId);
92
+ if (!membership)
93
+ return response.redirect('/account/orgs');
94
+ const org = await store.findOrgById(orgId);
95
+ if (!org)
96
+ return response.redirect('/account/orgs');
97
+ // Grava cookie de org ativa
98
+ const cookieValue = encodeActiveOrgCookie({ orgId, orgSlug: org.slug, orgRole: membership.role });
99
+ ctx.response.cookie(ACTIVE_ORG_COOKIE, cookieValue, {
100
+ httpOnly: true,
101
+ sameSite: 'lax',
102
+ maxAge: ACTIVE_ORG_COOKIE_TTL,
103
+ secure: ctx.request.secure(),
104
+ path: '/',
105
+ });
106
+ await cfg.audit?.record({ type: 'organization.switched', accountId, metadata: { orgId, orgSlug: org.slug } });
107
+ return response.redirect('/account/orgs');
108
+ }
109
+ /** POST /account/orgs/deactivate — remove org ativa. */
110
+ async deactivate(ctx) {
111
+ const { session, response } = ctx;
112
+ const service = await ctx.containerResolver.make('authkit.server');
113
+ const cfg = service.config;
114
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
115
+ ctx.response.clearCookie(ACTIVE_ORG_COOKIE, { path: '/' });
116
+ await cfg.audit?.record({ type: 'organization.deactivated', accountId });
117
+ return response.redirect('/account/orgs');
118
+ }
119
+ /** POST /account/orgs/:id/leave — sai da org (verifica last_owner). */
120
+ async leave(ctx) {
121
+ const { session, response, params } = ctx;
122
+ const service = await ctx.containerResolver.make('authkit.server');
123
+ const cfg = service.config;
124
+ const store = cfg.accountStore;
125
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
126
+ if (!supportsOrganizations(store))
127
+ return response.forbidden();
128
+ const result = await store.removeOrgMember(params.id, accountId);
129
+ if (result.ok) {
130
+ await cfg.audit?.record({ type: 'organization.member_removed', accountId, metadata: { orgId: params.id, self: true } });
131
+ }
132
+ return response.redirect('/account/orgs');
133
+ }
134
+ /** POST /account/orgs/:id/invite — convida membro por e-mail. */
135
+ async invite(ctx) {
136
+ const { session, response, params, request } = ctx;
137
+ const service = await ctx.containerResolver.make('authkit.server');
138
+ const cfg = service.config;
139
+ const store = cfg.accountStore;
140
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
141
+ if (!supportsOrganizations(store))
142
+ return response.forbidden();
143
+ // Verifica que o invitador é owner ou admin
144
+ const membership = await store.getOrgMembership(params.id, accountId);
145
+ if (!membership || (membership.role !== 'owner' && membership.role !== 'admin')) {
146
+ return response.forbidden();
147
+ }
148
+ const email = request.input('email', '').trim();
149
+ const role = request.input('role', 'member').trim();
150
+ if (!email)
151
+ return response.redirect('/account/orgs');
152
+ // H4: valida o role contra o catálogo efetivo de roles da org (runtime →
153
+ // config → defaults). Role fora do catálogo é rejeitada (não cria convite).
154
+ // Usa o helper PURO `isRoleInCatalog` (mesmo ponto de verdade do caminho admin).
155
+ const settings = await resolveRuntimeSettings(ctx);
156
+ const roleValid = await isRoleInCatalog(role, settings, {
157
+ roles: cfg.organizations.roles,
158
+ allowSelfCreate: cfg.organizations.allowSelfCreate,
159
+ invitationTtlHours: cfg.organizations.invitationTtlHours,
160
+ }, params.id);
161
+ if (!roleValid) {
162
+ return response.unprocessableEntity({ error: { code: 'invalid_role', message: 'Role inválida.' } });
163
+ }
164
+ // H4: no fluxo member-facing, só um OWNER pode conceder a role `owner`.
165
+ // Um admin (não-owner) tentando convidar como `owner` é escalonamento.
166
+ if (role === 'owner' && membership.role !== 'owner') {
167
+ return response.forbidden();
168
+ }
169
+ const { invitation, token } = await store.createOrgInvitation({
170
+ organizationId: params.id,
171
+ email,
172
+ role,
173
+ invitedBy: accountId,
174
+ ttlHours: cfg.organizations.invitationTtlHours,
175
+ });
176
+ // Dispara e-mail via mail hook (best-effort)
177
+ if (cfg.mail?.onOrgInvitation) {
178
+ const org = await store.findOrgById(params.id);
179
+ const acceptUrl = `${ctx.request.protocol()}://${ctx.request.host()}/account/orgs/invitations/${token}/accept`;
180
+ try {
181
+ await cfg.mail.onOrgInvitation({
182
+ email,
183
+ invitationId: invitation.id,
184
+ orgName: org?.name ?? params.id,
185
+ orgSlug: org?.slug ?? params.id,
186
+ role,
187
+ acceptUrl,
188
+ token,
189
+ });
190
+ }
191
+ catch {
192
+ // best-effort
193
+ }
194
+ }
195
+ await cfg.audit?.record({
196
+ type: 'organization.invitation_sent',
197
+ accountId,
198
+ metadata: { orgId: params.id, email, role },
199
+ });
200
+ return response.redirect('/account/orgs');
201
+ }
202
+ /** GET /account/orgs/invitations/:token/accept — mostra tela de aceite. */
203
+ async showAcceptInvitation(ctx) {
204
+ const { session, response, params } = ctx;
205
+ const service = await ctx.containerResolver.make('authkit.server');
206
+ const cfg = service.config;
207
+ const store = cfg.accountStore;
208
+ const { createHash } = await import('node:crypto');
209
+ if (!supportsOrganizations(store))
210
+ return response.notFound();
211
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
212
+ if (!accountId) {
213
+ // Não logado: redireciona para login com return URL
214
+ const returnTo = encodeURIComponent(`/account/orgs/invitations/${params.token}/accept`);
215
+ return response.redirect(`/account/login?returnTo=${returnTo}`);
216
+ }
217
+ const tokenHash = createHash('sha256').update(params.token).digest('hex');
218
+ const invitation = await store.findInvitationByTokenHash(tokenHash);
219
+ const props = {
220
+ invitation,
221
+ token: params.token,
222
+ messages: cfg.messages,
223
+ };
224
+ return cfg.render
225
+ ? cfg.render(ctx, 'account/orgs', { ...props, subview: 'accept-invitation' })
226
+ : response.notFound();
227
+ }
228
+ /** POST /account/orgs/invitations/:token/accept — processa aceite. */
229
+ async acceptInvitation(ctx) {
230
+ const { session, response, params } = ctx;
231
+ const service = await ctx.containerResolver.make('authkit.server');
232
+ const cfg = service.config;
233
+ const store = cfg.accountStore;
234
+ const { createHash } = await import('node:crypto');
235
+ if (!supportsOrganizations(store))
236
+ return response.notFound();
237
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
238
+ if (!accountId)
239
+ return response.redirect('/account/login');
240
+ const tokenHash = createHash('sha256').update(params.token).digest('hex');
241
+ const invitation = await store.findInvitationByTokenHash(tokenHash);
242
+ if (!invitation)
243
+ return response.redirect('/account/orgs');
244
+ const result = await store.acceptInvitation(invitation.id, accountId);
245
+ if (result.ok) {
246
+ await cfg.audit?.record({
247
+ type: 'organization.invitation_accepted',
248
+ accountId,
249
+ metadata: { orgId: invitation.organizationId, invitationId: invitation.id },
250
+ });
251
+ }
252
+ return response.redirect('/account/orgs');
253
+ }
254
+ /** POST /account/orgs/:id/members/:accountId/remove */
255
+ async removeMember(ctx) {
256
+ const { session, response, params } = ctx;
257
+ const service = await ctx.containerResolver.make('authkit.server');
258
+ const cfg = service.config;
259
+ const store = cfg.accountStore;
260
+ const actorId = session.get(ACCOUNT_SESSION_KEY);
261
+ if (!supportsOrganizations(store))
262
+ return response.forbidden();
263
+ const actorMembership = await store.getOrgMembership(params.id, actorId);
264
+ if (!actorMembership || (actorMembership.role !== 'owner' && actorMembership.role !== 'admin')) {
265
+ return response.forbidden();
266
+ }
267
+ const result = await store.removeOrgMember(params.id, params.accountId);
268
+ if (result.ok) {
269
+ await cfg.audit?.record({
270
+ type: 'organization.member_removed',
271
+ actorId,
272
+ metadata: { orgId: params.id, targetAccountId: params.accountId },
273
+ });
274
+ }
275
+ return response.redirect('/account/orgs');
276
+ }
277
+ /** POST /account/orgs/:id/invitations/:invId/revoke */
278
+ async revokeInvitation(ctx) {
279
+ const { session, response, params } = ctx;
280
+ const service = await ctx.containerResolver.make('authkit.server');
281
+ const cfg = service.config;
282
+ const store = cfg.accountStore;
283
+ const actorId = session.get(ACCOUNT_SESSION_KEY);
284
+ if (!supportsOrganizations(store))
285
+ return response.forbidden();
286
+ const actorMembership = await store.getOrgMembership(params.id, actorId);
287
+ if (!actorMembership || (actorMembership.role !== 'owner' && actorMembership.role !== 'admin')) {
288
+ return response.forbidden();
289
+ }
290
+ // Escopado por org (params.id já validado acima): impede IDOR cross-org.
291
+ await store.revokeInvitation(params.id, params.invId);
292
+ await cfg.audit?.record({
293
+ type: 'organization.invitation_revoked',
294
+ actorId,
295
+ metadata: { orgId: params.id, invitationId: params.invId },
296
+ });
297
+ return response.redirect('/account/orgs');
298
+ }
299
+ // ──────────────────────────────────────────────────────────────────────────
300
+ // JSON endpoints — consumed by @adonis-agora/authkit-react hooks.
301
+ // ──────────────────────────────────────────────────────────────────────────
302
+ /**
303
+ * GET /account/orgs/json — lista as orgs do usuário logado com papel + se ativa.
304
+ * Usado pelo hook `useOrganizations()`.
305
+ */
306
+ async listJson(ctx) {
307
+ const { session, response, request } = ctx;
308
+ const service = await ctx.containerResolver.make('authkit.server');
309
+ const cfg = service.config;
310
+ const store = cfg.accountStore;
311
+ if (!supportsOrganizations(store))
312
+ return { supported: false, orgs: [], activeOrgId: null };
313
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
314
+ if (!accountId)
315
+ return response.unauthorized({ message: 'Not authenticated.' });
316
+ const orgs = await store.listOrgsForAccount(accountId);
317
+ const activeOrgRaw = request.cookie(ACTIVE_ORG_COOKIE);
318
+ const activeOrgId = activeOrgRaw ? activeOrgRaw.split('\t')[0] : null;
319
+ return {
320
+ supported: true,
321
+ activeOrgId,
322
+ orgs: orgs.map((org) => ({
323
+ id: org.id,
324
+ name: org.name,
325
+ slug: org.slug,
326
+ logoUrl: org.logoUrl ?? null,
327
+ role: org.role,
328
+ isActive: org.id === activeOrgId,
329
+ })),
330
+ };
331
+ }
332
+ /**
333
+ * GET /account/orgs/:id/json — detalhes da org ativa (para uso pelo hook `useOrganization()`).
334
+ * Só retorna se o usuário é membro.
335
+ */
336
+ async showJson(ctx) {
337
+ const { session, response, params } = ctx;
338
+ const service = await ctx.containerResolver.make('authkit.server');
339
+ const cfg = service.config;
340
+ const store = cfg.accountStore;
341
+ if (!supportsOrganizations(store))
342
+ return response.notFound({ message: 'Not supported.' });
343
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
344
+ if (!accountId)
345
+ return response.unauthorized({ message: 'Not authenticated.' });
346
+ const membership = await store.getOrgMembership(params.id, accountId);
347
+ if (!membership)
348
+ return response.notFound({ message: 'Organization not found or not a member.' });
349
+ const org = await store.findOrgById(params.id);
350
+ if (!org)
351
+ return response.notFound({ message: 'Organization not found.' });
352
+ const canManage = membership.role === 'owner' || membership.role === 'admin';
353
+ const members = canManage ? await store.listOrgMembers(params.id) : [];
354
+ const enrichedMembers = await Promise.all(members.map(async (m) => {
355
+ const account = await store.findById(m.accountId);
356
+ return { accountId: m.accountId, email: account?.email ?? null, role: m.role, joinedAt: m.joinedAt };
357
+ }));
358
+ return {
359
+ id: org.id,
360
+ name: org.name,
361
+ slug: org.slug,
362
+ logoUrl: org.logoUrl ?? null,
363
+ role: membership.role,
364
+ canManage,
365
+ members: enrichedMembers,
366
+ };
367
+ }
368
+ /**
369
+ * GET /account/orgs/invitations/json — lista convites pendentes pro e-mail do usuário logado.
370
+ * Usado pelo hook `useOrgInvitations()`.
371
+ */
372
+ async listInvitationsJson(ctx) {
373
+ const { session, response } = ctx;
374
+ const service = await ctx.containerResolver.make('authkit.server');
375
+ const cfg = service.config;
376
+ const store = cfg.accountStore;
377
+ if (!supportsOrganizations(store))
378
+ return { invitations: [] };
379
+ const accountId = session.get(ACCOUNT_SESSION_KEY);
380
+ if (!accountId)
381
+ return response.unauthorized({ message: 'Not authenticated.' });
382
+ const account = await store.findById(accountId);
383
+ if (!account)
384
+ return response.unauthorized({ message: 'Not authenticated.' });
385
+ const invitations = await store.listPendingInvitationsForEmail(account.email);
386
+ const enriched = await Promise.all(invitations.map(async (inv) => {
387
+ const org = await store.findOrgById(inv.organizationId);
388
+ return {
389
+ id: inv.id,
390
+ organizationId: inv.organizationId,
391
+ orgName: org?.name ?? inv.organizationId,
392
+ orgSlug: org?.slug ?? inv.organizationId,
393
+ email: inv.email,
394
+ role: inv.role,
395
+ expiresAt: inv.expiresAt,
396
+ createdAt: inv.createdAt,
397
+ };
398
+ }));
399
+ return { invitations: enriched };
400
+ }
401
+ }
@@ -0,0 +1,43 @@
1
+ import "../augmentations.js";
2
+ import type { HttpContext } from "@adonisjs/core/http";
3
+ /**
4
+ * Self-service de segurança da conta (console de conta): trocar a senha e o
5
+ * e-mail. A troca de senha exige a senha ATUAL (verifyCredentials). A troca de
6
+ * e-mail exige a senha atual e dispara um link de confirmação para o NOVO
7
+ * endereço (consumido em GET /account/email/confirm). Degrada graciosamente se o
8
+ * store não suportar a capacidade ({@link supportsAccountSecurity}).
9
+ */
10
+ export default class AccountSecurityController {
11
+ index(ctx: HttpContext): Promise<any>;
12
+ /**
13
+ * GET /account/security/export — baixa um JSON com os dados da conta logada
14
+ * (perfil, identidades, apps autorizados, sessões, passkeys e audit do usuário).
15
+ * NUNCA inclui segredos. Audita `account.exported`.
16
+ */
17
+ exportData(ctx: HttpContext): Promise<void>;
18
+ /**
19
+ * POST /account/security/delete — deleção self-service da conta (danger zone).
20
+ * Exige confirmação: a senha ATUAL (se confere via verifyCredentials) OU o
21
+ * e-mail digitado igual ao da conta (contas passwordless). Roda o cascade
22
+ * completo e encerra a sessão.
23
+ */
24
+ deleteAccount(ctx: HttpContext): Promise<unknown>;
25
+ /**
26
+ * POST /account/security/trusted-devices/revoke
27
+ * Limpa o cookie de dispositivo confiável DESTE navegador (o MFA volta a ser
28
+ * exigido aqui). Revogação global por-dispositivo não existe sem estado
29
+ * server-side; re-enrolar o MFA invalida a confiança em TODOS os dispositivos.
30
+ */
31
+ revokeTrustedDevices(ctx: HttpContext): Promise<void>;
32
+ /** POST /account/security/profile — atualiza nome + avatar do próprio perfil. */
33
+ updateProfile(ctx: HttpContext): Promise<void>;
34
+ changePassword(ctx: HttpContext): Promise<unknown>;
35
+ changeEmail(ctx: HttpContext): Promise<unknown>;
36
+ /**
37
+ * POST /account/security/email/cancel — cancela uma troca de e-mail pendente
38
+ * (limpa o token pending sem alterar o e-mail da conta).
39
+ */
40
+ cancelEmailChange(ctx: HttpContext): Promise<void>;
41
+ /** GET /account/email/confirm?token=... — consome o token e aplica o novo e-mail. */
42
+ confirmEmail(ctx: HttpContext): Promise<any>;
43
+ }