Jeder setzt sein Bild unter "Mein Konto", Vorgesetzte und Administratoren auch fuer die Benutzer, die sie verwalten. Wo bisher die Initialen standen, steht jetzt das Bild - Seitenleiste, Kopfzeile, Team, Dashboard, Reports, Projekte, Kunden und die Buchungsliste. Ohne Bild bleiben die Initialen. Der Browser verkleinert das Bild vor dem Hochladen auf ein Quadrat von 256 px und schneidet mittig zu (lib/imageCompress.ts): aus einem 4-MB-Foto werden wenige Kilobyte, und der Server muss kein Bild verarbeiten. Gespeichert wird es als Data-URL in pulse_users.avatar (LONGTEXT). Kein Upload-Verzeichnis, das gesichert und beim Deployment am Leben gehalten werden muesste. Geprueft wird serverseitig in lib/avatar.js: nur PNG, JPEG, GIF, WebP und AVIF als Data-URL, hoechstens 2 MB. SVG ist bewusst nicht erlaubt, es kann Skripte tragen. Externe http(s)-Adressen ebenso wenig - sonst laedt jeder Seitenaufruf ein Bild von einem fremden Server und verraet, wer wann mit Pulse arbeitet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
24 lines
587 B
JSON
24 lines
587 B
JSON
{
|
|
"name": "perinco-pulse-backend",
|
|
"version": "1.0.0",
|
|
"private": true,
|
|
"description": "REST-Backend fuer perinco Pulse (Zeiterfassung, MariaDB perinco_pulse)",
|
|
"main": "src/server.js",
|
|
"type": "module",
|
|
"scripts": {
|
|
"start": "node src/server.js",
|
|
"dev": "node --watch src/server.js",
|
|
"test": "node --test \"test/*.test.mjs\""
|
|
},
|
|
"dependencies": {
|
|
"bcryptjs": "^2.4.3",
|
|
"cors": "^2.8.5",
|
|
"dotenv": "^16.4.5",
|
|
"exceljs": "^4.4.0",
|
|
"express": "^4.19.2",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"mysql2": "^3.11.5",
|
|
"pdfkit": "^0.15.0"
|
|
}
|
|
}
|