diff --git a/artifacts/voix-du-peuple/public/opengraph.jpg b/artifacts/voix-du-peuple/public/opengraph.jpg index 0829638..7632621 100644 Binary files a/artifacts/voix-du-peuple/public/opengraph.jpg and b/artifacts/voix-du-peuple/public/opengraph.jpg differ diff --git a/docs/DEX.md b/docs/DEX.md index 5d6ca74..6f1e0f6 100644 --- a/docs/DEX.md +++ b/docs/DEX.md @@ -14,6 +14,8 @@ | 1.2 | Avril 2026 | Palette pétrol neutre, textes de posture sur l'expression vs. vérité | | 1.3 | Avril 2026 | Dark mode pétrol, panneau d'accessibilité (dyslexie, contraste, zoom) | | 1.4 | Avril 2026 | Synchronisation Gitea sécurisée — `GITEA_TOKEN` + `scripts/push-gitea.sh` | +| 1.5 | Avril 2026 | Droit pénal français intégré dans le filtre IA (16 sections) | +| 1.6 | Avril 2026 | Panel admin sécurisé (`/admin`), signalement public, export CSV | --- @@ -367,7 +369,67 @@ Permissions requises : `repository` (lecture + écriture). --- -## 16. Contacts et ressources +## 16. Panel d'administration + +### Accès + +Le panel admin est accessible à l'URL `/admin` — il n'est **pas lié dans la navigation publique**. Seul l'administrateur connaît son existence. + +``` +https://votredomaine.fr/admin +``` + +### Authentification + +À l'ouverture, un formulaire de connexion demande le mot de passe. Celui-ci est la valeur de la variable `ADMIN_SECRET` configurée dans les secrets de l'environnement. La session est stockée dans `sessionStorage` du navigateur — elle est perdue à la fermeture de l'onglet. + +| Variable | Où la définir | +|----------|---------------| +| `ADMIN_SECRET` | Replit → Secrets · ou `.env` en auto-hébergement | + +### Fonctionnalités + +| Fonctionnalité | Description | +|----------------|-------------| +| **Tableau de bord** | Compteurs : total, acceptées, rejetées, signalées | +| **Liste filtrée** | Onglets : Toutes · Acceptées · Rejetées · Signalées | +| **Recherche** | Filtrage textuel en temps réel sur le contenu | +| **Suppression** | Suppression unitaire avec confirmation, puis régénération automatique de la synthèse | +| **Suppression en masse** | Sélection multiple → suppression groupée → synthèse régénérée | +| **Override IA** | Forcer l'acceptation ou le rejet d'une contribution, avec motif | +| **Note admin** | Annotation interne sur une contribution (invisible du public) | +| **Retrait de signalement** | Marquer un signalement comme traité | +| **Régénération manuelle** | Forcer la régénération complète de la synthèse | +| **Export CSV** | Télécharger toutes les contributions (UTF-8 BOM, compatible Excel) | + +### Signalement public + +Sur la page d'accueil, chaque contribution affiche un bouton **Signaler** au survol (icône drapeau). Ce bouton est limité à 3 signalements par minute et 10 par heure par IP. Les contributions signalées apparaissent en premier dans l'onglet **Signalées** du panel admin. + +### Sécurité + +- Toutes les routes `/api/admin/*` vérifient le header `Authorization: Bearer ` +- La route de login est limitée à 10 tentatives par minute (protection brute-force) +- Aucune session persistante côté serveur — pas de cookie, pas de base de sessions +- L'URL `/admin` n'est pas mentionnée dans le code source public ni dans le `robots.txt` + +### Routes API admin + +| Méthode | Route | Action | +|---------|-------|--------| +| `POST` | `/api/admin/login` | Vérification du mot de passe | +| `GET` | `/api/admin/stats` | Statistiques détaillées | +| `GET` | `/api/admin/ideas` | Liste avec filtres (`status`, `page`, `q`) | +| `DELETE` | `/api/admin/ideas/` | Suppression unitaire | +| `POST` | `/api/admin/ideas/bulk-delete` | Suppression en masse (`{ids: [...]}`) | +| `POST` | `/api/admin/ideas//override` | Override IA (`{accepted, reason, note}`) | +| `POST` | `/api/admin/ideas//unflag` | Retirer le signalement | +| `POST` | `/api/admin/synthesis/regenerate` | Forcer la régénération | +| `GET` | `/api/admin/export/csv` | Export CSV (toutes les contributions) | + +--- + +## 17. Contacts et ressources - Documentation Mistral : https://docs.mistral.ai - PostgreSQL : https://www.postgresql.org/docs/ diff --git a/docs/INSTALL_ROCKY.md b/docs/INSTALL_ROCKY.md index de27447..d174a9c 100644 --- a/docs/INSTALL_ROCKY.md +++ b/docs/INSTALL_ROCKY.md @@ -190,6 +190,9 @@ MISTRAL_API_KEY=votre_cle_mistral_ici # Sécurité Flask SESSION_SECRET=generez-une-chaine-aleatoire-longue-ici +# Panel admin — mot de passe de connexion à /admin (OBLIGATOIRE) +ADMIN_SECRET=choisissez-un-mot-de-passe-long-et-complexe-ici + # Modèles IA (valeurs par défaut si omis) # FILTER_MODEL=mistral-small-latest # SYNTHESIS_MODEL=mistral-large-latest @@ -198,10 +201,11 @@ SESSION_SECRET=generez-une-chaine-aleatoire-longue-ici VITE_APP_URL=https://votredomaine.fr ``` -Générer un SESSION_SECRET : +Générer `SESSION_SECRET` et `ADMIN_SECRET` : ```bash python3 -c "import secrets; print(secrets.token_hex(32))" +# Exécuter deux fois pour obtenir deux valeurs distinctes ``` ### 8.2 Changer le domaine (QR code)