From 6517e014a6688642606451ba30d97604e3e8486c Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 12 May 2026 20:51:49 +0200 Subject: [PATCH] feat(branding): port logo upload pipeline for internal PDFs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 / commit 2 of 14 — adds the admin-facing logo upload that the brand-kit Header pulls in for every internal-only PDF. Server pipeline (src/lib/services/logo.service.ts): - magic-byte format check via sharp metadata - rejects animated/multi-frame inputs - SVGs sanitized via svgo preset-default + post-pass regex check (rejects + + `; + const buf = Buffer.from(svg, 'utf8'); + await expect(processLogoUpload(buf)).rejects.toThrow(/disallowed nodes/i); + }); + + it('rejects SVG with external href', async () => { + const svg = ` + + `; + const buf = Buffer.from(svg, 'utf8'); + await expect(processLogoUpload(buf)).rejects.toThrow(/disallowed nodes/i); + }); + + it('flags JPEG sources with no alpha', async () => { + const buf = await sharp({ + create: { width: 1200, height: 1200, channels: 3, background: { r: 200, g: 50, b: 50 } }, + }) + .jpeg({ quality: 80 }) + .toBuffer(); + const result = await processLogoUpload(buf); + expect(result.warnings).toContain('jpeg-source'); + expect(result.warnings).toContain('no-alpha'); + }); +}); diff --git a/tests/unit/pdf-brand-kit.test.tsx b/tests/unit/pdf-brand-kit.test.tsx index 8c864267..6777ee50 100644 --- a/tests/unit/pdf-brand-kit.test.tsx +++ b/tests/unit/pdf-brand-kit.test.tsx @@ -67,14 +67,10 @@ describe('pdf brand kit', () => {
- columns={[ - { header: 'Name', render: (r: { name: string }) => r.name }, - { - header: 'Score', - align: 'right', - render: (r: { score: number }) => String(r.score), - }, + { header: 'Name', render: (r) => r.name }, + { header: 'Score', align: 'right', render: (r) => String(r.score) }, ]} rows={[ { name: 'Alpha', score: 1 },