From 2950f094850eb3cec30a8ce49a9ec0e224197f48 Mon Sep 17 00:00:00 2001 From: thomas Date: Sun, 30 Aug 2026 20:48:10 +0200 Subject: [PATCH] chore: JSON-404 fuer die API, Login-Validator entschlacken, Altlasten entfernen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Unbekannte Pfade unter /api fielen bis zum Express-Standard durch und lieferten eine HTML-Seite ("Cannot GET /api/foo"), mit der ein JSON-Client nichts anfangen kann. Es gab keinen 404-Handler; errorHandler greift nur bei next(err). Jetzt antwortet /api mit JSON und Status 404. - validateLogin verlangte fuer das EINGEGEBENE Passwort mindestens 6 Zeichen. Eine Policy gehoert nicht in den Login-Pfad: kurze Eingaben lieferten 400 "Validierungsfehler" statt 401 und verrieten damit etwas ueber die Regeln; ausserdem widersprach der Wert dem minlength: 12 des Admin-Schemas. Geprueft: kurzes Passwort liefert jetzt 401. - d9fecb6 hatte versehentlich ein backend/-Verzeichnis im Repo-Wurzel eingecheckt (leere .gitignore, zwei 0-Byte-Logdateien) — ausserhalb jeder App. Entfernt und im Wurzel-.gitignore gegen Wiederkehr abgesichert. Co-Authored-By: Claude Opus 5 --- .gitignore | 4 ++++ drohnenfuehrer/backend/middleware/validator.js | 8 +++++--- drohnenfuehrer/backend/server.js | 7 +++++++ nachsuche/backend/middleware/validator.js | 8 +++++--- nachsuche/backend/server.js | 7 +++++++ stoeberhunde/backend/middleware/validator.js | 8 +++++--- stoeberhunde/backend/server.js | 7 +++++++ 7 files changed, 40 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 0a0ff98..2b9e63a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,7 @@ portal/ssl/ # OS .DS_Store Thumbs.db + +# Versehentlich angelegte Log-Verzeichnisse +logs/ +*.log diff --git a/drohnenfuehrer/backend/middleware/validator.js b/drohnenfuehrer/backend/middleware/validator.js index 41f55b6..11431ae 100644 --- a/drohnenfuehrer/backend/middleware/validator.js +++ b/drohnenfuehrer/backend/middleware/validator.js @@ -17,11 +17,13 @@ const validateLogin = [ .trim() .notEmpty() .withMessage('Benutzername ist erforderlich'), + // Keine Laengenpruefung: eine Passwort-Policy gehoert nicht in den + // Login-Pfad. Sie liefert 400 statt 401 und verraet damit unnoetig etwas + // ueber die Regeln; ausserdem widersprach der Wert dem minlength des + // Admin-Schemas. body('password') .notEmpty() - .withMessage('Passwort ist erforderlich') - .isLength({ min: 6 }) - .withMessage('Passwort muss mindestens 6 Zeichen lang sein'), + .withMessage('Passwort ist erforderlich'), handleValidationErrors ]; diff --git a/drohnenfuehrer/backend/server.js b/drohnenfuehrer/backend/server.js index a5feddb..7dd99e9 100644 --- a/drohnenfuehrer/backend/server.js +++ b/drohnenfuehrer/backend/server.js @@ -73,6 +73,13 @@ app.use('/api', require('./routes/auditRoutes')); app.use('/api/config', require('./routes/configRoutes')); app.use('/api/drohnenfuehrer', require('./routes/drohnenfuehrerRoutes')); +// Unbekannte API-Pfade als JSON beantworten. Ohne das faellt die Anfrage bis zum +// Express-Standard durch und liefert eine HTML-Seite ("Cannot GET /api/foo"), +// mit der ein JSON-Client nichts anfangen kann. +app.use('/api', (req, res) => { + res.status(404).json({ success: false, message: 'Endpunkt nicht gefunden' }); +}); + // Health check with basic system info app.get('/health', async (req, res) => { const dbStatus = mongoose.connection.readyState === 1 ? 'connected' : 'disconnected'; diff --git a/nachsuche/backend/middleware/validator.js b/nachsuche/backend/middleware/validator.js index 41f55b6..11431ae 100644 --- a/nachsuche/backend/middleware/validator.js +++ b/nachsuche/backend/middleware/validator.js @@ -17,11 +17,13 @@ const validateLogin = [ .trim() .notEmpty() .withMessage('Benutzername ist erforderlich'), + // Keine Laengenpruefung: eine Passwort-Policy gehoert nicht in den + // Login-Pfad. Sie liefert 400 statt 401 und verraet damit unnoetig etwas + // ueber die Regeln; ausserdem widersprach der Wert dem minlength des + // Admin-Schemas. body('password') .notEmpty() - .withMessage('Passwort ist erforderlich') - .isLength({ min: 6 }) - .withMessage('Passwort muss mindestens 6 Zeichen lang sein'), + .withMessage('Passwort ist erforderlich'), handleValidationErrors ]; diff --git a/nachsuche/backend/server.js b/nachsuche/backend/server.js index 4bd9c65..170bd9b 100644 --- a/nachsuche/backend/server.js +++ b/nachsuche/backend/server.js @@ -73,6 +73,13 @@ app.use('/api', require('./routes/auditRoutes')); app.use('/api/config', require('./routes/configRoutes')); app.use('/api/handler', require('./routes/handlerRoutes')); +// Unbekannte API-Pfade als JSON beantworten. Ohne das faellt die Anfrage bis zum +// Express-Standard durch und liefert eine HTML-Seite ("Cannot GET /api/foo"), +// mit der ein JSON-Client nichts anfangen kann. +app.use('/api', (req, res) => { + res.status(404).json({ success: false, message: 'Endpunkt nicht gefunden' }); +}); + // Health check with basic system info app.get('/health', async (req, res) => { const dbStatus = mongoose.connection.readyState === 1 ? 'connected' : 'disconnected'; diff --git a/stoeberhunde/backend/middleware/validator.js b/stoeberhunde/backend/middleware/validator.js index 41f55b6..11431ae 100644 --- a/stoeberhunde/backend/middleware/validator.js +++ b/stoeberhunde/backend/middleware/validator.js @@ -17,11 +17,13 @@ const validateLogin = [ .trim() .notEmpty() .withMessage('Benutzername ist erforderlich'), + // Keine Laengenpruefung: eine Passwort-Policy gehoert nicht in den + // Login-Pfad. Sie liefert 400 statt 401 und verraet damit unnoetig etwas + // ueber die Regeln; ausserdem widersprach der Wert dem minlength des + // Admin-Schemas. body('password') .notEmpty() - .withMessage('Passwort ist erforderlich') - .isLength({ min: 6 }) - .withMessage('Passwort muss mindestens 6 Zeichen lang sein'), + .withMessage('Passwort ist erforderlich'), handleValidationErrors ]; diff --git a/stoeberhunde/backend/server.js b/stoeberhunde/backend/server.js index cae7a54..4b4998b 100644 --- a/stoeberhunde/backend/server.js +++ b/stoeberhunde/backend/server.js @@ -73,6 +73,13 @@ app.use('/api', require('./routes/auditRoutes')); app.use('/api/config', require('./routes/configRoutes')); app.use('/api/stoeberhundefuehrer', require('./routes/stoeberhundefuehrerRoutes')); +// Unbekannte API-Pfade als JSON beantworten. Ohne das faellt die Anfrage bis zum +// Express-Standard durch und liefert eine HTML-Seite ("Cannot GET /api/foo"), +// mit der ein JSON-Client nichts anfangen kann. +app.use('/api', (req, res) => { + res.status(404).json({ success: false, message: 'Endpunkt nicht gefunden' }); +}); + // Health check with basic system info app.get('/health', async (req, res) => { const dbStatus = mongoose.connection.readyState === 1 ? 'connected' : 'disconnected';