From f7b521cda60c082c37e71b05e77a59be4634996b Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Fri, 17 Jul 2026 10:05:29 +0200 Subject: [PATCH] feat(ui): display application errors in GTK --- docs/ROADMAP.md | 1299 +++++++++++++++++ .../{TICKET-31.1.md => TICKET-031.1.md} | 0 docs/tickets/closed/TICKET-032.md | 537 +++++++ docs/tickets/closed/TICKET-033.md | 694 +++++++++ include/views/application_message_dialog.h | 38 + labfy-investigation | Bin 188888 -> 195160 bytes src/core/application.c | 83 +- src/views/application_message_dialog.c | 337 +++++ tests/test_database | Bin 0 -> 41112 bytes tests/test_error | Bin 0 -> 32688 bytes tests/test_investigation_dao | Bin 0 -> 42288 bytes tests/test_investigation_node | Bin 0 -> 25824 bytes tests/test_investigation_project | Bin 0 -> 51616 bytes tests/test_investigation_record | Bin 0 -> 17392 bytes tests/test_investigation_session | Bin 0 -> 56880 bytes tests/test_investigation_tree_builder | Bin 0 -> 22848 bytes tests/test_investigation_tree_model | Bin 0 -> 17368 bytes tests/test_statement | Bin 0 -> 37456 bytes tests/test_transaction | Bin 0 -> 32760 bytes 19 files changed, 2987 insertions(+), 1 deletion(-) rename docs/tickets/closed/{TICKET-31.1.md => TICKET-031.1.md} (100%) create mode 100644 docs/tickets/closed/TICKET-032.md create mode 100644 docs/tickets/closed/TICKET-033.md create mode 100644 include/views/application_message_dialog.h create mode 100644 src/views/application_message_dialog.c create mode 100755 tests/test_database create mode 100755 tests/test_error create mode 100755 tests/test_investigation_dao create mode 100755 tests/test_investigation_node create mode 100755 tests/test_investigation_project create mode 100755 tests/test_investigation_record create mode 100755 tests/test_investigation_session create mode 100755 tests/test_investigation_tree_builder create mode 100755 tests/test_investigation_tree_model create mode 100755 tests/test_statement create mode 100755 tests/test_transaction diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index fe1e3b7..71fc697 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -268,3 +268,1302 @@ Le logiciel doit rester : - portable ; - testable ; - maintenable. + +# Feuille de route repensée — Labfy Investigation + +## Point de départ + +Le ticket **#031.1 — Fermeture propre de l’application** termine le premier socle GTK. + +À ce stade, Labfy Investigation sait : + +- créer une enquête ; +- ouvrir une enquête existante ; +- remplacer une session active ; +- afficher son arborescence ; +- fermer proprement l’application ; +- ouvrir et initialiser la base SQLite ; +- charger l’identité persistante de l’enquête ; +- gérer les transactions et les erreurs de base. + +La suite ne doit plus être pensée comme un simple gestionnaire de fichiers. + +## Vision du logiciel + +Labfy Investigation doit devenir un **poste de travail OSINT orienté enquête** capable de : + +- conserver les preuves originales ; +- extraire et rechercher des métadonnées ; +- créer des entités ; +- relier les données entre elles ; +- afficher les relations sous forme de graphe ; +- construire une chronologie ; +- effectuer des recherches locales ; +- lancer des outils OSINT externes ; +- interroger des services Internet ; +- conserver les résultats bruts ; +- normaliser les résultats ; +- documenter la provenance de chaque information ; +- produire un rapport exploitable. + +Architecture générale : + +```text +Interface GTK + ↓ +Contrôleurs de l’application + ↓ +Services métier + ├── preuves + ├── entités + ├── relations + ├── recherches + ├── tâches + └── rapports + ↓ +Adaptateurs + ├── SQLite + ├── système de fichiers + ├── outils CLI + ├── bibliothèques + └── API Internet +``` + +--- + +# Principes non négociables + +## SQLite reste la source de vérité + +Le graphe, les tableaux, la chronologie et les résultats de recherche sont des vues différentes des mêmes données. + +## Résultat brut et résultat normalisé sont séparés + +Chaque outil doit produire : + +```text +Sortie brute conservée et horodatée + + +Données normalisées utilisables dans Labfy +``` + +## Toute information doit avoir une provenance + +Une donnée exploitable doit pouvoir répondre à ces questions : + +```text +Qu’a-t-on trouvé ? +Quand ? +Avec quel outil ? +Avec quelle version ? +À partir de quelle requête ? +Quelle était la réponse brute ? +Quelle preuve ou source justifie l’interprétation ? +``` + +## Les outils externes sont optionnels + +Une dépendance absente ne doit pas empêcher Labfy de démarrer. + +Chaque capacité peut être : + +```text +Disponible +Absente +Trop ancienne +Non configurée +Désactivée +En erreur +``` + +## L’interface ne doit jamais être bloquée + +Les opérations longues doivent fonctionner en arrière-plan : + +- calcul d’empreinte ; +- copie de fichiers ; +- extraction de métadonnées ; +- requêtes réseau ; +- analyse de résultats ; +- génération de rapports. + +## Aucune commande shell construite avec une chaîne + +Les outils externes doivent être lancés avec `GSubprocess` et une liste d’arguments. + +## Les données déduites restent distinctes des données observées + +Labfy doit distinguer : + +```text +Observation directe +Résultat produit par un outil +Donnée importée +Déduction de l’enquêteur +Hypothèse +``` + +--- + +# Phase 1 — Consolider le noyau d’application + +## Ticket #032 — Factoriser le chargement d’une enquête + +Créer un service interne unique qui : + +1. ouvre une `InvestigationSession` ; +2. récupère le projet ; +3. construit l’arborescence ; +4. installe la session dans `Application` ; +5. conserve l’ancienne session en cas d’échec. + +Ce flux sera réutilisé par : + +- création d’une enquête ; +- ouverture manuelle ; +- enquêtes récentes ; +- arguments de ligne de commande ; +- restauration de session. + +## Ticket #033 — Afficher les erreurs dans GTK + +Créer un module commun d’affichage : + +- erreur ; +- avertissement ; +- confirmation ; +- information. + +Les erreurs techniques restent journalisées avec GLib, mais l’utilisateur doit recevoir un message graphique compréhensible. + +## Ticket #034 — Gestionnaire de tâches asynchrones + +Créer un modèle de tâche capable de gérer : + +- état ; +- progression ; +- annulation ; +- résultat ; +- erreur ; +- date de début ; +- date de fin. + +États recommandés : + +```text +En attente +En cours +Terminée +Échouée +Annulée +``` + +L’interface GTK doit rester fluide pendant l’exécution. + +## Ticket #035 — File de tâches et panneau d’activité + +Ajouter une file de tâches et une vue GTK permettant de suivre : + +- imports ; +- calculs d’empreintes ; +- recherches OSINT ; +- extractions de métadonnées ; +- exports. + +## Ticket #036 — Configuration de l’application + +Créer une configuration persistante pour : + +- chemins d’outils ; +- délais d’exécution ; +- activation des modules ; +- préférences d’interface ; +- paramètres réseau ; +- comportement des imports. + +Les secrets et clés API ne doivent pas être stockés en clair dans la base de l’enquête. + +--- + +# Phase 2 — Système d’outils externes + +## Ticket #037 — Registre des capacités et dépendances + +Créer un registre central capable de détecter : + +- présence d’un exécutable ; +- chemin réel ; +- version ; +- compatibilité minimale ; +- statut ; +- message d’erreur. + +Premiers outils candidats : + +```text +dig +host +whois +curl +openssl +file +exiftool +ffprobe +strings +``` + +## Ticket #038 — Interface commune des adaptateurs OSINT + +Définir les concepts opaques : + +```c +OsintTool +OsintRequest +OsintExecution +OsintResult +``` + +Un adaptateur devra pouvoir : + +- valider une requête ; +- vérifier sa disponibilité ; +- exécuter l’outil ; +- appliquer un délai maximal ; +- capturer `stdout` ; +- capturer `stderr` ; +- récupérer le code de retour ; +- analyser la sortie ; +- retourner un résultat normalisé. + +## Ticket #039 — Exécuteur sécurisé `GSubprocess` + +Créer un module générique qui lance un programme sans passer par un shell. + +Il doit gérer : + +- tableau d’arguments ; +- environnement contrôlé ; +- délai maximal ; +- annulation ; +- taille maximale des sorties ; +- code de retour ; +- erreurs de lancement. + +## Ticket #040 — Conservation des exécutions brutes + +Ajouter les tables et fichiers nécessaires pour conserver : + +- outil ; +- version ; +- cible ; +- paramètres ; +- date ; +- durée ; +- sortie standard ; +- sortie d’erreur ; +- code de retour ; +- SHA-256 de la sortie brute ; +- statut d’analyse. + +Exemple de stockage : + +```text +02_Preuves_Traitees/ +└── Resultats_Outils/ + └── __.json +``` + +## Ticket #041 — Vue des dépendances et capacités + +Créer une page GTK affichant : + +```text +ExifTool Disponible +dig Disponible +ffprobe Absent +Recherche sociale Non configurée +``` + +Une capacité absente doit expliquer comment l’activer sans bloquer l’application. + +--- + +# Phase 3 — Preuves et fichiers + +## Ticket #042 — Modèle opaque `EvidenceRecord` + +Champs initiaux : + +- identifiant ; +- nom original ; +- nom interne ; +- chemin relatif ; +- type ; +- taille ; +- SHA-256 ; +- date d’importation ; +- date de collecte déclarée ; +- source ; +- description ; +- statut d’intégrité. + +## Ticket #043 — Schéma SQLite et DAO des preuves + +Créer : + +- table `evidence` ; +- table `evidence_types` ; +- index ; +- contraintes ; +- DAO d’insertion ; +- DAO de lecture ; +- DAO de mise à jour autorisée. + +## Ticket #044 — Calcul SHA-256 par blocs + +Créer un module indépendant capable de traiter les gros fichiers sans les charger entièrement en mémoire. + +Ce ticket peut être synchronisé avec le cours de C. + +## Ticket #045 — Copie sûre et contrôlée d’un fichier + +Créer un service de copie qui : + +- valide le fichier source ; +- refuse les chemins dangereux ; +- évite les collisions ; +- copie vers une destination temporaire ; +- synchronise la copie ; +- recalcule son empreinte ; +- renomme atomiquement le fichier final. + +Ce ticket peut être synchronisé avec le cours Unix. + +## Ticket #046 — Import transactionnel d’une preuve + +Pipeline : + +```text +Validation +→ SHA-256 source +→ Copie temporaire +→ SHA-256 destination +→ Écriture SQLite +→ Validation de transaction +→ Renommage final +``` + +En cas d’échec, aucune preuve partiellement importée ne doit rester active. + +## Ticket #047 — Dialogue GTK d’import + +Ajouter : + +```text +Importer une preuve +``` + +Le formulaire doit permettre : + +- choix du fichier ; +- type ; +- source ; +- date de collecte ; +- description ; +- confirmation. + +## Ticket #048 — Liste et fiche détaillée des preuves + +Afficher sous forme de tableau : + +- nom ; +- type ; +- taille ; +- date ; +- source ; +- empreinte ; +- état d’intégrité. + +Une fiche détaillée doit afficher toutes les informations disponibles. + +## Ticket #049 — Vérification d’intégrité + +Recalculer les empreintes et détecter : + +- fichier absent ; +- taille modifiée ; +- empreinte modifiée ; +- chemin invalide ; +- doublon. + +--- + +# Phase 4 — Métadonnées et analyse locale + +## Ticket #050 — Premier adaptateur externe : ExifTool + +Ce sera le premier adaptateur complet validant toute l’architecture : + +```text +EvidenceRecord +→ tâche asynchrone +→ ExifTool +→ JSON brut +→ résultat stocké +→ métadonnées normalisées +``` + +## Ticket #051 — Modèle de métadonnées normalisées + +Créer un modèle générique : + +- clé ; +- valeur textuelle ; +- type de valeur ; +- namespace ; +- source ; +- outil ; +- confiance ; +- date d’extraction. + +## Ticket #052 — Extracteurs spécialisés + +Ajouter progressivement : + +- `file` pour le type réel ; +- `ffprobe` pour audio et vidéo ; +- extraction PDF ; +- extraction de documents bureautiques ; +- analyse EML ; +- analyse d’archives. + +## Ticket #053 — Recherche d’indicateurs dans les fichiers + +Détecter dans les métadonnées et contenus extraits : + +- emails ; +- domaines ; +- URL ; +- adresses IP ; +- téléphones ; +- pseudonymes ; +- noms d’utilisateurs ; +- coordonnées GPS. + +Les résultats doivent être proposés à l’enquêteur avant création d’entités. + +## Ticket #054 — Vue des métadonnées + +Afficher : + +- métadonnées brutes ; +- métadonnées normalisées ; +- filtres ; +- recherche ; +- provenance ; +- création d’entité depuis une valeur. + +--- + +# Phase 5 — Entités, observations et relations + +## Ticket #055 — Modèle opaque `EntityRecord` + +Types initiaux : + +```text +Personne +Pseudonyme +Adresse email +Téléphone +Domaine +Adresse IP +URL +Compte social +Organisation +IBAN +Cryptomonnaie +Document +Lieu +``` + +## Ticket #056 — Schéma et DAO des entités + +Créer : + +- `entity_types` ; +- `entities` ; +- `entity_attributes` ; +- contraintes ; +- index ; +- DAO. + +## Ticket #057 — Modèle `ObservationRecord` + +Une observation décrit une information découverte avec : + +- valeur ; +- date ; +- source ; +- méthode ; +- outil ; +- confiance ; +- statut de validation ; +- notes. + +## Ticket #058 — Interface de création et consultation des entités + +Permettre : + +- création manuelle ; +- modification ; +- recherche ; +- fusion contrôlée ; +- ajout d’attributs ; +- consultation des preuves associées. + +## Ticket #059 — Modèle opaque `RelationRecord` + +Une relation doit contenir : + +- source ; +- cible ; +- type ; +- direction ; +- date ; +- confiance ; +- provenance ; +- preuve associée ; +- note ; +- statut de validation. + +## Ticket #060 — Schéma et DAO des relations + +Créer : + +- `relation_types` ; +- `relations` ; +- contraintes ; +- index ; +- DAO. + +## Ticket #061 — Création et validation des relations + +Permettre : + +- création manuelle ; +- proposition automatique ; +- acceptation ; +- rejet ; +- modification ; +- justification. + +Aucune relation déduite automatiquement ne doit devenir définitive sans provenance. + +--- + +# Phase 6 — Recherche locale et requêtes + +## Ticket #062 — Index de recherche SQLite FTS5 + +Indexer : + +- preuves ; +- descriptions ; +- notes ; +- entités ; +- attributs ; +- observations ; +- métadonnées ; +- résultats OSINT ; +- événements. + +## Ticket #063 — Langage de filtres interne + +Créer un service de requêtes combinant : + +- texte ; +- type ; +- date ; +- source ; +- confiance ; +- outil ; +- statut ; +- relations. + +Exemples : + +```text +type:email source:exiftool +domain:example.org +confidence:<50 +evidence:"capture écran" +``` + +## Ticket #064 — Interface de recherche globale + +Ajouter : + +- barre de recherche ; +- filtres ; +- tri ; +- regroupement ; +- résultats paginés ; +- ouverture de la fiche correspondante. + +## Ticket #065 — Requêtes enregistrées + +Permettre d’enregistrer et de rejouer une recherche. + +## Ticket #066 — Recherche transversale et pivots + +Depuis une valeur, proposer : + +```text +Rechercher partout +Afficher les preuves liées +Afficher les entités liées +Afficher les relations +Lancer un enrichissement OSINT +``` + +--- + +# Phase 7 — Enrichissement OSINT réseau + +## Ticket #067 — Adaptateur DNS + +Fonctions initiales : + +- A ; +- AAAA ; +- MX ; +- NS ; +- TXT ; +- CNAME ; +- SOA ; +- résolution inverse. + +Stocker : + +- requête ; +- serveur utilisé ; +- date ; +- réponse brute ; +- réponses normalisées ; +- erreurs. + +## Ticket #068 — Adaptateur RDAP et WHOIS + +Extraire : + +- registraire ; +- dates ; +- serveurs de noms ; +- statuts ; +- contacts publics ; +- réseau IP ; +- ASN lorsque disponible. + +## Ticket #069 — Adaptateur TLS + +Analyser : + +- certificat ; +- sujet ; +- émetteur ; +- SAN ; +- dates ; +- chaîne ; +- empreintes ; +- protocoles observés. + +## Ticket #070 — Adaptateur HTTP + +Collecter : + +- statut ; +- redirections ; +- en-têtes ; +- titre ; +- type de contenu ; +- serveur déclaré ; +- empreinte de réponse ; +- liens principaux. + +## Ticket #071 — Recherche de sous-domaines + +Agrégation contrôlée de plusieurs sources : + +- DNS ; +- certificats ; +- données passives disponibles ; +- outils externes facultatifs. + +Les sources doivent rester identifiables séparément. + +## Ticket #072 — Archives du Web + +Ajouter un fournisseur permettant de rechercher : + +- captures anciennes ; +- dates disponibles ; +- URL historiques ; +- changements visibles. + +## Ticket #073 — Moteurs de recherche et recherche Web + +Créer une interface fournisseur pouvant utiliser : + +- API officielle ; +- service configuré ; +- ouverture assistée dans le navigateur ; +- import manuel de résultats. + +Labfy ne doit pas contourner les protections des moteurs. + +## Ticket #074 — Réseaux sociaux + +Créer un cadre générique pour : + +- comptes publics ; +- pseudonymes ; +- URL de profils ; +- publications publiques ; +- observations manuelles ; +- fournisseurs autorisés. + +Chaque plateforme pourra avoir : + +- un adaptateur API ; +- un adaptateur CLI ; +- un import manuel ; +- aucune automatisation si les règles l’interdisent. + +## Ticket #075 — Cache, quotas et limitation de débit + +Ajouter : + +- cache ; +- date d’expiration ; +- quotas ; +- pauses ; +- reprises ; +- erreurs temporaires ; +- délais entre requêtes. + +## Ticket #076 — Pivots OSINT + +Depuis une entité, proposer les recherches compatibles : + +```text +Domaine → DNS, RDAP, TLS, HTTP, archives +IP → reverse DNS, RDAP, ASN +Email → domaines, occurrences locales, fournisseurs configurés +Pseudonyme → moteurs, réseaux sociaux, dépôts publics +URL → HTTP, TLS, archives, métadonnées +``` + +## Ticket #077 — Révision des résultats avant intégration + +Une recherche OSINT doit produire une liste de propositions : + +- créer une entité ; +- compléter une entité ; +- créer une observation ; +- créer une relation ; +- ignorer. + +L’enquêteur garde le contrôle. + +--- + +# Phase 8 — Affichage analytique et graphe + +## Ticket #078 — Service de projection graphique + +Transformer les données SQLite en représentation graphique sans faire du graphe la source de vérité. + +Types de nœuds : + +- preuves ; +- entités ; +- événements ; +- résultats OSINT. + +Types d’arêtes : + +- relations validées ; +- relations proposées ; +- liens de provenance. + +## Ticket #079 — Première vue graphique + +Afficher un graphe simple avec : + +- nœuds ; +- liens ; +- libellés ; +- sélection ; +- zoom ; +- déplacement. + +Le premier moteur pourra s’appuyer sur Graphviz ou une bibliothèque compatible GTK. + +## Ticket #080 — Fiche contextuelle du graphe + +Cliquer sur un nœud ou une relation doit afficher : + +- identité ; +- attributs ; +- source ; +- confiance ; +- preuve justificative ; +- actions possibles. + +## Ticket #081 — Filtres du graphe + +Filtrer par : + +- type ; +- date ; +- source ; +- confiance ; +- statut ; +- profondeur ; +- enquêteur ; +- outil. + +## Ticket #082 — Organisation et regroupement + +Permettre : + +- regroupement manuel ; +- regroupement par type ; +- regroupement par domaine ; +- regroupement par période ; +- masquage de branches ; +- expansion d’un voisinage. + +## Ticket #083 — Vues graphiques enregistrées + +Enregistrer : + +- position des nœuds ; +- filtres ; +- regroupements ; +- annotations ; +- titre de la vue. + +## Ticket #084 — Tableaux et statistiques + +Créer des vues tabulaires et graphiques pour : + +- types de preuves ; +- entités ; +- domaines ; +- outils utilisés ; +- volume de résultats ; +- dates ; +- intégrité ; +- relations. + +--- + +# Phase 9 — Chronologie et notes + +## Ticket #085 — Modèle d’événement + +Champs : + +- date et heure ; +- précision ; +- fuseau ; +- description ; +- source ; +- entités ; +- preuves ; +- confiance. + +## Ticket #086 — Vue chronologique + +Afficher : + +- événements ; +- filtres ; +- regroupement ; +- preuves associées ; +- périodes sans date exacte. + +## Ticket #087 — Notes d’enquête + +Permettre : + +- notes globales ; +- notes liées à une preuve ; +- notes liées à une entité ; +- notes liées à une relation ; +- notes liées à un événement. + +## Ticket #088 — Hypothèses et pistes + +Créer un espace distinct pour : + +- hypothèses ; +- questions ouvertes ; +- pistes à vérifier ; +- statut ; +- priorité ; +- éléments favorables ; +- éléments contradictoires. + +--- + +# Phase 10 — Traçabilité et reproductibilité + +## Ticket #089 — Journal d’audit + +Tracer les opérations importantes : + +- création ; +- import ; +- modification ; +- suppression autorisée ; +- recherche OSINT ; +- création de relation ; +- validation ; +- export. + +## Ticket #090 — Rejouer une recherche + +Permettre de relancer une recherche avec : + +- même outil ; +- même version si disponible ; +- mêmes paramètres ; +- comparaison des résultats. + +## Ticket #091 — Manifeste de l’enquête + +Générer un manifeste contenant : + +- fichiers ; +- tailles ; +- empreintes ; +- versions d’outils ; +- base SQLite ; +- résultats bruts ; +- date de génération. + +## Ticket #092 — Contrôle de cohérence + +Détecter : + +- référence orpheline ; +- fichier absent ; +- résultat brut absent ; +- empreinte invalide ; +- relation sans provenance ; +- entité dupliquée. + +--- + +# Phase 11 — Rapports et exports + +## Ticket #093 — Rapport Markdown + +Générer : + +- identité de l’enquête ; +- résumé ; +- méthodologie ; +- preuves ; +- entités ; +- relations ; +- chronologie ; +- résultats OSINT ; +- empreintes ; +- limites. + +## Ticket #094 — Export PDF + +Transformer le rapport en document PDF transmissible. + +## Ticket #095 — Export du graphe + +Exporter une vue : + +- image ; +- SVG ; +- PDF ; +- annexe de rapport. + +## Ticket #096 — Archive autonome + +Créer une archive contenant : + +- rapport ; +- base ; +- manifeste ; +- résultats bruts ; +- preuves sélectionnées ; +- graphe ; +- journal d’audit. + +## Ticket #097 — Rédaction et anonymisation + +Permettre de produire une copie avec : + +- données masquées ; +- preuves exclues ; +- identifiants remplacés ; +- rapport adapté à la diffusion. + +--- + +# Phase 12 — Installation et distribution Ubuntu + +## Ticket #098 — Classification des dépendances + +Classer : + +```text +Obligatoires +Optionnelles +Recommandées +Fournies par une API +Indisponibles dans certains dépôts +``` + +## Ticket #099 — Script de compilation et installation + +Créer un dossier autonome avec : + +- détection de la distribution ; +- vérification des dépendances ; +- tentative d’installation ; +- compilation ; +- installation locale ; +- rapport clair des capacités indisponibles. + +## Ticket #100 — Paquet Debian + +Créer un paquet `.deb` contenant : + +- binaire ; +- icône ; +- fichier `.desktop` ; +- licence ; +- schémas ; +- dépendances obligatoires ; +- recommandations optionnelles. + +## Ticket #101 — Fonctionnement avec dépôts restreints + +Prévoir : + +- dépendances minimales ; +- modules facultatifs ; +- désactivation propre ; +- paquetage séparé si nécessaire ; +- documentation d’installation hors ligne. + +## Ticket #102 — Tests Ubuntu + +Tester : + +- Ubuntu LTS ; +- Wayland ; +- X11 ; +- machine sans outils de développement ; +- environnement hors ligne ; +- dépôts restreints ; +- utilisateur sans droits administrateur. + +--- + +# Jalons du projet + +## Jalon A — Socle professionnel + +Tickets : + +```text +#032 à #041 +``` + +Résultat : + +- contrôleur propre ; +- erreurs GTK ; +- tâches asynchrones ; +- registre d’outils ; +- exécution externe sécurisée ; +- résultats bruts conservés. + +## Jalon B — Gestion fiable des preuves + +Tickets : + +```text +#042 à #054 +``` + +Résultat : + +- import sûr ; +- SHA-256 ; +- intégrité ; +- métadonnées ; +- extraction d’indicateurs. + +## Jalon C — Enquête structurée + +Tickets : + +```text +#055 à #066 +``` + +Résultat : + +- entités ; +- observations ; +- relations ; +- recherche locale ; +- filtres ; +- pivots. + +## Jalon D — Poste de travail OSINT + +Tickets : + +```text +#067 à #077 +``` + +Résultat : + +- DNS ; +- RDAP ; +- TLS ; +- HTTP ; +- archives ; +- moteurs ; +- réseaux sociaux ; +- enrichissements contrôlés. + +## Jalon E — Analyse visuelle + +Tickets : + +```text +#078 à #088 +``` + +Résultat : + +- graphe ; +- tableaux ; +- chronologie ; +- notes ; +- hypothèses. + +## Jalon F — Transmission + +Tickets : + +```text +#089 à #102 +``` + +Résultat : + +- audit ; +- reproductibilité ; +- rapports ; +- exports ; +- installateurs Ubuntu. + +--- + +# MVP recommandé + +Le premier MVP réellement utile est atteint après le ticket **#066**. + +L’utilisateur pourra alors : + +1. créer ou ouvrir une enquête ; +2. importer des preuves ; +3. vérifier leur intégrité ; +4. extraire leurs métadonnées ; +5. créer des entités ; +6. relier les objets ; +7. rechercher dans toute l’enquête ; +8. effectuer des pivots locaux. + +Le second MVP, orienté OSINT réseau, est atteint après le ticket **#077**. + +--- + +# Ordre immédiat + +Ne pas commencer directement par le graphe ou les réseaux sociaux. + +Ordre recommandé : + +```text +#032 — Factoriser le chargement d’une enquête +#033 — Afficher les erreurs dans GTK +#034 — Gestionnaire de tâches asynchrones +#035 — File de tâches et panneau d’activité +#037 — Registre des dépendances +#038 — Interface commune des adaptateurs +#039 — Exécuteur GSubprocess +#040 — Conservation des résultats bruts +#042 — EvidenceRecord +``` + +Le ticket #036 sur la configuration peut être placé juste avant la première API nécessitant une clé. + +--- + +# Synchronisation avec les autres projets + +## C + +Tickets particulièrement adaptés au cours de C : + +- #034 gestion des tâches ; +- #039 exécution de processus ; +- #044 SHA-256 ; +- #045 copie robuste ; +- #053 extraction d’indicateurs ; +- #062 indexation ; +- #078 projection graphique. + +## Unix + +Tickets adaptés au cours système Unix : + +- #039 processus et signaux ; +- #045 fichiers et renommage atomique ; +- #049 intégrité ; +- #075 quotas et temporisation ; +- #089 journalisation ; +- #099 installation ; +- #100 paquet Debian. + +## OSINT + +Chaque nouveau fournisseur devra être précédé d’un apprentissage manuel : + +```text +Comprendre la technique +→ réaliser un exercice +→ documenter les limites +→ seulement ensuite intégrer l’outil +``` + +Labfy doit assister l’enquêteur, pas remplacer sa compréhension. + diff --git a/docs/tickets/closed/TICKET-31.1.md b/docs/tickets/closed/TICKET-031.1.md similarity index 100% rename from docs/tickets/closed/TICKET-31.1.md rename to docs/tickets/closed/TICKET-031.1.md diff --git a/docs/tickets/closed/TICKET-032.md b/docs/tickets/closed/TICKET-032.md new file mode 100644 index 0000000..b11f79f --- /dev/null +++ b/docs/tickets/closed/TICKET-032.md @@ -0,0 +1,537 @@ +# Ticket #032 — Factoriser le chargement et l’installation d’une enquête + +## Contexte + +Après le ticket #031.1, l’application sait : + +- créer une enquête ; +- ouvrir une enquête existante ; +- remplacer la session active ; +- fermer proprement l’application. + +Cependant, les flux « Nouvelle enquête » et « Ouvrir une enquête » dupliquent encore une partie importante de la logique : + +```text +investigation_session_open() +→ récupération du projet +→ récupération du chemin racine +→ investigation_tree_builder_build() +→ application_install_session() +→ nettoyage en cas d’échec +``` + +Cette duplication augmentera avec les futures fonctions : + +- enquêtes récentes ; +- ouverture depuis la ligne de commande ; +- restauration de session ; +- ouverture depuis un rapport ou une archive. + +## Objectif + +Créer dans `src/core/application.c` une fonction interne unique qui ouvre et installe une enquête à partir de son dossier racine. + +Contrat attendu : + +```c +static gboolean application_open_and_install_investigation( + Application *application, + const char *root_path, + GError **error +); +``` + +Cette fonction doit garantir : + +```text +succès : + Application devient propriétaire de la nouvelle session + Application devient propriétaire du nouvel arbre + ancienne session libérée + ancien arbre libéré + fenêtre mise à jour + +échec : + ancienne session conservée + ancien arbre conservé + nouvelle session libérée + nouvel arbre libéré + erreur transmise à l’appelant +``` + +--- + +# Travail à réaliser + +## 1. Ajouter un domaine d’erreur privé + +Dans `src/core/application.c`, ajouter un domaine d’erreur uniquement utilisé par le contrôleur. + +Exemple : + +```c +typedef enum +{ + APPLICATION_OPEN_ERROR_INVALID_ARGUMENT, + APPLICATION_OPEN_ERROR_INVALID_PROJECT, + APPLICATION_OPEN_ERROR_TREE_BUILD, + APPLICATION_OPEN_ERROR_INSTALL +} ApplicationOpenError; +``` + +Ajouter : + +```c +#define APPLICATION_OPEN_ERROR \ + application_open_error_quark() +``` + +Puis : + +```c +static GQuark application_open_error_quark(void) +{ + return g_quark_from_static_string( + "labfy-investigation-application-open-error" + ); +} +``` + +Le domaine reste privé à `application.c`. + +--- + +## 2. Créer la fonction factorisée + +Ajouter : + +```c +static gboolean application_open_and_install_investigation( + Application *application, + const char *root_path, + GError **error +); +``` + +La fonction doit : + +1. valider `application` ; +2. valider `application->main_window` ; +3. valider `root_path` ; +4. ouvrir une nouvelle `InvestigationSession` ; +5. récupérer son `InvestigationProject` ; +6. récupérer le chemin racine canonique ; +7. construire un nouvel `InvestigationTreeModel` ; +8. appeler `application_install_session()` ; +9. transférer la propriété uniquement en cas de succès. + +### Règle de propriété + +Avant `application_install_session()` : + +```text +la fonction possède new_session +la fonction possède new_tree_model +``` + +Après succès : + +```text +Application possède new_session +Application possède new_tree_model +``` + +Après échec : + +```text +la fonction doit libérer les objets qu’elle possède encore +``` + +### Validation de `GError` + +La fonction doit respecter la convention GLib : + +```c +g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE +); +``` + +L’utilisation de `g_return_val_if_fail()` est acceptable ici pour vérifier le contrat du développeur. + +Les erreurs utilisateur doivent être produites avec : + +```c +g_set_error() +g_set_error_literal() +g_propagate_prefixed_error() +``` + +--- + +## 3. Propager l’erreur de `InvestigationSession` + +Si : + +```c +investigation_session_open() +``` + +échoue, la fonction doit conserver l’erreur métier d’origine et lui ajouter du contexte. + +Exemple conceptuel : + +```text +Impossible d’ouvrir l’enquête : la base SQLite est absente +``` + +Ne pas remplacer l’erreur précise par un simple : + +```text +Erreur inconnue +``` + +lorsqu’un `GError` est disponible. + +--- + +## 4. Refactoriser l’ouverture d’une enquête existante + +`application_on_folder_selected()` ne doit plus contenir directement : + +```c +investigation_session_open() +investigation_tree_builder_build() +application_install_session() +``` + +Elle doit seulement : + +1. accepter l’annulation ; +2. appeler `application_open_and_install_investigation()` ; +3. journaliser l’erreur ; +4. libérer le `GError`. + +Structure attendue : + +```c +static void application_on_folder_selected( + const char *folder_path, + gpointer user_data +) +{ + Application *application = user_data; + GError *error = NULL; + + if (application == NULL || + folder_path == NULL) + { + return; + } + + if (!application_open_and_install_investigation( + application, + folder_path, + &error + )) + { + g_warning( + "Impossible d'ouvrir l'enquête '%s' : %s", + folder_path, + error != NULL + ? error->message + : "erreur inconnue" + ); + + g_clear_error(&error); + } +} +``` + +L’annulation ne doit pas produire de warning. + +--- + +## 5. Refactoriser la création d’une enquête + +`application_on_create_investigation()` doit conserver uniquement : + +1. la création physique du projet ; +2. l’appel à la fonction factorisée ; +3. le message spécifique indiquant que le projet existe sur le disque si son ouverture échoue. + +Le flux devient : + +```text +investigation_project_create() +→ application_open_and_install_investigation() +``` + +La fonction ne doit plus reconstruire elle-même : + +```text +session +projet +chemin canonique +arbre +installation +``` + +En cas d’échec après création, le dossier créé reste volontairement sur le disque. + +Le message doit être explicite : + +```text +L’enquête a été créée dans « ... », mais son ouverture a échoué : ... +``` + +--- + +## 6. Ne pas modifier `application_install_session()` + +Cette fonction conserve sa responsabilité actuelle : + +- valider les objets prêts à installer ; +- libérer l’ancien état ; +- transférer la propriété ; +- mettre à jour `MainWindow`. + +Le nouveau helper prépare les objets. + +`application_install_session()` réalise le remplacement final. + +--- + +# Pseudo-code de la fonction factorisée + +```c +static gboolean application_open_and_install_investigation( + Application *application, + const char *root_path, + GError **error +) +{ + InvestigationSession *new_session = NULL; + InvestigationTreeModel *new_tree_model = NULL; + const InvestigationProject *project = NULL; + const char *canonical_root_path = NULL; + GError *session_error = NULL; + + valider les arguments; + + new_session = investigation_session_open( + root_path, + &session_error + ); + + si échec : + propager session_error avec contexte; + return FALSE; + + project = investigation_session_get_project( + new_session + ); + + valider project; + + canonical_root_path = + investigation_project_get_root_path(project); + + valider canonical_root_path; + + new_tree_model = + investigation_tree_builder_build( + canonical_root_path + ); + + si échec : + produire GError; + fermer new_session; + return FALSE; + + si application_install_session() échoue : + produire GError; + libérer new_tree_model; + fermer new_session; + return FALSE; + + return TRUE; +} +``` + +--- + +# Tests manuels + +## Création valide + +1. lancer l’application ; +2. créer une enquête ; +3. vérifier le titre ; +4. vérifier la barre d’état ; +5. vérifier l’arborescence. + +## Ouverture valide + +1. fermer et relancer ; +2. ouvrir l’enquête créée ; +3. vérifier le même résultat. + +## Remplacement valide + +1. ouvrir une enquête A ; +2. ouvrir une enquête B ; +3. vérifier que B remplace A. + +## Échec d’ouverture + +1. ouvrir une enquête valide A ; +2. tenter d’ouvrir un dossier invalide ; +3. vérifier que A reste active ; +4. vérifier que l’erreur est journalisée. + +## Échec après création + +Provoquer si possible un échec d’ouverture après création. + +Vérifier : + +- le dossier créé reste présent ; +- l’ancienne session reste active ; +- aucun double `free` ; +- aucun crash. + +## Annulation + +Annuler le sélecteur de dossier. + +Vérifier : + +- aucun warning ; +- aucun changement d’état ; +- aucun crash. + +--- + +# Critères d’acceptation + +- [ ] Une seule fonction ouvre une session et construit son arbre. +- [ ] La création utilise cette fonction. +- [ ] L’ouverture utilise cette fonction. +- [ ] `application_install_session()` n’est pas dupliquée. +- [ ] L’ancienne session reste active en cas d’échec. +- [ ] L’ancien arbre reste actif en cas d’échec. +- [ ] Les nouveaux objets sont libérés en cas d’échec. +- [ ] Les erreurs de `InvestigationSession` sont propagées. +- [ ] L’annulation ne produit pas d’erreur. +- [ ] Aucun code SQLite direct n’est ajouté. +- [ ] Aucun comportement GTK visible n’est cassé. +- [ ] `make` réussit. +- [ ] `make test` réussit. +- [ ] `git diff --check` ne retourne aucune erreur. + +--- + +# Audit attendu + +La logique d’ouverture ne doit apparaître qu’une seule fois : + +```bash +rg -n \ + 'investigation_session_open|investigation_tree_builder_build' \ + src/core/application.c +``` + +Résultat attendu : + +```text +une occurrence de investigation_session_open +une occurrence de investigation_tree_builder_build +``` + +La création et l’ouverture doivent appeler le helper : + +```bash +rg -n \ + 'application_open_and_install_investigation' \ + src/core/application.c +``` + +Vérifier l’absence de SQLite direct : + +```bash +rg -n \ + 'sqlite3_|#include ' \ + src/core/application.c +``` + +Résultat attendu : + +```text +aucune sortie +``` + +Vérifier le format : + +```bash +git diff --check +``` + +--- + +# Fichiers concernés + +```text +src/core/application.c +``` + +Aucune modification publique n’est normalement nécessaire dans : + +```text +include/core/application.h +``` + +--- + +# Commit attendu + +```bash +make clean +make +make test +git diff --check +git status --short +``` + +```bash +git add src/core/application.c +``` + +```bash +git diff --cached --stat +git diff --cached +``` + +```bash +git commit -m "refactor(core): centralize investigation loading" +git push +``` + +--- + +# Résultat attendu + +Après ce ticket, tous les futurs points d’entrée utiliseront le même flux : + +```text +Création +Ouverture manuelle +Enquêtes récentes +Ligne de commande +Restauration de session + ↓ +application_open_and_install_investigation() +``` + +Le ticket #033 pourra ensuite afficher graphiquement les `GError` déjà correctement produits par ce flux. diff --git a/docs/tickets/closed/TICKET-033.md b/docs/tickets/closed/TICKET-033.md new file mode 100644 index 0000000..bec51ae --- /dev/null +++ b/docs/tickets/closed/TICKET-033.md @@ -0,0 +1,694 @@ +# Ticket #033 — Afficher les erreurs dans l’interface GTK + +## Contexte + +Le ticket #032 a centralisé le chargement d’une enquête dans : + +```c +application_open_and_install_investigation() +``` + +Cette fonction produit maintenant des `GError` précis et conserve l’ancienne session en cas d’échec. + +Actuellement, les erreurs sont seulement écrites dans le terminal avec : + +```c +g_warning() +``` + +Un utilisateur qui lance Labfy Investigation depuis son menu d’applications ne verra pas ces messages. + +## Objectif + +Créer un module GTK réutilisable capable d’afficher un message d’erreur compréhensible dans une fenêtre modale. + +Le contrôleur doit conserver deux niveaux d’information : + +```text +Terminal : + message technique complet avec g_warning() + +Interface GTK : + titre clair + message compréhensible +``` + +Le module doit rester générique afin de pouvoir afficher plus tard : + +- erreurs ; +- avertissements ; +- informations. + +--- + +# Architecture attendue + +Créer : + +```text +include/views/application_message_dialog.h +src/views/application_message_dialog.c +``` + +Responsabilités : + +```text +Application + ├── décide quand afficher une erreur + ├── fournit le titre + └── fournit le message + +ApplicationMessageDialog + ├── construit la fenêtre GTK + ├── affiche le contenu + └── gère sa fermeture +``` + +Le module de dialogue ne doit connaître ni : + +- `Application` ; +- `InvestigationSession` ; +- SQLite ; +- les règles métier de l’enquête. + +--- + +# Travail à réaliser + +## 1. Créer l’en-tête public + +Créer : + +```text +include/views/application_message_dialog.h +``` + +Contenu attendu : + +```c +/****************************************************************************** + * @file application_message_dialog.h + * @brief Fenêtre modale affichant un message à l'utilisateur. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_APPLICATION_MESSAGE_DIALOG_H +#define LABFY_INVESTIGATION_APPLICATION_MESSAGE_DIALOG_H + +#include + +/** + * @brief Nature du message affiché. + */ +typedef enum +{ + APPLICATION_MESSAGE_DIALOG_ERROR, + APPLICATION_MESSAGE_DIALOG_WARNING, + APPLICATION_MESSAGE_DIALOG_INFORMATION +} ApplicationMessageDialogType; + +/** + * @brief Affiche une fenêtre modale contenant un message. + * + * Les chaînes sont copiées par les widgets GTK. + * + * @param parent_window Fenêtre parente, ou NULL. + * @param message_type Type de message. + * @param title Titre de la fenêtre. + * @param message Message principal. + */ +void application_message_dialog_present( + GtkWindow *parent_window, + ApplicationMessageDialogType message_type, + const char *title, + const char *message +); + +#endif +``` + +--- + +## 2. Créer l’implémentation GTK + +Créer : + +```text +src/views/application_message_dialog.c +``` + +Le dialogue doit être construit avec des widgets GTK4 simples afin de rester indépendant d’une API de dialogue plus récente. + +Structure visuelle recommandée : + +```text +┌─────────────────────────────────────────────┐ +│ Titre │ +│ │ +│ Message pouvant occuper plusieurs lignes │ +│ │ +│ [ Fermer ] │ +└─────────────────────────────────────────────┘ +``` + +Le module doit utiliser au minimum : + +- `GtkWindow` ; +- `GtkBox` ; +- `GtkLabel` ; +- `GtkButton`. + +Propriétés recommandées : + +```c +gtk_window_set_modal(dialog_window, TRUE); +gtk_window_set_destroy_with_parent(dialog_window, TRUE); +gtk_window_set_resizable(dialog_window, FALSE); +``` + +Si `parent_window` n’est pas `NULL` : + +```c +gtk_window_set_transient_for( + dialog_window, + parent_window +); +``` + +Le message doit : + +- revenir automatiquement à la ligne ; +- être aligné à gauche ; +- être sélectionnable pour permettre sa copie ; +- avoir une largeur raisonnable. + +Exemple : + +```c +gtk_label_set_wrap( + GTK_LABEL(message_label), + TRUE +); + +gtk_label_set_selectable( + GTK_LABEL(message_label), + TRUE +); + +gtk_label_set_xalign( + GTK_LABEL(message_label), + 0.0F +); + +gtk_label_set_max_width_chars( + GTK_LABEL(message_label), + 70 +); +``` + +--- + +## 3. Gérer les arguments invalides + +La fonction doit accepter : + +```text +parent_window == NULL +title == NULL +title vide +message == NULL +message vide +``` + +Valeurs de remplacement recommandées : + +```text +Titre : + Erreur + Avertissement + Information + +Message : + Aucun détail supplémentaire n'est disponible. +``` + +Le titre par défaut dépend de `message_type`. + +Une valeur inconnue de `message_type` doit être traitée comme une information ou un avertissement, sans crash. + +--- + +## 4. Ajouter un callback privé de fermeture + +Dans l’implémentation, ajouter : + +```c +static void application_message_dialog_on_close_clicked( + GtkButton *button, + gpointer user_data +); +``` + +Ce callback doit : + +1. ignorer proprement `button` ; +2. vérifier le pointeur de fenêtre ; +3. appeler `gtk_window_destroy()`. + +Exemple : + +```c +static void application_message_dialog_on_close_clicked( + GtkButton *button, + gpointer user_data +) +{ + GtkWindow *dialog_window = user_data; + + (void) button; + + if (dialog_window == NULL) + { + return; + } + + gtk_window_destroy( + dialog_window + ); +} +``` + +Aucune structure allouée manuellement ne doit être nécessaire pour ce premier dialogue. + +--- + +## 5. Différencier visuellement les types + +Le dialogue doit au minimum afficher un libellé distinct : + +```text +Erreur +Avertissement +Information +``` + +Une différenciation légère peut être ajoutée avec des classes CSS GTK existantes sur le titre ou le bouton. + +La couleur ne doit jamais être le seul moyen de distinguer le type. + +Aucune feuille CSS spécifique n’est nécessaire dans ce ticket. + +--- + +## 6. Ajouter la source au Makefile + +Ajouter : + +```text +src/views/application_message_dialog.c +``` + +à la liste des sources de l’application. + +Le module doit être compilé avec les mêmes options strictes : + +```text +-std=c17 +-Wall +-Wextra +-Wpedantic +-Werror +``` + +--- + +# Intégration dans `Application` + +## 7. Ajouter l’en-tête + +Dans : + +```text +src/core/application.c +``` + +ajouter : + +```c +#include "views/application_message_dialog.h" +``` + +--- + +## 8. Créer un helper privé dans `application.c` + +Ajouter : + +```c +static void application_present_error( + Application *application, + const char *title, + const char *message +); +``` + +Implémentation attendue : + +```c +static void application_present_error( + Application *application, + const char *title, + const char *message +) +{ + GtkWindow *parent_window = NULL; + + if (application != NULL && + application->main_window != NULL) + { + parent_window = main_window_get_window( + application->main_window + ); + } + + application_message_dialog_present( + parent_window, + APPLICATION_MESSAGE_DIALOG_ERROR, + title, + message + ); +} +``` + +Ce helper centralise le choix du parent GTK. + +--- + +## 9. Afficher les erreurs d’ouverture + +Dans : + +```c +application_on_folder_selected() +``` + +conserver le `g_warning()` existant. + +Ajouter ensuite : + +```c +application_present_error( + application, + "Ouverture impossible", + error != NULL + ? error->message + : "L'enquête sélectionnée n'a pas pu être ouverte." +); +``` + +L’erreur doit être affichée avant : + +```c +g_clear_error(&error); +``` + +L’annulation du sélecteur ne doit toujours afficher aucun message. + +--- + +## 10. Afficher les erreurs de création + +Dans : + +```c +application_on_create_investigation() +``` + +traiter les deux échecs. + +### Échec de création physique + +Conserver le `g_warning()` puis afficher : + +```text +Titre : + Création impossible + +Message : + L'enquête n'a pas pu être créée dans le dossier sélectionné. +``` + +Le message peut contenir : + +- le nom de l’enquête ; +- le dossier parent. + +### Projet créé mais impossible à ouvrir + +Conserver le `g_warning()` puis afficher un message indiquant clairement : + +```text +L'enquête a été créée sur le disque, mais Labfy n'a pas pu l'ouvrir. +``` + +Ajouter ensuite le détail du `GError`. + +Le message doit éviter de laisser croire que le dossier créé a été supprimé. + +Une chaîne dynamique peut être construite avec : + +```c +g_strdup_printf() +``` + +Elle doit être libérée après l’appel au dialogue. + +--- + +# Exemple d’intégration + +```c +char *user_message = NULL; + +user_message = g_strdup_printf( + "L'enquête a été créée dans :\n%s\n\n" + "Elle n'a cependant pas pu être ouverte :\n%s", + created_root_path, + error != NULL + ? error->message + : "erreur inconnue" +); + +application_present_error( + application, + "Enquête créée mais non ouverte", + user_message +); + +g_free( + user_message +); +``` + +--- + +# Gestion de plusieurs erreurs + +Ce ticket ne crée pas encore de file de notifications. + +Si plusieurs erreurs surviennent successivement, plusieurs fenêtres peuvent être affichées. + +La gestion centralisée des tâches et notifications arrivera avec les tickets #034 et #035. + +--- + +# Tests manuels + +## Dossier invalide + +1. lancer l’application ; +2. ouvrir une enquête valide A ; +3. cliquer sur `Ouvrir une enquête` ; +4. sélectionner un dossier qui n’est pas une enquête. + +Vérifier : + +- une fenêtre d’erreur apparaît ; +- le message explique l’échec ; +- A reste active ; +- le terminal contient encore le `g_warning()` ; +- aucun crash. + +## Annulation + +1. ouvrir le sélecteur ; +2. annuler. + +Vérifier : + +- aucun dialogue ; +- aucun warning ; +- aucun changement de session. + +## Création dans un emplacement invalide + +Provoquer si possible un échec de création : + +- dossier non accessible en écriture ; +- nom déjà utilisé ; +- emplacement invalide. + +Vérifier : + +- dialogue visible ; +- message compréhensible ; +- aucune session remplacée. + +## Projet créé mais ouverture échouée + +Provoquer si possible un échec après la création. + +Vérifier que le dialogue précise : + +- que le dossier existe ; +- où il se trouve ; +- que seule l’ouverture a échoué. + +## Fermeture du dialogue + +Tester : + +- bouton `Fermer` ; +- bouton de fermeture de la fenêtre ; +- fermeture de la fenêtre principale. + +Aucun segfault ne doit apparaître. + +## Répétition + +Produire plusieurs erreurs successives. + +Vérifier qu’une nouvelle erreur reste affichable après fermeture de la précédente. + +--- + +# Critères d’acceptation + +- [ ] Le module `application_message_dialog` existe. +- [ ] Le module ne dépend pas du cœur métier. +- [ ] Le dialogue est modal. +- [ ] Le dialogue possède une fenêtre parente lorsqu’elle existe. +- [ ] Le message revient à la ligne. +- [ ] Le message est sélectionnable. +- [ ] Les arguments `NULL` sont acceptés. +- [ ] Un bouton `Fermer` fonctionne. +- [ ] Les erreurs d’ouverture sont visibles dans GTK. +- [ ] Les erreurs de création sont visibles dans GTK. +- [ ] Les `g_warning()` techniques sont conservés. +- [ ] L’annulation ne produit aucun dialogue. +- [ ] L’ancienne session est conservée en cas d’échec. +- [ ] Aucun appel SQLite direct n’est ajouté. +- [ ] Aucun `exit()` direct n’est ajouté. +- [ ] `make` réussit. +- [ ] `make test` réussit. +- [ ] `git diff --check` ne retourne aucune erreur. + +--- + +# Audit attendu + +Vérifier l’utilisation du module : + +```bash +rg -n \ + 'application_message_dialog|application_present_error' \ + include/views/application_message_dialog.h \ + src/views/application_message_dialog.c \ + src/core/application.c \ + Makefile +``` + +Vérifier que les erreurs restent journalisées : + +```bash +rg -n \ + 'g_warning' \ + src/core/application.c +``` + +Vérifier l’absence de logique métier dans le dialogue : + +```bash +rg -n \ + 'Investigation|Database|sqlite3_' \ + include/views/application_message_dialog.h \ + src/views/application_message_dialog.c +``` + +Résultat attendu : + +```text +aucune sortie +``` + +Vérifier l’absence de sortie forcée : + +```bash +rg -n \ + '\bexit\s*\(' \ + src/core/application.c \ + src/views/application_message_dialog.c +``` + +Résultat attendu : + +```text +aucune sortie +``` + +--- + +# Fichiers concernés + +```text +include/views/application_message_dialog.h +src/views/application_message_dialog.c +src/core/application.c +Makefile +``` + +--- + +# Commit attendu + +```bash +make clean +make +make test +git diff --check +git status --short +``` + +```bash +git add \ + include/views/application_message_dialog.h \ + src/views/application_message_dialog.c \ + src/core/application.c \ + Makefile +``` + +```bash +git diff --cached --stat +git diff --cached +``` + +```bash +git commit -m "feat(ui): display application errors in GTK" +git push +``` + +--- + +# Résultat attendu + +Après ce ticket, l’utilisateur ne dépendra plus du terminal pour comprendre pourquoi une enquête n’a pas pu être créée ou ouverte. + +Le ticket #034 pourra ensuite introduire le gestionnaire de tâches asynchrones sans mélanger la présentation des erreurs avec l’exécution des traitements longs. diff --git a/include/views/application_message_dialog.h b/include/views/application_message_dialog.h new file mode 100644 index 0000000..a8be14a --- /dev/null +++ b/include/views/application_message_dialog.h @@ -0,0 +1,38 @@ +/****************************************************************************** + * @file application_message_dialog.h + * @brief Fenêtre modale affichant un message à l'utilisateur. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_APPLICATION_MESSAGE_DIALOG_H +#define LABFY_INVESTIGATION_APPLICATION_MESSAGE_DIALOG_H + +#include + +/** + * @brief Nature du message affiché. + */ +typedef enum +{ + APPLICATION_MESSAGE_DIALOG_ERROR, + APPLICATION_MESSAGE_DIALOG_WARNING, + APPLICATION_MESSAGE_DIALOG_INFORMATION +} ApplicationMessageDialogType; + +/** + * @brief Affiche une fenêtre modale contenant un message. + * + * Les chaînes sont copiées par les widgets GTK. + * + * @param parent_window Fenêtre parente, ou NULL. + * @param message_type Type de message. + * @param title Titre de la fenêtre, ou NULL. + * @param message Message principal, ou NULL. + */ +void application_message_dialog_present( + GtkWindow *parent_window, + ApplicationMessageDialogType message_type, + const char *title, + const char *message +); + +#endif diff --git a/labfy-investigation b/labfy-investigation index 0825d5bfa4158caf7631df5feecad91a185dd672..e6abeda7a939cfa75e8e314c51450d64e824793b 100755 GIT binary patch delta 60175 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 diff --git a/src/core/application.c b/src/core/application.c index d441454..e7bc5df 100644 --- a/src/core/application.c +++ b/src/core/application.c @@ -14,6 +14,7 @@ #include "views/create_investigation_dialog.h" #include "views/folder_dialog.h" #include "views/main_window.h" +#include "views/application_message_dialog.h" #include @@ -65,6 +66,37 @@ struct Application InvestigationTreeModel *tree_model; }; +/** + * @brief Affiche une erreur dans une fenêtre GTK. + * + * @param application Application propriétaire de la fenêtre principale. + * @param title Titre compréhensible par l'utilisateur. + * @param message Description de l'erreur. + */ +static void application_present_error( + Application *application, + const char *title, + const char *message +) +{ + GtkWindow *parent_window = NULL; + + if (application != NULL && + application->main_window != NULL) + { + parent_window = main_window_get_window( + application->main_window + ); + } + + application_message_dialog_present( + parent_window, + APPLICATION_MESSAGE_DIALOG_ERROR, + title, + message + ); +} + /** * @brief Installe une nouvelle session et son arbre dans l'application. * @@ -390,6 +422,14 @@ static void application_on_folder_selected( : "erreur inconnue" ); + application_present_error( + application, + "Ouverture impossible", + error != NULL + ? error->message + : "L'enquête sélectionnée n'a pas pu être ouverte." + ); + g_clear_error( &error ); @@ -412,6 +452,8 @@ static void application_on_create_investigation( Application *application = user_data; char *created_root_path = NULL; + char *user_message = NULL; + GError *error = NULL; if (application == NULL) @@ -441,6 +483,25 @@ static void application_on_create_investigation( parent_directory ); + user_message = g_strdup_printf( + "L'enquête « %s » n'a pas pu être créée dans :\n" + "%s\n\n" + "Vérifiez que le dossier existe et que vous disposez " + "des droits d'écriture nécessaires.", + investigation_name, + parent_directory + ); + + application_present_error( + application, + "Création impossible", + user_message + ); + + g_free( + user_message + ); + return; } @@ -459,11 +520,31 @@ static void application_on_create_investigation( : "erreur inconnue" ); + user_message = g_strdup_printf( + "L'enquête a bien été créée sur le disque dans :\n" + "%s\n\n" + "Labfy Investigation n'a cependant pas pu l'ouvrir :\n" + "%s", + created_root_path, + error != NULL + ? error->message + : "Aucun détail supplémentaire n'est disponible." + ); + + application_present_error( + application, + "Enquête créée mais non ouverte", + user_message + ); + + g_free( + user_message + ); + g_clear_error( &error ); } - g_free( created_root_path ); diff --git a/src/views/application_message_dialog.c b/src/views/application_message_dialog.c new file mode 100644 index 0000000..1a1f0b2 --- /dev/null +++ b/src/views/application_message_dialog.c @@ -0,0 +1,337 @@ +/****************************************************************************** + * @file application_message_dialog.c + * @brief Implémentation de la fenêtre modale de message. + ******************************************************************************/ + +#include "views/application_message_dialog.h" + +/** + * @brief Largeur minimale du dialogue. + */ +#define APPLICATION_MESSAGE_DIALOG_DEFAULT_WIDTH 480 + +/** + * @brief Message utilisé lorsqu'aucun détail n'est disponible. + */ +#define APPLICATION_MESSAGE_DIALOG_DEFAULT_MESSAGE \ + "Aucun détail supplémentaire n'est disponible." + +/** + * @brief Retourne le libellé correspondant au type de message. + * + * @param message_type Type du message. + * + * @return Libellé statique du type. + */ +static const char *application_message_dialog_get_type_label( + ApplicationMessageDialogType message_type +) +{ + switch (message_type) + { + case APPLICATION_MESSAGE_DIALOG_ERROR: + return "Erreur"; + + case APPLICATION_MESSAGE_DIALOG_WARNING: + return "Avertissement"; + + case APPLICATION_MESSAGE_DIALOG_INFORMATION: + return "Information"; + + default: + return "Information"; + } +} + +/** + * @brief Retourne le titre à utiliser pour le dialogue. + * + * @param message_type Type du message. + * @param title Titre fourni par l'appelant. + * + * @return Titre fourni ou titre par défaut. + */ +static const char *application_message_dialog_get_safe_title( + ApplicationMessageDialogType message_type, + const char *title +) +{ + if (title != NULL && + title[0] != '\0') + { + return title; + } + + return application_message_dialog_get_type_label( + message_type + ); +} + +/** + * @brief Retourne un message toujours valide. + * + * @param message Message fourni par l'appelant. + * + * @return Message fourni ou message par défaut. + */ +static const char *application_message_dialog_get_safe_message( + const char *message +) +{ + if (message != NULL && + message[0] != '\0') + { + return message; + } + + return APPLICATION_MESSAGE_DIALOG_DEFAULT_MESSAGE; +} + +/** + * @brief Ferme le dialogue lorsque l'utilisateur clique sur le bouton. + * + * @param button Bouton ayant reçu le clic. + * @param user_data Pointeur vers la fenêtre du dialogue. + */ +static void application_message_dialog_on_close_clicked( + GtkButton *button, + gpointer user_data +) +{ + GtkWindow *dialog_window = user_data; + + (void) button; + + if (dialog_window == NULL) + { + return; + } + + gtk_window_destroy( + dialog_window + ); +} + +void application_message_dialog_present( + GtkWindow *parent_window, + ApplicationMessageDialogType message_type, + const char *title, + const char *message +) +{ + GtkWindow *dialog_window = NULL; + + GtkWidget *main_box = NULL; + GtkWidget *type_label = NULL; + GtkWidget *title_label = NULL; + GtkWidget *message_label = NULL; + GtkWidget *button_box = NULL; + GtkWidget *close_button = NULL; + + const char *safe_title = NULL; + const char *safe_message = NULL; + const char *type_text = NULL; + + safe_title = + application_message_dialog_get_safe_title( + message_type, + title + ); + + safe_message = + application_message_dialog_get_safe_message( + message + ); + + type_text = + application_message_dialog_get_type_label( + message_type + ); + + dialog_window = GTK_WINDOW( + gtk_window_new() + ); + + gtk_window_set_title( + dialog_window, + safe_title + ); + + gtk_window_set_default_size( + dialog_window, + APPLICATION_MESSAGE_DIALOG_DEFAULT_WIDTH, + -1 + ); + + gtk_window_set_modal( + dialog_window, + TRUE + ); + + gtk_window_set_destroy_with_parent( + dialog_window, + TRUE + ); + + gtk_window_set_resizable( + dialog_window, + FALSE + ); + + if (parent_window != NULL) + { + gtk_window_set_transient_for( + dialog_window, + parent_window + ); + } + + main_box = gtk_box_new( + GTK_ORIENTATION_VERTICAL, + 12 + ); + + gtk_widget_set_margin_start( + main_box, + 20 + ); + + gtk_widget_set_margin_end( + main_box, + 20 + ); + + gtk_widget_set_margin_top( + main_box, + 20 + ); + + gtk_widget_set_margin_bottom( + main_box, + 20 + ); + + type_label = gtk_label_new( + type_text + ); + + gtk_widget_set_halign( + type_label, + GTK_ALIGN_START + ); + + gtk_label_set_xalign( + GTK_LABEL(type_label), + 0.0F + ); + + title_label = gtk_label_new( + safe_title + ); + + gtk_widget_set_halign( + title_label, + GTK_ALIGN_START + ); + + gtk_label_set_xalign( + GTK_LABEL(title_label), + 0.0F + ); + + gtk_label_set_wrap( + GTK_LABEL(title_label), + TRUE + ); + + message_label = gtk_label_new( + safe_message + ); + + gtk_widget_set_halign( + message_label, + GTK_ALIGN_FILL + ); + + gtk_label_set_xalign( + GTK_LABEL(message_label), + 0.0F + ); + + gtk_label_set_wrap( + GTK_LABEL(message_label), + TRUE + ); + + gtk_label_set_wrap_mode( + GTK_LABEL(message_label), + PANGO_WRAP_WORD_CHAR + ); + + gtk_label_set_selectable( + GTK_LABEL(message_label), + TRUE + ); + + gtk_label_set_max_width_chars( + GTK_LABEL(message_label), + 70 + ); + + button_box = gtk_box_new( + GTK_ORIENTATION_HORIZONTAL, + 0 + ); + + gtk_widget_set_halign( + button_box, + GTK_ALIGN_END + ); + + close_button = gtk_button_new_with_label( + "Fermer" + ); + + g_signal_connect( + close_button, + "clicked", + G_CALLBACK( + application_message_dialog_on_close_clicked + ), + dialog_window + ); + + gtk_box_append( + GTK_BOX(button_box), + close_button + ); + + gtk_box_append( + GTK_BOX(main_box), + type_label + ); + + gtk_box_append( + GTK_BOX(main_box), + title_label + ); + + gtk_box_append( + GTK_BOX(main_box), + message_label + ); + + gtk_box_append( + GTK_BOX(main_box), + button_box + ); + + gtk_window_set_child( + dialog_window, + main_box + ); + + gtk_window_present( + dialog_window + ); +} diff --git a/tests/test_database b/tests/test_database new file mode 100755 index 0000000000000000000000000000000000000000..2a1ae2522c4f231ed1559cc6b60d12d90f28ed9f GIT binary patch literal 41112 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 literal 0 HcmV?d00001 diff --git a/tests/test_error b/tests/test_error new file mode 100755 index 0000000000000000000000000000000000000000..1185635c8f2fac9033677f79bb831ba8d661b8b9 GIT binary patch literal 32688 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 M9A~8oq!q3I2K-LdAOHXW literal 0 HcmV?d00001 diff --git a/tests/test_investigation_dao b/tests/test_investigation_dao new file mode 100755 index 0000000000000000000000000000000000000000..0234ddd470732e3c1dd7ba53ba45d9ccfe826f54 GIT binary patch literal 42288 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 literal 0 HcmV?d00001 diff --git a/tests/test_investigation_node b/tests/test_investigation_node new file mode 100755 index 0000000000000000000000000000000000000000..b7614efa3254dd41638e0c2b0d87f582c089bf9e GIT binary patch literal 25824 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 literal 0 HcmV?d00001 diff --git a/tests/test_investigation_project b/tests/test_investigation_project new file mode 100755 index 0000000000000000000000000000000000000000..3bd6369a2f5df830c034c78550518290ce4c20a8 GIT binary patch literal 51616 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 literal 0 HcmV?d00001 diff --git a/tests/test_investigation_record b/tests/test_investigation_record new file mode 100755 index 0000000000000000000000000000000000000000..ba2880ba891764294db9386029afaf85e4bc251a GIT binary patch literal 17392 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 literal 0 HcmV?d00001 diff --git a/tests/test_investigation_tree_builder b/tests/test_investigation_tree_builder new file mode 100755 index 0000000000000000000000000000000000000000..d6cd4844176447be928bb7a3bda21977ee4298de GIT binary patch literal 22848 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 G(fU7t_!_DJ literal 0 HcmV?d00001