cve fixes

This commit is contained in:
Jordy Hoogeveen
2026-09-18 13:38:22 +02:00
parent 2420a00777
commit e9192a8aba
11 changed files with 645 additions and 30 deletions
+50 -7
View File
@@ -10,7 +10,7 @@ Eigen vermogen · Schulden · Voortgang · Gebruikersbeheer
![Node.js](https://img.shields.io/badge/Node.js_22-339933?style=flat&logo=node.js&logoColor=white)
![PostgreSQL](https://img.shields.io/badge/PostgreSQL_18-4169E1?style=flat&logo=postgresql&logoColor=white)
![Docker](https://img.shields.io/badge/Docker_Compose-2496ED?style=flat&logo=docker&logoColor=white)
![Version](https://img.shields.io/badge/versie-1.0.9-8b5cf6?style=flat)
![Version](https://img.shields.io/badge/versie-1.0.10-8b5cf6?style=flat)
![Built with Claude](https://img.shields.io/badge/Gebouwd_met-Claude.ai-8b5cf6?style=flat&logo=anthropic&logoColor=white)
<img src="docs/screenshot-dashboard.png" alt="VibeFinance dashboard" width="820">
@@ -117,11 +117,12 @@ uitzonderingen nodig. Handige acties:
### Testen
```powershell
.\test.ps1 # dependency-check + backend-tests + build + smoketest
.\test.ps1 # deps + backend-tests + build + imagescan + smoketest
.\test.ps1 -Unit # dependency-check + backend-tests
.\test.ps1 -NoSmoke # zonder de stack te starten
.\test.ps1 -Strict # faal als een dependency achterloopt
.\test.ps1 -NoSmoke # zonder de stack te starten (imagescan draait wél)
.\test.ps1 -Strict # faal op achterlopende deps; scan ook op MEDIUM/LOW
.\test.ps1 -SkipDeps # dependency-check overslaan (bijv. offline)
.\test.ps1 -SkipScan # imagescan overslaan (bijv. offline)
```
Alles loopt in Docker — Node op de host is niet nodig. De backend-tests draaien
@@ -141,6 +142,26 @@ backend/package.json (15 dependencies)
alles actueel
```
Stap 4 scant het gebouwde image met [Trivy](https://trivy.dev) en blokkeert bij
CRITICAL of HIGH waarvoor een fix bestaat. Dat is iets anders dan stap 1: die
kijkt naar de `package.json`'s, deze naar wat er daadwerkelijk in het image zit
— de Alpine-pakketten en alles wat het base-image meelevert. Dat onderscheid is
niet theoretisch. Bij de scan van 1.0.10 kwamen alle 39 bevindingen daarvandaan
en geen enkele uit de applicatie zelf:
| Bron | Aantal | Waar het vandaan kwam |
|---|---|---|
| `libssl3` + `libcrypto3` | 20 | Alpine in het node-image liep achter op 3.5.8-r0 |
| npm's eigen dependencies | 19 | `tar`, `pacote`, `sigstore`, `brace-expansion`, `picomatch`, `ip-address` |
Een dependency-check had er nul van gezien. Het productie-image doet daarom aan
het eind van de build een `apk upgrade` en gooit npm, npx, corepack en yarn
eruit: de container start met `node src/server.js` en gebruikt nooit een
pakketbeheerder. Dat bracht de scan op nul, en houdt hem daar — npm's
dependencies zijn een terugkerende bron die nu simpelweg niet meer in het image
zit. `release.ps1` draait dezelfde scan vóór het pushen, dus een image met
openstaande CVE's komt de registry niet in.
### Productie release
```powershell
@@ -171,7 +192,7 @@ build — anders zou de release met een placeholder als notes online komen.
| 📉 **Schuld** | Schulden bijhouden per blok met afbetalingsoverzicht |
| 📈 **Voortgang Schuld & EV** | Grafieken en trends van EV en schuld over tijd (apart bij te houden) |
| 👥 **Gebruikers** | Accounts aanmaken, bewerken en beheren (Admin-rol vereist) |
| ⚙️ **Instellingen** | Kleurthema, licht/donker, backup downloaden en backup terugzetten |
| ⚙️ **Instellingen** | Kleurthema, licht/donker, backup downloaden, backup terugzetten en export naar HTML |
De grafiek "Ontwikkeling van Eigen Vermogen" op het dashboard tekent twee lijnen
op één as: je netto waarde per voortgangsmoment, en daaronder de cumulatief
@@ -209,6 +230,28 @@ downloadt een ZIP (`data.json` + `meta.json`) met je eigen financiële data,
"Backup terugzetten" leest zo'n ZIP weer in en schrijft hem via `/api/data` weg.
Dat is de gebruikersvariant; een volledige database-dump staat in `BEHEER.md`.
Daarnaast staat er **"Exporteren naar HTML"**: één zelfdragend bestand met al je
gegevens, bedoeld als laatste vangnet. Draait de app niet meer, is de database
weg en ligt er geen backup, dan opent dit bestand nog steeds — in elke browser,
op een computer zonder internet. Er zit niets van buiten in: de opmaak staat
inline, er worden geen lettertypen, afbeeldingen of scripts geladen. Je ziet een
samenvatting met de KPI's, eigen vermogen en schulden per categorie met
subtotalen, de initiële schuld met wat er sinds de start is afgelost, de
voortgangstabel en de historie.
Alles wat je ooit hebt ingevoerd komt mee, ook wat de app zelf niet meer toont:
stortingen op een inmiddels verwijderde categorie krijgen een eigen kolom
(`Verwijderd (c9)`). De voortgangstabel is bij zes categorieën twaalf kolommen
breed en scrollt horizontaal in plaats van kolommen af te kappen; de datumkolom
blijft daarbij staan. Op print vervalt de scrollbalk en wordt de tabel kleiner
gezet, zodat alle kolommen op papier alsnog passen.
Het bestand is tegelijk een backup: onderin staat de complete ruwe data in een
`<script type="application/json">`-blok dat de browser niet uitvoert en niet
toont. "Backup herstellen" accepteert daarom naast de ZIP ook zo'n HTML-bestand.
Eén bestand dat je zowel kunt lézen als kunt terugzetten — zie
[`frontend/src/utils/htmlExport.js`](frontend/src/utils/htmlExport.js).
---
## 🏗️ Architectuur
@@ -244,7 +287,7 @@ vibefinance/
│ ├── version.js # Draaiende versie (__APP_VERSION__ uit de build)
│ ├── constants/ # index.js (kleuren, tabs, begindata), themas.js
│ ├── utils/ # format.js (bedragen/datums), storage.js,
│ │ # grafiek.js (SVG-padberekening)
│ │ # grafiek.js (SVG), htmlExport.js (export)
│ ├── hooks/ # useTheme, useUpdateCheck, useKolomBreedtes
│ ├── context/ # AppContext (global state + API sync + backup)
│ ├── components/
@@ -253,7 +296,7 @@ vibefinance/
│ │ ├── LoginBackground.jsx
│ │ ├── NavBar.jsx
│ │ ├── ProfielPopup.jsx
│ │ ├── InstellingenModal.jsx # Thema + backup/restore
│ │ ├── InstellingenModal.jsx # Thema + backup/restore + export
│ │ └── GebruikersBeheer.jsx
│ └── pages/
│ ├── DashboardTab.jsx