Files

104 lines
4.9 KiB
Markdown

# TODO.md - Plan de travail en cours
> Document de reprise : si la session est interrompue, reprendre ici.
> Dernière mise à jour : 2026-09-14.
## Comment lancer / tester
```bash
# Tout tester d'un coup (backend + couverture + frontend) : "test le projet"
./test.sh
# Serveur API (dev) - obligatoire pour les tests
cd api && php -c php-upload.ini -S localhost:8000 router.php &
# Front (dev)
cd partitions && npm run dev # http://localhost:5173
# Tests backend
cd api && rm -f /tmp/rate_* 2>/dev/null && php tests.php
# Tests frontend
cd partitions && npm run check && npm run test:e2e
# Couverture (Xdebug requis) ~96.9%
```
## État actuel
### Fait (session)
- **Docs** : `AGENTS.md` réécrit (stack réelle), `README.md` + `api/README.md` corrigés,
`NAMING.md` recréé (convention des noms), dépendances documentées, `PLAN.md` /
`SECURITY_AUDIT.md` / `wordpress_list/` supprimés (commit `e79c865`).
- **Sécurité C1-C5** : plus de service statique `.env` (`router.php`), containment
`deleteScoreFile`, `.env` dé-suivis + secret roté, JWT base64url + `exp` obligatoire
+ `alg` validé + erreurs génériques, XSS `ressource` bloqué.
- **Bugs** : `+`/encodage des chemins (167 PDF), viewer PDF (course canvas + double
chargement + fuite blob), en-tête `Authorization` insensible à la casse, 404/403 download.
- **Backend** : `ressource` persisté/préservé, watermark multi-pages + échec remonté,
validation des segments de chemin, sanitisation INI, rate-limiter `flock`,
CORS sans wildcard, token download via header uniquement, `ini_set` retiré,
`score.ini` protégé, code mort supprimé (Auth methods).
- **Tests** : `tests.php` porte de 53 à **181 tests** (fonctionnels + unitaires directs).
Tests isolés (créent/suppriment leurs propres partitions) ; le test watermark utilisait
un PDF invalide et écrasait `scores[0]` → corrigé.
- **Harness couverture** : `api/coverage-prepend.php` + `api/coverage-report.php`
(exclus du deploy), documentés dans `AGENTS.md`.
### Couverture backend : 96.9%
- `api/router.php` : **100%**
- `api/lib/Auth.php` : **100%**
- `api/lib/ScoreScanner.php` : **99.5%** (restent 2 lignes)
- `api/index.php` : **92.4%** (restent 22 lignes)
Code inutile retiré (justifié en revue) : fallback `getallheaders()` (lit la même
source que `$_SERVER['HTTP_AUTHORIZATION']`) et boucle d'auto-id morte (comparait
un id non paddé à des dossiers paddés).
Lignes non couvertes = **branches défensives d'échec I/O**, non atteignables via
l'API sans injection de panne OS :
| Fichier | Lignes | Nature |
|---|---|---|
| `api/index.php` | 56, 59, 60 | rate-limiter : `fopen`/`flock` échoue (fail-open) |
| `api/index.php` | 104 | fallback `SCORES_PATH` si variable absente |
| `api/index.php` | 222-224 | `GET /scores` renvoie 500 si dossier Scores absent |
| `api/index.php` | 388-408 | erreurs d'upload PHP (`UPLOAD_ERR_*`, post_max_size) |
| `api/lib/ScoreScanner.php` | 443, 444 | rollback `createScore` si écriture `score.ini` échoue |
**Option** pour monter plus haut : serveur de test secondaire (port 8001) avec
`SCORES_PATH=/nonexistent` et `upload_max_filesize=1K` pour couvrir 222-224 et
388-395. Le reste (I/O/OS, 56/59/60, 104, 443/444) resterait non couvert.
## À faire (reste)
### Finitions
- [ ] Décider du sort de `legacy/Scores/001/` (résidu de test « Test Duplicate »,
sans PDF) → demander avant suppression.
- [ ] `npm audit` : 18 → **8 vulnérabilités** après `npm audit fix`. Le reste
(svelte/rollup/picomatch) exige `npm audit fix --force` (breaking) → à décider.
- [ ] Committer (uniquement sur demande).
## Fait (frontend, F11-F16)
- **F11** code mort supprimé : `auth.getToken()`, `api.downloadFileWithAuth`,
tout le code d'upload inutilisé d'`admin/+page.svelte`.
- **F12** maps d'instruments factorisées dans `partitions/src/lib/instruments.ts`
(+ helpers `getInstrumentName/Icon/DefaultKey`), réutilisées partout. `test-icons`
supprimé. `lucide-svelte` retiré (inutilisé).
- **F13** migration `$app/stores` → `$app/state`, suppression des abonnements
manuels, état réactif dans `scores/[id]` et chargement piloté par `$effect`
(navigation client correcte). `<slot/>` → `{@render children()}`.
- **F14** worker PDF pointé sur `.mjs` (fichier suivi), `nginx.conf` MIME `.mjs`,
`deploy.sh` simplifié, `favicon.png` ajouté.
- **F15** route `test-icons/` supprimée ; `VITE_API_URL` réellement utilisé
(fallback dev/prod), `define` bogus retiré de `vite.config.ts`.
- **F16** `svelte-check` ajouté (`npm run check`) → **0 erreur / 0 warning** ;
a11y corrigée (labels `for`/`id`, `<tr>`/spans cliquables → `<button>`,
modales → composant `ConfirmDialog.svelte` avec `role="dialog"`/Escape,
autofocus → action) ; `npm audit fix` appliqué.
## Notes
- Branche `master`. Ne pas committer sans demande explicite.
- `legacy/Scores/` est la donnée réelle : les tests ne doivent jamais y écrire
(les tests de partition sont désormais auto-isolés).