Files
tessera-ctl/apps/api/src/cert-manager/cert-json-body.ts
T
schalli 30118a2401 feat(cert-manager): Zusammenführen mit Fullchain und Nur Kette
- Kettenbau mit Aussteller- und Signaturprüfung (checkIssued plus verify), Wurzel nur auf Wunsch
- build-Route für Fullchain und Nur Kette (PEM), eigene JSON-Grenze 512 KiB mit 413 und Code tooLarge
- Reiter Zusammenführen mit Kettenansicht, Hinweis bei fehlendem Zwischenzertifikat

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 15:03:23 +02:00

60 lines
2.4 KiB
TypeScript

import { createRequire } from 'node:module';
import type { NextFunction, Request, Response } from 'express';
/**
* Eigener JSON-Leser fuer POST build (quick-261009-ikt, D-26).
*
* Nests Standardgrenze fuer JSON ist 100 kB. Eine Anfrage innerhalb der DTO-Grenzen
* (cert-build.dto.ts) kann aber bis etwa 384 kB gross werden: viele Zertifikate im Pool, dazu
* Schluessel und Anfrage. Darum bekommt genau diese Route 512 KiB; jede andere Route behaelt
* die 100 kB. Eine groessere Anfrage wird mit 413 und dem Code tooLarge beantwortet (statt mit
* einer Antwort ohne Code), fehlerhaftes JSON mit 400 und dem Code invalidInput.
*
* Registriert wird der Leser in main.ts mit app.use(CERT_BUILD_ROUTE, ...) vor app.listen.
* Wichtig:
* - Die Funktion darf NICHT jsonParser heissen. Nests Express-Adapter ueberspringt seinen
* globalen JSON-Leser fuer ALLE Routen, sobald eine Schicht mit diesem Namen existiert; dann
* wuerde auch die Anmeldung kein JSON mehr lesen. Darum der Name certBuildJsonBody.
* - `express` ist vom API-Paket aus nicht direkt aufloesbar. Es wird ueber @nestjs/platform-express
* geladen, also aus derselben Kopie, die Nest selbst benutzt. Ein neues Paket kommt nicht hinzu.
* - body-parser lehnt eine Anfrage ab, deren Koerper schon gelesen ist; Nests globaler Leser liest
* den Koerper daher kein zweites Mal.
*/
export const CERT_BUILD_ROUTE = '/modules/cert-manager/build';
export const CERT_BUILD_JSON_LIMIT = 512 * 1024;
const expressFromNest = createRequire(
createRequire(__filename).resolve('@nestjs/platform-express'),
)('express') as typeof import('express');
const parseJson = expressFromNest.json({ limit: CERT_BUILD_JSON_LIMIT });
export function certBuildJsonBody(req: Request, res: Response, next: NextFunction): void {
parseJson(req, res, next);
}
interface BodyParserError {
type?: string;
status?: number;
}
/** Fehler des Lesers: zu gross -> 413 tooLarge, kein gueltiges JSON -> 400 invalidInput, sonst weiter. */
export function certBuildBodyErrors(
error: unknown,
_req: Request,
res: Response,
next: NextFunction,
): void {
const e = (error ?? {}) as BodyParserError;
if (e.type === 'entity.too.large') {
res.status(413).json({ code: 'tooLarge', message: 'Request body exceeds 512 KiB' });
return;
}
if (e.type === 'entity.parse.failed') {
res.status(400).json({ code: 'invalidInput', message: 'Request body is not valid JSON' });
return;
}
next(error);
}