From c0ef7514348aa764ffb60b14a4bf6c42c128a880 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Fri, 17 Jul 2026 15:14:05 +0200 Subject: [PATCH] feat: add external tool registry --- Makefile | 23 +- docs/tickets/closed/TICKET-036.md | 825 ++++++++++++++++ include/core/tool_registry.h | 332 +++++++ labfy-investigation | Bin 250944 -> 258624 bytes src/core/tool_registry.c | 635 +++++++++++++ tests/test_background_task | Bin 0 -> 46768 bytes 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_tool_registry | Bin 0 -> 40496 bytes tests/test_tool_registry.c | 1250 +++++++++++++++++++++++++ tests/test_transaction | Bin 0 -> 32760 bytes 19 files changed, 3063 insertions(+), 2 deletions(-) create mode 100644 docs/tickets/closed/TICKET-036.md create mode 100644 include/core/tool_registry.h create mode 100644 src/core/tool_registry.c create mode 100755 tests/test_background_task 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_tool_registry create mode 100644 tests/test_tool_registry.c create mode 100755 tests/test_transaction diff --git a/Makefile b/Makefile index b352b95..d797e70 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,8 @@ TEST_INVESTIGATION_RECORD = tests/test_investigation_record TEST_INVESTIGATION_DAO := tests/test_investigation_dao TEST_INVESTIGATION_SESSION := tests/test_investigation_session TEST_BACKGROUND_TASK := tests/test_background_task +TEST_TASK_MANAGER := tests/test_task_manager +TEST_TOOL_REGISTRY := tests/test_tool_registry all: $(TARGET) @@ -143,6 +145,17 @@ $(TEST_BACKGROUND_TASK): \ src/core/background_task.c $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) +$(TEST_TASK_MANAGER): \ + tests/test_task_manager.c \ + src/core/task_manager.c \ + src/core/background_task.c + $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) + +$(TEST_TOOL_REGISTRY): \ + tests/test_tool_registry.c \ + src/core/tool_registry.c + $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) + test: \ $(TEST_NODE) \ $(TEST_TREE_MODEL) \ @@ -155,7 +168,9 @@ test: \ $(TEST_INVESTIGATION_RECORD) \ $(TEST_INVESTIGATION_DAO) \ $(TEST_INVESTIGATION_SESSION) \ - $(TEST_BACKGROUND_TASK) + $(TEST_BACKGROUND_TASK) \ + $(TEST_TASK_MANAGER) \ + $(TEST_TOOL_REGISTRY) @echo "Exécution des tests..." @./$(TEST_NODE) @./$(TEST_TREE_MODEL) @@ -169,6 +184,8 @@ test: \ @$(TEST_INVESTIGATION_DAO) @$(TEST_INVESTIGATION_SESSION) @$(TEST_BACKGROUND_TASK) + @$(TEST_TASK_MANAGER) + @$(TEST_TOOL_REGISTRY) @echo "Tous les tests sont valides." %.o: %.c @@ -190,6 +207,8 @@ clean: $(TEST_INVESTIGATION_RECORD) \ $(TEST_INVESTIGATION_DAO) \ $(TEST_INVESTIGATION_SESSION) \ - $(TEST_BACKGROUND_TASK) + $(TEST_BACKGROUND_TASK) \ + $(TEST_TASK_MANAGER) \ + $(TEST_TOOL_REGISTRY) .PHONY: clean run test diff --git a/docs/tickets/closed/TICKET-036.md b/docs/tickets/closed/TICKET-036.md new file mode 100644 index 0000000..c65bbc5 --- /dev/null +++ b/docs/tickets/closed/TICKET-036.md @@ -0,0 +1,825 @@ +# TICKET-036 — Registre des outils et dépendances externes + +## Statut + +À faire + +## Priorité + +Haute + +## Objectif + +Créer un module central capable de représenter les outils externes utilisés par Labfy Investigation et de déterminer s’ils sont disponibles sur la machine. + +Ce registre deviendra la source unique permettant à l’application de savoir : + +- quel outil est demandé par une fonctionnalité ; +- si cet outil est obligatoire ou optionnel ; +- sous quel nom il est recherché dans le `PATH` ; +- où se trouve son exécutable ; +- si sa version est connue ; +- pourquoi une fonctionnalité doit être désactivée lorsqu’une dépendance manque. + +Le module doit rester indépendant de GTK. + +--- + +## Contexte + +Labfy Investigation utilisera progressivement plusieurs outils externes : + +- outils DNS ; +- outils RDAP et WHOIS ; +- outils TLS ; +- outils HTTP ; +- outils de traitement de métadonnées ; +- outils de conversion ou d’analyse ; +- adaptateurs spécialisés OSINT. + +Ces outils ne seront pas tous installés sur chaque machine. + +La cible Ubuntu de la gendarmerie peut également disposer : + +- de dépôts limités ; +- d’une liste de paquets spécifique ; +- d’outils installés dans des chemins non standards ; +- de versions différentes de celles présentes sur Arch Linux. + +Le code métier ne doit donc jamais supposer qu’un exécutable est disponible. + +--- + +## Périmètre + +Ce ticket doit fournir : + +1. un registre opaque `ToolRegistry` ; +2. une représentation opaque ou privée d’un outil enregistré ; +3. l’enregistrement d’un outil à partir de métadonnées stables ; +4. la détection de l’exécutable dans le `PATH` ; +5. la mémorisation du chemin détecté ; +6. la distinction entre dépendance obligatoire et optionnelle ; +7. la recherche d’un outil par identifiant ; +8. l’énumération des outils enregistrés ; +9. la détection des dépendances obligatoires manquantes ; +10. un champ permettant de mémoriser une version lorsqu’elle sera détectée ; +11. des tests unitaires sans dépendre des outils réellement installés sur la machine. + +--- + +## Hors périmètre + +Ce ticket ne doit pas encore : + +- créer d’interface GTK ; +- lancer une commande OSINT réelle ; +- interpréter la sortie de `dig`, `whois`, `curl` ou `openssl` ; +- exécuter automatiquement `--version` ; +- installer des paquets ; +- modifier les dépôts du système ; +- télécharger un outil manquant ; +- utiliser une commande construite sous forme de chaîne shell ; +- contenir une liste définitive des outils OSINT de l’application. + +L’exécution contrôlée des programmes externes sera traitée dans un ticket dédié. + +--- + +## Fichiers attendus + +```text +include/core/tool_registry.h +src/core/tool_registry.c +tests/test_tool_registry.c +``` + +Le `Makefile` devra être mis à jour pour compiler le module et son test. + +--- + +## Contraintes générales + +- Standard C17. +- Compilation avec : + +```text +-Wall -Wextra -Wpedantic -Werror +``` + +- Utiliser GLib. +- Respecter les conventions du projet : + - fichiers en `snake_case` ; + - fonctions préfixées par `tool_registry_` ou `tool_info_` ; + - noms de variables explicites ; + - structure publique opaque ; + - aucune variable globale mutable ; + - aucune dépendance à GTK. +- Ne jamais construire une commande shell. +- Ne jamais appeler `system()`, `popen()` ou équivalent. +- Ne pas coder en dur un chemin comme `/usr/bin/dig`. + +--- + +## Modèle de données + +### ToolRequirement +nvim.lsp.b_248_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_249_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_252_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_255_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_259_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_262_save BufWritePost + + [vim.lsp: textDocument/didSave handler] + Modifié la dernière fois dans ~/.dotfiles/nvim/.config/nvim/init.lua (run Nvim with -V1 for more details +) +nvim.lsp.b_273_save BufWritePost + + + +G_BEGIN_DECLS + +/** + * @brief Importance d’un outil externe pour l’application. + */ +typedef enum +{ + /** + * L’absence de l’outil ne bloque pas l’application. + */ + TOOL_REQUIREMENT_OPTIONAL, + + /** + * L’outil est indispensable à la fonctionnalité concernée. + */ + TOOL_REQUIREMENT_REQUIRED +} ToolRequirement; + +/** + * @brief État de disponibilité d’un outil externe. + */ +typedef enum +{ + /** + * L’outil n’a pas encore été recherché. + */ + TOOL_AVAILABILITY_UNKNOWN, + + /** + * L’exécutable a été trouvé. + */ + TOOL_AVAILABILITY_AVAILABLE, + + /** + * L’exécutable n’a pas été trouvé. + */ + TOOL_AVAILABILITY_MISSING +} ToolAvailability; + +/** + * @brief Erreurs produites par ToolRegistry. + */ +typedef enum +{ + /** + * Un argument transmis à une fonction est invalide. + */ + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT, + + /** + * Un outil possède le même identifiant qu’un outil déjà enregistré. + */ + TOOL_REGISTRY_ERROR_DUPLICATE_IDENTIFIER, + + /** + * L’outil demandé n’existe pas dans le registre. + */ + TOOL_REGISTRY_ERROR_NOT_FOUND +} ToolRegistryError; + +/** + * @brief Domaine d’erreur du registre d’outils. + */ +#define TOOL_REGISTRY_ERROR \ + tool_registry_error_quark() + +/** + * @brief Registre opaque des outils externes. + */ +typedef struct ToolRegistry ToolRegistry; + +/** + * @brief Informations opaques décrivant un outil externe. + */ +typedef struct ToolInfo ToolInfo; + +/** + * @brief Retourne le domaine d’erreur du registre. + * + * @return Quark GLib du domaine d’erreur. + */ +GQuark tool_registry_error_quark(void); + +/** + * @brief Crée un registre d’outils vide. + * + * @return Nouveau registre, ou NULL en cas d’échec. + */ +ToolRegistry *tool_registry_new(void); + +/** + * @brief Libère un registre et tous les outils qu’il contient. + * + * @param tool_registry Registre à libérer, ou NULL. + */ +void tool_registry_free( + ToolRegistry *tool_registry +); + +/** + * @brief Enregistre un nouvel outil externe. + * + * Le registre duplique toutes les chaînes reçues. + * + * L’outil commence avec : + * + * - une disponibilité inconnue ; + * - aucun chemin résolu ; + * - aucune version détectée. + * + * @param tool_registry Registre cible. + * @param identifier Identifiant interne unique. + * @param display_name Nom affiché à l’utilisateur. + * @param executable_name Nom de l’exécutable recherché dans le PATH. + * @param requirement Importance de la dépendance. + * @param error Emplacement facultatif pour l’erreur. + * + * @return TRUE en cas de succès, sinon FALSE. + */ +gboolean tool_registry_register( + ToolRegistry *tool_registry, + const char *identifier, + const char *display_name, + const char *executable_name, + ToolRequirement requirement, + GError **error +); + +/** + * @brief Recherche tous les exécutables enregistrés dans le PATH. + * + * Chaque ancien chemin résolu est remplacé par le résultat de la nouvelle + * détection. + * + * @param tool_registry Registre à actualiser. + * @param error Emplacement facultatif pour l’erreur. + * + * @return TRUE lorsque le rafraîchissement a pu être effectué. + */ +gboolean tool_registry_refresh( + ToolRegistry *tool_registry, + GError **error +); + +/** + * @brief Retourne le nombre d’outils enregistrés. + * + * @param tool_registry Registre consulté. + * + * @return Nombre d’outils, ou zéro si le registre est NULL. + */ +gsize tool_registry_get_count( + const ToolRegistry *tool_registry +); + +/** + * @brief Retourne un outil à partir de son index. + * + * Le pointeur retourné est emprunté. Il ne doit pas être libéré. + * + * @param tool_registry Registre consulté. + * @param index Index de l’outil. + * + * @return Outil correspondant, ou NULL si l’index est invalide. + */ +const ToolInfo *tool_registry_get_tool( + const ToolRegistry *tool_registry, + gsize index +); + +/** + * @brief Recherche un outil à partir de son identifiant. + * + * Le pointeur retourné est emprunté. Il ne doit pas être libéré. + * + * @param tool_registry Registre consulté. + * @param identifier Identifiant recherché. + * + * @return Outil correspondant, ou NULL s’il est absent. + */ +const ToolInfo *tool_registry_find( + const ToolRegistry *tool_registry, + const char *identifier +); + +/** + * @brief Mémorise la version détectée d’un outil. + * + * Une version NULL ou vide efface la version actuellement enregistrée. + * + * @param tool_registry Registre contenant l’outil. + * @param identifier Identifiant de l’outil. + * @param detected_version Version détectée, ou NULL. + * @param error Emplacement facultatif pour l’erreur. + * + * @return TRUE en cas de succès, sinon FALSE. + */ +gboolean tool_registry_set_version( + ToolRegistry *tool_registry, + const char *identifier, + const char *detected_version, + GError **error +); + +/** + * @brief Indique si une dépendance obligatoire est explicitement absente. + * + * Les outils encore dans l’état UNKNOWN ne sont pas considérés ici comme + * explicitement absents. + * + * @param tool_registry Registre consulté. + * + * @return TRUE si au moins un outil obligatoire est MISSING. + */ +gboolean tool_registry_has_missing_required_tools( + const ToolRegistry *tool_registry +); + +/** + * @brief Indique si toutes les dépendances obligatoires sont disponibles. + * + * Un outil obligatoire dans l’état UNKNOWN empêche cette fonction de + * retourner TRUE. + * + * @param tool_registry Registre consulté. + * + * @return TRUE si tous les outils obligatoires sont AVAILABLE. + */ +gboolean tool_registry_all_required_tools_available( + const ToolRegistry *tool_registry +); + +/** + * @brief Retourne l’identifiant interne d’un outil. + * + * La chaîne retournée est empruntée. + * + * @param tool_info Outil consulté. + * + * @return Identifiant, ou NULL. + */ +const char *tool_info_get_identifier( + const ToolInfo *tool_info +); + +/** + * @brief Retourne le nom affiché d’un outil. + * + * La chaîne retournée est empruntée. + * + * @param tool_info Outil consulté. + * + * @return Nom affiché, ou NULL. + */ +const char *tool_info_get_display_name( + const ToolInfo *tool_info +); + +/** + * @brief Retourne le nom de l’exécutable d’un outil. + * + * La chaîne retournée est empruntée. + * + * @param tool_info Outil consulté. + * + * @return Nom de l’exécutable, ou NULL. + */ +const char *tool_info_get_executable_name( + const ToolInfo *tool_info +); + +/** + * @brief Retourne l’importance d’un outil. + * + * @param tool_info Outil consulté. + * + * @return Importance de l’outil. + */ +ToolRequirement tool_info_get_requirement( + const ToolInfo *tool_info +); + +/** + * @brief Retourne l’état de disponibilité d’un outil. + * + * @param tool_info Outil consulté. + * + * @return État de disponibilité. + */ +ToolAvailability tool_info_get_availability( + const ToolInfo *tool_info +); + +/** + * @brief Retourne le chemin absolu détecté d’un outil. + * + * La chaîne retournée est empruntée. + * + * @param tool_info Outil consulté. + * + * @return Chemin détecté, ou NULL. + */ +const char *tool_info_get_resolved_path( + const ToolInfo *tool_info +); + +/** + * @brief Retourne la version détectée d’un outil. + * + * La chaîne retournée est empruntée. + * + * @param tool_info Outil consulté. + * + * @return Version détectée, ou NULL. + */ +const char *tool_info_get_detected_version( + const ToolInfo *tool_info +); + +G_END_DECLS + +#endif diff --git a/labfy-investigation b/labfy-investigation index 19ab421984624e06395036da3592beb8d3797a18..ddbf124190c369fd5db5a1630db103e0b1d788cc 100755 GIT binary patch delta 64934 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 HG;;qRwl9R) delta 54739 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 zidentifier, + g_free + ); + + g_clear_pointer( + &tool_info->display_name, + g_free + ); + + g_clear_pointer( + &tool_info->executable_name, + g_free + ); + + g_clear_pointer( + &tool_info->resolved_path, + g_free + ); + + g_clear_pointer( + &tool_info->detected_version, + g_free + ); + + g_free( + tool_info + ); +} + +/** + * @brief Recherche un outil modifiable dans le registre. + * + * @param tool_registry Registre consulté. + * @param identifier Identifiant recherché. + * + * @return Outil correspondant, ou NULL. + */ +static ToolInfo *tool_registry_find_internal( + const ToolRegistry *tool_registry, + const char *identifier +) +{ + guint index = 0; + + if (tool_registry == NULL || + tool_registry->tools == NULL || + !tool_registry_string_is_valid(identifier)) + { + return NULL; + } + + for (index = 0; + index < tool_registry->tools->len; + index++) + { + ToolInfo *tool_info = NULL; + + tool_info = g_ptr_array_index( + tool_registry->tools, + index + ); + + if (tool_info != NULL && + g_strcmp0( + tool_info->identifier, + identifier + ) == 0) + { + return tool_info; + } + } + + return NULL; +} + +GQuark tool_registry_error_quark(void) +{ + return g_quark_from_static_string( + "labfy-investigation-tool-registry-error" + ); +} + +ToolRegistry *tool_registry_new(void) +{ + ToolRegistry *tool_registry = NULL; + + tool_registry = g_new0( + ToolRegistry, + 1 + ); + + tool_registry->tools = + g_ptr_array_new_with_free_func( + tool_info_free + ); + + return tool_registry; +} + +void tool_registry_free( + ToolRegistry *tool_registry +) +{ + if (tool_registry == NULL) + { + return; + } + + if (tool_registry->tools != NULL) + { + g_ptr_array_unref( + tool_registry->tools + ); + + tool_registry->tools = NULL; + } + + g_free( + tool_registry + ); +} + +gboolean tool_registry_register( + ToolRegistry *tool_registry, + const char *identifier, + const char *display_name, + const char *executable_name, + ToolRequirement requirement, + GError **error +) +{ + ToolInfo *tool_info = NULL; + + g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE + ); + + if (tool_registry == NULL || + tool_registry->tools == NULL || + !tool_registry_string_is_valid(identifier) || + !tool_registry_string_is_valid(display_name) || + !tool_registry_string_is_valid(executable_name) || + !tool_registry_requirement_is_valid(requirement)) + { + g_set_error_literal( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT, + "Les arguments fournis au registre d'outils sont invalides." + ); + + return FALSE; + } + + if (tool_registry_find_internal( + tool_registry, + identifier + ) != NULL) + { + g_set_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_DUPLICATE_IDENTIFIER, + "Un outil portant l'identifiant '%s' est déjà enregistré.", + identifier + ); + + return FALSE; + } + + tool_info = g_new0( + ToolInfo, + 1 + ); + + tool_info->identifier = g_strdup( + identifier + ); + + tool_info->display_name = g_strdup( + display_name + ); + + tool_info->executable_name = g_strdup( + executable_name + ); + + tool_info->requirement = requirement; + tool_info->availability = + TOOL_AVAILABILITY_UNKNOWN; + + tool_info->resolved_path = NULL; + tool_info->detected_version = NULL; + + g_ptr_array_add( + tool_registry->tools, + tool_info + ); + + return TRUE; +} + +gboolean tool_registry_refresh( + ToolRegistry *tool_registry, + GError **error +) +{ + guint index = 0; + + g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE + ); + + if (tool_registry == NULL || + tool_registry->tools == NULL) + { + g_set_error_literal( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT, + "Le registre d'outils est invalide." + ); + + return FALSE; + } + + for (index = 0; + index < tool_registry->tools->len; + index++) + { + ToolInfo *tool_info = NULL; + char *found_path = NULL; + char *canonical_path = NULL; + + tool_info = g_ptr_array_index( + tool_registry->tools, + index + ); + + if (tool_info == NULL) + { + continue; + } + + found_path = g_find_program_in_path( + tool_info->executable_name + ); + + g_clear_pointer( + &tool_info->resolved_path, + g_free + ); + + if (found_path == NULL) + { + tool_info->availability = + TOOL_AVAILABILITY_MISSING; + + continue; + } + + /* + * g_find_program_in_path() retourne une nouvelle chaîne. + * + * La canonicalisation garantit que le registre mémorise un + * chemin absolu et normalisé. + */ + canonical_path = g_canonicalize_filename( + found_path, + NULL + ); + + g_free( + found_path + ); + + tool_info->resolved_path = + canonical_path; + + tool_info->availability = + TOOL_AVAILABILITY_AVAILABLE; + } + + return TRUE; +} + +gsize tool_registry_get_count( + const ToolRegistry *tool_registry +) +{ + if (tool_registry == NULL || + tool_registry->tools == NULL) + { + return 0; + } + + return tool_registry->tools->len; +} + +const ToolInfo *tool_registry_get_tool( + const ToolRegistry *tool_registry, + gsize index +) +{ + if (tool_registry == NULL || + tool_registry->tools == NULL || + index >= tool_registry->tools->len) + { + return NULL; + } + + return g_ptr_array_index( + tool_registry->tools, + (guint) index + ); +} + +const ToolInfo *tool_registry_find( + const ToolRegistry *tool_registry, + const char *identifier +) +{ + return tool_registry_find_internal( + tool_registry, + identifier + ); +} + +gboolean tool_registry_set_version( + ToolRegistry *tool_registry, + const char *identifier, + const char *detected_version, + GError **error +) +{ + ToolInfo *tool_info = NULL; + + g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE + ); + + if (tool_registry == NULL || + tool_registry->tools == NULL || + !tool_registry_string_is_valid(identifier)) + { + g_set_error_literal( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT, + "Le registre ou l'identifiant de l'outil est invalide." + ); + + return FALSE; + } + + tool_info = tool_registry_find_internal( + tool_registry, + identifier + ); + + if (tool_info == NULL) + { + g_set_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_NOT_FOUND, + "Aucun outil portant l'identifiant '%s' n'est enregistré.", + identifier + ); + + return FALSE; + } + + g_clear_pointer( + &tool_info->detected_version, + g_free + ); + + if (tool_registry_string_is_valid( + detected_version + )) + { + tool_info->detected_version = + g_strdup( + detected_version + ); + } + + return TRUE; +} + +gboolean tool_registry_has_missing_required_tools( + const ToolRegistry *tool_registry +) +{ + guint index = 0; + + if (tool_registry == NULL || + tool_registry->tools == NULL) + { + return FALSE; + } + + for (index = 0; + index < tool_registry->tools->len; + index++) + { + const ToolInfo *tool_info = NULL; + + tool_info = g_ptr_array_index( + tool_registry->tools, + index + ); + + if (tool_info != NULL && + tool_info->requirement == + TOOL_REQUIREMENT_REQUIRED && + tool_info->availability == + TOOL_AVAILABILITY_MISSING) + { + return TRUE; + } + } + + return FALSE; +} + +gboolean tool_registry_all_required_tools_available( + const ToolRegistry *tool_registry +) +{ + guint index = 0; + + if (tool_registry == NULL || + tool_registry->tools == NULL) + { + return FALSE; + } + + for (index = 0; + index < tool_registry->tools->len; + index++) + { + const ToolInfo *tool_info = NULL; + + tool_info = g_ptr_array_index( + tool_registry->tools, + index + ); + + if (tool_info != NULL && + tool_info->requirement == + TOOL_REQUIREMENT_REQUIRED && + tool_info->availability != + TOOL_AVAILABILITY_AVAILABLE) + { + return FALSE; + } + } + + /* + * Lorsqu'aucun outil obligatoire n'est enregistré, toutes les + * dépendances obligatoires sont considérées comme satisfaites. + */ + return TRUE; +} + +const char *tool_info_get_identifier( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return NULL; + } + + return tool_info->identifier; +} + +const char *tool_info_get_display_name( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return NULL; + } + + return tool_info->display_name; +} + +const char *tool_info_get_executable_name( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return NULL; + } + + return tool_info->executable_name; +} + +ToolRequirement tool_info_get_requirement( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return TOOL_REQUIREMENT_OPTIONAL; + } + + return tool_info->requirement; +} + +ToolAvailability tool_info_get_availability( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return TOOL_AVAILABILITY_UNKNOWN; + } + + return tool_info->availability; +} + +const char *tool_info_get_resolved_path( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return NULL; + } + + return tool_info->resolved_path; +} + +const char *tool_info_get_detected_version( + const ToolInfo *tool_info +) +{ + if (tool_info == NULL) + { + return NULL; + } + + return tool_info->detected_version; +} diff --git a/tests/test_background_task b/tests/test_background_task new file mode 100755 index 0000000000000000000000000000000000000000..0c76ca061ee73c9f29a46eaa1c9d1a8cb4998f6e GIT binary patch literal 46768 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 OzDG(U(-_i<*8c$C?X}?m literal 0 HcmV?d00001 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 zcmeHQeRNbsmaim4P=Uk`l&_H%0l|eP1j3*g4J3h%%SVKuGK!BT-6TCG-LXFqW@Kay z>k^slqGxqIqdNx~W<*Cv^mrU(UF5?d>go>8_<hydzD*i=gcZBC{U7$)Mbit`$`R`iUpn}d;n6Vrl}JA z9ih%sry$=)^NhU85J*k(6=l+X%qKSC9%i|l4re`~;vrGOFB*(C~#iaTJ@4bB)|hcNQA{b4&$CS;B2)oST-izEFuL#e{zAIG%1g z3NlJUNtY5)`i;Gea=mGl=2DxREbG z*TA@ql}5o$*D+40)bC2*s2xr=Nw-=c<>hGirQCi(rC*c3XX8iBH+$Y9HL`ryZEe3> z_t-A#$2c*h45TSCjGPMO#en9vdmCss~aIc@5MsZ+eMh__syvt&!`;qasq z>7SWJlj4w#eCb}Wrc$`SvQ5^&01nDPlOwlWi_=%!d5Kq zkH#$v+Oc>vkZ4m@UBg@}5R3+!La}%-+Az1eB@zxc_?NY0n)C+(0JZvCS|W{QR@mUa z62+bov0|a`1p}%r5s$$ce=HV+Bg_4v7UaRNa|D7>^XHatF3bHGgq(srB^i(9eBXJ7;cwydR`_kqzoy>Eg)jM? z^9`TI3Lbhj<2eVvuTjx|_c{2dIr#e>{QeGpw}W5e;4AirY;%>gw4a0Tj8mzDFJmJC z20Qrr`lzko+;Q-o zk3c>G`3U4A@P843qb28k=4=0;pKpEfW0-sU{&8o#FtyLu{%pTJ+I*_w1+Y`2U&P;% z5mh*%d^5=occ+j>@1{IWK@RWJ`R$aasmI}+I{!H3X=-$MtIj_}d76S8-l+4NC{I(5 z!y9z|N0g^2$Kf?Pe<$T>nsc~K=WnMxO+5}T)%jZ~Pg9P=^~h6wCjGIl3Lsg-jWe(0YQa3D;L9nud{dok&BPV2O$){fD(n` z)KquLh&80Qhbi>OY5j_kM8*(?A`qSmUUB`=j1$%uje;Gd;1`=$bU#fd~$%vXX zp8Q)=`99q>CnhiQwO1~nLtn@H@d3W|m3xs%4XVQ5WFsoGxA-9@m0hAj1U)gC8@eVqf!&LdJ>3$k6aI{w?&(UqKlIQTkhkNetJA6JRdzRp2S zxU2JZR!lScR}$%XdHXrqv94s@m#LI*J@g5SxtgzIH>`g6Ejrrk>v%o65()?wS^Ac- z^d}N_7N5(O&Sgufzosn}!V-g$V@SK=DFZ5J&@cwQ-~cI138`JEsK*Ve-Joh1HG)z9 z>OkE?PBZFegPLnlmodu2sOuf5YJ_RS^Lw(y^IJKO)aeTs`oH-F|B{nW(tiSb9h6yu7`PEj{3{^bjny zA1}}$dcdHT8kDj8^7bi=y3v8U3il%E%6ia=x}l{&lT3SOl(G9i(;Wk4b|nu09tASmEy+6 zAY)?(+h}9R7)R095&YuXZVjt6u(yYh_&!t_!nK#9`bm!ftk`yF|Y>=Y#YN8 z4BKX4IzIo7E5q08xQ~#v&f+IQw!(-I(`dYNo-eoT7drtwM z2j4T`&oRiO0(}_#GY0oJ;BLEjjmrR68t@JS{xgq|4>0)Gf2NWbIZvWLpqbKTf9cVc zyv4wi4Bx`=4F=xrIDdbh0e{B8s|@@NhCj&gE7PTS^C{c{I9I#fVEY*CtBn0QV+W@x0~)0>b!hG+H9c326`F$zlWjc z2=pRmJmr9f4D^LTRCw`ZhCa)hZyrmfbcxS^p^|GHz%m28!vHU0;IA0C2|zt$A!h%C zs!D7+i@ng~6PbJPMTO~_e0CoBQ8C?EJ)5n*$X4f&)y@G&%qU-zwxkD*Lj`F&j~hEj zv5Jps4QD&Fu1u}i2X;0rF|!HGH8HShkL=jq-TIY3OnqP3H6oKKe%~E8|WAVy_{Y6n4#YW)L<&9Lo!CsFFGqe zK1&B+I%AG9rpU%jcVPaLhKtUM9R?%ie8QMtAC+?Max_?n!Q7r%&N0T^Yh!LjD7b>j zw^4d>5_)BF2+qvpOSpn0cVqsOd;@c={Z?=ot*-_1OTU5YXtSuaJ*@Op3eBSWv3TdJ2Bx9K-5LZh$>g{#qP?yHB6*Ja@m* ziLb{UA1-C8nu3oEB>DP9FLu;x z4;}O8j@9Olqhzfs39Wpp}$fIyAI)Ac^`7F0MI>fFS|BR+jSwNaEbWfCAb9HYZ~?{2C9)y`3U4A zkdHt<0{IB!Ban|kJ_7j&cC4fZm&Qrit-jEIzSpl2soKCRPMv*8FIw ziQe!G##DB$K@%*d!B!{?Ts+j|kB9IoYd8`JdK(oH&-s;}d5h-EA%uBZbgZYhveguf zTVa1|a4ccQjrWYqTJA{CI8SAzhaQ1a%3&wIs*UZCa^1YEY8N)t&7RRvH-DZrZ+=a! zRa3X1wz^^dg2l#6E<0`hXfPZ%9+4%fMlSuv=1@xj5UVkgaN^3832=3DG!l-qM4CcD zZ)-rgvhd~W#3vJ-8JKSxmsxdlYT4I@U~5~8KOR)}0sJ%75YEK1GHa$k7OV-@M8e@9 z^%XaRg& zCmM_=qTwLdoJ75Sr!sT+$>&3FjP{n?W`|D_PqER^-WIv5)kq_&^pWXIvw-!+SH_in zVEDG)#A-SlagxzrBU>13jD!RA`m9zNnckgAx0?)II?#4Mi)k~KiH6Oks-K^w;^~e? z!^e1!w#6Od#QL^V9S7jS4O;Qxn@&Pe;@q<~#h%`6weUf!LYJ@WPBtYx)lU+2j$M^ovLpQydk*Hs%S(|~O4 zMCI^!W$V+yiOOm7$D7CY)>f*{Ik}lflbTCB@kk=(!34>pCqW+YnnQaYjQXSKy+Kbb z5{`RT;1iiZFy>XHlD=T+*^%}`^Qpt7S!upKaG>UzoBpG52o~A5pckS^S1gA-6b=Me zre$=Lfu~uQ1KUeZQOPC`Ct6ypWx;0uiclmGRRzO}rqeqZczCQ{d^MFi0DALlsT4ib zOuU{-(ZkV~_NP*#K)1hZn0g#{==%Wnqze#GOCptig)Nn$O(59~1F^c4KI z3VX3Gyie(ID}qG`5&_kq6)?M`n#*z&^P+4i4? zd=2`6$0@%yZT|qvM>yr*Nz1>0{1)JI$%iAZKY;u;C%*6>?D8*#{5{C8%aC7f%ddmn z^KL3t?v%Ht%fA`&a>zYSIr~p6N{8MqDlSsT^|xhsfk=6Xi9`cl;5T?Ajzk?3Z_nBJ zjX1{JEb0@M>;8*8ibE>u*GG;@PbnH)h)?E9!92YPX7KK44p|>as7$<$qrXorT%&dp z4k3c>G`3U4AkdHt< z0)OifkbP-n9~!ye{sRX_@}If#16d$)+8c*be?#nza`0)aPOo?j#pfhC$^JO_%0wqD zN$E6{sqB+8obw_-_GKzUtmm+{Mv2x7DCsY}L1_(xQj+DgZb7Mv{i78KN`np2>ll2f z3By#9_r)=58cOxBlC0<9D>I$w%LGc>m?8Y*?1=ciQ)?-8DpM&RpKs^Z)Ne_K|ZJJe3w@kY+Kxis^EuE12HK^lqj z{pLKZfRBN)>eJd@A@zFR$BEU|`OGhK@o8tC;g4Af2P(}>SEUK!iRs9^x88heRoFs zJ6T`OyXCCEYlv1?!;z=7iuJo$pWRje!uoIVK%>{5p}&ds)g>B^9$*rEqC);hc%Tyf z|6+ZQOaCD27x2J!knJ2}{VLX%c+wY{+1llF3_RKRgTODqO6NV5Y}i4v>0h7+uo5Nv z8H)N;ZD+7O&Ix~x=AUEl4=Ma57+^eVh^puQDf~sym$nlgQ9tz0MBHSb&oL~dHS28p z-v{5rI!k3AveIwWP#vm5gBaW0&RI>dZGK2)Uijv=}~didB$ z&e8RCa?J4<@XtWM)r;F;$$B(>ESt^G8Q^<*n^D(-Uz#QUwDSr1U!@;1q_Jyr*uM+> zky-3-Wjmwr@gpVu%mlOx{4)xN*yEBG;?HlHFXOQAyV=f<*`M23@K>?#F%11o1BXKq zkZf_d5d2cdc*thd2vi@&~Ux-;rsnm$+!p3NPk~cz|A}$MAaetEnV;S~i3@-#Xy)~m1Z?zg} zb4J=fF%YquS|ZE*Emi>UC&es(Vx?+~;B_jz;uOH%h*>pgN5v3t5s8=1qN~*MC?3pO zfkbQTDnJ}LylWSVXQ;~a+}>~CX^H*DhI!0vS@jEQ8yXf{vlh*()-T0b-fx>{!s%zx z*_5UlrHlvD+4L$hA26pMP-jz~lBsN-R%cV3oT+FYTW3=&&r~$eud^vmGK#JT+1WJ9 zsNI9%0JXYh%~~*HZmm^2uLhfSS{9}`R;`bjzM2KfnmuR!%o%g6`Lkv%tZlFwX3U&Z z3&onn^JdJgtHw^9-(XKr+M2UUcFClzG1HrbI``|$P|;oL#P3FAlWOn2&eo$=-F$2i z8VH50L=3x#p4?8PI0^73pV?S6n-}K&jd(N6rT0!Xu4QaMno;8{?~mYp7_?Et+-keM z0<K@^F)hdNz~35b zgnM{Rk^XqKC#F=ipYmdiZpF~+x&(ZaEKN)4o)gm*oz~$xOG)S`lePci@{^Ig$Q9rx z_=g!URPMh8M7qv26&Y-M5E1-yj29|+DOc`?#YPnl(r*Q%@7t4XXAKuf_xW@vc)5S} zfk&!RzN`ZXt#Uc+%Ia-y=^k6~a$haf1KX6uf6)`V1Twm3m;7^lUoNyvqs=;n(|=~G z7Pc*TSvL^6lNF_Wcl}o|ekSY5I)u<32cBZ)#;*a7{9?D$^Aet)$odRabP_)#|9u=d z@gBwr-71PqS!_>#XnyF#%l(4TLIJq&V)lnFyv*-~%KDS&yZyhD@e+TTrweV61td1$ za!38hg_rv*p$|*JOx@*gapBc;R%Cjg?U><9`>~dK90%BY#O{CY{pYEFIg=Z|9YW{$ z;ohge$_d7?8~>6EFY6{kJubYv{%=B#yCZvVYgrc*>Ml?6LVph|tu^p)VXu?OdWq;k zMJLG%Jqj-MeZk8*mQeXW2(r#7IOzvp089N>@UmaG(6Nv?li-EYzs7LlW!+I|vlEPC z!3jOhg_rwtq2i~Q5uD^pfhV5$FY8Z2-TLIKGY#VM%bZLc3x1f3FL)<)b#aYYQ*VGW v4%2Pv1^9_SGXB$go%n7L=I_|64c+hRa8j=5(y~`JyneY7vh!R3S62Nm*59e1 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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 +#include + +#include + +/** + * @struct ToolRegistryPathFixture + * @brief Environnement temporaire contenant un faux exécutable. + */ +typedef struct +{ + char *temporary_directory; + char *fake_executable_path; + char *original_path; +} ToolRegistryPathFixture; + +/** + * @brief Crée un faux exécutable. + * + * @param executable_path Chemin du fichier à créer. + */ +static void test_tool_registry_create_fake_executable( + const char *executable_path +) +{ + GError *error = NULL; + gboolean write_success = FALSE; + int chmod_result = 0; + + g_assert_nonnull( + executable_path + ); + + write_success = g_file_set_contents( + executable_path, + "#!/bin/sh\n" + "exit 0\n", + -1, + &error + ); + + g_assert_no_error( + error + ); + + g_assert_true( + write_success + ); + + chmod_result = g_chmod( + executable_path, + S_IRUSR | + S_IWUSR | + S_IXUSR + ); + + g_assert_cmpint( + chmod_result, + ==, + 0 + ); +} + +/** + * @brief Prépare un PATH contenant uniquement un faux outil. + * + * @param fixture Fixture à initialiser. + * @param user_data Données inutilisées. + */ +static void test_tool_registry_path_fixture_setup( + ToolRegistryPathFixture *fixture, + gconstpointer user_data +) +{ + GError *error = NULL; + + (void) user_data; + + fixture->original_path = g_strdup( + g_getenv("PATH") + ); + + fixture->temporary_directory = + g_dir_make_tmp( + "labfy-tool-registry-XXXXXX", + &error + ); + + g_assert_no_error( + error + ); + + g_assert_nonnull( + fixture->temporary_directory + ); + + fixture->fake_executable_path = + g_build_filename( + fixture->temporary_directory, + "fake_osint_tool", + NULL + ); + + test_tool_registry_create_fake_executable( + fixture->fake_executable_path + ); + + g_assert_true( + g_setenv( + "PATH", + fixture->temporary_directory, + TRUE + ) + ); +} + +/** + * @brief Restaure le PATH et supprime les fichiers temporaires. + * + * @param fixture Fixture à nettoyer. + * @param user_data Données inutilisées. + */ +static void test_tool_registry_path_fixture_teardown( + ToolRegistryPathFixture *fixture, + gconstpointer user_data +) +{ + (void) user_data; + + if (fixture->original_path != NULL) + { + g_setenv( + "PATH", + fixture->original_path, + TRUE + ); + } + else + { + g_unsetenv( + "PATH" + ); + } + + if (fixture->fake_executable_path != NULL) + { + g_remove( + fixture->fake_executable_path + ); + } + + if (fixture->temporary_directory != NULL) + { + g_rmdir( + fixture->temporary_directory + ); + } + + g_clear_pointer( + &fixture->original_path, + g_free + ); + + g_clear_pointer( + &fixture->fake_executable_path, + g_free + ); + + g_clear_pointer( + &fixture->temporary_directory, + g_free + ); +} + +/** + * @brief Vérifie la création d’un registre vide. + */ +static void test_tool_registry_construction(void) +{ + ToolRegistry *tool_registry = NULL; + + tool_registry = tool_registry_new(); + + g_assert_nonnull( + tool_registry + ); + + g_assert_cmpuint( + tool_registry_get_count( + tool_registry + ), + ==, + 0 + ); + + g_assert_null( + tool_registry_get_tool( + tool_registry, + 0 + ) + ); + + g_assert_null( + tool_registry_find( + tool_registry, + "unknown.tool" + ) + ); + + tool_registry_free( + tool_registry + ); + + tool_registry_free( + NULL + ); +} + +/** + * @brief Vérifie l’enregistrement et les accesseurs. + */ +static void test_tool_registry_register(void) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "dns.dig", + "dig", + "dig", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_cmpuint( + tool_registry_get_count( + tool_registry + ), + ==, + 1 + ); + + tool_info = tool_registry_get_tool( + tool_registry, + 0 + ); + + g_assert_nonnull( + tool_info + ); + + g_assert_cmpstr( + tool_info_get_identifier( + tool_info + ), + ==, + "dns.dig" + ); + + g_assert_cmpstr( + tool_info_get_display_name( + tool_info + ), + ==, + "dig" + ); + + g_assert_cmpstr( + tool_info_get_executable_name( + tool_info + ), + ==, + "dig" + ); + + g_assert_cmpint( + tool_info_get_requirement( + tool_info + ), + ==, + TOOL_REQUIREMENT_OPTIONAL + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_UNKNOWN + ); + + g_assert_null( + tool_info_get_resolved_path( + tool_info + ) + ); + + g_assert_null( + tool_info_get_detected_version( + tool_info + ) + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie que le registre duplique les chaînes reçues. + */ +static void test_tool_registry_string_ownership(void) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + + char *identifier = NULL; + char *display_name = NULL; + char *executable_name = NULL; + + GError *error = NULL; + + identifier = g_strdup( + "network.fake" + ); + + display_name = g_strdup( + "Fake Tool" + ); + + executable_name = g_strdup( + "fake_tool" + ); + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + identifier, + display_name, + executable_name, + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_free( + identifier + ); + + g_free( + display_name + ); + + g_free( + executable_name + ); + + tool_info = tool_registry_find( + tool_registry, + "network.fake" + ); + + g_assert_nonnull( + tool_info + ); + + g_assert_cmpstr( + tool_info_get_identifier( + tool_info + ), + ==, + "network.fake" + ); + + g_assert_cmpstr( + tool_info_get_display_name( + tool_info + ), + ==, + "Fake Tool" + ); + + g_assert_cmpstr( + tool_info_get_executable_name( + tool_info + ), + ==, + "fake_tool" + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie le refus des identifiants en double. + */ +static void test_tool_registry_duplicate_identifier(void) +{ + ToolRegistry *tool_registry = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "dns.dig", + "dig", + "dig", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_false( + tool_registry_register( + tool_registry, + "dns.dig", + "Autre outil", + "other_tool", + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_DUPLICATE_IDENTIFIER + ); + + g_clear_error( + &error + ); + + g_assert_cmpuint( + tool_registry_get_count( + tool_registry + ), + ==, + 1 + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie les arguments invalides. + */ +static void test_tool_registry_invalid_arguments(void) +{ + ToolRegistry *tool_registry = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_false( + tool_registry_register( + NULL, + "dns.dig", + "dig", + "dig", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_assert_false( + tool_registry_register( + tool_registry, + "", + "dig", + "dig", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_assert_false( + tool_registry_register( + tool_registry, + "dns.dig", + "", + "dig", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_assert_false( + tool_registry_register( + tool_registry, + "dns.dig", + "dig", + "", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_assert_false( + tool_registry_register( + tool_registry, + "dns.dig", + "dig", + "dig", + (ToolRequirement) 999, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_assert_false( + tool_registry_refresh( + NULL, + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie la recherche par identifiant. + */ +static void test_tool_registry_find_tool(void) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "tls.openssl", + "OpenSSL", + "openssl", + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_no_error( + error + ); + + tool_info = tool_registry_find( + tool_registry, + "tls.openssl" + ); + + g_assert_nonnull( + tool_info + ); + + g_assert_null( + tool_registry_find( + tool_registry, + "unknown.tool" + ) + ); + + g_assert_null( + tool_registry_find( + tool_registry, + NULL + ) + ); + + g_assert_null( + tool_registry_find( + tool_registry, + "" + ) + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie la détection d’un faux exécutable. + */ +static void test_tool_registry_available_tool( + ToolRegistryPathFixture *fixture, + gconstpointer user_data +) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + (void) user_data; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "test.fake", + "Fake OSINT Tool", + "fake_osint_tool", + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + tool_info = tool_registry_find( + tool_registry, + "test.fake" + ); + + g_assert_nonnull( + tool_info + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_AVAILABLE + ); + + g_assert_nonnull( + tool_info_get_resolved_path( + tool_info + ) + ); + + g_assert_cmpstr( + tool_info_get_resolved_path( + tool_info + ), + ==, + fixture->fake_executable_path + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie la détection d’un outil absent. + */ +static void test_tool_registry_missing_tool(void) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "test.missing", + "Missing Tool", + "labfy_tool_that_must_not_exist_036", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + tool_info = tool_registry_find( + tool_registry, + "test.missing" + ); + + g_assert_nonnull( + tool_info + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_MISSING + ); + + g_assert_null( + tool_info_get_resolved_path( + tool_info + ) + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie les transitions de disponibilité. + */ +static void test_tool_registry_successive_refresh( + ToolRegistryPathFixture *fixture, + gconstpointer user_data +) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + (void) user_data; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "test.fake", + "Fake OSINT Tool", + "fake_osint_tool", + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_no_error( + error + ); + + /* + * Première détection : le fichier existe. + */ + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + tool_info = tool_registry_find( + tool_registry, + "test.fake" + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_AVAILABLE + ); + + /* + * Deuxième détection : le fichier a été supprimé. + */ + g_assert_cmpint( + g_remove( + fixture->fake_executable_path + ), + ==, + 0 + ); + + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_MISSING + ); + + g_assert_null( + tool_info_get_resolved_path( + tool_info + ) + ); + + /* + * Troisième détection : le fichier est recréé. + */ + test_tool_registry_create_fake_executable( + fixture->fake_executable_path + ); + + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_cmpint( + tool_info_get_availability( + tool_info + ), + ==, + TOOL_AVAILABILITY_AVAILABLE + ); + + g_assert_nonnull( + tool_info_get_resolved_path( + tool_info + ) + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie le stockage et l’effacement d’une version. + */ +static void test_tool_registry_version(void) +{ + ToolRegistry *tool_registry = NULL; + const ToolInfo *tool_info = NULL; + GError *error = NULL; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_register( + tool_registry, + "tls.openssl", + "OpenSSL", + "openssl", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + tool_registry_set_version( + tool_registry, + "tls.openssl", + "3.5.1", + &error + ) + ); + + g_assert_no_error( + error + ); + + tool_info = tool_registry_find( + tool_registry, + "tls.openssl" + ); + + g_assert_cmpstr( + tool_info_get_detected_version( + tool_info + ), + ==, + "3.5.1" + ); + + g_assert_true( + tool_registry_set_version( + tool_registry, + "tls.openssl", + "3.6.0", + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_cmpstr( + tool_info_get_detected_version( + tool_info + ), + ==, + "3.6.0" + ); + + g_assert_true( + tool_registry_set_version( + tool_registry, + "tls.openssl", + NULL, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_null( + tool_info_get_detected_version( + tool_info + ) + ); + + g_assert_false( + tool_registry_set_version( + tool_registry, + "unknown.tool", + "1.0", + &error + ) + ); + + g_assert_error( + error, + TOOL_REGISTRY_ERROR, + TOOL_REGISTRY_ERROR_NOT_FOUND + ); + + g_clear_error( + &error + ); + + tool_registry_free( + tool_registry + ); +} + +/** + * @brief Vérifie l’état global des dépendances obligatoires. + */ +static void test_tool_registry_required_tools( + ToolRegistryPathFixture *fixture, + gconstpointer user_data +) +{ + ToolRegistry *tool_registry = NULL; + GError *error = NULL; + + (void) fixture; + (void) user_data; + + tool_registry = tool_registry_new(); + + g_assert_true( + tool_registry_all_required_tools_available( + tool_registry + ) + ); + + g_assert_false( + tool_registry_has_missing_required_tools( + tool_registry + ) + ); + + g_assert_true( + tool_registry_register( + tool_registry, + "test.required", + "Required Fake Tool", + "fake_osint_tool", + TOOL_REQUIREMENT_REQUIRED, + &error + ) + ); + + g_assert_no_error( + error + ); + + g_assert_true( + tool_registry_register( + tool_registry, + "test.optional", + "Optional Missing Tool", + "labfy_optional_tool_that_must_not_exist_036", + TOOL_REQUIREMENT_OPTIONAL, + &error + ) + ); + + g_assert_no_error( + error + ); + + /* + * L’outil obligatoire est encore UNKNOWN. + */ + g_assert_false( + tool_registry_all_required_tools_available( + tool_registry + ) + ); + + g_assert_false( + tool_registry_has_missing_required_tools( + tool_registry + ) + ); + + g_assert_true( + tool_registry_refresh( + tool_registry, + &error + ) + ); + + g_assert_no_error( + error + ); + + /* + * L’outil obligatoire existe. + * L’outil optionnel absent ne bloque pas l’état global. + */ + g_assert_true( + tool_registry_all_required_tools_available( + tool_registry + ) + ); + + g_assert_false( + tool_registry_has_missing_required_tools( + tool_registry + ) + ); + + tool_registry_free( + tool_registry + ); +} + +int main( + int argc, + char **argv +) +{ + g_test_init( + &argc, + &argv, + NULL + ); + + g_test_add_func( + "/tool_registry/construction", + test_tool_registry_construction + ); + + g_test_add_func( + "/tool_registry/register", + test_tool_registry_register + ); + + g_test_add_func( + "/tool_registry/string_ownership", + test_tool_registry_string_ownership + ); + + g_test_add_func( + "/tool_registry/duplicate_identifier", + test_tool_registry_duplicate_identifier + ); + + g_test_add_func( + "/tool_registry/invalid_arguments", + test_tool_registry_invalid_arguments + ); + + g_test_add_func( + "/tool_registry/find", + test_tool_registry_find_tool + ); + + g_test_add( + "/tool_registry/available_tool", + ToolRegistryPathFixture, + NULL, + test_tool_registry_path_fixture_setup, + test_tool_registry_available_tool, + test_tool_registry_path_fixture_teardown + ); + + g_test_add_func( + "/tool_registry/missing_tool", + test_tool_registry_missing_tool + ); + + g_test_add( + "/tool_registry/successive_refresh", + ToolRegistryPathFixture, + NULL, + test_tool_registry_path_fixture_setup, + test_tool_registry_successive_refresh, + test_tool_registry_path_fixture_teardown + ); + + g_test_add_func( + "/tool_registry/version", + test_tool_registry_version + ); + + g_test_add( + "/tool_registry/required_tools", + ToolRegistryPathFixture, + NULL, + test_tool_registry_path_fixture_setup, + test_tool_registry_required_tools, + test_tool_registry_path_fixture_teardown + ); + + return g_test_run(); +} diff --git a/tests/test_transaction b/tests/test_transaction new file mode 100755 index 0000000000000000000000000000000000000000..3533f197f356319952e8176b0788354d8f1b182e GIT binary patch literal 32760 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 G(fU7t_!_DJ literal 0 HcmV?d00001