@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,40 @@
1
+ import type { ClientConfig } from '@adonis-agora/authkit-core';
2
+ import type { AdminClientsService } from '../host/admin_clients_service.js';
3
+ /** Resultado da importação de um client individual. */
4
+ export type ClientImportOutcome = 'created' | 'skipped' | 'error';
5
+ /** Linha de relatório por client. */
6
+ export interface ClientImportEntry {
7
+ clientId: string;
8
+ outcome: ClientImportOutcome;
9
+ /** Razão do erro ou 'already exists' no caso de skip. */
10
+ reason?: string;
11
+ /**
12
+ * Secret gerado (em claro, mostrado UMA vez) — presente apenas em `created` e
13
+ * somente quando o client é confidencial. Não recuperável depois.
14
+ */
15
+ clientSecret?: string;
16
+ }
17
+ /** Relatório agregado da operação. */
18
+ export interface ClientsImportReport {
19
+ created: number;
20
+ skipped: number;
21
+ errors: number;
22
+ entries: ClientImportEntry[];
23
+ }
24
+ /**
25
+ * Importa a lista de clients estáticos do config para o adapter/DB via
26
+ * {@link AdminClientsService}. Idempotente: clients cujo `client_id` já existe no
27
+ * adapter são pulados (preservando o secret original). O `client_secret` do config
28
+ * estático é PRESERVADO na criação (passado diretamente como `clientId` ficará com
29
+ * o secret original). Para clients sem secret (public), `clientSecret` fica omitido.
30
+ *
31
+ * A função é PURA quanto a I/O do config (recebe os records já parseados) —
32
+ * testável em isolamento. O único I/O é via `svc` (adapter).
33
+ *
34
+ * @param clients - Lista de {@link ClientConfig} vindos de `config.clients`.
35
+ * @param svc - Serviço admin de clients (CRUD sobre o adapter).
36
+ * @param options - `dryRun`: não persiste, só relata o que SERIA feito.
37
+ */
38
+ export declare function importClients(clients: ClientConfig[], svc: AdminClientsService, options?: {
39
+ dryRun?: boolean;
40
+ }): Promise<ClientsImportReport>;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Importa a lista de clients estáticos do config para o adapter/DB via
3
+ * {@link AdminClientsService}. Idempotente: clients cujo `client_id` já existe no
4
+ * adapter são pulados (preservando o secret original). O `client_secret` do config
5
+ * estático é PRESERVADO na criação (passado diretamente como `clientId` ficará com
6
+ * o secret original). Para clients sem secret (public), `clientSecret` fica omitido.
7
+ *
8
+ * A função é PURA quanto a I/O do config (recebe os records já parseados) —
9
+ * testável em isolamento. O único I/O é via `svc` (adapter).
10
+ *
11
+ * @param clients - Lista de {@link ClientConfig} vindos de `config.clients`.
12
+ * @param svc - Serviço admin de clients (CRUD sobre o adapter).
13
+ * @param options - `dryRun`: não persiste, só relata o que SERIA feito.
14
+ */
15
+ export async function importClients(clients, svc, options = {}) {
16
+ const report = { created: 0, skipped: 0, errors: 0, entries: [] };
17
+ for (const client of clients) {
18
+ const clientId = client.clientId;
19
+ // Verifica se já existe no adapter.
20
+ let exists = false;
21
+ try {
22
+ const found = await svc.find(clientId);
23
+ exists = !!found;
24
+ }
25
+ catch (err) {
26
+ report.errors++;
27
+ report.entries.push({
28
+ clientId,
29
+ outcome: 'error',
30
+ reason: `falha ao verificar existência: ${err.message}`,
31
+ });
32
+ continue;
33
+ }
34
+ if (exists) {
35
+ report.skipped++;
36
+ report.entries.push({ clientId, outcome: 'skipped', reason: 'already exists' });
37
+ continue;
38
+ }
39
+ if (options.dryRun) {
40
+ // Dry-run: conta como "would create" sem persistir.
41
+ report.created++;
42
+ report.entries.push({ clientId, outcome: 'created' });
43
+ continue;
44
+ }
45
+ // Determina o auth method a partir do config estático.
46
+ const authMethod = client.tokenEndpointAuthMethod ?? (client.clientSecret ? 'client_secret_basic' : 'none');
47
+ try {
48
+ // Cria via AdminClientsService, que usa o mesmo caminho do console admin / registro dinâmico.
49
+ // Para preservar o client_secret do config estático, escrevemos diretamente via adapter —
50
+ // o `svc.create` gera um secret aleatório. Usamos a API interna do svc para construir o
51
+ // payload com o secret original e persistir.
52
+ const preservedSecret = client.clientSecret;
53
+ const created = await svc.createWithSecret({
54
+ clientId,
55
+ redirectUris: client.redirectUris ?? [],
56
+ postLogoutRedirectUris: client.postLogoutRedirectUris ?? [],
57
+ grantTypes: client.grants ?? ['authorization_code', 'refresh_token'],
58
+ tokenEndpointAuthMethod: authMethod,
59
+ backchannelLogoutUri: client.backchannelLogoutUri,
60
+ backchannelLogoutSessionRequired: client.backchannelLogoutSessionRequired,
61
+ }, preservedSecret);
62
+ report.created++;
63
+ report.entries.push({
64
+ clientId,
65
+ outcome: 'created',
66
+ clientSecret: created.clientSecret,
67
+ });
68
+ }
69
+ catch (err) {
70
+ report.errors++;
71
+ report.entries.push({
72
+ clientId,
73
+ outcome: 'error',
74
+ reason: err.message,
75
+ });
76
+ }
77
+ }
78
+ return report;
79
+ }
@@ -0,0 +1,51 @@
1
+ import type { AccountStore } from '../accounts/account_store.js';
2
+ /** Uma linha do arquivo de import (campos extras viram custom — globalRoles). */
3
+ export interface ImportUserRecord {
4
+ email?: string;
5
+ /** Hash de senha já pronto (qualquer formato). Inserido como está (lazy rehash). */
6
+ password_hash?: string | null;
7
+ name?: string | null;
8
+ email_verified?: boolean;
9
+ /** Papéis globais (opcional). */
10
+ global_roles?: string[];
11
+ }
12
+ /** Relatório agregado do import. */
13
+ export interface ImportReport {
14
+ created: number;
15
+ /** Pulados por e-mail duplicado (já existente). */
16
+ skippedDuplicate: number;
17
+ /** Linhas com erro de parsing/validação. */
18
+ errors: {
19
+ line: number;
20
+ reason: string;
21
+ }[];
22
+ }
23
+ /**
24
+ * Faz o parse do conteúdo do arquivo: aceita NDJSON (uma linha JSON por usuário)
25
+ * OU um array JSON. Retorna os registros + os erros de parsing por linha. PURO
26
+ * (sem I/O) para ser testável.
27
+ */
28
+ export declare function parseImportFile(content: string): {
29
+ records: {
30
+ line: number;
31
+ record: ImportUserRecord;
32
+ }[];
33
+ parseErrors: {
34
+ line: number;
35
+ reason: string;
36
+ }[];
37
+ };
38
+ /**
39
+ * Importa os registros pelo account store (sem re-hash — o lazy rehash no login
40
+ * migra). Idempotente por e-mail (duplicados são pulados). Com `dryRun`, NÃO
41
+ * persiste nada (só valida e conta o que SERIA criado).
42
+ *
43
+ * Lógica PURA quanto a I/O de arquivo (recebe os registros já parseados) — fácil
44
+ * de testar. Lança se o store não suporta import nem create.
45
+ */
46
+ export declare function importUsers(store: AccountStore, records: {
47
+ line: number;
48
+ record: ImportUserRecord;
49
+ }[], options?: {
50
+ dryRun?: boolean;
51
+ }): Promise<ImportReport>;
@@ -0,0 +1,94 @@
1
+ import { supportsAccountImport } from '../accounts/account_store.js';
2
+ /**
3
+ * Faz o parse do conteúdo do arquivo: aceita NDJSON (uma linha JSON por usuário)
4
+ * OU um array JSON. Retorna os registros + os erros de parsing por linha. PURO
5
+ * (sem I/O) para ser testável.
6
+ */
7
+ export function parseImportFile(content) {
8
+ const trimmed = content.trim();
9
+ const records = [];
10
+ const parseErrors = [];
11
+ if (trimmed.startsWith('[')) {
12
+ // Array JSON.
13
+ try {
14
+ const arr = JSON.parse(trimmed);
15
+ if (!Array.isArray(arr)) {
16
+ parseErrors.push({ line: 1, reason: 'expected a JSON array or NDJSON' });
17
+ return { records, parseErrors };
18
+ }
19
+ arr.forEach((record, i) => records.push({ line: i + 1, record }));
20
+ }
21
+ catch (error) {
22
+ parseErrors.push({ line: 1, reason: `invalid JSON array: ${error.message}` });
23
+ }
24
+ return { records, parseErrors };
25
+ }
26
+ // NDJSON: uma linha JSON por usuário (linhas vazias ignoradas).
27
+ const lines = trimmed.split('\n');
28
+ lines.forEach((raw, i) => {
29
+ const line = raw.trim();
30
+ if (!line)
31
+ return;
32
+ try {
33
+ records.push({ line: i + 1, record: JSON.parse(line) });
34
+ }
35
+ catch (error) {
36
+ parseErrors.push({ line: i + 1, reason: `invalid JSON: ${error.message}` });
37
+ }
38
+ });
39
+ return { records, parseErrors };
40
+ }
41
+ /**
42
+ * Importa os registros pelo account store (sem re-hash — o lazy rehash no login
43
+ * migra). Idempotente por e-mail (duplicados são pulados). Com `dryRun`, NÃO
44
+ * persiste nada (só valida e conta o que SERIA criado).
45
+ *
46
+ * Lógica PURA quanto a I/O de arquivo (recebe os registros já parseados) — fácil
47
+ * de testar. Lança se o store não suporta import nem create.
48
+ */
49
+ export async function importUsers(store, records, options = {}) {
50
+ const report = { created: 0, skippedDuplicate: 0, errors: [] };
51
+ const canImport = supportsAccountImport(store);
52
+ for (const { line, record } of records) {
53
+ const email = record.email?.trim();
54
+ if (!email) {
55
+ report.errors.push({ line, reason: 'missing email' });
56
+ continue;
57
+ }
58
+ // Duplicado: e-mail já existe → pula.
59
+ const existing = await store.findByEmail(email);
60
+ if (existing) {
61
+ report.skippedDuplicate++;
62
+ continue;
63
+ }
64
+ if (options.dryRun) {
65
+ report.created++;
66
+ continue;
67
+ }
68
+ try {
69
+ if (canImport) {
70
+ const created = await store.importAccount({
71
+ email,
72
+ passwordHash: record.password_hash ?? null,
73
+ fullName: record.name ?? null,
74
+ globalRoles: record.global_roles,
75
+ emailVerified: record.email_verified ?? false,
76
+ });
77
+ // null = corrida (e-mail criado entre o check e o insert) → conta como dup.
78
+ if (created)
79
+ report.created++;
80
+ else
81
+ report.skippedDuplicate++;
82
+ }
83
+ else {
84
+ // Fallback: store sem import — usa create (re-hasheia e aplica política).
85
+ // Útil quando o registro traz senha em claro; sem hash nem senha falha.
86
+ report.errors.push({ line, reason: 'store does not support account import' });
87
+ }
88
+ }
89
+ catch (error) {
90
+ report.errors.push({ line, reason: error.message });
91
+ }
92
+ }
93
+ return report;
94
+ }
@@ -0,0 +1,13 @@
1
+ import type { ApplicationService } from '@adonisjs/core/types';
2
+ /**
3
+ * Resolve o valor exportado por `config/authkit.ts` para a config final.
4
+ *
5
+ * `defineConfig` retorna um config PROVIDER (`{ type, resolver }`) que o service
6
+ * provider resolve no boot — mas `config.get('authkit')` devolve esse provider
7
+ * CRU. Comandos ace que leem a config diretamente (doctor, users:import,
8
+ * keys:rotate) precisam resolvê-lo antes de inspecionar campos, senão veem
9
+ * `issuer`/`accountStore`/`jwks` como ausentes mesmo num config válido.
10
+ *
11
+ * Valores planos (configs antigos/test fixtures) passam direto.
12
+ */
13
+ export declare function resolveAuthkitConfig<T = Record<string, any>>(app: ApplicationService, raw: unknown): Promise<T | null>;
@@ -0,0 +1,18 @@
1
+ import { configProvider } from '@adonisjs/core';
2
+ /**
3
+ * Resolve o valor exportado por `config/authkit.ts` para a config final.
4
+ *
5
+ * `defineConfig` retorna um config PROVIDER (`{ type, resolver }`) que o service
6
+ * provider resolve no boot — mas `config.get('authkit')` devolve esse provider
7
+ * CRU. Comandos ace que leem a config diretamente (doctor, users:import,
8
+ * keys:rotate) precisam resolvê-lo antes de inspecionar campos, senão veem
9
+ * `issuer`/`accountStore`/`jwks` como ausentes mesmo num config válido.
10
+ *
11
+ * Valores planos (configs antigos/test fixtures) passam direto.
12
+ */
13
+ export async function resolveAuthkitConfig(app, raw) {
14
+ if (!raw)
15
+ return null;
16
+ const resolved = (await configProvider.resolve(app, raw));
17
+ return resolved ?? raw;
18
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Ace commands para gerenciamento de runtime settings da tabela `auth_settings`.
3
+ *
4
+ * Todos os commands usam o padrão dos commands existentes:
5
+ * - resolveAuthkitConfig + container para obter a config
6
+ * - SettingsCapability do store ou RuntimeSettings sobre o DB
7
+ * - Auditam settings.updated com actor 'cli'
8
+ *
9
+ * Commands disponíveis:
10
+ * authkit:settings:list — lista todas as settings presentes
11
+ * authkit:settings:get <key> — obtém uma setting por key
12
+ * authkit:settings:set <key> <json> — grava (upsert) uma setting (valida shape se key conhecida)
13
+ * authkit:settings:unset <key> — apaga uma setting (reset to config)
14
+ *
15
+ * Todas suportam --json para output machine-readable.
16
+ */
17
+ import type { ApplicationService } from '@adonisjs/core/types';
18
+ export declare function settingsList(app: ApplicationService, opts: {
19
+ json?: boolean;
20
+ logger: {
21
+ info: (m: string) => void;
22
+ warn: (m: string) => void;
23
+ };
24
+ }): Promise<void>;
25
+ export declare function settingsGet(app: ApplicationService, key: string, opts: {
26
+ json?: boolean;
27
+ logger: {
28
+ info: (m: string) => void;
29
+ warn: (m: string) => void;
30
+ };
31
+ }): Promise<void>;
32
+ export declare function settingsSet(app: ApplicationService, key: string, jsonValue: string, opts: {
33
+ json?: boolean;
34
+ logger: {
35
+ info: (m: string) => void;
36
+ warn: (m: string) => void;
37
+ error: (m: string) => void;
38
+ };
39
+ }): Promise<boolean>;
40
+ export declare function settingsUnset(app: ApplicationService, key: string, opts: {
41
+ json?: boolean;
42
+ logger: {
43
+ info: (m: string) => void;
44
+ warn: (m: string) => void;
45
+ error: (m: string) => void;
46
+ };
47
+ }): Promise<void>;
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Ace commands para gerenciamento de runtime settings da tabela `auth_settings`.
3
+ *
4
+ * Todos os commands usam o padrão dos commands existentes:
5
+ * - resolveAuthkitConfig + container para obter a config
6
+ * - SettingsCapability do store ou RuntimeSettings sobre o DB
7
+ * - Auditam settings.updated com actor 'cli'
8
+ *
9
+ * Commands disponíveis:
10
+ * authkit:settings:list — lista todas as settings presentes
11
+ * authkit:settings:get <key> — obtém uma setting por key
12
+ * authkit:settings:set <key> <json> — grava (upsert) uma setting (valida shape se key conhecida)
13
+ * authkit:settings:unset <key> — apaga uma setting (reset to config)
14
+ *
15
+ * Todas suportam --json para output machine-readable.
16
+ */
17
+ import { RuntimeSettings } from '../host/runtime_settings.js';
18
+ import { resolveAuthkitConfig } from './resolve_config.js';
19
+ import { SETTING_KEYS } from '../host/runtime_toggles.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Known-key shape validators (best-effort — warn only, não rejeita)
22
+ // ---------------------------------------------------------------------------
23
+ const KNOWN_KEYS = new Set(Object.values(SETTING_KEYS));
24
+ /** Validação superficial de shape para keys conhecidas. Retorna null se ok, string de erro se inválida. */
25
+ function validateKnownKey(key, value) {
26
+ if (value === null || value === undefined)
27
+ return null;
28
+ if (typeof value !== 'object' || Array.isArray(value)) {
29
+ return `Value for key "${key}" must be a JSON object, got ${Array.isArray(value) ? 'array' : typeof value}.`;
30
+ }
31
+ const obj = value;
32
+ switch (key) {
33
+ case SETTING_KEYS.LOCKOUT: {
34
+ const fields = ['enabled', 'maxAttempts', 'windowSec', 'baseLockoutSec', 'maxLockoutSec'];
35
+ for (const f of fields) {
36
+ if (f in obj && f === 'enabled' && typeof obj[f] !== 'boolean')
37
+ return `lockout.${f} must be boolean`;
38
+ if (f in obj && f !== 'enabled' && typeof obj[f] !== 'number')
39
+ return `lockout.${f} must be number`;
40
+ }
41
+ return null;
42
+ }
43
+ case SETTING_KEYS.RATE_LIMIT: {
44
+ for (const bucket of ['login', 'introspection']) {
45
+ if (bucket in obj && obj[bucket] !== null) {
46
+ const b = obj[bucket];
47
+ if (typeof b !== 'object' || Array.isArray(b))
48
+ return `rate_limit.${bucket} must be object`;
49
+ if ('points' in b && typeof b.points !== 'number')
50
+ return `rate_limit.${bucket}.points must be number`;
51
+ if ('duration' in b && typeof b.duration !== 'string')
52
+ return `rate_limit.${bucket}.duration must be string`;
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ case SETTING_KEYS.PASSWORD_POLICY: {
58
+ const boolFields = ['requireUppercase', 'requireLowercase', 'requireNumbers', 'requireSymbols', 'checkPwned'];
59
+ for (const f of boolFields) {
60
+ if (f in obj && typeof obj[f] !== 'boolean')
61
+ return `password_policy.${f} must be boolean`;
62
+ }
63
+ if ('minLength' in obj && typeof obj.minLength !== 'number')
64
+ return `password_policy.minLength must be number`;
65
+ return null;
66
+ }
67
+ case SETTING_KEYS.NOTIFICATIONS: {
68
+ for (const f of ['newLoginEmail', 'newDeviceEmail']) {
69
+ if (f in obj && typeof obj[f] !== 'boolean')
70
+ return `notifications.${f} must be boolean`;
71
+ }
72
+ return null;
73
+ }
74
+ case SETTING_KEYS.TRUSTED_DEVICES: {
75
+ if ('enabled' in obj && typeof obj.enabled !== 'boolean')
76
+ return 'trusted_devices.enabled must be boolean';
77
+ if ('days' in obj && typeof obj.days !== 'number')
78
+ return 'trusted_devices.days must be number';
79
+ return null;
80
+ }
81
+ case SETTING_KEYS.TOKEN_TTL: {
82
+ const fields = ['accessTokenSec', 'idTokenSec', 'refreshTokenSec'];
83
+ for (const f of fields) {
84
+ if (f in obj && typeof obj[f] !== 'number')
85
+ return `token_ttl.${f} must be number`;
86
+ }
87
+ return null;
88
+ }
89
+ case SETTING_KEYS.ADMIN_IMPERSONATION: {
90
+ if ('enabled' in obj && typeof obj.enabled !== 'boolean')
91
+ return 'admin_impersonation.enabled must be boolean';
92
+ return null;
93
+ }
94
+ case SETTING_KEYS.ORGANIZATIONS_POLICY: {
95
+ if ('allowSelfCreate' in obj && typeof obj.allowSelfCreate !== 'boolean')
96
+ return 'organizations_policy.allowSelfCreate must be boolean';
97
+ if ('invitationTtlHours' in obj && typeof obj.invitationTtlHours !== 'number')
98
+ return 'organizations_policy.invitationTtlHours must be number';
99
+ if ('roles' in obj && !Array.isArray(obj.roles))
100
+ return 'organizations_policy.roles must be array';
101
+ return null;
102
+ }
103
+ default:
104
+ return null;
105
+ }
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Shared helper: resolve settings service
109
+ // ---------------------------------------------------------------------------
110
+ async function resolveSettingsService(app) {
111
+ try {
112
+ const db = await app.container.make('lucid.db');
113
+ // Tenta derivar a conexão do accountStore para probe searchPath-aware.
114
+ let connection;
115
+ try {
116
+ const cfg = await resolveCfg(app);
117
+ connection = cfg?.accountStore?.connectionName;
118
+ }
119
+ catch {
120
+ // Silencioso: sem config → default connection.
121
+ }
122
+ return new RuntimeSettings(db, connection ? { connection } : {});
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ async function resolveCfg(app) {
129
+ const raw = app.config?.get?.('authkit') ?? null;
130
+ return resolveAuthkitConfig(app, raw);
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // authkit:settings:list
134
+ // ---------------------------------------------------------------------------
135
+ export async function settingsList(app, opts) {
136
+ const svc = await resolveSettingsService(app);
137
+ if (!svc) {
138
+ opts.logger.warn('Could not connect to database — is lucid.db bound in the container?');
139
+ return;
140
+ }
141
+ const tablePresent = await svc.isTablePresent();
142
+ if (!tablePresent) {
143
+ opts.logger.warn('The `auth_settings` table is not present. Run migrations to create it.');
144
+ return;
145
+ }
146
+ const rows = await svc.listSettings();
147
+ if (opts.json) {
148
+ opts.logger.info(JSON.stringify(rows.map((r) => ({ key: r.key, value: r.value, updatedAt: r.updatedAt, updatedBy: r.updatedBy }))));
149
+ return;
150
+ }
151
+ if (rows.length === 0) {
152
+ opts.logger.info('No runtime settings found (table present but empty).');
153
+ return;
154
+ }
155
+ for (const row of rows) {
156
+ const updatedInfo = row.updatedAt ? ` [updated: ${row.updatedAt}]` : '';
157
+ const byInfo = row.updatedBy ? ` by: ${row.updatedBy}` : '';
158
+ opts.logger.info(` ${row.key}${updatedInfo}${byInfo}: ${JSON.stringify(row.value)}`);
159
+ }
160
+ }
161
+ // ---------------------------------------------------------------------------
162
+ // authkit:settings:get
163
+ // ---------------------------------------------------------------------------
164
+ export async function settingsGet(app, key, opts) {
165
+ const svc = await resolveSettingsService(app);
166
+ if (!svc) {
167
+ opts.logger.warn('Could not connect to database.');
168
+ return;
169
+ }
170
+ const tablePresent = await svc.isTablePresent();
171
+ if (!tablePresent) {
172
+ opts.logger.warn('The `auth_settings` table is not present.');
173
+ return;
174
+ }
175
+ const value = await svc.getSetting(key);
176
+ if (value === null) {
177
+ opts.logger.warn(`Setting "${key}" not found (not set — config/default applies).`);
178
+ return;
179
+ }
180
+ if (opts.json) {
181
+ opts.logger.info(JSON.stringify({ key, value }));
182
+ return;
183
+ }
184
+ opts.logger.info(`${key}: ${JSON.stringify(value, null, 2)}`);
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // authkit:settings:set
188
+ // ---------------------------------------------------------------------------
189
+ export async function settingsSet(app, key, jsonValue, opts) {
190
+ let parsed;
191
+ try {
192
+ parsed = JSON.parse(jsonValue);
193
+ }
194
+ catch {
195
+ opts.logger.error(`Invalid JSON for value: ${jsonValue}`);
196
+ return false;
197
+ }
198
+ // Warn on unknown keys; validate shape for known keys.
199
+ if (!KNOWN_KEYS.has(key)) {
200
+ opts.logger.warn(`Key "${key}" is not in the known setting catalog. Proceeding with write (unknown keys are stored as-is).`);
201
+ }
202
+ else {
203
+ const validationError = validateKnownKey(key, parsed);
204
+ if (validationError) {
205
+ opts.logger.error(`Shape validation error for key "${key}": ${validationError}`);
206
+ return false;
207
+ }
208
+ }
209
+ const svc = await resolveSettingsService(app);
210
+ if (!svc) {
211
+ opts.logger.error('Could not connect to database.');
212
+ return false;
213
+ }
214
+ const tablePresent = await svc.isTablePresent();
215
+ if (!tablePresent) {
216
+ opts.logger.error('The `auth_settings` table is not present. Run migrations to create it.');
217
+ return false;
218
+ }
219
+ await svc.setSetting(key, parsed, 'cli');
220
+ // Audit via config.audit if available.
221
+ const cfg = await resolveCfg(app);
222
+ await cfg?.audit?.record({
223
+ type: 'settings.updated',
224
+ actorId: 'cli',
225
+ ip: null,
226
+ metadata: { key, value: parsed },
227
+ });
228
+ if (opts.json) {
229
+ opts.logger.info(JSON.stringify({ key, value: parsed, updated: true }));
230
+ return true;
231
+ }
232
+ opts.logger.info(`Setting "${key}" saved.`);
233
+ return true;
234
+ }
235
+ // ---------------------------------------------------------------------------
236
+ // authkit:settings:unset
237
+ // ---------------------------------------------------------------------------
238
+ export async function settingsUnset(app, key, opts) {
239
+ const svc = await resolveSettingsService(app);
240
+ if (!svc) {
241
+ opts.logger.error('Could not connect to database.');
242
+ return;
243
+ }
244
+ const tablePresent = await svc.isTablePresent();
245
+ if (!tablePresent) {
246
+ opts.logger.error('The `auth_settings` table is not present.');
247
+ return;
248
+ }
249
+ const existing = await svc.getSetting(key);
250
+ if (existing === null) {
251
+ opts.logger.warn(`Setting "${key}" was not set (nothing to unset).`);
252
+ if (opts.json)
253
+ opts.logger.info(JSON.stringify({ key, deleted: false }));
254
+ return;
255
+ }
256
+ await svc.deleteSetting(key);
257
+ // Audit.
258
+ const cfg = await resolveCfg(app);
259
+ await cfg?.audit?.record({
260
+ type: 'settings.updated',
261
+ actorId: 'cli',
262
+ ip: null,
263
+ metadata: { key, action: 'deleted' },
264
+ });
265
+ if (opts.json) {
266
+ opts.logger.info(JSON.stringify({ key, deleted: true }));
267
+ return;
268
+ }
269
+ opts.logger.info(`Setting "${key}" deleted — config/default is now the source of truth.`);
270
+ }
@@ -0,0 +1,22 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ /**
3
+ * Delega a requisição Adonis ao handler do oidc-provider (`service.callback`),
4
+ * que faz seu próprio roteamento e escreve direto na resposta Node.
5
+ *
6
+ * Quando o issuer tem um path (ex.: `/oidc`), o `service.callback` é um app Koa
7
+ * com o provider MONTADO sob esse path via koa-mount (vide OidcService). Por isso
8
+ * NÃO removemos o prefixo de `req.url`: o koa-mount cuida do mount e o provider
9
+ * gera URLs de discovery/redirect já prefixadas (ex.: /oidc/auth, /oidc/jwks).
10
+ *
11
+ * Resolvemos a Promise no `finish`/`close` para impedir que o Adonis tente
12
+ * tratar a resposta novamente.
13
+ *
14
+ * Body bridge: o bodyparser do AdonisJS consome o stream da requisição antes
15
+ * de chegar aqui. O oidc-provider usa `raw-body` para ler o stream — como ele
16
+ * já está esgotado, o provider cai no fallback `ctx.req.body || ctx.request.body`.
17
+ * Populamos `req.body` com o payload já parseado pelo AdonisJS para que o
18
+ * oidc-provider consiga ler os parâmetros do formulário (client_id, code, etc.).
19
+ */
20
+ export default class OidcCallbackController {
21
+ handle(ctx: HttpContext): Promise<void>;
22
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Delega a requisição Adonis ao handler do oidc-provider (`service.callback`),
3
+ * que faz seu próprio roteamento e escreve direto na resposta Node.
4
+ *
5
+ * Quando o issuer tem um path (ex.: `/oidc`), o `service.callback` é um app Koa
6
+ * com o provider MONTADO sob esse path via koa-mount (vide OidcService). Por isso
7
+ * NÃO removemos o prefixo de `req.url`: o koa-mount cuida do mount e o provider
8
+ * gera URLs de discovery/redirect já prefixadas (ex.: /oidc/auth, /oidc/jwks).
9
+ *
10
+ * Resolvemos a Promise no `finish`/`close` para impedir que o Adonis tente
11
+ * tratar a resposta novamente.
12
+ *
13
+ * Body bridge: o bodyparser do AdonisJS consome o stream da requisição antes
14
+ * de chegar aqui. O oidc-provider usa `raw-body` para ler o stream — como ele
15
+ * já está esgotado, o provider cai no fallback `ctx.req.body || ctx.request.body`.
16
+ * Populamos `req.body` com o payload já parseado pelo AdonisJS para que o
17
+ * oidc-provider consiga ler os parâmetros do formulário (client_id, code, etc.).
18
+ */
19
+ export default class OidcCallbackController {
20
+ async handle(ctx) {
21
+ const service = await ctx.containerResolver.make('authkit.server');
22
+ const req = ctx.request.request;
23
+ const res = ctx.response.response;
24
+ // Repassa o body já parseado pelo AdonisJS para o req cru, pois o stream
25
+ // foi consumido pelo bodyparser_middleware antes de chegar neste controller.
26
+ req.body = ctx.request.all();
27
+ return new Promise((resolve) => {
28
+ res.on('finish', resolve);
29
+ res.on('close', resolve);
30
+ service.callback(req, res);
31
+ });
32
+ }
33
+ }