fix(security): API-Keys nur für Admins, Mailversand ohne Datei-/URL-Zugriff
- ApiKeysController verlangt MANAGE_SETTINGS. Bisher konnte jeder
OIDC-Benutzer einen API-Key erzeugen, der im PermissionsGuard jede
Rechteprüfung umgeht (Rechteausweitung zum Admin).
- MailService setzt disableFileAccess/disableUrlAccess für jede Mail.
- send-email im Posteingang prüft den Body streng auf Strings/Zahlen.
Bisher liest nodemailer bei html: { path: '/proc/self/environ' }
beliebige Serverdateien ein und verschickt sie.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0406354b8b
commit
bb8bf3714f
7 files changed
+192
-9
No files matched your search
@@ -0,0 +1,50 @@
|
||||
import { BadRequestException } from '@nestjs/common';
|
||||
import { parseSendEmailBody } from './send-email-body.util';
|
||||
|
||||
describe('parseSendEmailBody', () => {
|
||||
const gueltig = {
|
||||
to: 'a@example.org',
|
||||
subject: 'Betreff',
|
||||
body: 'Text',
|
||||
html: '<p>Text</p>',
|
||||
segments: [{ pages: [1, 2], filename: 'beleg' }],
|
||||
sender: 'user',
|
||||
};
|
||||
|
||||
it('übernimmt einen gültigen Body', () => {
|
||||
expect(parseSendEmailBody(gueltig)).toEqual(gueltig);
|
||||
});
|
||||
|
||||
it('lässt html und sender weg, wenn sie fehlen', () => {
|
||||
const ohne = { ...gueltig, html: undefined, sender: undefined };
|
||||
expect(parseSendEmailBody(ohne)).toEqual({
|
||||
to: gueltig.to,
|
||||
subject: gueltig.subject,
|
||||
body: gueltig.body,
|
||||
segments: gueltig.segments,
|
||||
});
|
||||
});
|
||||
|
||||
it.each([
|
||||
['html als Objekt mit path', { html: { path: '/proc/self/environ' } }],
|
||||
['body als Objekt mit href', { body: { href: 'http://169.254.169.254/' } }],
|
||||
['to als Objekt', { to: { address: 'a@example.org' } }],
|
||||
['to als Array', { to: ['a@example.org'] }],
|
||||
['subject fehlt', { subject: undefined }],
|
||||
['segments kein Array', { segments: 'x' }],
|
||||
['Seite keine Zahl', { segments: [{ pages: ['1'], filename: 'x' }] }],
|
||||
[
|
||||
'filename kein String',
|
||||
{ segments: [{ pages: [1], filename: { path: '/etc/passwd' } }] },
|
||||
],
|
||||
['sender kein String', { sender: { x: 1 } }],
|
||||
])('lehnt ab: %s', (_name, patch) => {
|
||||
expect(() => parseSendEmailBody({ ...gueltig, ...patch })).toThrow(
|
||||
BadRequestException,
|
||||
);
|
||||
});
|
||||
|
||||
it('lehnt einen fehlenden Body ab', () => {
|
||||
expect(() => parseSendEmailBody(undefined)).toThrow(BadRequestException);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user