From 7d6f7f672f586a21896c1fb690cb851fa8fb188e Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Sat, 18 Jul 2026 17:03:33 +0200 Subject: [PATCH] feat: add evidence record model --- Makefile | 12 + include/models/evidence_record.h | 274 ++++++++ labfy-investigation | Bin 331296 -> 349304 bytes src/models/evidence_record.c | 967 ++++++++++++++++++++++++++ tests/test_evidence_record | Bin 0 -> 41184 bytes tests/test_evidence_record.c | 1099 ++++++++++++++++++++++++++++++ 6 files changed, 2352 insertions(+) create mode 100644 include/models/evidence_record.h create mode 100644 src/models/evidence_record.c create mode 100755 tests/test_evidence_record create mode 100644 tests/test_evidence_record.c diff --git a/Makefile b/Makefile index 6a5adcf..a8e0ce1 100644 --- a/Makefile +++ b/Makefile @@ -23,6 +23,8 @@ TEST_CFLAGS = -std=c17 \ TEST_LDFLAGS = $(shell $(PKG_CONFIG) --libs glib-2.0 gio-2.0) +EVIDENCE_RECORD_TEST_CFLAGS := $(TEST_CFLAGS) -Wpedantic + SRC := $(shell find src -name "*.c") OBJ := $(SRC:.c=.o) @@ -38,6 +40,8 @@ TEST_STATEMENT = tests/test_statement TEST_TRANSACTION = tests/test_transaction TEST_ERROR = tests/test_error TEST_INVESTIGATION_RECORD = tests/test_investigation_record +TEST_EVIDENCE_RECORD := tests/test_evidence_record +TEST_EVIDENCE_RECORD := tests/test_evidence_record TEST_INVESTIGATION_DAO := tests/test_investigation_dao TEST_INVESTIGATION_SESSION := tests/test_investigation_session TEST_BACKGROUND_TASK := tests/test_background_task @@ -120,6 +124,11 @@ $(TEST_INVESTIGATION_RECORD): \ src/models/investigation_record.c $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) +$(TEST_EVIDENCE_RECORD): \ + tests/test_evidence_record.c \ + src/models/evidence_record.c + $(CC) $(EVIDENCE_RECORD_TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) + $(TEST_INVESTIGATION_DAO): \ tests/test_investigation_dao.c \ src/dao/investigation_dao.c \ @@ -200,6 +209,7 @@ test: \ $(TEST_TRANSACTION) \ $(TEST_ERROR) \ $(TEST_INVESTIGATION_RECORD) \ + $(TEST_EVIDENCE_RECORD) \ $(TEST_INVESTIGATION_DAO) \ $(TEST_INVESTIGATION_SESSION) \ $(TEST_BACKGROUND_TASK) \ @@ -219,6 +229,7 @@ test: \ @$(TEST_TRANSACTION) @$(TEST_ERROR) @$(TEST_INVESTIGATION_RECORD) + @$(TEST_EVIDENCE_RECORD) @$(TEST_INVESTIGATION_DAO) @$(TEST_INVESTIGATION_SESSION) @$(TEST_BACKGROUND_TASK) @@ -247,6 +258,7 @@ clean: $(TEST_TRANSACTION) \ $(TEST_ERROR) \ $(TEST_INVESTIGATION_RECORD) \ + $(TEST_EVIDENCE_RECORD) \ $(TEST_INVESTIGATION_DAO) \ $(TEST_INVESTIGATION_SESSION) \ $(TEST_BACKGROUND_TASK) \ diff --git a/include/models/evidence_record.h b/include/models/evidence_record.h new file mode 100644 index 0000000..b292d0a --- /dev/null +++ b/include/models/evidence_record.h @@ -0,0 +1,274 @@ +/****************************************************************************** + * @file evidence_record.h + * @brief Modèle représentant une preuve numérique persistée. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_EVIDENCE_RECORD_H +#define LABFY_INVESTIGATION_EVIDENCE_RECORD_H + +#include + +G_BEGIN_DECLS + +/** + * @brief Modèle opaque représentant une preuve numérique. + */ +typedef struct EvidenceRecord EvidenceRecord; + +/** + * @brief État connu de l’intégrité d’une preuve. + */ +typedef enum +{ + /** + * Aucune vérification d’intégrité n’a encore été effectuée. + */ + EVIDENCE_INTEGRITY_STATUS_UNKNOWN, + + /** + * Le fichier existe et son empreinte est conforme. + */ + EVIDENCE_INTEGRITY_STATUS_VALID, + + /** + * Le fichier attendu est absent. + */ + EVIDENCE_INTEGRITY_STATUS_MISSING, + + /** + * Le fichier existe, mais son contenu a changé. + */ + EVIDENCE_INTEGRITY_STATUS_MODIFIED, + + /** + * La vérification d’intégrité n’a pas pu être réalisée. + */ + EVIDENCE_INTEGRITY_STATUS_ERROR +} EvidenceIntegrityStatus; + +/** + * @brief Codes d’erreur produits par EvidenceRecord. + */ +typedef enum +{ + /** + * Un argument général est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_ARGUMENT, + + /** + * L’identifiant UUID est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_IDENTIFIER, + + /** + * Un nom de fichier est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_NAME, + + /** + * Le chemin relatif est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_PATH, + + /** + * L’identifiant du type de preuve est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_TYPE, + + /** + * L’empreinte SHA-256 est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_SHA256, + + /** + * Une date est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_DATE, + + /** + * Le statut d’intégrité est invalide. + */ + EVIDENCE_RECORD_ERROR_INVALID_STATUS +} EvidenceRecordError; + +/** + * @brief Domaine d’erreur du modèle EvidenceRecord. + */ +#define EVIDENCE_RECORD_ERROR \ + evidence_record_error_quark() + +/** + * @brief Retourne le domaine d’erreur du modèle. + * + * @return Quark GLib associé à EvidenceRecord. + */ +GQuark evidence_record_error_quark(void); + +/** + * @brief Crée un modèle représentant une preuve numérique. + * + * Toutes les chaînes sont copiées et appartiennent au nouvel objet. + * + * Les champs identifier, original_name, internal_name, relative_path, + * type_identifier, sha256 et imported_at sont obligatoires. + * + * collected_at, source et description peuvent être NULL. + * + * @param identifier Identifiant UUID de la preuve. + * @param original_name Nom du fichier au moment de la collecte. + * @param internal_name Nom utilisé pour le stockage dans l’enquête. + * @param relative_path Chemin relatif depuis la racine de l’enquête. + * @param type_identifier Identifiant métier du type de preuve. + * @param size_bytes Taille observée du fichier. + * @param sha256 Empreinte SHA-256 du fichier. + * @param imported_at Date UTC de l’importation. + * @param collected_at Date UTC de collecte, ou NULL. + * @param source Description de la source, ou NULL. + * @param description Description facultative, ou NULL. + * @param integrity_status État d’intégrité de la preuve. + * @param error Emplacement facultatif recevant une erreur. + * + * @return Nouveau modèle, ou NULL lorsque les données sont invalides. + */ +EvidenceRecord *evidence_record_new( + const char *identifier, + const char *original_name, + const char *internal_name, + const char *relative_path, + const char *type_identifier, + guint64 size_bytes, + const char *sha256, + const char *imported_at, + const char *collected_at, + const char *source, + const char *description, + EvidenceIntegrityStatus integrity_status, + GError **error +); + +/** + * @brief Libère un modèle EvidenceRecord. + * + * Cette fonction accepte evidence_record == NULL. + * + * @param evidence_record Modèle à libérer. + */ +void evidence_record_free( + EvidenceRecord *evidence_record +); + +/** + * @brief Retourne l’identifiant UUID de la preuve. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_identifier( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne le nom original du fichier. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_original_name( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne le nom interne du fichier. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_internal_name( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne le chemin relatif de la preuve. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_relative_path( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne l’identifiant du type de preuve. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_type_identifier( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne la taille observée de la preuve. + * + * @return Taille en octets, ou 0 lorsque l’objet est NULL. + */ +guint64 evidence_record_get_size_bytes( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne l’empreinte SHA-256. + * + * L’empreinte est stockée en minuscules. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_sha256( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne la date UTC d’importation. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_imported_at( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne la date UTC de collecte. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_collected_at( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne la source déclarée de la preuve. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_source( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne la description de la preuve. + * + * @return Chaîne empruntée, ou NULL. + */ +const char *evidence_record_get_description( + const EvidenceRecord *evidence_record +); + +/** + * @brief Retourne l’état d’intégrité de la preuve. + * + * @return État enregistré, ou EVIDENCE_INTEGRITY_STATUS_UNKNOWN + * lorsque l’objet est NULL. + */ +EvidenceIntegrityStatus evidence_record_get_integrity_status( + const EvidenceRecord *evidence_record +); + +G_END_DECLS + +#endif diff --git a/labfy-investigation b/labfy-investigation index a47839f4c95162b50312adec247cae6093bc3457..ec5ef1dda6aaf1b50de0fb5d38a99ed8bffca4d8 100755 GIT binary patch delta 112506 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≀^^I9M>(8;uwIVb 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 eb(;r@w;A#YT~+Qdh`XJ(2EwsasN4(P{Qm +#include + +/** + * @brief Représentation privée d’une preuve numérique persistée. + */ +struct EvidenceRecord +{ + char *identifier; + char *original_name; + char *internal_name; + char *relative_path; + char *type_identifier; + + guint64 size_bytes; + + char *sha256; + char *imported_at; + char *collected_at; + char *source; + char *description; + + EvidenceIntegrityStatus integrity_status; +}; + +/** + * @brief Produit une erreur du domaine EvidenceRecord. + */ +static void evidence_record_set_error( + GError **error, + EvidenceRecordError error_code, + const char *message +) +{ + if (error == NULL) + { + return; + } + + g_set_error_literal( + error, + EVIDENCE_RECORD_ERROR, + error_code, + message + ); +} + +/** + * @brief Copie une chaîne et retire les espaces extérieurs. + * + * @return Nouvelle chaîne, ou NULL lorsque text vaut NULL. + */ +static char *evidence_record_duplicate_trimmed( + const char *text +) +{ + char *text_copy = NULL; + + if (text == NULL) + { + return NULL; + } + + text_copy = g_strdup( + text + ); + + g_strstrip( + text_copy + ); + + return text_copy; +} + +/** + * @brief Indique si une chaîne obligatoire contient du texte. + */ +static gboolean evidence_record_required_text_is_valid( + const char *text +) +{ + return text != NULL && + text[0] != '\0'; +} + +/** + * @brief Vérifie qu’un nom ne contient aucun composant de chemin. + */ +static gboolean evidence_record_filename_is_valid( + const char *filename +) +{ + if (!evidence_record_required_text_is_valid( + filename + )) + { + return FALSE; + } + + if (g_strcmp0( + filename, + "." + ) == 0 || + g_strcmp0( + filename, + ".." + ) == 0) + { + return FALSE; + } + + /* + * Les deux séparateurs sont refusés, même si l’application cible + * principalement les systèmes Unix. + */ + if (strchr( + filename, + '/' + ) != NULL || + strchr( + filename, + '\\' + ) != NULL) + { + return FALSE; + } + + return TRUE; +} + +/** + * @brief Vérifie qu’un chemin reste relatif à l’enquête. + */ +static gboolean evidence_record_relative_path_is_valid( + const char *relative_path +) +{ + char **components = NULL; + gsize component_index = 0; + + gboolean is_valid = TRUE; + + if (!evidence_record_required_text_is_valid( + relative_path + )) + { + return FALSE; + } + + if (g_path_is_absolute( + relative_path + )) + { + return FALSE; + } + + if (g_strcmp0( + relative_path, + "." + ) == 0 || + g_strcmp0( + relative_path, + ".." + ) == 0) + { + return FALSE; + } + + if (relative_path[ + strlen(relative_path) - 1 + ] == G_DIR_SEPARATOR) + { + return FALSE; + } + + components = g_strsplit( + relative_path, + G_DIR_SEPARATOR_S, + -1 + ); + + if (components == NULL) + { + return FALSE; + } + + for (component_index = 0; + components[component_index] != NULL; + component_index++) + { + const char *component = + components[component_index]; + + if (component[0] == '\0' || + g_strcmp0( + component, + "." + ) == 0 || + g_strcmp0( + component, + ".." + ) == 0) + { + is_valid = FALSE; + break; + } + } + + g_strfreev( + components + ); + + return is_valid; +} + +/** + * @brief Vérifie qu’une empreinte contient 64 caractères hexadécimaux. + */ +static gboolean evidence_record_sha256_is_valid( + const char *sha256 +) +{ + gsize character_index = 0; + + if (sha256 == NULL || + strlen(sha256) != 64) + { + return FALSE; + } + + for (character_index = 0; + character_index < 64; + character_index++) + { + if (!g_ascii_isxdigit( + sha256[character_index] + )) + { + return FALSE; + } + } + + return TRUE; +} + +/** + * @brief Convertit une empreinte hexadécimale en minuscules. + */ +static void evidence_record_sha256_to_lowercase( + char *sha256 +) +{ + gsize character_index = 0; + + if (sha256 == NULL) + { + return; + } + + for (character_index = 0; + sha256[character_index] != '\0'; + character_index++) + { + sha256[character_index] = + g_ascii_tolower( + sha256[character_index] + ); + } +} + +/** + * @brief Lit un nombre décimal à une position déterminée. + */ +static gboolean evidence_record_parse_decimal( + const char *text, + gsize offset, + gsize length, + gint *out_value +) +{ + gsize character_index = 0; + gint value = 0; + + if (text == NULL || + out_value == NULL || + length == 0) + { + return FALSE; + } + + for (character_index = 0; + character_index < length; + character_index++) + { + char character = + text[offset + character_index]; + + if (!g_ascii_isdigit( + character + )) + { + return FALSE; + } + + value = + (value * 10) + + (character - '0'); + } + + *out_value = value; + + return TRUE; +} + +/** + * @brief Vérifie une date UTC au format YYYY-MM-DDTHH:MM:SSZ. + */ +static gboolean evidence_record_utc_date_is_valid( + const char *date_text +) +{ + GDateTime *date_time = NULL; + + gint year = 0; + gint month = 0; + gint day = 0; + gint hour = 0; + gint minute = 0; + gint second = 0; + + if (date_text == NULL || + strlen(date_text) != 20) + { + return FALSE; + } + + if (date_text[4] != '-' || + date_text[7] != '-' || + date_text[10] != 'T' || + date_text[13] != ':' || + date_text[16] != ':' || + date_text[19] != 'Z') + { + return FALSE; + } + + if (!evidence_record_parse_decimal( + date_text, + 0, + 4, + &year + ) || + !evidence_record_parse_decimal( + date_text, + 5, + 2, + &month + ) || + !evidence_record_parse_decimal( + date_text, + 8, + 2, + &day + ) || + !evidence_record_parse_decimal( + date_text, + 11, + 2, + &hour + ) || + !evidence_record_parse_decimal( + date_text, + 14, + 2, + &minute + ) || + !evidence_record_parse_decimal( + date_text, + 17, + 2, + &second + )) + { + return FALSE; + } + + date_time = g_date_time_new_utc( + year, + month, + day, + hour, + minute, + second + ); + + if (date_time == NULL) + { + return FALSE; + } + + g_date_time_unref( + date_time + ); + + return TRUE; +} + +/** + * @brief Vérifie que la valeur appartient à EvidenceIntegrityStatus. + */ +static gboolean evidence_record_integrity_status_is_valid( + EvidenceIntegrityStatus integrity_status +) +{ + switch (integrity_status) + { + case EVIDENCE_INTEGRITY_STATUS_UNKNOWN: + case EVIDENCE_INTEGRITY_STATUS_VALID: + case EVIDENCE_INTEGRITY_STATUS_MISSING: + case EVIDENCE_INTEGRITY_STATUS_MODIFIED: + case EVIDENCE_INTEGRITY_STATUS_ERROR: + return TRUE; + + default: + return FALSE; + } +} + +GQuark evidence_record_error_quark(void) +{ + return g_quark_from_static_string( + "labfy-investigation-evidence-record-error" + ); +} + +EvidenceRecord *evidence_record_new( + const char *identifier, + const char *original_name, + const char *internal_name, + const char *relative_path, + const char *type_identifier, + guint64 size_bytes, + const char *sha256, + const char *imported_at, + const char *collected_at, + const char *source, + const char *description, + EvidenceIntegrityStatus integrity_status, + GError **error +) +{ + EvidenceRecord *evidence_record = NULL; + + char *identifier_copy = NULL; + char *original_name_copy = NULL; + char *internal_name_copy = NULL; + char *relative_path_copy = NULL; + char *type_identifier_copy = NULL; + char *sha256_copy = NULL; + char *imported_at_copy = NULL; + char *collected_at_copy = NULL; + char *source_copy = NULL; + char *description_copy = NULL; + + g_return_val_if_fail( + error == NULL || *error == NULL, + NULL + ); + + identifier_copy = + evidence_record_duplicate_trimmed( + identifier + ); + + original_name_copy = + evidence_record_duplicate_trimmed( + original_name + ); + + internal_name_copy = + evidence_record_duplicate_trimmed( + internal_name + ); + + relative_path_copy = + evidence_record_duplicate_trimmed( + relative_path + ); + + type_identifier_copy = + evidence_record_duplicate_trimmed( + type_identifier + ); + + sha256_copy = + evidence_record_duplicate_trimmed( + sha256 + ); + + imported_at_copy = + evidence_record_duplicate_trimmed( + imported_at + ); + + collected_at_copy = + evidence_record_duplicate_trimmed( + collected_at + ); + + source_copy = + evidence_record_duplicate_trimmed( + source + ); + + description_copy = + evidence_record_duplicate_trimmed( + description + ); + + if (!evidence_record_required_text_is_valid( + identifier_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_IDENTIFIER, + "L’identifiant de la preuve est obligatoire." + ); + + goto cleanup; + } + + if (!g_uuid_string_is_valid( + identifier_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_IDENTIFIER, + "L’identifiant de la preuve n’est pas un UUID valide." + ); + + goto cleanup; + } + + if (!evidence_record_filename_is_valid( + original_name_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_NAME, + "Le nom original de la preuve est invalide." + ); + + goto cleanup; + } + + if (!evidence_record_filename_is_valid( + internal_name_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_NAME, + "Le nom interne de la preuve est invalide." + ); + + goto cleanup; + } + + if (!evidence_record_relative_path_is_valid( + relative_path_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_PATH, + "Le chemin relatif de la preuve est invalide." + ); + + goto cleanup; + } + + if (!evidence_record_required_text_is_valid( + type_identifier_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_TYPE, + "Le type de la preuve est obligatoire." + ); + + goto cleanup; + } + + if (!evidence_record_sha256_is_valid( + sha256_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_SHA256, + "L’empreinte SHA-256 de la preuve est invalide." + ); + + goto cleanup; + } + + if (!evidence_record_utc_date_is_valid( + imported_at_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_DATE, + "La date d’importation est invalide." + ); + + goto cleanup; + } + + if (collected_at_copy != NULL && + !evidence_record_utc_date_is_valid( + collected_at_copy + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_DATE, + "La date de collecte est invalide." + ); + + goto cleanup; + } + + if (!evidence_record_integrity_status_is_valid( + integrity_status + )) + { + evidence_record_set_error( + error, + EVIDENCE_RECORD_ERROR_INVALID_STATUS, + "Le statut d’intégrité de la preuve est invalide." + ); + + goto cleanup; + } + + /* + * Les champs facultatifs composés uniquement d’espaces deviennent + * NULL afin de ne pas conserver de chaînes vides. + */ + if (source_copy != NULL && + source_copy[0] == '\0') + { + g_clear_pointer( + &source_copy, + g_free + ); + } + + if (description_copy != NULL && + description_copy[0] == '\0') + { + g_clear_pointer( + &description_copy, + g_free + ); + } + + evidence_record_sha256_to_lowercase( + sha256_copy + ); + + evidence_record = g_new0( + EvidenceRecord, + 1 + ); + + evidence_record->identifier = + identifier_copy; + + evidence_record->original_name = + original_name_copy; + + evidence_record->internal_name = + internal_name_copy; + + evidence_record->relative_path = + relative_path_copy; + + evidence_record->type_identifier = + type_identifier_copy; + + evidence_record->size_bytes = + size_bytes; + + evidence_record->sha256 = + sha256_copy; + + evidence_record->imported_at = + imported_at_copy; + + evidence_record->collected_at = + collected_at_copy; + + evidence_record->source = + source_copy; + + evidence_record->description = + description_copy; + + evidence_record->integrity_status = + integrity_status; + + return evidence_record; + +cleanup: + g_free( + description_copy + ); + + g_free( + source_copy + ); + + g_free( + collected_at_copy + ); + + g_free( + imported_at_copy + ); + + g_free( + sha256_copy + ); + + g_free( + type_identifier_copy + ); + + g_free( + relative_path_copy + ); + + g_free( + internal_name_copy + ); + + g_free( + original_name_copy + ); + + g_free( + identifier_copy + ); + + return NULL; +} + +void evidence_record_free( + EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return; + } + + g_free( + evidence_record->description + ); + + g_free( + evidence_record->source + ); + + g_free( + evidence_record->collected_at + ); + + g_free( + evidence_record->imported_at + ); + + g_free( + evidence_record->sha256 + ); + + g_free( + evidence_record->type_identifier + ); + + g_free( + evidence_record->relative_path + ); + + g_free( + evidence_record->internal_name + ); + + g_free( + evidence_record->original_name + ); + + g_free( + evidence_record->identifier + ); + + g_free( + evidence_record + ); +} + +const char *evidence_record_get_identifier( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->identifier; +} + +const char *evidence_record_get_original_name( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->original_name; +} + +const char *evidence_record_get_internal_name( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->internal_name; +} + +const char *evidence_record_get_relative_path( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->relative_path; +} + +const char *evidence_record_get_type_identifier( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->type_identifier; +} + +guint64 evidence_record_get_size_bytes( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return 0; + } + + return evidence_record->size_bytes; +} + +const char *evidence_record_get_sha256( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->sha256; +} + +const char *evidence_record_get_imported_at( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->imported_at; +} + +const char *evidence_record_get_collected_at( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->collected_at; +} + +const char *evidence_record_get_source( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->source; +} + +const char *evidence_record_get_description( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return NULL; + } + + return evidence_record->description; +} + +EvidenceIntegrityStatus evidence_record_get_integrity_status( + const EvidenceRecord *evidence_record +) +{ + if (evidence_record == NULL) + { + return EVIDENCE_INTEGRITY_STATUS_UNKNOWN; + } + + return evidence_record->integrity_status; +} diff --git a/tests/test_evidence_record b/tests/test_evidence_record new file mode 100755 index 0000000000000000000000000000000000000000..f0e69838734eadf5b792d9e52c461c0225bb7cba GIT binary patch literal 41184 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 +#include + +#define TEST_EVIDENCE_IDENTIFIER \ + "6e62b9af-2046-4efd-b3b9-29869f816951" + +#define TEST_EVIDENCE_SHA256_LOWER \ + "0123456789abcdef" \ + "0123456789abcdef" \ + "0123456789abcdef" \ + "0123456789abcdef" + +#define TEST_EVIDENCE_SHA256_UPPER \ + "0123456789ABCDEF" \ + "0123456789ABCDEF" \ + "0123456789ABCDEF" \ + "0123456789ABCDEF" + +typedef struct +{ + const char *identifier; + const char *original_name; + const char *internal_name; + const char *relative_path; + const char *type_identifier; + + guint64 size_bytes; + + const char *sha256; + const char *imported_at; + const char *collected_at; + const char *source; + const char *description; + + EvidenceIntegrityStatus integrity_status; +} TestEvidenceRecordInput; + +static TestEvidenceRecordInput test_evidence_record_valid_input(void) +{ + return (TestEvidenceRecordInput) + { + .identifier = TEST_EVIDENCE_IDENTIFIER, + .original_name = "capture_originale.png", + .internal_name = "preuve_001.png", + .relative_path = + "01_Preuves_Originales/Captures_Ecran/preuve_001.png", + .type_identifier = "image", + .size_bytes = 4096, + .sha256 = TEST_EVIDENCE_SHA256_LOWER, + .imported_at = "2026-07-18T14:30:00Z", + .collected_at = "2026-07-17T20:15:30Z", + .source = "Conversation Instagram", + .description = "Capture originale reçue par la victime.", + .integrity_status = EVIDENCE_INTEGRITY_STATUS_VALID + }; +} + +static EvidenceRecord *test_evidence_record_create( + const TestEvidenceRecordInput *input, + GError **error +) +{ + g_assert_nonnull( + input + ); + + return evidence_record_new( + input->identifier, + input->original_name, + input->internal_name, + input->relative_path, + input->type_identifier, + input->size_bytes, + input->sha256, + input->imported_at, + input->collected_at, + input->source, + input->description, + input->integrity_status, + error + ); +} + +static void test_evidence_record_assert_invalid( + const TestEvidenceRecordInput *input, + EvidenceRecordError expected_error +) +{ + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + evidence_record = + test_evidence_record_create( + input, + &error + ); + + g_assert_null( + evidence_record + ); + + g_assert_error( + error, + EVIDENCE_RECORD_ERROR, + (gint) expected_error + ); + + g_assert_nonnull( + error->message + ); + + g_assert_cmpstr( + error->message, + !=, + "" + ); + + g_clear_error( + &error + ); +} + +static void test_evidence_record_valid_full(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_cmpstr( + evidence_record_get_identifier( + evidence_record + ), + ==, + TEST_EVIDENCE_IDENTIFIER + ); + + g_assert_cmpstr( + evidence_record_get_original_name( + evidence_record + ), + ==, + "capture_originale.png" + ); + + g_assert_cmpstr( + evidence_record_get_internal_name( + evidence_record + ), + ==, + "preuve_001.png" + ); + + g_assert_cmpstr( + evidence_record_get_relative_path( + evidence_record + ), + ==, + "01_Preuves_Originales/Captures_Ecran/preuve_001.png" + ); + + g_assert_cmpstr( + evidence_record_get_type_identifier( + evidence_record + ), + ==, + "image" + ); + + g_assert_cmpuint( + evidence_record_get_size_bytes( + evidence_record + ), + ==, + 4096 + ); + + g_assert_cmpstr( + evidence_record_get_sha256( + evidence_record + ), + ==, + TEST_EVIDENCE_SHA256_LOWER + ); + + g_assert_cmpstr( + evidence_record_get_imported_at( + evidence_record + ), + ==, + "2026-07-18T14:30:00Z" + ); + + g_assert_cmpstr( + evidence_record_get_collected_at( + evidence_record + ), + ==, + "2026-07-17T20:15:30Z" + ); + + g_assert_cmpstr( + evidence_record_get_source( + evidence_record + ), + ==, + "Conversation Instagram" + ); + + g_assert_cmpstr( + evidence_record_get_description( + evidence_record + ), + ==, + "Capture originale reçue par la victime." + ); + + g_assert_cmpint( + evidence_record_get_integrity_status( + evidence_record + ), + ==, + EVIDENCE_INTEGRITY_STATUS_VALID + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_valid_optional_null(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + input.collected_at = NULL; + input.source = " "; + input.description = "\t"; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_null( + evidence_record_get_collected_at( + evidence_record + ) + ); + + g_assert_null( + evidence_record_get_source( + evidence_record + ) + ); + + g_assert_null( + evidence_record_get_description( + evidence_record + ) + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_copies_strings(void) +{ + char identifier[] = + TEST_EVIDENCE_IDENTIFIER; + + char original_name[] = + "capture_originale.png"; + + char internal_name[] = + "preuve_001.png"; + + char relative_path[] = + "01_Preuves_Originales/Captures_Ecran/preuve_001.png"; + + char type_identifier[] = + "image"; + + char sha256[] = + TEST_EVIDENCE_SHA256_LOWER; + + char imported_at[] = + "2026-07-18T14:30:00Z"; + + char collected_at[] = + "2026-07-17T20:15:30Z"; + + char source[] = + "Conversation Instagram"; + + char description[] = + "Capture originale"; + + TestEvidenceRecordInput input = + { + .identifier = identifier, + .original_name = original_name, + .internal_name = internal_name, + .relative_path = relative_path, + .type_identifier = type_identifier, + .size_bytes = 123, + .sha256 = sha256, + .imported_at = imported_at, + .collected_at = collected_at, + .source = source, + .description = description, + .integrity_status = EVIDENCE_INTEGRITY_STATUS_VALID + }; + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + identifier[0] = 'X'; + original_name[0] = 'X'; + internal_name[0] = 'X'; + relative_path[0] = 'X'; + type_identifier[0] = 'X'; + sha256[0] = 'f'; + imported_at[0] = 'X'; + collected_at[0] = 'X'; + source[0] = 'X'; + description[0] = 'X'; + + g_assert_cmpstr( + evidence_record_get_identifier( + evidence_record + ), + ==, + TEST_EVIDENCE_IDENTIFIER + ); + + g_assert_cmpstr( + evidence_record_get_original_name( + evidence_record + ), + ==, + "capture_originale.png" + ); + + g_assert_cmpstr( + evidence_record_get_internal_name( + evidence_record + ), + ==, + "preuve_001.png" + ); + + g_assert_cmpstr( + evidence_record_get_relative_path( + evidence_record + ), + ==, + "01_Preuves_Originales/Captures_Ecran/preuve_001.png" + ); + + g_assert_cmpstr( + evidence_record_get_type_identifier( + evidence_record + ), + ==, + "image" + ); + + g_assert_cmpstr( + evidence_record_get_sha256( + evidence_record + ), + ==, + TEST_EVIDENCE_SHA256_LOWER + ); + + g_assert_cmpstr( + evidence_record_get_imported_at( + evidence_record + ), + ==, + "2026-07-18T14:30:00Z" + ); + + g_assert_cmpstr( + evidence_record_get_collected_at( + evidence_record + ), + ==, + "2026-07-17T20:15:30Z" + ); + + g_assert_cmpstr( + evidence_record_get_source( + evidence_record + ), + ==, + "Conversation Instagram" + ); + + g_assert_cmpstr( + evidence_record_get_description( + evidence_record + ), + ==, + "Capture originale" + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_trims_text(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + input.identifier = + " 6e62b9af-2046-4efd-b3b9-29869f816951 "; + + input.original_name = + " capture.png "; + + input.internal_name = + "\tpreuve.png\t"; + + input.relative_path = + " 01_Preuves_Originales/preuve.png "; + + input.type_identifier = + " image "; + + input.sha256 = + " 0123456789ABCDEF0123456789ABCDEF" + "0123456789ABCDEF0123456789ABCDEF "; + + input.imported_at = + " 2026-07-18T14:30:00Z "; + + input.collected_at = + "\t2026-07-17T20:15:30Z\t"; + + input.source = + " Téléchargement manuel "; + + input.description = + " Capture principale "; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_cmpstr( + evidence_record_get_identifier( + evidence_record + ), + ==, + TEST_EVIDENCE_IDENTIFIER + ); + + g_assert_cmpstr( + evidence_record_get_original_name( + evidence_record + ), + ==, + "capture.png" + ); + + g_assert_cmpstr( + evidence_record_get_internal_name( + evidence_record + ), + ==, + "preuve.png" + ); + + g_assert_cmpstr( + evidence_record_get_relative_path( + evidence_record + ), + ==, + "01_Preuves_Originales/preuve.png" + ); + + g_assert_cmpstr( + evidence_record_get_type_identifier( + evidence_record + ), + ==, + "image" + ); + + g_assert_cmpstr( + evidence_record_get_sha256( + evidence_record + ), + ==, + TEST_EVIDENCE_SHA256_LOWER + ); + + g_assert_cmpstr( + evidence_record_get_source( + evidence_record + ), + ==, + "Téléchargement manuel" + ); + + g_assert_cmpstr( + evidence_record_get_description( + evidence_record + ), + ==, + "Capture principale" + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_invalid_uuid(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.identifier = + "identifiant-invalide"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_IDENTIFIER + ); +} + +static void test_evidence_record_invalid_original_name(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.original_name = + "dossier/capture.png"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_NAME + ); +} + +static void test_evidence_record_invalid_internal_name(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.internal_name = + ".."; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_NAME + ); +} + +static void test_evidence_record_absolute_path(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.relative_path = + "/tmp/preuve.png"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_PATH + ); +} + +static void test_evidence_record_parent_component(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.relative_path = + "01_Preuves_Originales/../preuve.png"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_PATH + ); +} + +static void test_evidence_record_relative_path(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + input.relative_path = + "01_Preuves_Originales/Documents/preuve.pdf"; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_cmpstr( + evidence_record_get_relative_path( + evidence_record + ), + ==, + "01_Preuves_Originales/Documents/preuve.pdf" + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_empty_type(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.type_identifier = + " "; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_TYPE + ); +} + +static void test_evidence_record_short_sha256(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.sha256 = + "0123456789abcdef"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_SHA256 + ); +} + +static void test_evidence_record_invalid_sha256_character(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + char invalid_sha256[] = + TEST_EVIDENCE_SHA256_LOWER; + + invalid_sha256[63] = 'g'; + + input.sha256 = + invalid_sha256; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_SHA256 + ); +} + +static void test_evidence_record_uppercase_sha256(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + input.sha256 = + TEST_EVIDENCE_SHA256_UPPER; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_cmpstr( + evidence_record_get_sha256( + evidence_record + ), + ==, + TEST_EVIDENCE_SHA256_LOWER + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_invalid_imported_at(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.imported_at = + "2026-07-18 14:30:00Z"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_DATE + ); +} + +static void test_evidence_record_invalid_collected_at(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.collected_at = + "2026-02-30T14:30:00Z"; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_DATE + ); +} + +static void test_evidence_record_invalid_status(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + input.integrity_status = + (EvidenceIntegrityStatus) 999; + + test_evidence_record_assert_invalid( + &input, + EVIDENCE_RECORD_ERROR_INVALID_STATUS + ); +} + +static void test_evidence_record_zero_size(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + GError *error = NULL; + + input.size_bytes = 0; + + evidence_record = + test_evidence_record_create( + &input, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + evidence_record + ); + + g_assert_cmpuint( + evidence_record_get_size_bytes( + evidence_record + ), + ==, + 0 + ); + + evidence_record_free( + evidence_record + ); +} + +static void test_evidence_record_null_accessors(void) +{ + g_assert_null( + evidence_record_get_identifier( + NULL + ) + ); + + g_assert_null( + evidence_record_get_original_name( + NULL + ) + ); + + g_assert_null( + evidence_record_get_internal_name( + NULL + ) + ); + + g_assert_null( + evidence_record_get_relative_path( + NULL + ) + ); + + g_assert_null( + evidence_record_get_type_identifier( + NULL + ) + ); + + g_assert_cmpuint( + evidence_record_get_size_bytes( + NULL + ), + ==, + 0 + ); + + g_assert_null( + evidence_record_get_sha256( + NULL + ) + ); + + g_assert_null( + evidence_record_get_imported_at( + NULL + ) + ); + + g_assert_null( + evidence_record_get_collected_at( + NULL + ) + ); + + g_assert_null( + evidence_record_get_source( + NULL + ) + ); + + g_assert_null( + evidence_record_get_description( + NULL + ) + ); + + g_assert_cmpint( + evidence_record_get_integrity_status( + NULL + ), + ==, + EVIDENCE_INTEGRITY_STATUS_UNKNOWN + ); +} + +static void test_evidence_record_free_null(void) +{ + evidence_record_free( + NULL + ); +} + +static void test_evidence_record_optional_error(void) +{ + TestEvidenceRecordInput input = + test_evidence_record_valid_input(); + + EvidenceRecord *evidence_record = NULL; + + input.identifier = + "uuid-invalide"; + + evidence_record = + test_evidence_record_create( + &input, + NULL + ); + + g_assert_null( + evidence_record + ); + + input = + test_evidence_record_valid_input(); + + evidence_record = + test_evidence_record_create( + &input, + NULL + ); + + g_assert_nonnull( + evidence_record + ); + + evidence_record_free( + evidence_record + ); +} + +int main( + int argc, + char **argv +) +{ + g_test_init( + &argc, + &argv, + NULL + ); + + g_test_add_func( + "/evidence_record/valid_full", + test_evidence_record_valid_full + ); + + g_test_add_func( + "/evidence_record/valid_optional_null", + test_evidence_record_valid_optional_null + ); + + g_test_add_func( + "/evidence_record/copies_strings", + test_evidence_record_copies_strings + ); + + g_test_add_func( + "/evidence_record/trims_text", + test_evidence_record_trims_text + ); + + g_test_add_func( + "/evidence_record/invalid_uuid", + test_evidence_record_invalid_uuid + ); + + g_test_add_func( + "/evidence_record/invalid_original_name", + test_evidence_record_invalid_original_name + ); + + g_test_add_func( + "/evidence_record/invalid_internal_name", + test_evidence_record_invalid_internal_name + ); + + g_test_add_func( + "/evidence_record/absolute_path", + test_evidence_record_absolute_path + ); + + g_test_add_func( + "/evidence_record/parent_component", + test_evidence_record_parent_component + ); + + g_test_add_func( + "/evidence_record/relative_path", + test_evidence_record_relative_path + ); + + g_test_add_func( + "/evidence_record/empty_type", + test_evidence_record_empty_type + ); + + g_test_add_func( + "/evidence_record/short_sha256", + test_evidence_record_short_sha256 + ); + + g_test_add_func( + "/evidence_record/invalid_sha256_character", + test_evidence_record_invalid_sha256_character + ); + + g_test_add_func( + "/evidence_record/uppercase_sha256", + test_evidence_record_uppercase_sha256 + ); + + g_test_add_func( + "/evidence_record/invalid_imported_at", + test_evidence_record_invalid_imported_at + ); + + g_test_add_func( + "/evidence_record/invalid_collected_at", + test_evidence_record_invalid_collected_at + ); + + g_test_add_func( + "/evidence_record/invalid_status", + test_evidence_record_invalid_status + ); + + g_test_add_func( + "/evidence_record/zero_size", + test_evidence_record_zero_size + ); + + g_test_add_func( + "/evidence_record/null_accessors", + test_evidence_record_null_accessors + ); + + g_test_add_func( + "/evidence_record/free_null", + test_evidence_record_free_null + ); + + g_test_add_func( + "/evidence_record/optional_error", + test_evidence_record_optional_error + ); + + return g_test_run(); +} +