refactor(quick-260921-m34): Aufgabe 3a - 18 Fehlerfaenger auf unknown, mit echter Eingrenzung
catch (e: any) in groups, module-grants, ldap, user, admin-seed, calendar
und vier tenders-Diensten auf catch (e: unknown) umgestellt. Die
Eingrenzung passiert an der Verwendungsstelle, nicht per Zusicherung.
Neu: apps/api/src/prisma/prisma-error.ts mit prismaErrorCode() und
prismaErrorTarget(). Bewusst Form-Pruefungen statt instanceof
Prisma.PrismaClientKnownRequestError - gemessen: samtliche Testdoppel in
apps/api werfen new Error(...) mit angehaengtem .code (groups, user, ldap,
tenders, module-grants, admin-seed) und dashboard.service.spec.ts:451 ein
reines { code: 'P2002' }. Ein instanceof-Test haette all diese Werte in den
anderen Zweig geschickt - Verhaltensaenderung, verboten nach D-03/T-M34-06.
Die Helfer bilden err?.code und err?.meta?.target eins zu eins ab.
ldap.service.ts liest zusaetzlich meta.target; prismaErrorTarget() gibt
unknown zurueck, weil der Bestand dort Array UND Zeichenkette getrennt
behandelt - ein engerer Typ waere eine Behauptung.
calendar.service.ts:341 nutzt instanceof Error statt e?.message: gemessen
wirft validateUrlNotPrivate() ausschliesslich ForbiddenException (der
eigene catch dort setzt jeden Fremdfehler in eine um), also trifft
instanceof dieselben Faelle. Ersatzzweig 'URL not allowed' unveraendert.
noExplicitAny in apps/api/src: 56 -> 38. type-check 4/4, lint 5/5 (0
error), apps/api 72/1143, apps/web 73/531, rls-access-inventory 30/30.
noNonNullAssertion 56, as unknown as 33, Unterdrueckungsmarker 1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TPPB4ApQxzSU1rwV2Ffj9J
This commit is contained in:
@@ -338,8 +338,16 @@ export class CalendarService {
|
||||
try {
|
||||
// Exchange EWS servers are commonly on internal networks — SSRF check skipped for exchange type
|
||||
if (dto.type !== 'exchange') await this.validateUrlNotPrivate(dto.url);
|
||||
} catch (e: any) {
|
||||
return { success: false, error: e?.message ?? 'URL not allowed' };
|
||||
} catch (e: unknown) {
|
||||
// validateUrlNotPrivate() wirft ausschliesslich ForbiddenException
|
||||
// (gemessen: jeder Wurf in der Methode ist eine, und der eigene
|
||||
// catch-Block dort setzt jeden Fremdfehler in eine um). instanceof
|
||||
// Error trifft deshalb genau dieselben Faelle wie das bisherige
|
||||
// e?.message; der Ersatzzweig bleibt derselbe (D-03).
|
||||
return {
|
||||
success: false,
|
||||
error: e instanceof Error ? e.message : 'URL not allowed',
|
||||
};
|
||||
}
|
||||
|
||||
const provider = this.getProvider(dto.type);
|
||||
|
||||
Reference in New Issue
Block a user