30118a2401
- 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>
60 lines
2.4 KiB
TypeScript
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);
|
|
}
|