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>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user