fix: A29 + A42(partiel) — publish partagé, fuite password_hash, data_dir (v7.5.0)
- A29 — `app/services/publish.py` : slugify titré unique (fallback aléatoire),
404 si la page n'existe pas, événements centralisés. Les 3 paires
publish/unpublish déléguent (sharing = front, board, v2) :
· board : mise à jour aveugle → 404 + contrôle de session ajouté
· board : perd `share_mode='anyone'` en bonus, v2 : perd `is_shared=1` —
le share dialog reste l'unique propriétaire de ces drapeaux
· v2 : slug fourni conservé, slug vidé aussi à la dépublication (avant : laissé)
· `/users/me` ×2 et listings collections ×3 = contrats versionnés distincts,
décision documentée (on garde)
- Byproduct sécurité — `GET /api/users/me` (v1) et le contexte de `/accounts`
faisaient `SELECT *` sur users → password_hash / login_attempts / locked_until
exposés → colonnes whitelistées (liste v2)
- A42 (partiel) — 9 copies de `Path(os.environ.get("FLOWDECK_DATA_DIR", "/data"))`
→ `settings.data_dir` (property : lecture à chaque accès, les tests
monkeypatchent l'env) ; cache Gitea : évacuation des entrées expirées à chaque
écriture. Reste : client httpx partagé (52 créations, cache par event loop)
tests : test_publish_service_shared_and_safe, test_users_me_no_secret_columns,
test_gitea_cache_evicts_expired
suite **1034/1034** · `ruff check app tests` OK · OpenAPI 511 chemins / 7.5.0
docs (ROADMAP/CHANGELOG/WORKLOAD/VERSION) à jour
This commit is contained in:
@@ -1,5 +1,36 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.5.0 (2026-10-01) — Audit : A29, A42 (partiel)
|
||||
|
||||
### Changed
|
||||
|
||||
- **A29** — `services/publish.py` partagé : les 3 paires publish/unpublish
|
||||
(sharing = front, board, v2) déléguent ; 404 partout (board faisait une
|
||||
mise à jour aveugle), slugify titré unique (board : aléatoire ; v2 : slug
|
||||
fourni conservé), événements centralisés, board gagne le contrôle de session.
|
||||
Les bonus divergents disparaissent (`share_mode='anyone'` pour board,
|
||||
`is_shared=1` pour v2) : le share dialog reste l'unique propriétaire de ces
|
||||
drapeaux, dépublier ne révoque donc pas un partage manuel. Les listings
|
||||
`/users/me` ×2 et collections ×3 restent : contrats versionnés distincts
|
||||
- **A42** — 9 copies de `Path(os.environ.get("FLOWDECK_DATA_DIR", "/data"))` →
|
||||
`settings.data_dir` (property : lecture à chaque accès, les tests
|
||||
monkeypatchent l'env) ; cache Gitea : évacuation des entrées expirées à
|
||||
chaque écriture (il ne pouvait que grandir) ; les 29 `Environment(...)`
|
||||
étaient déjà couverts par A10. **Reste** : client httpx partagé (52 créations,
|
||||
à faire avec un cache par event loop)
|
||||
|
||||
### Security
|
||||
|
||||
- **Byproduct A29** — `GET /api/users/me` (v1) et le contexte Jinja de
|
||||
`/accounts` renvoyaient `SELECT *` sur `users` : **password_hash**,
|
||||
`login_attempts` et `locked_until` exposés → colonnes whitelistées
|
||||
(identiques à la liste v2)
|
||||
|
||||
### Tests
|
||||
|
||||
- `test_publish_service_shared_and_safe` (slug, 404, partage préservé),
|
||||
`test_users_me_no_secret_columns`, `test_gitea_cache_evicts_expired`
|
||||
|
||||
## v7.4.0 (2026-10-01) — Audit : A30, A37, A39, A40, A41
|
||||
|
||||
### Changed
|
||||
|
||||
Reference in New Issue
Block a user