chore: initialize Labfy Investigation project structure
This commit is contained in:
parent
6d90c10ca1
commit
919bd1b7ad
20 changed files with 1076 additions and 177 deletions
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Build
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
labfy-investigation
|
||||||
|
|
||||||
|
# SQLite
|
||||||
|
*.sqlite-wal
|
||||||
|
*.sqlite-shm
|
||||||
|
|
||||||
|
# QtCreator
|
||||||
|
*.pro.user
|
||||||
|
|
||||||
|
# DB Browser
|
||||||
|
*.sqbpro
|
||||||
11
Enquete-gui/.gitignore
vendored
11
Enquete-gui/.gitignore
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
# Build
|
|
||||||
enquete-gui
|
|
||||||
*.o
|
|
||||||
|
|
||||||
# SQLite temporaires
|
|
||||||
*.sqlite-shm
|
|
||||||
*.sqlite-wal
|
|
||||||
|
|
||||||
# Neovim / LSP
|
|
||||||
.cache/
|
|
||||||
compile_commands.json
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
CC = gcc
|
|
||||||
|
|
||||||
PKG_CONFIG = pkg-config
|
|
||||||
|
|
||||||
CFLAGS = -Wall -Wextra -Wpedantic -Werror -std=c17 -g \
|
|
||||||
-Iinclude \
|
|
||||||
$(shell $(PKG_CONFIG) --cflags gtk4 sqlite3)
|
|
||||||
|
|
||||||
LDFLAGS = $(shell $(PKG_CONFIG) --libs gtk4 sqlite3)
|
|
||||||
|
|
||||||
SRC := $(wildcard src/*.c)
|
|
||||||
OBJ := $(SRC:.c=.o)
|
|
||||||
|
|
||||||
TARGET = enquete-gui
|
|
||||||
|
|
||||||
$(TARGET): $(OBJ)
|
|
||||||
$(CC) $(OBJ) -o $@ $(LDFLAGS)
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJ) $(TARGET)
|
|
||||||
|
|
||||||
run: $(TARGET)
|
|
||||||
./$(TARGET)
|
|
||||||
|
|
||||||
.PHONY: clean run
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
-I/usr/include/gtk-4.0
|
|
||||||
-I/usr/include/pango-1.0
|
|
||||||
-I/usr/include/fribidi
|
|
||||||
-I/usr/include/harfbuzz
|
|
||||||
-I/usr/include/gdk-pixbuf-2.0
|
|
||||||
-I/usr/include/glycin-2
|
|
||||||
-I/usr/include/cairo
|
|
||||||
-I/usr/include/freetype2
|
|
||||||
-I/usr/include/libpng16
|
|
||||||
-I/usr/include/pixman-1
|
|
||||||
-I/usr/include/graphene-1.0
|
|
||||||
-I/usr/lib/graphene-1.0/include
|
|
||||||
-mfpmath=sse
|
|
||||||
-msse
|
|
||||||
-msse2
|
|
||||||
-I/usr/include/glib-2.0
|
|
||||||
-I/usr/lib/glib-2.0/include
|
|
||||||
-I/usr/include/libmount
|
|
||||||
-I/usr/include/blkid
|
|
||||||
-I/usr/include/sysprof-6
|
|
||||||
-pthread
|
|
||||||
-Iinclude
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef APP_H
|
|
||||||
#define APP_H
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
GtkWidget *app_create_main_window(GtkApplication *app);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#ifndef DATABASE_H
|
|
||||||
#define DATABASE_H
|
|
||||||
|
|
||||||
#include <sqlite3.h>
|
|
||||||
|
|
||||||
int db_open(sqlite3 **db, const char *path);
|
|
||||||
void db_close(sqlite3 *db);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
#include "app.h"
|
|
||||||
|
|
||||||
GtkWidget *app_create_main_window(GtkApplication *app)
|
|
||||||
{
|
|
||||||
GtkWidget *window;
|
|
||||||
GtkWidget *box;
|
|
||||||
GtkWidget *sidebar;
|
|
||||||
GtkWidget *content;
|
|
||||||
GtkWidget *label;
|
|
||||||
|
|
||||||
window = gtk_application_window_new(app);
|
|
||||||
gtk_window_set_title(GTK_WINDOW(window), "Enquête OSINT");
|
|
||||||
gtk_window_set_default_size(GTK_WINDOW(window), 1000, 650);
|
|
||||||
|
|
||||||
box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
|
||||||
gtk_window_set_child(GTK_WINDOW(window), box);
|
|
||||||
|
|
||||||
sidebar = gtk_list_box_new();
|
|
||||||
gtk_widget_set_size_request(sidebar, 220, -1);
|
|
||||||
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Preuves"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Entités"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Chronologie"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Recherches"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Hypothèses"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Sources"));
|
|
||||||
gtk_list_box_append(GTK_LIST_BOX(sidebar), gtk_label_new("Rapport"));
|
|
||||||
|
|
||||||
content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
|
|
||||||
gtk_widget_set_margin_top(content, 20);
|
|
||||||
gtk_widget_set_margin_bottom(content, 20);
|
|
||||||
gtk_widget_set_margin_start(content, 20);
|
|
||||||
gtk_widget_set_margin_end(content, 20);
|
|
||||||
|
|
||||||
label = gtk_label_new("Tableau de bord de l'enquête");
|
|
||||||
gtk_box_append(GTK_BOX(content), label);
|
|
||||||
|
|
||||||
gtk_box_append(GTK_BOX(box), sidebar);
|
|
||||||
gtk_box_append(GTK_BOX(box), content);
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#include "database.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int db_open(sqlite3 **db, const char *path)
|
|
||||||
{
|
|
||||||
int rc = sqlite3_open(path, db);
|
|
||||||
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
fprintf(stderr, "Erreur SQLite: %s\n", sqlite3_errmsg(*db));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void db_close(sqlite3 *db)
|
|
||||||
{
|
|
||||||
if (db != NULL) {
|
|
||||||
sqlite3_close(db);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
#include <gtk/gtk.h>
|
|
||||||
#include <sqlite3.h>
|
|
||||||
|
|
||||||
#include "app.h"
|
|
||||||
#include "database.h"
|
|
||||||
|
|
||||||
static void activate(GtkApplication *app, gpointer user_data)
|
|
||||||
{
|
|
||||||
(void)user_data;
|
|
||||||
|
|
||||||
GtkWidget *window = app_create_main_window(app);
|
|
||||||
gtk_window_present(GTK_WINDOW(window));
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
sqlite3 *db = NULL;
|
|
||||||
|
|
||||||
if (db_open(&db, "../../03_Chronologie/Enquete.sqlite") != 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
GtkApplication *app = gtk_application_new(
|
|
||||||
"com.labfytools.enquete",
|
|
||||||
G_APPLICATION_DEFAULT_FLAGS
|
|
||||||
);
|
|
||||||
|
|
||||||
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
|
|
||||||
|
|
||||||
int status = g_application_run(G_APPLICATION(app), argc, argv);
|
|
||||||
|
|
||||||
g_object_unref(app);
|
|
||||||
db_close(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2026 fy59
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
@ -162,3 +162,9 @@ Elle permet de :
|
||||||
- documenter les recherches ;
|
- documenter les recherches ;
|
||||||
- générer les rapports ;
|
- générer les rapports ;
|
||||||
- faciliter la navigation dans la base de données.
|
- faciliter la navigation dans la base de données.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Ce projet est distribué sous licence MIT.
|
||||||
|
|
||||||
|
Voir le fichier `LICENSE` pour plus d'informations.
|
||||||
|
|
|
||||||
351
docs/ARCHITECTURE.md
Normal file
351
docs/ARCHITECTURE.md
Normal file
|
|
@ -0,0 +1,351 @@
|
||||||
|
# Architecture
|
||||||
|
|
||||||
|
Version : 1.0
|
||||||
|
|
||||||
|
Dernière mise à jour : 2026-07-06
|
||||||
|
|
||||||
|
Auteur : fy59
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Objectif
|
||||||
|
|
||||||
|
Ce document décrit l'architecture logicielle de **Labfy Investigation**.
|
||||||
|
|
||||||
|
Son objectif est de :
|
||||||
|
|
||||||
|
- définir les responsabilités de chaque composant ;
|
||||||
|
- faciliter la maintenance ;
|
||||||
|
- garantir une architecture cohérente ;
|
||||||
|
- limiter les dépendances entre les modules.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Philosophie
|
||||||
|
|
||||||
|
Labfy Investigation repose sur une architecture modulaire.
|
||||||
|
|
||||||
|
Chaque composant possède une responsabilité clairement définie.
|
||||||
|
|
||||||
|
Aucun module ne doit effectuer plusieurs tâches sans justification.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Architecture générale
|
||||||
|
|
||||||
|
Le projet suit une architecture inspirée du modèle MVC (Model - View - Controller).
|
||||||
|
|
||||||
|
```
|
||||||
|
Utilisateur
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
+------------------+
|
||||||
|
| Vue (GTK4) |
|
||||||
|
+------------------+
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
+------------------+
|
||||||
|
| Contrôleur |
|
||||||
|
+------------------+
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
+------------------+
|
||||||
|
| DAO |
|
||||||
|
+------------------+
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
+------------------+
|
||||||
|
| SQLite |
|
||||||
|
+------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
Chaque couche communique uniquement avec la couche immédiatement inférieure.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Arborescence
|
||||||
|
|
||||||
|
```
|
||||||
|
labfy-investigation/
|
||||||
|
|
||||||
|
├── include/
|
||||||
|
├── src/
|
||||||
|
│
|
||||||
|
├── docs/
|
||||||
|
├── database/
|
||||||
|
├── tests/
|
||||||
|
├── tools/
|
||||||
|
├── resources/
|
||||||
|
│
|
||||||
|
├── Makefile
|
||||||
|
├── README.md
|
||||||
|
├── LICENSE
|
||||||
|
├── CHANGELOG.md
|
||||||
|
└── CONTRIBUTING.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Description des dossiers
|
||||||
|
|
||||||
|
## include/
|
||||||
|
|
||||||
|
Contient l'ensemble des interfaces publiques.
|
||||||
|
|
||||||
|
Aucun code métier ne doit être présent dans les fichiers d'en-tête.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## src/
|
||||||
|
|
||||||
|
Contient l'implémentation du logiciel.
|
||||||
|
|
||||||
|
Il est organisé en plusieurs modules :
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
|
||||||
|
core/
|
||||||
|
dao/
|
||||||
|
models/
|
||||||
|
controllers/
|
||||||
|
views/
|
||||||
|
widgets/
|
||||||
|
utils/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## database/
|
||||||
|
|
||||||
|
Contient :
|
||||||
|
|
||||||
|
- le schéma SQLite ;
|
||||||
|
- les scripts d'initialisation ;
|
||||||
|
- les éventuelles migrations.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## docs/
|
||||||
|
|
||||||
|
Documentation technique.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## tests/
|
||||||
|
|
||||||
|
Tests unitaires et fonctionnels.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## resources/
|
||||||
|
|
||||||
|
Toutes les ressources utilisées par l'application :
|
||||||
|
|
||||||
|
- icônes ;
|
||||||
|
- feuilles CSS ;
|
||||||
|
- fichiers GtkBuilder (.ui).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Description des modules
|
||||||
|
|
||||||
|
## Core
|
||||||
|
|
||||||
|
Le module Core initialise l'application.
|
||||||
|
|
||||||
|
Il gère :
|
||||||
|
|
||||||
|
- le cycle de vie du programme ;
|
||||||
|
- la configuration ;
|
||||||
|
- l'ouverture de l'enquête ;
|
||||||
|
- la fermeture propre.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Models
|
||||||
|
|
||||||
|
Les modèles représentent les objets métiers.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
- Preuve
|
||||||
|
- Entite
|
||||||
|
- Personne
|
||||||
|
- Recherche
|
||||||
|
- Source
|
||||||
|
|
||||||
|
Ils ne connaissent ni GTK ni SQLite.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## DAO
|
||||||
|
|
||||||
|
Les DAO sont responsables de l'accès aux données.
|
||||||
|
|
||||||
|
Ils sont les seuls autorisés à communiquer avec SQLite.
|
||||||
|
|
||||||
|
Ils réalisent :
|
||||||
|
|
||||||
|
- INSERT
|
||||||
|
- UPDATE
|
||||||
|
- DELETE
|
||||||
|
- SELECT
|
||||||
|
|
||||||
|
Aucune requête SQL ne doit apparaître ailleurs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Controllers
|
||||||
|
|
||||||
|
Les contrôleurs assurent la logique applicative.
|
||||||
|
|
||||||
|
Ils reçoivent les événements provenant de l'interface graphique.
|
||||||
|
|
||||||
|
Ils utilisent les DAO.
|
||||||
|
|
||||||
|
Ils mettent à jour les vues.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Views
|
||||||
|
|
||||||
|
Les vues représentent l'interface utilisateur.
|
||||||
|
|
||||||
|
Elles ne contiennent aucun code métier.
|
||||||
|
|
||||||
|
Une vue affiche uniquement des informations.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Widgets
|
||||||
|
|
||||||
|
Les widgets sont des composants GTK réutilisables.
|
||||||
|
|
||||||
|
Par exemple :
|
||||||
|
|
||||||
|
- Sidebar
|
||||||
|
- Toolbar
|
||||||
|
- Statusbar
|
||||||
|
- PropertyPanel
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Utils
|
||||||
|
|
||||||
|
Fonctions utilitaires :
|
||||||
|
|
||||||
|
- SHA-256
|
||||||
|
- Date
|
||||||
|
- Fichiers
|
||||||
|
- Journalisation
|
||||||
|
|
||||||
|
Les utilitaires ne doivent jamais dépendre du reste du projet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Flux de données
|
||||||
|
|
||||||
|
Lorsqu'un utilisateur ajoute une preuve :
|
||||||
|
|
||||||
|
```
|
||||||
|
Utilisateur
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
Vue GTK
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
Controller
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
DAO
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
DAO
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
Controller
|
||||||
|
|
||||||
|
↓
|
||||||
|
|
||||||
|
Vue GTK
|
||||||
|
```
|
||||||
|
|
||||||
|
Le flux est toujours identique.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Dépendances
|
||||||
|
|
||||||
|
Les dépendances suivent la règle suivante :
|
||||||
|
|
||||||
|
```
|
||||||
|
Views
|
||||||
|
↓
|
||||||
|
Controllers
|
||||||
|
↓
|
||||||
|
DAO
|
||||||
|
↓
|
||||||
|
SQLite
|
||||||
|
```
|
||||||
|
|
||||||
|
Les dépendances inverses sont interdites.
|
||||||
|
|
||||||
|
Par exemple :
|
||||||
|
|
||||||
|
Le DAO ne doit jamais appeler une vue.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gestion de la mémoire
|
||||||
|
|
||||||
|
Chaque module est responsable des ressources qu'il alloue.
|
||||||
|
|
||||||
|
Toute allocation possède une fonction de libération correspondante.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gestion des erreurs
|
||||||
|
|
||||||
|
Les erreurs remontent toujours vers le contrôleur.
|
||||||
|
|
||||||
|
L'interface graphique est responsable de leur affichage.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Évolutivité
|
||||||
|
|
||||||
|
L'ajout d'un nouveau type d'entité ou d'une nouvelle fonctionnalité doit nécessiter le moins de modifications possibles.
|
||||||
|
|
||||||
|
L'architecture doit favoriser l'extension plutôt que la modification du code existant.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Principes
|
||||||
|
|
||||||
|
L'architecture repose sur les principes suivants :
|
||||||
|
|
||||||
|
- responsabilité unique ;
|
||||||
|
- faible couplage ;
|
||||||
|
- forte cohésion ;
|
||||||
|
- séparation des responsabilités ;
|
||||||
|
- simplicité ;
|
||||||
|
- lisibilité ;
|
||||||
|
- maintenabilité.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Conclusion
|
||||||
|
|
||||||
|
Toute nouvelle fonctionnalité doit s'intégrer dans cette architecture.
|
||||||
|
|
||||||
|
Si une évolution nécessite de contourner ces règles, la décision doit être documentée et justifiée.
|
||||||
683
docs/DEVELOPMENT.md
Normal file
683
docs/DEVELOPMENT.md
Normal file
|
|
@ -0,0 +1,683 @@
|
||||||
|
# Développement
|
||||||
|
|
||||||
|
Version : 1.0
|
||||||
|
|
||||||
|
Dernière mise à jour : 2026-07-06
|
||||||
|
|
||||||
|
Auteur : fy59
|
||||||
|
|
||||||
|
# Sommaire
|
||||||
|
|
||||||
|
1. Objet
|
||||||
|
2. Objectif
|
||||||
|
3. Technologies
|
||||||
|
4. Outils
|
||||||
|
5. Commandes
|
||||||
|
6. Revue de code
|
||||||
|
7. Philosophie
|
||||||
|
8. Architecture
|
||||||
|
9. Règles de codage
|
||||||
|
10. Documentation
|
||||||
|
11. Organisation des fichiers
|
||||||
|
12. Gestion mémoire
|
||||||
|
13. Base de données
|
||||||
|
14. Git
|
||||||
|
15. Développement
|
||||||
|
16. Tests
|
||||||
|
17. Gestion des erreurs
|
||||||
|
18. Convention de nommage
|
||||||
|
- Fichiers
|
||||||
|
- Fonctions
|
||||||
|
- Variables
|
||||||
|
- Types
|
||||||
|
- Constantes
|
||||||
|
- Énumérations
|
||||||
|
19. Principes de conception
|
||||||
|
- Simplicité
|
||||||
|
- Lisibilité
|
||||||
|
- Responsabilité unique
|
||||||
|
- Zéro surprise
|
||||||
|
- Style de code
|
||||||
|
- Le compilateur est notre premier relecteur
|
||||||
|
- Documentation
|
||||||
|
- Boy Scout Rule
|
||||||
|
- Robustesse avant optimisation
|
||||||
|
- Une fonctionnalité = un commit
|
||||||
|
20. Décisions techniques
|
||||||
|
21. Branche principale
|
||||||
|
22. Dépendances
|
||||||
|
---
|
||||||
|
|
||||||
|
## Objet
|
||||||
|
|
||||||
|
Ce document définit les règles de développement du projet **Labfy Investigation**.
|
||||||
|
|
||||||
|
L'objectif est de garantir un code :
|
||||||
|
|
||||||
|
- lisible ;
|
||||||
|
- maintenable ;
|
||||||
|
- documenté ;
|
||||||
|
- portable ;
|
||||||
|
- simple à faire évoluer.
|
||||||
|
|
||||||
|
Ces règles s'appliquent à l'ensemble du projet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Objectif
|
||||||
|
|
||||||
|
L'objectif du projet est de produire un logiciel libre, robuste et documenté destiné à faciliter la gestion d'enquêtes OSINT, tout en constituant un support d'apprentissage du langage C, de GTK4, de SQLite et des bonnes pratiques de développement logiciel.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Technologies
|
||||||
|
|
||||||
|
Le projet repose sur les technologies suivantes :
|
||||||
|
|
||||||
|
| Technologie | Version |
|
||||||
|
|-------------|----------|
|
||||||
|
| Langage | C17 |
|
||||||
|
| Interface graphique | GTK 4.10+ |
|
||||||
|
| Base de données | SQLite 3.45+ |
|
||||||
|
| Compilateur | GCC 15+ |
|
||||||
|
| Build | Make |
|
||||||
|
| Documentation | Doxygen |
|
||||||
|
| Gestion de version | Git |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Outils
|
||||||
|
|
||||||
|
Les outils suivants sont utilisés pendant le développement :
|
||||||
|
|
||||||
|
- gcc
|
||||||
|
- clang
|
||||||
|
- clang-format
|
||||||
|
- clang-tidy
|
||||||
|
- cppcheck
|
||||||
|
- valgrind
|
||||||
|
- doxygen
|
||||||
|
- graphviz
|
||||||
|
- make
|
||||||
|
- Git
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Commandes
|
||||||
|
|
||||||
|
Compilation :
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
Exécution :
|
||||||
|
|
||||||
|
make run
|
||||||
|
|
||||||
|
Nettoyage :
|
||||||
|
|
||||||
|
make clean
|
||||||
|
|
||||||
|
Documentation :
|
||||||
|
|
||||||
|
make docs
|
||||||
|
|
||||||
|
Tests :
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Revue de code
|
||||||
|
|
||||||
|
Avant chaque commit important, le code doit être vérifié selon les critères suivants :
|
||||||
|
|
||||||
|
- respecte les conventions de nommage ;
|
||||||
|
- compile sans warning ;
|
||||||
|
- est documenté ;
|
||||||
|
- respecte l'architecture MVC ;
|
||||||
|
- ne duplique pas de code ;
|
||||||
|
- gère correctement les erreurs ;
|
||||||
|
- libère correctement les ressources.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Philosophie
|
||||||
|
|
||||||
|
Labfy Investigation est développé comme un logiciel professionnel.
|
||||||
|
|
||||||
|
Les priorités sont les suivantes :
|
||||||
|
|
||||||
|
1. Simplicité.
|
||||||
|
2. Lisibilité.
|
||||||
|
3. Robustesse.
|
||||||
|
4. Documentation.
|
||||||
|
5. Évolutivité.
|
||||||
|
|
||||||
|
Un code plus simple est toujours préféré à un code plus complexe.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Architecture
|
||||||
|
|
||||||
|
Le projet suit une architecture de type MVC.
|
||||||
|
|
||||||
|
```
|
||||||
|
Vue (GTK)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
Contrôleur
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
DAO
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
SQLite
|
||||||
|
```
|
||||||
|
|
||||||
|
Les responsabilités sont clairement séparées.
|
||||||
|
|
||||||
|
Une couche ne doit jamais accéder directement à une couche qui ne lui appartient pas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Règles de codage
|
||||||
|
|
||||||
|
Le projet est développé en **C17**.
|
||||||
|
|
||||||
|
Les options de compilation sont :
|
||||||
|
|
||||||
|
- `-std=c17`
|
||||||
|
- `-Wall`
|
||||||
|
- `-Wextra`
|
||||||
|
- `-Wpedantic`
|
||||||
|
- `-Werror`
|
||||||
|
|
||||||
|
Aucun warning n'est accepté.
|
||||||
|
|
||||||
|
Le projet doit compiler sans erreur ni avertissement.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
Chaque fichier possède un en-tête.
|
||||||
|
|
||||||
|
Chaque fonction publique est documentée avec Doxygen.
|
||||||
|
|
||||||
|
Les commentaires expliquent :
|
||||||
|
|
||||||
|
- pourquoi un choix a été fait ;
|
||||||
|
- les contraintes techniques ;
|
||||||
|
- les hypothèses.
|
||||||
|
|
||||||
|
Les commentaires ne doivent jamais simplement répéter le code.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Organisation des fichiers
|
||||||
|
|
||||||
|
Chaque fichier possède une responsabilité unique.
|
||||||
|
|
||||||
|
Une fonction ne doit réaliser qu'une seule tâche.
|
||||||
|
|
||||||
|
Lorsque cela devient nécessaire, le code est découpé en plusieurs modules.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gestion mémoire
|
||||||
|
|
||||||
|
Toute allocation mémoire possède une fonction de libération correspondante.
|
||||||
|
|
||||||
|
Les fuites mémoire sont considérées comme des bugs.
|
||||||
|
|
||||||
|
Les vérifications sont réalisées régulièrement avec Valgrind.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Base de données
|
||||||
|
|
||||||
|
Toutes les opérations sur SQLite passent par la couche DAO.
|
||||||
|
|
||||||
|
Le reste de l'application ne manipule jamais directement SQLite.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Git
|
||||||
|
|
||||||
|
Le dépôt Git contient uniquement :
|
||||||
|
|
||||||
|
- le code source ;
|
||||||
|
- la documentation ;
|
||||||
|
- les modèles ;
|
||||||
|
- les scripts.
|
||||||
|
|
||||||
|
Les enquêtes réelles ne sont jamais versionnées.
|
||||||
|
|
||||||
|
Chaque commit :
|
||||||
|
|
||||||
|
- compile ;
|
||||||
|
- fonctionne ;
|
||||||
|
- correspond à une seule fonctionnalité.
|
||||||
|
|
||||||
|
Les messages de commit suivent la convention :
|
||||||
|
|
||||||
|
```
|
||||||
|
type(scope): description
|
||||||
|
```
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(gui): create main window
|
||||||
|
|
||||||
|
feat(database): add evidence dao
|
||||||
|
|
||||||
|
fix(core): close sqlite connection
|
||||||
|
|
||||||
|
docs: update architecture
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Développement
|
||||||
|
|
||||||
|
Avant toute nouvelle fonctionnalité :
|
||||||
|
|
||||||
|
1. Définir le besoin.
|
||||||
|
2. Concevoir l'architecture.
|
||||||
|
3. Développer.
|
||||||
|
4. Tester.
|
||||||
|
5. Documenter.
|
||||||
|
6. Commit.
|
||||||
|
|
||||||
|
Aucune fonctionnalité n'est considérée comme terminée tant que ces six étapes ne sont pas réalisées.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
|
||||||
|
Chaque fonctionnalité doit être testée avant son intégration.
|
||||||
|
|
||||||
|
Lorsque cela est possible :
|
||||||
|
|
||||||
|
- tests unitaires ;
|
||||||
|
- tests fonctionnels ;
|
||||||
|
- vérification sous Valgrind ;
|
||||||
|
- compilation sans warning.
|
||||||
|
|
||||||
|
Un correctif est toujours accompagné d'un test permettant de vérifier que le problème est résolu.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gestion des erreurs
|
||||||
|
|
||||||
|
Aucune erreur ne doit être ignorée.
|
||||||
|
|
||||||
|
Les valeurs de retour des fonctions sont systématiquement vérifiées.
|
||||||
|
|
||||||
|
Les messages d'erreur doivent être explicites et permettre d'identifier rapidement l'origine du problème.
|
||||||
|
|
||||||
|
Les ressources ouvertes doivent toujours être libérées, même en cas d'erreur.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Convention de nommage
|
||||||
|
|
||||||
|
Afin de garantir la cohérence du projet, une convention de nommage stricte est appliquée.
|
||||||
|
|
||||||
|
Toute dérogation à cette convention doit être justifiée.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fichiers
|
||||||
|
|
||||||
|
Les noms de fichiers sont écrits en **snake_case**.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```text
|
||||||
|
database.c
|
||||||
|
database.h
|
||||||
|
|
||||||
|
preuve.c
|
||||||
|
preuve.h
|
||||||
|
|
||||||
|
main_window.c
|
||||||
|
main_window.h
|
||||||
|
|
||||||
|
types_entite.c
|
||||||
|
types_entite.h
|
||||||
|
```
|
||||||
|
|
||||||
|
Les noms doivent être explicites et refléter la responsabilité du module.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fonctions
|
||||||
|
|
||||||
|
Les fonctions sont toujours préfixées par le nom du module auquel elles appartiennent.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```c
|
||||||
|
db_open();
|
||||||
|
db_close();
|
||||||
|
|
||||||
|
preuve_new();
|
||||||
|
preuve_free();
|
||||||
|
|
||||||
|
main_window_create();
|
||||||
|
main_window_destroy();
|
||||||
|
```
|
||||||
|
|
||||||
|
Les fonctions génériques telles que :
|
||||||
|
|
||||||
|
```c
|
||||||
|
create();
|
||||||
|
init();
|
||||||
|
run();
|
||||||
|
```
|
||||||
|
|
||||||
|
sont interdites, car elles deviennent rapidement ambiguës lorsque le projet grandit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
Les variables utilisent également la convention **snake_case**.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```c
|
||||||
|
preuve_id
|
||||||
|
|
||||||
|
type_id
|
||||||
|
|
||||||
|
main_window
|
||||||
|
|
||||||
|
database
|
||||||
|
|
||||||
|
source_id
|
||||||
|
|
||||||
|
date_collecte
|
||||||
|
```
|
||||||
|
|
||||||
|
Les noms doivent décrire clairement le contenu de la variable.
|
||||||
|
|
||||||
|
Les noms suivants sont à proscrire :
|
||||||
|
|
||||||
|
```c
|
||||||
|
x
|
||||||
|
|
||||||
|
tmp
|
||||||
|
|
||||||
|
toto
|
||||||
|
|
||||||
|
test
|
||||||
|
```
|
||||||
|
|
||||||
|
à l'exception des variables locales très courtes utilisées dans une boucle ou un contexte limité :
|
||||||
|
|
||||||
|
```c
|
||||||
|
for (size_t i = 0; i < count; ++i)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Types
|
||||||
|
|
||||||
|
Les structures représentent des objets métiers et utilisent le **PascalCase**.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
...
|
||||||
|
} Preuve;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
...
|
||||||
|
} Entite;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
...
|
||||||
|
} Personne;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Constantes
|
||||||
|
|
||||||
|
Les constantes et macros sont écrites en majuscules avec des underscores.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```c
|
||||||
|
MAX_PATH_LENGTH
|
||||||
|
|
||||||
|
SHA256_LENGTH
|
||||||
|
|
||||||
|
DEFAULT_WINDOW_WIDTH
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Énumérations
|
||||||
|
|
||||||
|
Les énumérations utilisent un préfixe correspondant au type.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
PREUVE_CAPTURE,
|
||||||
|
PREUVE_EMAIL,
|
||||||
|
PREUVE_VIDEO
|
||||||
|
} PreuveType;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Objectif
|
||||||
|
|
||||||
|
Le nom d'un fichier, d'une fonction ou d'une variable doit permettre de comprendre immédiatement son rôle, sans avoir à consulter son implémentation.
|
||||||
|
|
||||||
|
Le code doit être explicite avant d'être concis.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Principes de conception
|
||||||
|
|
||||||
|
Les principes suivants guident le développement de l'ensemble du projet.
|
||||||
|
|
||||||
|
Ils doivent être respectés avant toute considération d'optimisation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Simplicité
|
||||||
|
|
||||||
|
La solution la plus simple est privilégiée.
|
||||||
|
|
||||||
|
Un code plus court n'est pas forcément un meilleur code.
|
||||||
|
|
||||||
|
La lisibilité prime toujours.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lisibilité
|
||||||
|
|
||||||
|
Le code doit pouvoir être compris plusieurs mois après son écriture.
|
||||||
|
|
||||||
|
Les noms des fichiers, fonctions, variables et structures doivent être explicites.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Responsabilité unique
|
||||||
|
|
||||||
|
Chaque module possède une responsabilité unique.
|
||||||
|
|
||||||
|
Chaque fonction réalise une seule tâche.
|
||||||
|
|
||||||
|
Si une fonction devient difficile à expliquer, elle doit probablement être découpée.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Zéro surprise
|
||||||
|
|
||||||
|
Le comportement d'une fonction doit être prévisible.
|
||||||
|
|
||||||
|
Le nom d'une fonction doit permettre de comprendre ce qu'elle réalise sans avoir à lire son implémentation.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
preuve_save();
|
||||||
|
```
|
||||||
|
|
||||||
|
est préférable à :
|
||||||
|
|
||||||
|
```c
|
||||||
|
save();
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Style de code
|
||||||
|
|
||||||
|
- Indentation : 4 espaces.
|
||||||
|
- Largeur maximale : 100 colonnes.
|
||||||
|
- Accolades sur une nouvelle ligne (style Allman).
|
||||||
|
- Une déclaration par ligne.
|
||||||
|
- Une instruction par ligne.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Le compilateur est notre premier relecteur
|
||||||
|
|
||||||
|
Les warnings sont considérés comme des erreurs.
|
||||||
|
|
||||||
|
Le projet compile toujours avec :
|
||||||
|
|
||||||
|
- `-Wall`
|
||||||
|
- `-Wextra`
|
||||||
|
- `-Wpedantic`
|
||||||
|
- `-Werror`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Le code explique **comment** fonctionne une fonctionnalité.
|
||||||
|
|
||||||
|
Les commentaires expliquent **pourquoi** elle existe.
|
||||||
|
|
||||||
|
Les commentaires ne doivent jamais simplement répéter le code.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Boy Scout Rule
|
||||||
|
|
||||||
|
À chaque modification d'un fichier, celui-ci doit être laissé dans un état au moins aussi propre qu'avant la modification.
|
||||||
|
|
||||||
|
Cela peut être :
|
||||||
|
|
||||||
|
- améliorer un nom de variable ;
|
||||||
|
- corriger un commentaire ;
|
||||||
|
- supprimer du code mort ;
|
||||||
|
- simplifier une fonction.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Robustesse avant optimisation
|
||||||
|
|
||||||
|
Les optimisations ne sont réalisées que lorsqu'un besoin est identifié et mesuré.
|
||||||
|
|
||||||
|
La robustesse et la lisibilité sont prioritaires.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Une fonctionnalité = un commit
|
||||||
|
|
||||||
|
Chaque commit correspond à une seule fonctionnalité.
|
||||||
|
|
||||||
|
Chaque commit :
|
||||||
|
|
||||||
|
- compile ;
|
||||||
|
- est testé ;
|
||||||
|
- est documenté.
|
||||||
|
|
||||||
|
Les messages de commit suivent la convention :
|
||||||
|
|
||||||
|
```
|
||||||
|
type(scope): description
|
||||||
|
```
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(gui): create main window
|
||||||
|
feat(database): add evidence dao
|
||||||
|
fix(core): close sqlite connection
|
||||||
|
docs: update development guide
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Décisions techniques
|
||||||
|
|
||||||
|
Toute décision technique importante doit être documentée.
|
||||||
|
|
||||||
|
Le projet privilégie les choix simples, documentés et facilement maintenables.
|
||||||
|
|
||||||
|
Lorsque plusieurs solutions existent, la préférence est donnée à celle qui facilite la compréhension du code par un nouveau développeur.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Branche principale
|
||||||
|
|
||||||
|
La branche `main` est toujours stable.
|
||||||
|
|
||||||
|
Le projet doit toujours :
|
||||||
|
|
||||||
|
- compiler ;
|
||||||
|
- démarrer ;
|
||||||
|
- être documenté.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Dépendances
|
||||||
|
|
||||||
|
Les nouvelles dépendances doivent être justifiées.
|
||||||
|
|
||||||
|
Avant d'ajouter une bibliothèque externe, il convient de vérifier :
|
||||||
|
|
||||||
|
- si la bibliothèque standard suffit ;
|
||||||
|
- si GTK ou GLib proposent déjà la fonctionnalité ;
|
||||||
|
- si la nouvelle dépendance apporte un réel bénéfice.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Licence
|
||||||
|
|
||||||
|
Le projet est distribué sous la licence MIT.
|
||||||
|
|
||||||
|
Toute nouvelle contribution est considérée comme publiée sous cette même licence.
|
||||||
|
|
||||||
|
Le texte complet de la licence est disponible dans le fichier `LICENSE` situé à la racine du projet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Historique
|
||||||
|
|
||||||
|
## Version 1.0
|
||||||
|
|
||||||
|
- Création du guide de développement.
|
||||||
|
- Définition des conventions de codage.
|
||||||
|
- Définition de l'architecture.
|
||||||
|
- Définition des règles Git.
|
||||||
0
docs/ROADMAP.md
Normal file
0
docs/ROADMAP.md
Normal file
Loading…
Reference in a new issue