257 lines
5.3 KiB
Markdown
257 lines
5.3 KiB
Markdown
# Ticket #020
|
|
|
|
## Titre
|
|
|
|
Créer une nouvelle enquête.
|
|
|
|
---
|
|
|
|
## Objectif
|
|
|
|
Ajouter la capacité de créer automatiquement une nouvelle enquête dans un dossier choisi par l'utilisateur.
|
|
|
|
La création doit produire une arborescence standard et préparer l'emplacement de la future base SQLite.
|
|
|
|
Ce ticket ne crée pas encore le schéma SQL complet.
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
```text
|
|
Application
|
|
│
|
|
▼
|
|
InvestigationProject
|
|
│
|
|
▼
|
|
FileSystem
|
|
```
|
|
|
|
Le module `InvestigationProject` devient le point d'entrée métier pour la création d'une enquête.
|
|
|
|
La GUI ne doit jamais créer directement les dossiers.
|
|
|
|
---
|
|
|
|
## Responsabilités
|
|
|
|
### InvestigationProject
|
|
|
|
Le module doit :
|
|
|
|
- recevoir le chemin du dossier parent ;
|
|
- recevoir le nom de la nouvelle enquête ;
|
|
- créer le dossier racine de l'enquête ;
|
|
- créer l'arborescence standard ;
|
|
- créer le dossier `00_BaseDeDonnees` ;
|
|
- créer un fichier SQLite vide nommé `Enquete.sqlite` ;
|
|
- nettoyer ce qui a été créé en cas d'échec partiel ;
|
|
- retourner le chemin complet de l'enquête créée.
|
|
|
|
---
|
|
|
|
## Arborescence à créer
|
|
|
|
```text
|
|
NomEnquete/
|
|
├── 00_BaseDeDonnees/
|
|
│ └── Enquete.sqlite
|
|
├── 01_Preuves_Originales/
|
|
│ ├── Captures_Ecran/
|
|
│ ├── Conversations/
|
|
│ ├── Documents/
|
|
│ ├── Emails/
|
|
│ ├── Photos/
|
|
│ └── Videos/
|
|
├── 02_Preuves_Traitees/
|
|
│ ├── Annotations/
|
|
│ ├── Extractions/
|
|
│ ├── OCR/
|
|
│ └── Redactions/
|
|
├── 03_Chronologie/
|
|
├── 04_Entites/
|
|
│ ├── Adresses_Email/
|
|
│ ├── Comptes_Bancaires/
|
|
│ ├── Comptes_Facebook/
|
|
│ ├── Comptes_Instagram/
|
|
│ ├── Documents_Identite/
|
|
│ ├── IBAN/
|
|
│ ├── Personnes/
|
|
│ ├── Pseudonymes/
|
|
│ ├── Telephones/
|
|
│ └── Autres/
|
|
├── 05_Rapports/
|
|
├── 06_Exports/
|
|
├── 07_Notes/
|
|
├── 08_Sources/
|
|
└── 09_Hash/
|
|
```
|
|
|
|
Les noms de dossiers ne doivent pas contenir d'accents.
|
|
|
|
---
|
|
|
|
## Interface publique attendue
|
|
|
|
Créer :
|
|
|
|
```text
|
|
include/core/investigation_project.h
|
|
src/core/investigation_project.c
|
|
```
|
|
|
|
Avec :
|
|
|
|
```c
|
|
char *investigation_project_create(
|
|
const char *parent_directory,
|
|
const char *investigation_name
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Contrat de propriété
|
|
|
|
En cas de succès, la fonction retourne une nouvelle chaîne allouée contenant le chemin complet du dossier d'enquête.
|
|
|
|
Le code appelant devient propriétaire de cette chaîne et doit la libérer avec :
|
|
|
|
```c
|
|
g_free(investigation_path);
|
|
```
|
|
|
|
En cas d'échec, la fonction retourne :
|
|
|
|
```c
|
|
NULL
|
|
```
|
|
|
|
---
|
|
|
|
## Règles de validation
|
|
|
|
La fonction doit refuser :
|
|
|
|
- `parent_directory == NULL` ;
|
|
- un chemin parent vide ;
|
|
- `investigation_name == NULL` ;
|
|
- un nom vide ;
|
|
- un dossier parent inexistant ;
|
|
- un chemin parent qui n'est pas un dossier ;
|
|
- un dossier d'enquête qui existe déjà ;
|
|
- un nom contenant `/`.
|
|
|
|
---
|
|
|
|
## Gestion des erreurs
|
|
|
|
Si une étape échoue après la création partielle :
|
|
|
|
- tous les fichiers créés par la fonction doivent être supprimés ;
|
|
- tous les dossiers créés par la fonction doivent être supprimés ;
|
|
- aucun dossier partiel ne doit rester sur le disque ;
|
|
- la fonction retourne `NULL`.
|
|
|
|
La fonction ne doit jamais supprimer un dossier qui existait avant son appel.
|
|
|
|
---
|
|
|
|
## Création de `Enquete.sqlite`
|
|
|
|
Pour ce ticket, le fichier doit seulement être créé.
|
|
|
|
Le schéma SQLite sera initialisé dans le ticket #022.
|
|
|
|
Le fichier attendu est :
|
|
|
|
```text
|
|
00_BaseDeDonnees/Enquete.sqlite
|
|
```
|
|
|
|
---
|
|
|
|
## Hors périmètre
|
|
|
|
Ce ticket ne doit pas :
|
|
|
|
- créer les tables SQLite ;
|
|
- générer un UUID ;
|
|
- créer les métadonnées ;
|
|
- importer une enquête existante ;
|
|
- modifier l'interface GTK ;
|
|
- ouvrir automatiquement l'enquête créée ;
|
|
- créer un rapport ;
|
|
- copier des preuves.
|
|
|
|
---
|
|
|
|
## Dépendances
|
|
|
|
- C17 ;
|
|
- GLib ;
|
|
- GIO autorisé.
|
|
|
|
Aucune dépendance GTK ou SQLite requise dans ce ticket.
|
|
|
|
---
|
|
|
|
## Contraintes techniques
|
|
|
|
- structure modulaire ;
|
|
- aucun état global ;
|
|
- aucune logique de création dans `Application` ;
|
|
- aucune logique de création dans les widgets ;
|
|
- documentation Doxygen ;
|
|
- compilation sans warning ;
|
|
- nettoyage complet en cas d'erreur ;
|
|
- noms de fonctions préfixés par `investigation_project_`.
|
|
|
|
---
|
|
|
|
## Tests
|
|
|
|
Créer :
|
|
|
|
```text
|
|
tests/test_investigation_project.c
|
|
```
|
|
|
|
Le test doit :
|
|
|
|
- créer un dossier temporaire ;
|
|
- créer une enquête valide ;
|
|
- vérifier chaque dossier attendu ;
|
|
- vérifier la présence de `Enquete.sqlite` ;
|
|
- vérifier que la fonction retourne le bon chemin ;
|
|
- vérifier le refus des paramètres `NULL` ;
|
|
- vérifier le refus des chaînes vides ;
|
|
- vérifier le refus d'un nom contenant `/` ;
|
|
- vérifier le refus si le dossier existe déjà ;
|
|
- supprimer complètement l'enquête de test ;
|
|
- vérifier qu'aucun résidu ne reste.
|
|
|
|
---
|
|
|
|
## Critères d'acceptation
|
|
|
|
- [ ] Le projet compile sans warning.
|
|
- [ ] `make test` reste valide.
|
|
- [ ] Une enquête complète peut être créée.
|
|
- [ ] Tous les dossiers attendus existent.
|
|
- [ ] `Enquete.sqlite` existe.
|
|
- [ ] Aucun dossier partiel ne reste en cas d'échec.
|
|
- [ ] Un dossier existant n'est jamais écrasé.
|
|
- [ ] Le chemin retourné est correct.
|
|
- [ ] Aucune dépendance GTK.
|
|
- [ ] Aucun code SQLite métier.
|
|
- [ ] Le nouveau test est intégré à `make test`.
|
|
|
|
---
|
|
|
|
## Commit attendu
|
|
|
|
```text
|
|
feat(core): create investigation project structure
|
|
```
|