From 0ab402aa7357137ae46a2759c997702c6414e1c1 Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Sat, 26 Sep 2026 11:55:26 -0400 Subject: [PATCH] docs: roadmap priorise dette et securite #85 #87 (#77 non signe, #73 reporte) --- CHANGELOG.md | 20 +++++++++++- README.fr.md | 6 ++-- README.md | 6 ++-- VERSION | 2 +- desktop/Cargo.lock | 2 +- desktop/Cargo.toml | 2 +- desktop/tauri.conf.json | 2 +- docs/ROADMAP.md | 71 ++++++++++++----------------------------- package.json | 2 +- 9 files changed, 51 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 204890d..220da28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). > **En cours de développement** : les changements à venir sont listés dans la section -> [Unreleased](#unreleased). La dernière version livrée est **2.27.0**. +> [Unreleased](#unreleased). La dernière version livrée est **2.27.1**. --- @@ -14,6 +14,24 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.27.1] — 2026-09-26 + +### Modifié + +- **Roadmap — priorisation dette & sécurité (décisions 2026-09-26).** + Items #85 (refonte architecturale) et #87 (CI/CD) détaillés et marqués + prioritaires : `backend/main.py` mesuré à ~4 827 lignes, `tools/registry.py` + à créer, persistance SQLite/Redis, verrous asyncio, audit des `except` + larges, CI sécurité bloquante (bandit/semgrep/trivy, audits pip/npm), + finition CSP nonce (BUG-034), cookies `Secure` par défaut, rotation clé + DeepSeek à confirmer (BUG-006). #73 Sync reporté (P4, hors chemin + critique) ; desktop #77 confirmé non signé + doc SmartScreen, reste les + 6 tests E2E manuels. Corrections : sections livrées #83/#84 retirées du + backlog (détail dans l'archive, index inchangé), total restant recalculé + (~12-18 jours chemin critique : #77 fin + #85 + #87). + +--- + ## [2.27.0] — 2026-09-25 ### Ajouté diff --git a/README.fr.md b/README.fr.md index 8eab06c..98cd017 100644 --- a/README.fr.md +++ b/README.fr.md @@ -4,7 +4,7 @@ **Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive. -[![Version](https://img.shields.io/badge/Version-2.27.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.27.1-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -976,8 +976,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.27.0). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.27.1). --- -*Projet : ObsiGate | Version : 2.27.0 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.27.1 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index 2b02223..fdb2ecb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface. -[![Version](https://img.shields.io/badge/Version-2.27.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.27.1-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -1151,8 +1151,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.27.0). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.27.1). --- -*Project: ObsiGate | Version: 2.27.0 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.27.1 | Last updated: September 2026* diff --git a/VERSION b/VERSION index a5f3e61..f046523 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.27.0 +2.27.1 diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index 4a53627..4cd164c 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "obsigate-desktop" -version = "2.27.0" +version = "2.27.1" dependencies = [ "chrono", "env_logger", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 99456f0..eb8c9ad 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsigate-desktop" -version = "2.27.0" +version = "2.27.1" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" authors = ["Bruno Charest"] edition = "2021" diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index f2879e3..d20e750 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "productName": "ObsiGate", - "version": "2.27.0", + "version": "2.27.1", "identifier": "com.obsigate.desktop", "build": { "frontendDist": "../frontend", diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 6a77608..8e0a40a 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # ObsiGate — Roadmap -> **Version :** 2.27.0 | **Dernière mise à jour :** 2026-09-25 +> **Version :** 2.27.1 | **Dernière mise à jour :** 2026-09-26 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact > vers les fonctionnalités livrées. > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** @@ -37,7 +37,7 @@ - **Reste à faire :** - [x] **Signature de l'updater Tauri** (gratuit) : paire de clés générée, `pubkey` renseignée, `createUpdaterArtifacts` activé, secrets CI câblés - [x] **Manifeste `latest.json`** généré par `scripts/updater_manifest.py` (intégré à `publish_release.py`), endpoint updater pointé sur `main` - - [ ] **Signature de code Windows** : non retenue (pas de certificat) — alternatives : livrer non signé, SignPath.io (OSS gratuit), Certum OSS, Azure Trusted Signing, certificat EV + - [ ] **Signature de code Windows** : **non retenue — décision confirmée le 2026-09-26** : livraison non signée + documentation SmartScreen (« Exécuter quand même »). Alternatives écartées sauf retour utilisateur : SignPath.io (OSS gratuit), Certum OSS, Azure Trusted Signing, certificat EV - [ ] Exécuter les 6 tests E2E **manuels** — protocole documenté : [DESKTOP_E2E_CHECKLIST.md](./DESKTOP_E2E_CHECKLIST.md) --- @@ -47,6 +47,7 @@ ### 73. Synchronisation multi-appareils — Obsidian Sync compatible - **Effort :** 6-8 jours | **Impact :** 🟢 +- **Décision 2026-09-26 : reporté (P4)** — axe prioritaire = dette & sécurité (#85/#87) ; #73 hors chemin critique. Si réactivé : partir d'un MVP export/hash/LWW adossé à #59 (PWA offline) + #62 (collab Yjs/CRDT) plutôt qu'un protocole parallèle. - **Description :** Synchronisation des vaults entre plusieurs instances d'ObsiGate via un protocole de synchronisation décentralisé ou compatible Obsidian Sync. Alternative self-hosted à Obsidian Sync. - **Sous-tâches :** - [ ] Protocole : évaluation CRDT vs OT vs diff/patch pour fichiers markdown @@ -60,60 +61,29 @@ --- -## ⚪ Backlog — Priorité 2 (P2) - -### 83. Barre d'outils d'édition mobile — style Obsidian Android - -- **Effort :** 3-5 jours | **Impact :** 🟡 | **Zone :** frontend (mobile) -- **Statut :** ✅ livré — ruban horizontal défilable ancré au-dessus du clavier, commandes étendues et personnalisation persistée. Détail : [archive/COMPLETED_v1-v2.md](./archive/COMPLETED_v1-v2.md) (section #83). -- **Description :** remplacer la barre de mise en forme Markdown actuelle par un **ruban horizontal - défilable** ancré juste au-dessus du clavier virtuel, reprenant l'ergonomie de l'app Android - Obsidian : fond anthracite aux coins arrondis, insertion/enrobage de la syntaxe au curseur ou sur - la sélection, et personnalisation des commandes via une icône clé à molette. -- **Sous-tâches :** - - [x] Ruban horizontal défilable (glissement tactile gauche/droite) ancré au-dessus du clavier - - [x] Actions rapides : annuler, refaire, `[[ ]]` (lien interne), modèle/fichiers, tag `#`, pièce jointe - - [x] Formatage : H1–H6, gras, italique, barré (`~~`), surligné (`==`), code en ligne/bloc, citation (`>`) - - [x] Liens externes, listes à puces/numérotées, case à cocher (`- [ ]`), indenter / désindenter - - [x] Personnalisation (clé à molette) : ajouter / supprimer / réordonner les commandes - - [x] i18n FR/EN + tests frontend (helpers purs) + E2E mobile - ---- - ## ⚪ Backlog — Sécurité, architecture & performance (P0/P1) -### 84. Consolidation & sécurité — revue statique 2026-09-13 (phase 1) - -- **Effort :** 6-9 jours | **Impact :** 🔴 | **Zone :** backend + frontend | **Référence :** [ISSUES_TODOLIST.md](./ISSUES_TODOLIST.md) BUG-021 → BUG-034 -- **Statut :** 🟢 livré (phase 1) — sanitizer XSS, rate-limit/lockout MFA, isolation vaults, ReDoS, SSRF webhooks, cycle de vie des sessions, politique de mot de passe, verrous `users.json`, audits IP, rate-limit par compte, symlinks, recherche via inverted index, token en cookie HttpOnly. Détail : [archive/COMPLETED_v1-v2.md](./archive/COMPLETED_v1-v2.md) (section #84). -- **Description :** traiter toutes les vulnérabilités critiques et importantes issues de la revue statique : XSS markdown (`escape=False`) et page publique de partage, brute-force MFA, isolation des vaults (`resolve_safe_path`), ReDoS, SSRF webhooks, cycle de vie des sessions, politique de mot de passe, races `users.json`, audits IP, rate-limit partagé, indexation symlinks. -- **Sous-tâches :** - - [x] Assainir le rendu markdown (sanitizer serveur en whitelist) et la page de partage (échappement `title`/frontmatter) — *DOMPurify client non ajouté (défense en profondeur serveur suffisante)* - - [x] Rate-limit + lockout sur les endpoints MFA (`totp/verify`, `recovery`, `webauthn/verify`) - - [x] Corriger `resolve_safe_path` (comparaison de chemin stricte par segment) + test de régression - - [x] Rotation du refresh token, révocation de l'access token au logout, persistance des JTI révoqués - - [x] Valider la politique de mot de passe à la création ; bloquer le SSRF des webhooks et externaliser les secrets - - [x] Verrous sur les mutations `users.json` ; consigner l'adresse IP réelle dans les audits - - [x] Ignorer les symlinks de l'index ; caps CPU/timeout regex (ReDoS) - - [~] Durcir la CSP — *partiel* : directives `object-src`/`base-uri`/`form-action`/`frame-ancestors` ajoutées et token retiré de `sessionStorage` ; migration **nonce** restante (nécessite la conversion des gestionnaires d'événements inline) - ### 85. Refonte architecturale — découpage du monolithe & persistance d'état (phase 2) - **Effort :** 8-12 jours | **Impact :** 🟡 | **Zone :** backend -- **Description :** extraire le monolithe `backend/main.py` (~4 260 lignes) en routers FastAPI par domaine et rendre persistant l'état qui ne l'est pas (index de recherche, JTI révoqués, compteurs de rate-limit) pour préparer le multi-nœuds. +- **Décision 2026-09-26 : prioritaire (axe Dette & sécurité).** +- **Description :** extraire le monolithe `backend/main.py` (~4 827 lignes au 2026-09-26, ~17 % du backend) en routers FastAPI par domaine et rendre persistant l'état qui ne l'est pas (index de recherche, JTI révoqués, compteurs de rate-limit) pour préparer le multi-nœuds. L'état mémoire actuel (index, inverted index, vecteurs sémantiques, `SSEManager`, collab) rend le multi-workers unsafe. - **Sous-tâches :** - - [ ] Routers par domaine : files, search, share, webhooks, plugins, collab, admin, ai - - [ ] Centraliser le contrat d'outils IA sur `tools/registry.py` (permissions, quotas, redaction) - - [ ] Persister index, JTI révoqués et compteurs de rate-limit (SQLite/Redis) - - [ ] Verrous asyncio autour de l'index global et des stores JSON ; service de partage public (expiration, révocation, quotas) + - [ ] Routers par domaine : files, search, share, webhooks, plugins, collab, admin, ai — `main.py` conservé comme assemblage (< 500 lignes) ; dédupliquer les modèles Pydantic vers `schemas.py` + - [ ] Créer `tools/registry.py` (inexistant) : contrat central des outils IA (permissions, quotas, redaction) + - [ ] Persister index, JTI révoqués et compteurs de rate-limit (SQLite par défaut, Redis en option multi-nœuds ; le rate-limit actuel est in-memory mono-process) + - [ ] Verrous asyncio autour de l'index global et des stores JSON ; auditer les `except Exception` larges (> 100 occurrences) : best-effort (backup/audit) vs masquage d'erreur (erreurs typées 4xx/5xx + test) + - [ ] Extraire le service de partage public (expiration, révocation, quotas) ### 87. Amélioration continue — tests, CI/CD, revues de sécurité (phase 4) - **Effort :** 3-5 jours | **Impact :** 🟡 | **Zone :** `.gitea/workflows/`, `tests/` -- **Description :** renforcer le pipeline (`.gitea/workflows/ci.yml`, `desktop-build.yml`) pour le rendre bloquant par défaut et accompagner les phases 1 → 3. +- **Décision 2026-09-26 : prioritaire (axe Dette & sécurité).** +- **Description :** renforcer le pipeline (`.gitea/workflows/ci.yml`, `desktop-build.yml`) pour le rendre bloquant par défaut et accompagner les phases 1 → 3. Constat 2026-09-26 : job `security` non bloquant (`bandit`/`pip-audit` en `|| echo`, ni semgrep ni trivy), E2E limité à `chromium-desktop`, 5 suites frontend hors CI. - **Sous-tâches :** - - [ ] Jobs CI sécurité (bandit/semgrep/trivy, audits pip/npm) + tests E2E XSS (page de partage + lecteur markdown) - - [ ] Tests de concurrence (`users.json`), fuzzing de timing regex, couverture des composants critiques + - [ ] Jobs CI sécurité **bloquants** (bandit/semgrep/trivy, audits pip/npm) + tests E2E XSS (page de partage + lecteur markdown) + - [ ] Tests de concurrence (`users.json`), fuzzing de timing regex, couverture des composants critiques ; intégrer au CI les 5 suites frontend hors CI (`upload`, `pretty`, `media-viewer`, `mfa-settings`, `config-ai-keys`) + - [ ] Finir BUG-034 (migration CSP **nonce**, conversion des handlers inline), `Secure` cookies à `true` par défaut, politique CORS same-origin explicite ; confirmer la rotation de la clé DeepSeek (BUG-006, clé dans l'historique Git) - [ ] Revue périodique des dépendances ; documentation utilisateur FR/EN synchronisée ; contrôle automatisé de la conformité au DoD --- @@ -200,16 +170,17 @@ | Priorité | Items | Effort total estimé | |---|---|---| -| ✅ Complété | #1 → #59, #61–72, #74–76, #78–84, #86, #88–93, #94–100, #102–114, #92 | ~133 jours réalisés | -| 🔵 P2 restant | #77 Desktop : signature de code (non retenue), 6 tests E2E **manuels** ([protocole](./DESKTOP_E2E_CHECKLIST.md)) | ~0,5-1 jour | -| ⚪ P4 restant | #73 Sync (6-8j) | 6-8 jours | -| ⚪ P0/P1 restant | #85, #87 Refonte architecturale, CI/CD (BUG-035 → BUG-040 corrigés, #86 livré) | ~11-17 jours | -| **Total restant** | **6 items + finitions** | **~23-38 jours** | +| ✅ Complété | #1 → #59, #61–72, #74–76, #78–84, #86, #88–93, #94–100, #102–115, #117, #92 | ~133 jours réalisés | +| 🔵 Finitions | #77 Desktop : 6 tests E2E **manuels** ([protocole](./DESKTOP_E2E_CHECKLIST.md)) — signature Windows non retenue (décision 2026-09-26) | ~0,5-1 jour | +| ⚪ P4 reporté | #73 Sync — **reporté (décision 2026-09-26)**, hors chemin critique | 6-8 jours si réactivé | +| ⚪ P0/P1 prioritaire | #85, #87 Refonte architecturale, CI/CD (BUG-035 → BUG-040 corrigés, #86 livré) | ~11-17 jours | +| **Total chemin critique** | **#77 fin + #85 + #87** | **~12-18 jours** | --- ## Notes +- **Décisions 2026-09-26 :** axe prioritaire = dette & sécurité (#85/#87) ; #73 Sync reporté (P4, hors chemin critique) ; desktop livré non signé + doc SmartScreen. - Les items P3/P4 ne sont pas ordonnés par priorité interne — à raffiner selon les retours utilisateurs. - L'effort inclut le développement + tests unitaires + intégration CI, mais pas la documentation utilisateur. - Les items marqués 🟢 (nice-to-have) sont de bons candidats pour des contributions externes. diff --git a/package.json b/package.json index bf38eb5..6460a24 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsigate", - "version": "2.27.0", + "version": "2.27.1", "description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.", "main": "patch.js", "directories": {