fix(tls): o painel de seguranca estava vazio em qualquer modo menos um

/admin/security mostrava "Nao foi possivel carregar os dados" porque
/api/v1/admin/tls respondia 503. A rota so era ligada quando o certificado
vinha do watcher do acme.json do Traefik, o unico provider que tinha metodos
de estado proprios.

Nesta instalacao o TRAEFIK_ACME_DIR nao esta definido e o STATIC_CERT_PATH
tambem nao, portanto o servidor cai no certificado autoassinado efemero -- ou
seja, o painel calava-se exactamente no estado em que o operador mais precisa
de ser avisado.

- ProviderStatus deriva o estado de qualquer port.CertProvider, lendo a folha
  do certificado que ele realmente serve
- o painel passa a ser ligado sempre que ha JWT_SECRET
- passa a dizer quem emitiu e se e autoassinado, com um aviso proprio: nas
  portas de correio um autoassinado e recusado por qualquer cliente que
  verifique, o que pesa mais do que uma validade ainda longe

CheckSignatureFrom nao serve para detectar isto: tambem exige que o emissor
seja uma CA, coisa que uma folha descartavel nunca declara, e por isso dava a
fallback degradada como correctamente emitida.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Opus 5 committed 2026-08-24 09:11:49 -03:00
1 parent 9689f26dda
commit 136f9f339a
9 files changed
+194 -7

No files matched your search

@@ -156,8 +156,8 @@ export default function AdminQueuePage() {
{jobs.map((j) => (
<tr key={j.id}>
<td className="pl-0 font-mono text-[12.5px] text-slate-100">{j.id.slice(0, 8)}</td>
<td className="max-w-[180px] break-words text-[12.5px] text-slate-300">{j.envelope_from}</td>
<td className="max-w-[180px] break-words text-[12.5px] text-slate-300">{j.envelope_to}</td>
<td className="max-w-[220px] break-words text-[12.5px] text-slate-300">{j.envelope_from}</td>
<td className="max-w-[220px] break-words text-[12.5px] text-slate-300">{j.envelope_to}</td>
<td className="break-words text-[12.5px] text-slate-300">{j.destination_domain}</td>
<td className="whitespace-nowrap text-[12.5px] tabular-nums text-slate-300">{j.attempt}</td>
{/* The diagnostic wraps instead of being truncated: a queue