fix(dns): o painel dizia que faltavam registos que estavam publicados
Tres defeitos na comparacao, todos encontrados contra a zona real. Cada um fazia a consola declarar em falta um registo que existia e estava a funcionar - o que e pior do que nao dizer nada, porque manda o operador procurar um problema que nao ha. MX. A especificacao guarda a prioridade num campo proprio, portanto o valor desejado e so o host. A comparacao era feita contra "10 mail.x." como texto, e por isso o MX de um dominio que recebe correio todos os dias aparecia como inexistente. TXT longo. Um valor acima de 255 bytes e publicado em varias strings, e o resolver devolve-as entre aspas. Tirar as aspas e juntar tudo com espacos punha um espaco no meio de uma chave DKIM: todos os registos DKIM RSA da zona eram dados como em falta. As strings sao agora unidas ponta a ponta, e os espacos dentro de cada uma sobrevivem. Registos atras do proxy. Um CNAME proxied nao e publicado como CNAME - o proxy responde A. Perguntar pelo CNAME devolvia resposta vazia, e o registo era dado como em falta apesar de estar la a servir trafego. A pergunta passa a ser do tipo que o proxy responde de facto. A comparacao passa a ser por tipo em vez de uma normalizacao unica para tudo, que era a origem comum dos tres. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
64f1a2e145
commit
8227fe2b97
4 files changed
+217
-14
No files matched your search
@@ -105,7 +105,10 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
|
||||
{initialsFor(account?.email)}
|
||||
</span>
|
||||
<span className="min-w-0 flex-1">
|
||||
<span className="block break-words text-[12.5px] leading-tight">
|
||||
<span
|
||||
className="block truncate text-[12.5px] leading-tight"
|
||||
title={account?.email ?? undefined}
|
||||
>
|
||||
{account?.email ?? t("common.loading")}
|
||||
</span>
|
||||
<span className="mt-0.5 flex items-center gap-1 text-[10.5px] text-slate-400">
|
||||
@@ -154,7 +157,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
|
||||
</div>
|
||||
|
||||
{/* Desktop rail */}
|
||||
<aside className="hidden w-[244px] flex-none flex-col bg-dark-rail shadow-[inset_-1px_0_0_0_rgba(233,233,237,0.09)] md:flex">
|
||||
<aside className="hidden w-[244px] flex-none flex-col bg-dark-rail xl:w-[268px] shadow-[inset_-1px_0_0_0_rgba(233,233,237,0.09)] md:flex">
|
||||
{SidebarContent}
|
||||
</aside>
|
||||
|
||||
|
||||
@@ -198,3 +198,25 @@ describe("API proxy routing", () => {
|
||||
expect(proxy).toContain("return AUTH_SERVICE_URL");
|
||||
});
|
||||
});
|
||||
|
||||
describe("the admin rail has the fixes the webmail rail got", () => {
|
||||
const ADMIN_LAYOUT = "src/app/(admin)/admin/layout.tsx";
|
||||
|
||||
// The same defect, in the other surface: break-words split the address
|
||||
// mid-domain and left a lone "br" on its own line.
|
||||
it("truncates the account address instead of breaking it apart", () => {
|
||||
const layout = code(ADMIN_LAYOUT);
|
||||
expect(layout).not.toMatch(/break-words[^"]*>\s*\{?\s*(account|session)?\??\.?email/);
|
||||
expect(layout).toMatch(/truncate[\s\S]{0,200}email/);
|
||||
});
|
||||
|
||||
// A rail pinned at 244px is what made the address and the surface switch
|
||||
// too tight to fit in the first place.
|
||||
it("gives the rail room on a wide screen", () => {
|
||||
expect(code(ADMIN_LAYOUT)).toMatch(/xl:w-\[\d+px\]/);
|
||||
});
|
||||
|
||||
it("keeps the full address reachable in the tooltip", () => {
|
||||
expect(code(ADMIN_LAYOUT)).toMatch(/title=\{[^}]*email/);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user