@seedgrid/ai-toolkit 0.0.0-stage → 0.3.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 (225) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -2
  3. package/dist/adapters/claude.js +114 -0
  4. package/dist/adapters/codex.js +108 -0
  5. package/dist/adapters/index.js +17 -0
  6. package/dist/adapters/shared.js +142 -0
  7. package/dist/adapters/types.js +1 -0
  8. package/dist/cli.js +203 -0
  9. package/dist/commands/common.js +98 -0
  10. package/dist/commands/doctor.js +290 -0
  11. package/dist/commands/init.js +9 -0
  12. package/dist/commands/install.js +107 -0
  13. package/dist/commands/remove.js +54 -0
  14. package/dist/commands/review.js +127 -0
  15. package/dist/commands/status.js +73 -0
  16. package/dist/commands/update.js +8 -0
  17. package/dist/commands/validate.js +27 -0
  18. package/dist/core/apply.js +181 -0
  19. package/dist/core/blocks.js +64 -0
  20. package/dist/core/content.js +528 -0
  21. package/dist/core/env.js +40 -0
  22. package/dist/core/frontmatter.js +29 -0
  23. package/dist/core/hash.js +14 -0
  24. package/dist/core/inspect.js +51 -0
  25. package/dist/core/lock.js +124 -0
  26. package/dist/core/paths.js +65 -0
  27. package/dist/core/plan.js +242 -0
  28. package/dist/core/tools.js +62 -0
  29. package/dist/core/types.js +11 -0
  30. package/dist/core/updates.js +121 -0
  31. package/docs/arquitetura.md +80 -0
  32. package/docs/compatibilidade.md +50 -0
  33. package/docs/formato.md +155 -0
  34. package/docs/instalacao.md +105 -0
  35. package/docs/manutencao.md +115 -0
  36. package/package.json +43 -4
  37. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
  38. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
  39. package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
  40. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
  41. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
  42. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
  43. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
  44. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
  45. package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
  46. package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
  47. package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
  48. package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
  49. package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
  50. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
  51. package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
  52. package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
  53. package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
  54. package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
  55. package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
  56. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
  57. package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
  58. package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
  59. package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
  60. package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
  61. package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
  62. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
  63. package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
  64. package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
  65. package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
  66. package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
  67. package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
  68. package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
  69. package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
  70. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
  71. package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
  72. package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
  73. package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
  74. package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
  75. package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
  76. package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
  77. package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
  78. package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
  79. package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
  80. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
  81. package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
  82. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
  83. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
  84. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
  85. package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
  86. package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
  87. package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
  88. package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
  89. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
  90. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
  91. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
  92. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
  93. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
  94. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
  95. package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
  96. package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
  97. package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
  98. package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
  99. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
  100. package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
  101. package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
  102. package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
  103. package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
  104. package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
  105. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
  106. package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
  107. package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
  108. package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
  109. package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
  110. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
  111. package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
  112. package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
  113. package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
  114. package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
  115. package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
  116. package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
  117. package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
  118. package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
  119. package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
  120. package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
  121. package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
  122. package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
  123. package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
  124. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
  125. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
  126. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
  127. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
  128. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
  129. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
  130. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
  131. package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
  132. package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
  133. package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
  134. package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
  135. package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
  136. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
  137. package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
  138. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
  139. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
  140. package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
  141. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
  142. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
  143. package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
  144. package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
  145. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
  146. package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
  147. package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
  148. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
  149. package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
  150. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
  151. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
  152. package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
  153. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
  154. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
  155. package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
  156. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
  157. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
  158. package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
  159. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
  160. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
  161. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
  162. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
  163. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
  164. package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
  165. package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
  166. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
  167. package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
  168. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
  169. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
  170. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
  171. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
  172. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
  173. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
  174. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
  175. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
  176. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
  177. package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
  178. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
  179. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
  180. package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
  181. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
  182. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
  183. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
  184. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
  185. package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
  186. package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
  187. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
  188. package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
  189. package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
  190. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
  191. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
  192. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
  193. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
  194. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
  195. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
  196. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
  197. package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
  198. package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
  199. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
  200. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
  201. package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
  202. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
  203. package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
  204. package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
  205. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
  206. package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
  207. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
  208. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
  209. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
  210. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
  211. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
  212. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
  213. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
  214. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
  215. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
  216. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
  217. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
  218. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
  219. package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
  220. package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
  221. package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
  222. package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
  223. package/seedgridKB/SeedGrid/Versoes.md +64 -0
  224. package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
  225. package/seedgridKB/manifest.json +142 -0
@@ -0,0 +1,327 @@
1
+ ---
2
+ tags: [seedgrid, extension, security, rust, configuracao]
3
+ fonte: rust/seedgrid-rust-crate-security
4
+ branch: main
5
+ commit: be738a2d1e
6
+ analisado-em: 2026-10-14
7
+ ---
8
+
9
+ # Configuração Rust — `seedgrid-security`
10
+
11
+ Volta para: [[SeedGrid/Extensions/security/Rust|Porte Rust do security]] · Java: [[SeedGrid/Extensions/security/Configuracao|Configuração do security (Quarkus)]]
12
+
13
+ ## 1. Cabeçalho
14
+
15
+ | Item | Valor |
16
+ |---|---|
17
+ | Crate / pacote | diretório `rust/seedgrid-rust-crate-security`, pacote Cargo `seedgrid-security`, lib `seedgrid_security` |
18
+ | Struct de config | `SecurityConfig` (agrega `JwtConfig`, `RefreshTokenConfig`, `PasswordConfig`, `TwoFactorConfig`, `EncryptionConfig`, `PrivacyConfig`, `SelfEnterConfig`, `FrontendConfig`, `AvatarConfig`, `FirstAdminUserConfig`, `DefaultCompanyConfig`, `MailerConfig`, `UserAttributesConfig`, `AccountManagementConfig`) — `src/config.rs` |
19
+ | Mecanismo | variáveis de ambiente lidas com `std::env::var` em `SecurityConfig::from_env()` (no boot, uma vez). O host pode também montar `SecurityConfig::new(JwtConfig)` e alterar campos à mão. Fora do `from_env`, uma única env é lida no `SecurityStateBuilder::build()` (`SEEDGRID_SECURITY_TEMPLATES_DIR`). |
20
+ | Quem chama `from_env` | o host; ou `SecurityPlatform::assemble` (`src/platform.rs`); ou os orquestradores `login-tenancy::assemble_all` e `subdomain-tenancy::assemble_all` |
21
+ | Falha | `from_env` só devolve `Err` quando **nenhuma** fonte de chave RSA está presente (ou base64 inválido / arquivo ilegível). `SecurityPlatform::assemble` trata esse `Err` como "security desabilitado" (`Ok(None)`). Valores numéricos/durações inválidos são **ignorados silenciosamente** (fica o default). |
22
+ | Features Cargo | **nenhuma** (`Cargo.toml` não declara `[features]`). |
23
+ | Origem (caminho base) | todas as origens abaixo são relativas a `rust/seedgrid-rust-crate-security/` |
24
+
25
+ ### Convenções de nomes e precedência (Confirmado)
26
+
27
+ O crate aceita **dois "dialetos"** de env, para que o mesmo `dev.env` funcione no Java e no Rust:
28
+
29
+ - `SEEDGRID_SECURITY_*` — nomes usados no `META-INF/microprofile-config.properties` do módulo Java (`${SEEDGRID_SECURITY_...:default}`).
30
+ - `SECURITY_*` — nomes usados nos `application.properties` dos **exemplos Java** (`java/examples/*/application.properties`, ex.: `seedgrid.security.jwt.issuer=${SECURITY_JWT_ISSUER:...}`) e nomes históricos do crate.
31
+
32
+ Regra de precedência quando há os dois: **a primeira env listada que existir vence** (`env::var(a).or_else(|_| env::var(b))`). Na maioria dos grupos o nome `SEEDGRID_*` vem primeiro. Exceções importantes:
33
+
34
+ - **JWT issuer/kid/ttl, refresh, senha, self-enter enabled/public/invite**: só o nome `SECURITY_*` é lido. `SEEDGRID_SECURITY_JWT_ISSUER`, `SEEDGRID_SECURITY_JWT_KID`, `SEEDGRID_SECURITY_JWT_TTL` (nomes do módulo Java) **não** são lidos pelo crate (Confirmado por grep).
35
+ - **2FA, default company corporate/trade name, account audiences**: só o nome `SEEDGRID_*` é lido.
36
+ - "Existir" difere por grupo: em `fe_env`/`first_env` uma env vazia/branca conta como ausente (passa para o alias); em `env::var(a).or_else(...)` simples (ex.: `SEEDGRID_PRIVACY_CRYPTO_KEY`, mailer password, 2FA enabled) uma env **vazia porém definida** vence e é usada.
37
+
38
+ Parsing:
39
+ - **Booleanos** (`parse_bool`): `true/1/yes/on` (sem caixa) → `true`; qualquer outra coisa → `false`. Exceção: `SECURITY_SELF_ENTER_ENABLED/PUBLIC_ENABLED/INVITE_ENABLED` usam comparação literal `v == "true"` (case-sensitive).
40
+ - **Durações** (`parse_duration_to_seconds`): inteiro puro = segundos; ISO-8601 subset `PnDTnHnMnS` (sem semanas/meses/anos); sufixo `8h`/`30m`/`45s`/`30d`. Formato não reconhecido → ignorado (fica o default).
41
+ - **CSV** (`parse_csv` / split manual): itens aparados, vazios descartados.
42
+
43
+ ## 2. Propriedades do crate
44
+
45
+ Colunas: **Leitura** = quando é lida. "boot" = `SecurityConfig::from_env()`; "build" = `SecurityStateBuilder::build()`; "struct" = só campo de struct (sem env), definido pelo host.
46
+
47
+ ### 2.1 JWT (chaves RSA, issuer, TTL)
48
+
49
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
50
+ |---|---|---|---|---|---|---|---|---|---|
51
+ | 🔒 `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64` → `jwt.private_key_pem` | `Vec<u8>` | base64 do **DER PKCS#8** (sem header PEM); espaços/quebras ignorados | — | Condicional: uma das 4 fontes da chave privada é obrigatória | 1ª na precedência; DER é reembrulhado em PEM `PRIVATE KEY` (`der_to_pem`). Base64 inválido → `Err` | assina o access token RS256 (`crypto::jwt::JwtKeys::from_rsa_pem`) | Java: `seedgrid.security.jwt.private-key-base64` (Confirmado, mesmo nome de env) | boot | `src/config.rs` → `read_rsa_key`; consumo `src/state.rs` → `SecurityStateBuilder::build` |
52
+ | 🔒 `SEEDGRID_SECURITY_JWT_PUBLIC_KEY_BASE64` → `jwt.public_key_pem` | `Vec<u8>` | base64 do **DER X.509/SPKI** | — | Condicional: uma das 4 fontes da pública | idem, label `PUBLIC KEY` | valida o access token | Java: `seedgrid.security.jwt.public-key-base64` | boot | idem |
53
+ | `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_LOCATION` · alias `SECURITY_PRIVATE_KEY_LOCATION` | caminho | arquivo PEM legível | — | Condicional | 2ª fonte; lê o arquivo inteiro. Arquivo ilegível → `Err` (não cai para a próxima fonte) | idem privada | Java: `seedgrid.security.jwt.private-key-location` (default Java `keys/private.pem`; **Rust não tem default**) | boot | `src/config.rs` → `read_rsa_key` |
54
+ | `SEEDGRID_SECURITY_JWT_PUBLIC_KEY_LOCATION` · alias `SECURITY_PUBLIC_KEY_LOCATION` | caminho | arquivo PEM | — | Condicional | idem | idem pública | Java: `seedgrid.security.jwt.public-key-location` | boot | idem |
55
+ | 🔒 `SECURITY_JWT_PRIVATE_KEY_PEM` | string | PEM inline | — | Condicional | 3ª fonte (ignorada se branca) | idem | sem equivalente Java confirmado | boot | idem |
56
+ | `SECURITY_JWT_PUBLIC_KEY_PEM` | string | PEM inline | — | Condicional | 3ª fonte | idem | — | boot | idem |
57
+ | `SECURITY_JWT_PRIVATE_KEY_PEM_FILE` | caminho | arquivo PEM | — | Condicional | 4ª fonte (nome antigo do crate) | idem | — | boot | idem |
58
+ | `SECURITY_JWT_PUBLIC_KEY_PEM_FILE` | caminho | arquivo PEM | — | Condicional | 4ª fonte | idem | — | boot | idem |
59
+ | `SECURITY_JWT_ISSUER` → `jwt.issuer` | `String` | qualquer | `seedgrid` | Não | claim `iss` | `crypto/jwt.rs`; exposto no status do login-tenancy | Java: `seedgrid.security.jwt.issuer` (default Java `https://seedgrid.com.br`); env do módulo Java `SEEDGRID_SECURITY_JWT_ISSUER` **não é lida** | boot | `src/config.rs` → `from_env` |
60
+ | `SECURITY_JWT_KID` → `jwt.kid` | `Option<String>` | string não-branca | `None` (header sem `kid`) | Não | aparado; branco = `None` | `crypto/jwt.rs` (`header.kid`) | Java: `seedgrid.security.jwt.kid` (default Java `seedgrid-key`) | boot | idem |
61
+ | `SECURITY_JWT_TTL` → `jwt.ttl_seconds` | `i64` (s) | duração (ISO-8601/sufixo/inteiro) | `28800` (8h) | Não | precede `SECURITY_JWT_TTL_SECONDS` | validade do access token | Java: `seedgrid.security.jwt.ttl` (PT8H) | boot | idem |
62
+ | `SECURITY_JWT_TTL_SECONDS` | `i64` | inteiro | `28800` | Não | usado só se `SECURITY_JWT_TTL` ausente/inválida (compat) | idem | — | boot | idem |
63
+
64
+ ### 2.2 Refresh token
65
+
66
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
67
+ |---|---|---|---|---|---|---|---|---|---|
68
+ | `SECURITY_REFRESH_TOKEN_TTL` → `refresh.ttl_days` | `i64` (dias) | duração (`P30D`, `30d`, segundos) | `30` | Não | convertido para dias (`secs/86400`, mínimo 1) | `services/refresh.rs` | Java: `seedgrid.security.refresh-token.ttl` (P30D) | boot | `src/config.rs` → `from_env` |
69
+ | `SECURITY_REFRESH_TOKEN_REUSE_GRACE_WINDOW` → `refresh.reuse_grace_window_secs` | `i64` (s) | duração; `PT0S`/`0` desliga | `30` | Não | janela em que a reapresentação concorrente do mesmo refresh não é tratada como reuso | `services/refresh.rs` (`grace_secs`) | Java: `seedgrid.security.refresh-token.reuse-grace-window` (PT30S) — nome Java por regra kebab-case do `reuseGraceWindow()` | boot | idem |
70
+ | `refresh.reuse_detection` (campo) | `bool` | — | `true` | Não | reuso detectado revoga a family inteira | `services/refresh.rs:114` | sem env | struct | `src/config.rs` → `RefreshTokenConfig::default` |
71
+
72
+ ### 2.3 Política de senha
73
+
74
+ > Diferença deliberada (Confirmado, comentário em `PasswordConfig::default`): os defaults do crate são **rígidos**; os do módulo Java (`microprofile-config.properties`) são permissivos (`min-size=1`, `max-history=0`, flags `false`).
75
+
76
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
77
+ |---|---|---|---|---|---|---|---|---|---|
78
+ | `SECURITY_PASSWORD_MIN_SIZE` → `password.min_length` | `usize` | inteiro ≥ 0 | `8` | Não | tamanho mínimo | `services/users.rs` (`validate_password`) | Java: `seedgrid.security.password.min-size` (Java módulo: 1) | boot | `src/config.rs` → `from_env` |
79
+ | `SECURITY_PASSWORD_EXPIRATION_DAYS` → `password.expiry_days` | `i64` | inteiro; `0` = nunca | `0` | Não | data de expiração da senha | `services/users.rs` | Java: `...password.expiration-days` | boot | idem |
80
+ | `SECURITY_PASSWORD_MAX_HISTORY` → `password.history_size` | `usize` | inteiro | `5` | Não | senhas anteriores proibidas | `services/users.rs` | Java: `...password.max-history` (Java módulo: 0) | boot | idem |
81
+ | `SECURITY_PASSWORD_UPPER` → `password.require_upper` | `bool` | `parse_bool` | `true` | Não | exige maiúscula | `services/users.rs` | Java: `...password.upper-case-required` (Java módulo: false) | boot | idem |
82
+ | `SECURITY_PASSWORD_LOWER` → `password.require_lower` | `bool` | `parse_bool` | `true` | Não | exige minúscula | idem | Java: `...lower-case-required` | boot | idem |
83
+ | `SECURITY_PASSWORD_SPECIAL` → `password.require_special` | `bool` | `parse_bool` | `true` | Não | exige especial de `!@#$%^&*(),.?":{}\|<>` | idem | Java: `...special-character-required` | boot | idem |
84
+ | `SECURITY_PASSWORD_NO_REPEAT` → `password.prohibit_repeated_sequence` | `bool` | `parse_bool` | `true` | Não | proíbe 2 caracteres iguais seguidos | idem | Java: `...prohibits-repeated-characters-in-sequence` | boot | idem |
85
+
86
+ ### 2.4 Criptografia (segredo TOTP e PII) e privacidade
87
+
88
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
89
+ |---|---|---|---|---|---|---|---|---|---|
90
+ | 🔒 `SEEDGRID_PRIVACY_CRYPTO_KEY` · aliases `SECURITY_ENCRYPTION_KEY`, `SEEDGRID_SECURITY_ENCRYPTION_KEY` → `encryption.key_b64` | `Option<String>` | base64 de 32 bytes (AES-256) | `None` | Condicional: exigida para 2FA TOTP (cifra do segredo) e para cifra de PII com privacy ligado | precedência na ordem listada; chave inválida faz `build()` falhar | `src/state.rs` (`SecretCipher`, `AesGcmCryptoService`); `services/twofactor.rs` (`cipher`) | Java: `seedgrid.privacy.crypto.key` (Confirmado em `CryptoProvider.CRYPTO_KEY_PROPERTY` da lib privacy) e `seedgrid.security.encryption.key` (`SecurityEncryptionConfig#key`) | boot | `src/config.rs` → `from_env` |
91
+ | `SEEDGRID_PRIVACY_ENCRYPTION_ENABLED` · alias `SECURITY_PRIVACY_ENABLED` → `privacy.enabled` | `bool` | `parse_bool` | `false` | Não | liga a cifra at-rest de PII (`email`, `whatsApp`, `cnpj`, `rep_*`) e os hashes de busca — só se as chaves existirem | `src/state.rs` (gate de `field_cipher`/`search_hasher`) | Java: `seedgrid.privacy.encryption.enabled` | boot | idem |
92
+ | 🔒 `SEEDGRID_PRIVACY_SEARCH_KEY` · alias `SECURITY_PRIVACY_HMAC_KEY` → `privacy.hmac_key_b64` | `Option<String>` | base64 (≥ 32 bytes, segundo README) | `None` | Condicional: necessária para busca por hash com privacy ligado | HMAC-SHA256 dos `*_hash` | `src/state.rs` | Java: `seedgrid.privacy.search.key` | boot | idem |
93
+
94
+ ### 2.5 2FA (`seedgrid.security.2f.*`)
95
+
96
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
97
+ |---|---|---|---|---|---|---|---|---|---|
98
+ | `SEEDGRID_SECURITY_2F_ENABLED` → `two_factor.enabled` | `bool` | `parse_bool` | `false` | Não | liga o fluxo 2FA no login; `/2f/*` informa `featureEnabled` | `services/auth.rs:130`, `src/routes.rs` | Java: `seedgrid.security.2f.enabled` (`@WithDefault false`, mas o `microprofile-config.properties` do módulo fixa `true` — **default efetivo é `true` no Java**) | boot | `src/config.rs` → `from_env` |
99
+ | `SEEDGRID_SECURITY_2F_EMAIL_CODE_TTL` → `two_factor.email_code_ttl_seconds` | `i64` (s) | duração | `300` | Não | validade do código por e-mail | `services/twofactor.rs` | Java: `...2f.email.code-ttl` (PT5M) | boot | idem |
100
+ | `SEEDGRID_SECURITY_2F_ALLOWED_METHODS` → `two_factor.allowed_methods` | `Vec<String>` | CSV de `EMAIL`, `TOTP`, `WHATSAPP` | `EMAIL,TOTP` | Não | lista vazia é ignorada | `src/routes.rs` | Java: `...2f.allowed-methods` | boot | idem |
101
+ | `SEEDGRID_SECURITY_2F_DEFAULT_METHOD` → `two_factor.default_method` | `String` | `EMAIL`/`TOTP`/`WHATSAPP` | `TOTP` | Não | método default da sessão 2FA | `services/twofactor.rs` | Java: `...2f.default-method` | boot | idem |
102
+ | `SEEDGRID_SECURITY_2F_TOTP_ISSUER` → `two_factor.totp_issuer` | `String` | qualquer | `SeedGrid` | Não | issuer do `otpauth://` | `services/twofactor.rs` | Java: `...2f.totp.issuer` | boot | idem |
103
+ | `SEEDGRID_SECURITY_2F_TOTP_DIGITS` → `two_factor.totp_digits` | `usize` | inteiro | `6` | Não | dígitos TOTP e dos OTP numéricos | `services/twofactor.rs` | Java: `...2f.totp.digits` | boot | idem |
104
+ | `SEEDGRID_SECURITY_2F_TOTP_PERIOD` → `two_factor.totp_period_seconds` | `u64` | inteiro (s) | `30` | Não | período TOTP | `services/twofactor.rs` | Java: `...2f.totp.period` | boot | idem |
105
+ | `SEEDGRID_SECURITY_2F_VERIFY_MAX_ATTEMPTS` → `two_factor.verify_max_attempts` | `u32` | inteiro | `5` | Não | tentativas por sessão | `services/twofactor.rs:293` | Java: `...2f.verify.max-attempts` | boot | idem |
106
+ | `SEEDGRID_SECURITY_2F_SESSION_TTL` → `two_factor.session_ttl_seconds` | `i64` (s) | duração | `300` | Não | sessão temporária login→verify | `services/twofactor.rs` | Java: `...2f.session.ttl` (PT5M) | boot | idem |
107
+ | `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` → `two_factor.whatsapp_channel_id` | `String` | canal/instância | vazio | Condicional: necessário para oferecer WHATSAPP | vazio → WHATSAPP nunca oferecido; preenchido → `build()` cria `WhatsAppCrateSender` com `seedgrid_whatsapp::WhatsAppConfig::from_env()` | `src/state.rs` (`whatsapp_is_configured`) | Java: `...2f.whatsapp.channel-id` (env Java idêntica). Credenciais do provider: ver [[SeedGrid/Extensions/whatsapp/Configuracao-Rust\|config Rust do whatsapp]] | boot | idem |
108
+ | `SEEDGRID_SECURITY_2F_BACKUP_CODES_COUNT` → `two_factor.backup_codes_count` | `usize` | inteiro | `10` | Não | nº de backup codes gerados | `services/twofactor.rs:615` | Java: `...2f.backup-codes.count` | boot | idem |
109
+
110
+ ### 2.6 Frontend (links de e-mail)
111
+
112
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
113
+ |---|---|---|---|---|---|---|---|---|---|
114
+ | `SEEDGRID_SECURITY_FRONTEND_BASE_URL` · aliases `SECURITY_FRONTEND_BASE_URL`, `SECURITY_BASE_URL` → `frontend.base_url` | `String` | URL | `http://localhost:3000` | Não (recomendada em produção) | branco ignorado; `/` final removida no uso | `src/web/links.rs` | Java: `seedgrid.security.frontend.base-url` (env idêntica) | boot | `src/config.rs` → `from_env` |
115
+ | `SEEDGRID_SECURITY_FRONTEND_LOGIN_PATH` · alias `SECURITY_FRONTEND_LOGIN_PATH` | `String` | path | `/login` | Não | — | `src/web/links.rs` | Java: `...frontend.login-path` | boot | idem (`fe_env`) |
116
+ | `SEEDGRID_SECURITY_FRONTEND_PASSWORD_RESET_PATH` · alias `SECURITY_FRONTEND_PASSWORD_RESET_PATH` | `String` | path | `/auth/forgot-password/confirm` | Não | — | idem | Java: `...password-reset-path` | boot | idem |
117
+ | `SEEDGRID_SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH` · alias `SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH` | `String` | path | `/auth/confirm-email` | Não | — | idem | Java: `...email-confirmation-path` | boot | idem |
118
+ | `SEEDGRID_SECURITY_FRONTEND_WELCOME_PATH` · alias `SECURITY_FRONTEND_WELCOME_PATH` | `String` | path | `/auth/welcome` | Não | — | idem | Java: `...welcome-path` | boot | idem |
119
+ | `SEEDGRID_SECURITY_FRONTEND_SELF_ENTER_PATH` · alias `SECURITY_FRONTEND_SELF_ENTER_PATH` | `String` | path | `/auth/self-enter` | Não | — | idem | Java: `...self-enter-path` | boot | idem |
120
+
121
+ ### 2.7 Self-enter (auto-registro e convites)
122
+
123
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
124
+ |---|---|---|---|---|---|---|---|---|---|
125
+ | `SECURITY_SELF_ENTER_ENABLED` → `self_enter.enabled` | `bool` | **só** `"true"` literal liga | `false` | Não | desligado → toda rota `/self-enter*` responde 404 (middleware antes da auth) e o cleanup não roda | `src/routes.rs`, `services/selfenter.rs` | Java: `seedgrid.security.self-enter.enabled` | boot | `src/config.rs` → `from_env` |
126
+ | `SECURITY_SELF_ENTER_PUBLIC_ENABLED` → `self_enter.public_enabled` | `bool` | `"true"` literal | `true` | Não | `false` = modo só-convite (signup público 404) | `services/selfenter.rs` | Java: `...self-enter.public-enabled` | boot | idem |
127
+ | `SECURITY_SELF_ENTER_INVITE_ENABLED` → `self_enter.invite_enabled` | `bool` | `"true"` literal | `true` | Não | `false` = convites 404 | idem | Java: `...self-enter.invite-enabled` | boot | idem |
128
+ | `SEEDGRID_SECURITY_SELF_ENTER_REQUEST_TTL` · alias `SECURITY_SELF_ENTER_REQUEST_TTL` → `request_ttl_hours` | `i64` (h) | duração | `48` | Não | convertido para horas (mín. 1) | `services/selfenter.rs` | Java: `...self-enter.request-ttl` (PT48H) | boot | idem |
129
+ | `SEEDGRID_SECURITY_SELF_ENTER_INVITE_TTL` · alias `SECURITY_SELF_ENTER_INVITE_TTL` → `invite_ttl_hours` | `i64` (h) | duração | `168` | Não | idem | idem | Java: `...invite-ttl` (PT168H) | boot | idem |
130
+ | `SEEDGRID_SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL` · alias `SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL` → `otp_ttl_seconds` | `i64` (s) | duração | `1800` | Não | validade de cada OTP de e-mail | idem | Java: `...email-token-ttl` (PT30M) | boot | idem |
131
+ | `SEEDGRID_SECURITY_SELF_ENTER_DEFAULT_ROLE` · alias `SECURITY_SELF_ENTER_DEFAULT_ROLE` → `default_role` | `Option<String>` | nome de role | — (sem padrão) | **Sim, quando `SECURITY_SELF_ENTER_ENABLED=true`**: `SecurityConfig::from_env()` devolve `Err` se ausente/em branco | role atribuída na aprovação quando o convite não traz roles. Busca `SELECT id, for_integration FROM roles WHERE name = $1 AND company_id IS NULL` **antes** de criar o usuário; ausente, inexistente ou de integração → aprovação recusada (`400`, códigos `DEFAULT_ROLE_NOT_CONFIGURED`, `DEFAULT_ROLE_NOT_FOUND`, `ROLE_NOT_ALLOWED`) e nenhum usuário é criado. Roles do convite não encontradas continuam sendo ignoradas | `services/selfenter.rs` (aprovação, `self_enter_default_role`) | Java: `seedgrid.security.self-enter.default-role` (também obrigatória com self-enter ligado). Comportamento equivalente; o Java responde 422/403 onde o Rust responde 400 | boot | idem |
132
+ | `SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_ENABLED` · alias `SECURITY_SELF_ENTER_CLEANUP_ENABLED` → `cleanup_enabled` | `bool` | `parse_bool` | `true` | Não | gate do `cleanup_entry_requests` | `services/selfenter.rs:19` | Java: `...cleanup.enabled` | boot | idem |
133
+ | `SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER` · alias `SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER` → `purge_after_hours` | `i64` (h) | duração | `168` | Não | retenção de pedidos finalizados | `services/selfenter.rs:32` | Java: `...cleanup.purge-after` (PT168H) | boot | idem |
134
+ | `self_enter.otp_accept_last_n` (campo) | `i64` | — | `4` | Não | aceita os últimos N OTPs válidos | `services/selfenter.rs:210` | sem env | struct | `SelfEnterConfig::default` |
135
+
136
+ O intervalo do job de limpeza **não é config**: o host passa um `Duration` a `spawn_entry_request_cleanup(state, interval)` (`src/lib.rs`). O Java usa `seedgrid.security.self-enter.cleanup.cron`, sem equivalente no crate.
137
+
138
+ ### 2.8 Avatar
139
+
140
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
141
+ |---|---|---|---|---|---|---|---|---|---|
142
+ | `SEEDGRID_SECURITY_AVATAR_USER_PREFIX` · alias `SECURITY_AVATAR_USER_PREFIX` → `avatar.user_prefix` | `String` | prefixo de storage | `avatars/users` | Não | — | `services/avatar.rs:57` | Java: `seedgrid.security.avatar.user-prefix` | boot | `src/config.rs` → `from_env` |
143
+ | `SEEDGRID_SECURITY_AVATAR_DEFAULT_PREFIX` · alias `SECURITY_AVATAR_DEFAULT_PREFIX` → `avatar.default_prefix` | `String` | prefixo | `avatars/defaults` | Não | pool compartilhado de avatares default | `services/avatar.rs:216` | Java: `...avatar.default-prefix` | boot | idem |
144
+ | `avatar.max_bytes` (campo) | `u64` | bytes; `0` = sem limite | `2097152` via `SecurityConfig::new`/`from_env` (`AvatarConfig::default` = `0`) | Não | rejeita upload maior | `services/avatar.rs:147` | sem env | struct | `SecurityConfig::new` |
145
+ | `avatar.allowed_content_types` (campo) | `Vec<String>` | MIME | `image/png`, `image/jpeg`, `image/webp` via `new` (vazio no `Default` = aceita tudo) | Não | — | `services/avatar.rs:153` | sem env | struct | idem |
146
+
147
+ Backend de storage e credenciais (`seedgrid.security.avatar.storage`, `.filesystem.*`, `.s3.*`, `.minio.*`...) **não** são lidos pelo crate: o host injeta `AvatarStorage` (ex.: `spi::FileManagementStorage`) no builder.
148
+
149
+ ### 2.9 Mailer SMTP
150
+
151
+ Auto-ligado no `build()` quando `username` não-branco **e** `password` não-vazio; senão `LoggingEmailService` (só loga). Injeção `.email(...)` do host sempre vence.
152
+
153
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
154
+ |---|---|---|---|---|---|---|---|---|---|
155
+ | `SEEDGRID_SECURITY_MAILER_FROM` · alias `SECURITY_MAILER_FROM` | `String` | e-mail | `noreply@example.com` | Não | remetente | `src/email_smtp.rs` | Java: `seedgrid.security.mailer.from` (env idêntica) | boot | `src/config.rs` → `from_env` |
156
+ | `SEEDGRID_SECURITY_MAILER_HOST` · alias `SECURITY_MAILER_HOST` | `String` | host | `smtp.gmail.com` | Não | — | idem | Java: `...mailer.host` | boot | idem |
157
+ | `SEEDGRID_SECURITY_MAILER_PORT` · alias `SECURITY_MAILER_PORT` | `u16` | porta | `587` | Não | inválido ignorado | idem | Java: `...mailer.port` | boot | idem |
158
+ | `SEEDGRID_SECURITY_MAILER_START_TLS` · alias `SECURITY_MAILER_START_TLS` | `String` | `REQUIRED`/`OPTIONAL`/`DISABLED` | `REQUIRED` | Não | `DISABLED` (sem caixa) desliga STARTTLS | `src/email_smtp.rs:36` | Java: `...mailer.start-tls` | boot | idem |
159
+ | `SEEDGRID_SECURITY_MAILER_USERNAME` · alias `SECURITY_MAILER_USERNAME` | `String` | — | vazio | Condicional: necessário para SMTP real | — | `MailerConfig::is_configured` | Java: `...mailer.username` | boot | idem |
160
+ | 🔒 `SEEDGRID_SECURITY_MAILER_PASSWORD` · alias `SECURITY_MAILER_PASSWORD` | `String` | — | vazio | Condicional: idem | sem trim; vazio ignorado | idem | Java: `...mailer.password` | boot | idem |
161
+
162
+ Sem equivalente no crate: `seedgrid.security.mailer.auth-methods` (Java).
163
+
164
+ ### 2.10 Atributos adicionais do usuário
165
+
166
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
167
+ |---|---|---|---|---|---|---|---|---|---|
168
+ | `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES` | `usize` | inteiro | `16384` | Não | excedeu → 400 `INVALID_USER_ADDITIONAL_ATTRIBUTES` | `services/user_attributes.rs` (`check_limits`) | Java: `seedgrid.security.user.additional-attributes.max-size-bytes`. **Atenção:** o microprofile do módulo Java usa a env `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_SIZE_BYTES` (sem `ADDITIONAL_`), que o crate **não lê**; o nome do crate coincide com a regra automática MicroProfile da propriedade | boot | `src/config.rs` → `from_env` |
169
+ | `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH` | `usize` | inteiro (raiz = 1) | `5` | Não | idem | idem | Java: `...max-depth` (env Java `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_DEPTH`) | boot | idem |
170
+ | `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS` | `usize` | inteiro | `100` | Não | idem | idem | Java: `...max-keys` (env Java `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_KEYS`) | boot | idem |
171
+
172
+ ### 2.11 Bootstrap: primeiro admin e empresa-plataforma
173
+
174
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
175
+ |---|---|---|---|---|---|---|---|---|---|
176
+ | `SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL` · alias `SECURITY_FIRST_ADMIN_EMAIL` | `Option<String>` | e-mail | `None` | Não | se setado, `bootstrap()` cria/garante o admin | `services/bootstrap.rs` | Java: `seedgrid.security.first-admin-user.email`; também lida diretamente pelo `login-tenancy::assemble_all` | boot | `src/config.rs` → `from_env` (`first_env`) |
177
+ | `SEEDGRID_SECURITY_FIRST_ADMIN_USER_NAME` · alias `SECURITY_FIRST_ADMIN_NAME` | `Option<String>` | — | `None` (bootstrap usa `Administrador`) | Não | — | idem | Java: `...first-admin-user.name` | boot | idem |
178
+ | `SEEDGRID_SECURITY_FIRST_ADMIN_USER_WHATSAPP` · alias `SECURITY_FIRST_ADMIN_WHATSAPP` | `Option<String>` | — | `None` | Não | — | idem | Java: `...first-admin-user.whatsapp` | boot | idem |
179
+ | 🔒 `SEEDGRID_SECURITY_FIRST_ADMIN_USER_INITIAL_PASSWORD` · alias `SECURITY_FIRST_ADMIN_INITIAL_PASSWORD` | `Option<String>` | — | `None` | Não | senha inicial (com `change_password_required`) | `services/bootstrap.rs:232` | Java: `...first-admin-user.initial-password` | boot | idem |
180
+ | `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` · alias `SECURITY_DEFAULT_COMPANY_CNPJ` | `String` | CNPJ (comparado só por dígitos) | vazio | Condicional: sem ele não há empresa-plataforma (bootstrap não cria company; `require_platform_scope` sem referência) | — | `services/bootstrap.rs`, `services/rbac.rs`, `services/session.rs`, `services/auth.rs`, `services/platform_company.rs`; lido também por `login-tenancy::assemble_all` | Java: `seedgrid.security.default-company.cnpj` | boot | idem |
181
+ | `SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME` | `String` | — | vazio | Condicional: obrigatório quando o CNPJ está setado e a company ainda não existe (senão `bootstrap` retorna erro) | — | `services/bootstrap.rs:32` | Java: `...default-company.corporate-name` | boot | idem |
182
+ | `SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME` | `String` | — | vazio | Condicional: idem | — | `services/bootstrap.rs:33` | Java: `...default-company.trade-name` | boot | idem |
183
+ | `SecurityOverrides.run_bootstrap` (campo) | `bool` | — | `true` em `SecurityOverrides::enabled()`; `false` em `Default` (derive) | Não | roda `bootstrap()` no fim do `SecurityPlatform::assemble` | `src/platform.rs` | Java tem `seedgrid.security.bootstrap.enabled` (env `SEEDGRID_SECURITY_BOOTSTRAP_ENABLED`), **não lida** pelo crate | struct | `src/platform.rs` |
184
+
185
+ ### 2.12 Gestão pela conta e templates
186
+
187
+ | Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
188
+ |---|---|---|---|---|---|---|---|---|---|
189
+ | `SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES` → `account.assignable_permission_audiences` | `Vec<String>` | CSV de audiences | vazio (só permissões sem audience). O `login-tenancy::assemble_all` usa `client` quando a env **não existe** | Não | audiences que o admin da conta pode atribuir em `/me/security/roles` | `services/company_roles.rs` | Java: `seedgrid.security.account.assignable-permission-audiences`. Constante `config::ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES_ENV` | boot | `src/config.rs` → `from_env` |
190
+ | `SEEDGRID_SECURITY_TEMPLATES_DIR` · alias `SECURITY_TEMPLATES_DIR` | caminho | diretório | `./templates/security` (relativo ao cwd) | Não | overrides `<nome>.html`/`.txt` vencem os templates embutidos; só usado se o host não injetar `.template_provider(...)` | `DefaultTemplateSecurityProvider::with_host_dir` | sem propriedade Java (Java usa recurso de classpath `templates/security/`) | build | `src/state.rs` → `SecurityStateBuilder::build` |
191
+
192
+ ## 3. Propriedades de frameworks/bibliotecas
193
+
194
+ - O crate **não** lê `quarkus.*`, `mp.*`, `smallrye.*`.
195
+ - `seedgrid_whatsapp::WhatsAppConfig::from_env()` é chamado no `build()` quando `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` está preenchido: as envs `SEEDGRID_WHATSAPP_*` pertencem ao crate whatsapp — ver [[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração Rust do whatsapp]].
196
+ - Rate limit das rotas públicas: o `RateLimitService` é construído com `EmptyConfigSource` (`src/ratelimit.rs` → `build_service`), ou seja, **não há override por config** dos limites (login 100/min, auth-refresh 30/min, auth-confirm-email 10/min, forgot-password 5/h, auth-reset-password 10/min, 2fa-verify 5/15min). As propriedades Java `seedgrid.security.rate-limit.login.*` não têm equivalente.
197
+ - `DATABASE_URL`/pool: responsabilidade do host (o crate recebe um `PgPool`).
198
+
199
+ ## 4. Propriedades usadas só em testes e exemplos
200
+
201
+ - `tests/common/mod.rs` → `base_config()` monta `SecurityConfig` à mão (chaves de `tests/keys/*.pem`), espelhando a política de senha do `application.properties` de teste Java.
202
+ - `README` do crate: `DOCKER_HOST`, `TESTCONTAINERS_RYUK_DISABLED` (execução dos testes de integração com Podman).
203
+ - Exemplos `rust/examples/seedgrid-security-apikeys-example` e `seedgrid-login-tenancy-example` (`.env.example`): `DATABASE_URL`, `BIND_ADDR` (lidos pelo `main.rs` do exemplo), `SECURITY_JWT_ISSUER`, `SECURITY_JWT_TTL_SECONDS`, `SECURITY_ENCRYPTION_KEY` e `SECURITY_FRONTEND_BASE_URL`.
204
+
205
+ ## 5. Aliases, obsoletas, renomeações
206
+
207
+ | Nome atual (primário) | Alias aceito | Observação |
208
+ |---|---|---|
209
+ | `SEEDGRID_SECURITY_JWT_{PRIVATE,PUBLIC}_KEY_LOCATION` | `SECURITY_{PRIVATE,PUBLIC}_KEY_LOCATION` | alias = nome dos exemplos Java |
210
+ | `SECURITY_JWT_{PRIVATE,PUBLIC}_KEY_PEM_FILE` | — | nome antigo do crate, 4ª fonte |
211
+ | `SECURITY_JWT_TTL` | `SECURITY_JWT_TTL_SECONDS` | compat; inteiro em segundos |
212
+ | `SEEDGRID_PRIVACY_CRYPTO_KEY` | `SECURITY_ENCRYPTION_KEY`, `SEEDGRID_SECURITY_ENCRYPTION_KEY` | — |
213
+ | `SEEDGRID_PRIVACY_ENCRYPTION_ENABLED` | `SECURITY_PRIVACY_ENABLED` | — |
214
+ | `SEEDGRID_PRIVACY_SEARCH_KEY` | `SECURITY_PRIVACY_HMAC_KEY` | — |
215
+ | `SEEDGRID_SECURITY_FRONTEND_BASE_URL` | `SECURITY_FRONTEND_BASE_URL`, `SECURITY_BASE_URL` | — |
216
+ | `SEEDGRID_SECURITY_FRONTEND_*`, `_SELF_ENTER_*`, `_AVATAR_*`, `_MAILER_*`, `_USER_ADDITIONAL_ATTRIBUTES_*`, `_TEMPLATES_DIR` | o mesmo nome sem `SEEDGRID_` | — |
217
+ | `SEEDGRID_SECURITY_FIRST_ADMIN_USER_{EMAIL,NAME,WHATSAPP,INITIAL_PASSWORD}` | `SECURITY_FIRST_ADMIN_{EMAIL,NAME,WHATSAPP,INITIAL_PASSWORD}` | alias **sem** `_USER` |
218
+ | `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` | `SECURITY_DEFAULT_COMPANY_CNPJ` | corporate/trade name sem alias |
219
+
220
+ Defaults diferentes do módulo Java (Confirmado): issuer (`seedgrid` × `https://seedgrid.com.br`), kid (`None` × `seedgrid-key`), política de senha (rígida × permissiva), `2f.enabled` efetivo (`false` × `true`).
221
+
222
+ ## 6. Configuração mínima (`.env`)
223
+
224
+ ```dotenv
225
+ # Chaves RSA (obrigatório). Escolha UMA forma por chave.
226
+ SEEDGRID_SECURITY_JWT_PRIVATE_KEY_LOCATION=./keys/private.pem
227
+ SEEDGRID_SECURITY_JWT_PUBLIC_KEY_LOCATION=./keys/public.pem
228
+ # Empresa-plataforma (recomendado; corporate/trade obrigatórios na 1ª criação)
229
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ=<cnpj-da-plataforma>
230
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME=<razao-social>
231
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME=<nome-fantasia>
232
+ ```
233
+
234
+ ## 7. Configuração completa comentada
235
+
236
+ ```dotenv
237
+ # --- JWT ---
238
+ # Precedência por chave: *_BASE64 (DER) > *_LOCATION (arquivo) > SECURITY_JWT_*_PEM (inline) > SECURITY_JWT_*_PEM_FILE
239
+ SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64=<SEGREDO:jwt-private-key-der-base64>
240
+ SEEDGRID_SECURITY_JWT_PUBLIC_KEY_BASE64=<jwt-public-key-der-base64>
241
+ SECURITY_JWT_ISSUER=https://auth.example.com # default do crate: seedgrid
242
+ SECURITY_JWT_KID=seedgrid-key # default: sem kid
243
+ SECURITY_JWT_TTL=PT8H # ou SECURITY_JWT_TTL_SECONDS=28800
244
+ # --- Refresh ---
245
+ SECURITY_REFRESH_TOKEN_TTL=P30D
246
+ SECURITY_REFRESH_TOKEN_REUSE_GRACE_WINDOW=PT30S # PT0S desliga
247
+ # --- Senha (defaults do crate: 8 / 0 / 5 / true x4) ---
248
+ SECURITY_PASSWORD_MIN_SIZE=8
249
+ SECURITY_PASSWORD_EXPIRATION_DAYS=0
250
+ SECURITY_PASSWORD_MAX_HISTORY=5
251
+ SECURITY_PASSWORD_UPPER=true
252
+ SECURITY_PASSWORD_LOWER=true
253
+ SECURITY_PASSWORD_SPECIAL=true
254
+ SECURITY_PASSWORD_NO_REPEAT=true
255
+ # --- Cripto / privacidade ---
256
+ SEEDGRID_PRIVACY_CRYPTO_KEY=<SEGREDO:aes256-key-base64>
257
+ SEEDGRID_PRIVACY_ENCRYPTION_ENABLED=false
258
+ SEEDGRID_PRIVACY_SEARCH_KEY=<SEGREDO:hmac-key-base64>
259
+ # --- 2FA ---
260
+ SEEDGRID_SECURITY_2F_ENABLED=false
261
+ SEEDGRID_SECURITY_2F_ALLOWED_METHODS=EMAIL,TOTP
262
+ SEEDGRID_SECURITY_2F_DEFAULT_METHOD=TOTP
263
+ SEEDGRID_SECURITY_2F_TOTP_ISSUER=SeedGrid
264
+ SEEDGRID_SECURITY_2F_TOTP_DIGITS=6
265
+ SEEDGRID_SECURITY_2F_TOTP_PERIOD=30
266
+ SEEDGRID_SECURITY_2F_VERIFY_MAX_ATTEMPTS=5
267
+ SEEDGRID_SECURITY_2F_SESSION_TTL=PT5M
268
+ SEEDGRID_SECURITY_2F_EMAIL_CODE_TTL=PT5M
269
+ SEEDGRID_SECURITY_2F_BACKUP_CODES_COUNT=10
270
+ SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID= # preencher liga WHATSAPP (+ SEEDGRID_WHATSAPP_*)
271
+ # --- Frontend ---
272
+ SEEDGRID_SECURITY_FRONTEND_BASE_URL=https://app.example.com
273
+ SEEDGRID_SECURITY_FRONTEND_LOGIN_PATH=/login
274
+ SEEDGRID_SECURITY_FRONTEND_PASSWORD_RESET_PATH=/auth/forgot-password/confirm
275
+ SEEDGRID_SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH=/auth/confirm-email
276
+ SEEDGRID_SECURITY_FRONTEND_WELCOME_PATH=/auth/welcome
277
+ SEEDGRID_SECURITY_FRONTEND_SELF_ENTER_PATH=/auth/self-enter
278
+ # --- Self-enter ---
279
+ SECURITY_SELF_ENTER_ENABLED=false # só "true" literal liga
280
+ SECURITY_SELF_ENTER_PUBLIC_ENABLED=true
281
+ SECURITY_SELF_ENTER_INVITE_ENABLED=true
282
+ SEEDGRID_SECURITY_SELF_ENTER_REQUEST_TTL=PT48H
283
+ SEEDGRID_SECURITY_SELF_ENTER_INVITE_TTL=PT168H
284
+ SEEDGRID_SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL=PT30M
285
+ SEEDGRID_SECURITY_SELF_ENTER_DEFAULT_ROLE=<NOME-DA-ROLE-GLOBAL> # obrigatória se SECURITY_SELF_ENTER_ENABLED=true
286
+ SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_ENABLED=true
287
+ SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER=PT168H
288
+ # --- Avatar (prefixos; backend via AvatarStorage injetado) ---
289
+ SEEDGRID_SECURITY_AVATAR_USER_PREFIX=avatars/users
290
+ SEEDGRID_SECURITY_AVATAR_DEFAULT_PREFIX=avatars/defaults
291
+ # --- Mailer (SMTP real liga com username+password) ---
292
+ SEEDGRID_SECURITY_MAILER_FROM=noreply@example.com
293
+ SEEDGRID_SECURITY_MAILER_HOST=smtp.example.com
294
+ SEEDGRID_SECURITY_MAILER_PORT=587
295
+ SEEDGRID_SECURITY_MAILER_START_TLS=REQUIRED
296
+ SEEDGRID_SECURITY_MAILER_USERNAME=<usuario-smtp>
297
+ SEEDGRID_SECURITY_MAILER_PASSWORD=<SEGREDO:smtp-password>
298
+ # --- additionalAttributes ---
299
+ SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES=16384
300
+ SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH=5
301
+ SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS=100
302
+ # --- Bootstrap ---
303
+ SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL=admin@example.com
304
+ SEEDGRID_SECURITY_FIRST_ADMIN_USER_NAME=Administrador
305
+ SEEDGRID_SECURITY_FIRST_ADMIN_USER_WHATSAPP=
306
+ SEEDGRID_SECURITY_FIRST_ADMIN_USER_INITIAL_PASSWORD=<SEGREDO:first-admin-password>
307
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ=<cnpj>
308
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME=<razao-social>
309
+ SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME=<nome-fantasia>
310
+ # --- Conta / templates ---
311
+ SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES=
312
+ SEEDGRID_SECURITY_TEMPLATES_DIR=./templates/security
313
+ ```
314
+
315
+ ## 8. Receitas
316
+
317
+ - **Chave em uma linha (PaaS):** use `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64`/`_PUBLIC_KEY_BASE64` com o corpo DER (sem `-----BEGIN`). É a mesma env do Java.
318
+ - **Mesmo `dev.env` do Java:** os nomes `SEEDGRID_SECURITY_*` do módulo funcionam, **exceto** issuer/kid/ttl do JWT (use `SECURITY_JWT_ISSUER`/`_KID`/`_TTL`) e os limites de `additionalAttributes` (Java usa `..._USER_ATTRIBUTES_...`, crate usa `..._USER_ADDITIONAL_ATTRIBUTES_...`).
319
+ - **Política de senha igual à do Java (permissiva):** `SECURITY_PASSWORD_MIN_SIZE=1`, `SECURITY_PASSWORD_MAX_HISTORY=0`, `SECURITY_PASSWORD_UPPER/LOWER/SPECIAL/NO_REPEAT=false`.
320
+ - **E-mail real:** defina `SEEDGRID_SECURITY_MAILER_USERNAME` + `_PASSWORD`; sem eles o crate só loga.
321
+ - **2FA por WhatsApp:** `SEEDGRID_SECURITY_2F_ALLOWED_METHODS=EMAIL,TOTP,WHATSAPP` + `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` + credenciais `SEEDGRID_WHATSAPP_*`.
322
+ - **Self-enter só por convite:** `SECURITY_SELF_ENTER_ENABLED=true`, `SECURITY_SELF_ENTER_PUBLIC_ENABLED=false` (o valor tem de ser exatamente `true` para ligar).
323
+
324
+ ## 9. Dúvidas e lacunas
325
+
326
+ - Nomes JWT do módulo Java (`SEEDGRID_SECURITY_JWT_ISSUER/KID/TTL`) não são aceitos; o comentário de `from_env` diz "alinhado aos nomes do Java", o que vale para os exemplos Java, não para o módulo — **Confirmado**.
327
+ - Sem equivalente no crate (Java tem): `seedgrid.security.bootstrap.enabled`, `rate-limit.login.*`, `rbac.cache-ttl` (cache RBAC não implementado), `2f.otp-qrcode.*`, `2f.verify.lockout-duration`, `2f.backup-codes.length`, `2f.whatsapp.code-ttl`, `self-enter.invite-needs-approval`, `self-enter.cleanup.cron`, `self-enter.email.*`, `mailer.auth-methods`, `avatar.storage/public-read/*` (backend) e os campos de endereço/representante de `default-company.*` — **Confirmado** por comparação com `microprofile-config.properties` e `configs/*.java` do Java.