diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2021-07-04 20:55:30 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2021-07-04 20:55:30 (GMT) |
commit | 59febc74741332fec4df71962fe9174d511df384 (patch) | |
tree | e8d8004506850ebb168ef7ba0aacdeeeaa0f749c /src/analysis | |
parent | 5958d9b25f806df73cd0634de2c9475eb6497e8c (diff) |
Save all needed information into project files.
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/binary.c | 286 | ||||
-rw-r--r-- | src/analysis/binary.h | 14 | ||||
-rw-r--r-- | src/analysis/project.c | 67 |
3 files changed, 48 insertions, 319 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 19b46a2..2b23eff 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -65,17 +65,11 @@ struct _GLoadedBinary { GObject parent; /* A laisser en premier */ - char *username; /* Identifiant de l'utilisateur*/ - bool username_changed; /* Mémorise les changements */ - bool use_remote; /* Enregistrements distants ? */ char *remote_host; /* Nom du serveur distant */ char *remote_port; /* Port du serveur distant */ + GAnalystClient *client; /* Enregistrements courants */ - GAnalystClient *local; /* Enregistrements locaux */ - GAnalystClient *remote; /* Enregistrements distants */ - - DBStorage storages[DBF_COUNT]; /* Lieux d'enregistrement */ GList *collections; /* Ensemble de modifications */ GExeFormat *format; /* Format du binaire */ @@ -246,17 +240,10 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *klass) static void g_loaded_binary_init(GLoadedBinary *binary) { - binary->username = strdup("default"); - binary->use_remote = false; binary->remote_host = strdup("localhost"); binary->remote_port = strdup("1337"); - binary->storages[DBF_BOOKMARKS] = DBS_ALL_LOCAL; - binary->storages[DBF_COMMENTS] = DBS_ALL_LOCAL; - binary->storages[DBF_MOVES] = DBS_ALL_LOCAL; - binary->storages[DBF_DISPLAY_SWITCHERS] = DBS_ALL_LOCAL; - binary->collections = create_collections_list(); attach_binary_to_collections(binary->collections, binary); @@ -332,8 +319,7 @@ static void g_loaded_binary_dispose(GLoadedBinary *binary) { BinaryView i; /* Boucle de parcours */ - g_clear_object(&binary->local); - g_clear_object(&binary->remote); + g_clear_object(&binary->client); delete_collections_list(&binary->collections); @@ -366,9 +352,8 @@ static void g_loaded_binary_dispose(GLoadedBinary *binary) static void g_loaded_binary_finalize(GLoadedBinary *binary) { - free(binary->username); - free(binary->remote_host); + free(binary->remote_port); G_OBJECT_CLASS(g_loaded_binary_parent_class)->finalize(G_OBJECT(binary)); @@ -427,7 +412,6 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContext char *value; /* Valeur lue à partie du XML */ char *access; /* Chemin d'accès à un élément */ char *port; /* Port de communication */ - DBFeatures i; /* Boucle de parcours */ result = true; @@ -441,21 +425,6 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContext free(value); - /* Nom d'utilisateur */ - - access = strdup(storage_path); - access = stradd(access, "/Username"); - - value = get_node_text_value(context, access); - - if (value != NULL) - { - g_loaded_binary_set_username(binary, value); - free(value); - } - - free(access); - /* Serveur distant */ access = strdup(storage_path); @@ -483,46 +452,6 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContext free(access); - /* Fonctionnalités */ - - for (i = 0; i < DBF_COUNT; i++) - { - access = strdup(storage_path); - access = stradd(access, "/Features/"); - - switch (i) - { - case DBF_BOOKMARKS: - access = stradd(access, "Bookmarks"); - break; - case DBF_COMMENTS: - access = stradd(access, "Comments"); - break; - case DBF_MOVES: - access = stradd(access, "Moves"); - break; - case DBF_DISPLAY_SWITCHERS: - access = stradd(access, "Segments"); - break; - default: - /* Pour GCC */ - assert(false); - break; - } - - value = get_node_text_value(context, access); - - if (value != NULL) - { - if (atoi(value) <= DBS_MAX) - g_loaded_binary_set_storage(binary, i, atoi(value)); - - } - - free(access); - - } - if (binary->use_remote) g_loaded_binary_set_remote_storage_usage(binary, true); @@ -555,7 +484,6 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDoc *xd bool result; /* Bilan à faire remonter */ char *storage_path; /* Partie "Enregistrement" */ char *access; /* Chemin d'accès à un élément */ - DBFeatures i; /* Boucle de parcours */ result = true; @@ -565,15 +493,6 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDoc *xd result &= add_string_attribute_to_node(xdoc, context, storage_path, "remote", binary->use_remote ? "true" : "false"); - /* Nom d'utilisateur */ - - access = strdup(storage_path); - access = stradd(access, "/Username"); - - result &= add_content_to_node(xdoc, context, access, binary->username); - - free(access); - /* Serveur distant */ access = strdup(storage_path); @@ -585,39 +504,6 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDoc *xd free(access); - /* Fonctionnalités */ - - for (i = 0; i < DBF_COUNT; i++) - { - access = strdup(storage_path); - access = stradd(access, "/Features/"); - - switch (i) - { - case DBF_BOOKMARKS: - access = stradd(access, "Bookmarks"); - break; - case DBF_COMMENTS: - access = stradd(access, "Comments"); - break; - case DBF_MOVES: - access = stradd(access, "Moves"); - break; - case DBF_DISPLAY_SWITCHERS: - access = stradd(access, "Segments"); - break; - default: - /* Pour GCC */ - assert(false); - break; - } - - result &= add_uint_content_to_node(xdoc, context, access, binary->storages[i]); - - free(access); - - } - free(storage_path); return result; @@ -629,52 +515,6 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDoc *xd * * * Paramètres : binary = élément binaire à consulter. * * * -* Description : Identifie l'utilisateur analysant le binaire courant. * -* * -* Retour : Nom de l'utilisateur manipulant le binaire. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_loaded_binary_get_username(const GLoadedBinary *binary) -{ - return binary->username; - -} - - -/****************************************************************************** -* * -* Paramètres : binary = élément binaire à consulter. * -* username = nom de l'utilisateur manipulant le binaire. * -* * -* Description : Définit l'utilisateur analysant le binaire courant. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_loaded_binary_set_username(GLoadedBinary *binary, const char *username) -{ - bool changed; /* Note les changements */ - - changed = (strcmp(binary->username, username) != 0); - - free(binary->username); - binary->username = strdup(username); - - binary->username_changed = changed; - -} - - -/****************************************************************************** -* * -* Paramètres : binary = élément binaire à consulter. * -* * * Description : Détermine si tous les enregistrements sont locaux ou non. * * * * Retour : Statut de l'utilisation du serveur local. * @@ -707,7 +547,7 @@ void g_loaded_binary_set_remote_storage_usage(GLoadedBinary *binary, bool use) { binary->use_remote = use; - g_clear_object(&binary->remote); + g_clear_object(&binary->client); if (use) g_loaded_binary_connect_remote(binary); @@ -764,47 +604,6 @@ void g_loaded_binary_set_remote_server(GLoadedBinary *binary, const char *host, /****************************************************************************** * * -* Paramètres : binary = élément binaire à consulter. * -* feature = fonctionnalité visée par la requête. * -* * -* Description : Indique la forme d'enregistrement d'une fonctionnalité. * -* * -* Retour : Type d'enregistrement sélectionné. * -* * -* Remarques : - * -* * -******************************************************************************/ - -DBStorage g_loaded_binary_get_storage(const GLoadedBinary *binary, DBFeatures feature) -{ - return binary->storages[feature]; - -} - - -/****************************************************************************** -* * -* Paramètres : binary = élément binaire à consulter. * -* feature = fonctionnalité visée par la requête. * -* storage = type d'enregistrement sélectionné. * -* * -* Description : Définit la forme d'enregistrement d'une fonctionnalité. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_loaded_binary_set_storage(GLoadedBinary *binary, DBFeatures feature, DBStorage storage) -{ - binary->storages[feature] = storage; - -} - - -/****************************************************************************** -* * * Paramètres : binary = élément binaire à manipuler. * * * * Description : Etablit une connexion au serveur interne en tant que client. * @@ -829,9 +628,9 @@ static bool g_loaded_binary_connect_internal(GLoadedBinary *binary) /* Tentative de connexion */ - binary->local = g_analyst_client_new(checksum, binary->collections); + binary->client = g_analyst_client_new(checksum, binary->collections); - result = g_hub_client_start_internal(G_HUB_CLIENT(binary->local)); + result = g_hub_client_start_internal(G_HUB_CLIENT(binary->client)); return result; @@ -856,7 +655,7 @@ static bool g_loaded_binary_connect_remote(GLoadedBinary *binary) GBinContent *content; /* Contenu bianire manipulé */ const gchar *checksum; /* Identifiant de binaire */ - assert(binary->remote == NULL); + assert(binary->client == NULL); /* Détermination de l'identifiant */ @@ -866,9 +665,9 @@ static bool g_loaded_binary_connect_remote(GLoadedBinary *binary) /* Tentative de connexion */ - binary->remote = g_analyst_client_new(checksum, binary->collections); + binary->client = g_analyst_client_new(checksum, binary->collections); - result = g_hub_client_start_remote(G_HUB_CLIENT(binary->remote), + result = g_hub_client_start_remote(G_HUB_CLIENT(binary->client), binary->remote_host, binary->remote_port, true); if (!result) @@ -876,7 +675,7 @@ static bool g_loaded_binary_connect_remote(GLoadedBinary *binary) log_variadic_message(LMT_ERROR, _("Failed to connect to remote host '%s:%s'"), binary->remote_host, binary->remote_port); - g_clear_object(&binary->remote); + g_clear_object(&binary->client); } @@ -940,8 +739,7 @@ bool g_loaded_binary_save_cache(const GLoadedBinary *binary) /****************************************************************************** * * -* Paramètres : binary = élément binaire à consulter. * -* internal = sélectionne le client à renvoyer selon sa nature. * +* Paramètres : binary = élément binaire à consulter. * * * * Description : Fournit un client assurant la liaison avec un serveur. * * * @@ -951,14 +749,11 @@ bool g_loaded_binary_save_cache(const GLoadedBinary *binary) * * ******************************************************************************/ -GAnalystClient *g_loaded_binary_get_client(const GLoadedBinary *binary, bool internal) +GAnalystClient *g_loaded_binary_get_client(const GLoadedBinary *binary) { GAnalystClient *result; /* Instance à retourner */ - if (internal) - result = binary->local; - else - result = binary->remote; + result = binary->client; if (result != NULL) g_object_ref(G_OBJECT(result)); @@ -1054,15 +849,9 @@ GDbCollection *g_loaded_binary_find_collection(const GLoadedBinary *binary, DBFe bool g_loaded_binary_add_to_collection(GLoadedBinary *binary, GDbItem *item) { bool result; /* Bilan à faire remonter */ - DBFeatures feature; /* Domaine de fonctionnalité */ - DBStorage storage; /* Forme d'enregistrement */ GAnalystClient *client; /* Liaison à utiliser */ - feature = g_db_item_get_feature(item); - - storage = g_loaded_binary_get_storage(binary, feature); - - client = g_loaded_binary_get_client(binary, storage == DBS_ALL_LOCAL); + client = g_loaded_binary_get_client(binary); if (client == NULL) { @@ -1099,24 +888,13 @@ bool g_loaded_binary_add_to_collection(GLoadedBinary *binary, GDbItem *item) bool g_loaded_binary_set_last_active(GLoadedBinary *binary, timestamp_t timestamp) { bool result; /* Bilan à retourner */ - bool done; /* Suivi des actions menées */ result = true; - done = false; - if (binary->local != NULL) - { - result = g_analyst_client_set_last_active(binary->local, timestamp); - done = true; - } - - if (result && binary->remote != NULL) - { - result = g_analyst_client_set_last_active(binary->remote, timestamp); - done = true; - } + if (binary->client != NULL) + result = g_analyst_client_set_last_active(binary->client, timestamp); - if (!done) + else { log_simple_message(LMT_ERROR, _("No connection to a server found in order to set timestamp")); result = false; @@ -1530,6 +1308,9 @@ static bool g_loaded_binary_restore(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPat static bool g_loaded_binary_save(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPathContext *context, const char *path) { bool result; /* Bilan à faire remonter */ + GBinContent *content; /* Contenu brut à manipuler */ + const gchar *hash; /* Empreinte d'un contenu */ + char *key; /* Support associé au contenu */ /* Mise en cache des instructions */ @@ -1538,6 +1319,31 @@ static bool g_loaded_binary_save(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPathCo /* Elément divers associés au binaire */ if (result) + { + content = g_loaded_content_get_content(G_LOADED_CONTENT(binary)); + + hash = g_binary_content_get_checksum(content); + result = add_string_attribute_to_node(xdoc, context, path, "hash", hash); + + g_object_unref(G_OBJECT(content)); + + } + + if (result) + { + key = g_loaded_content_get_format_name(G_LOADED_CONTENT(binary)); + result = add_string_attribute_to_node(xdoc, context, path, "format", key); + free(key); + } + + if (result) + { + key = g_arch_processor_get_key(binary->proc); + result = add_string_attribute_to_node(xdoc, context, path, "arch", key); + free(key); + } + + if (result) result = g_loaded_binary_save_storage(binary, xdoc, context, path); if (result) @@ -1546,7 +1352,7 @@ static bool g_loaded_binary_save(GLoadedBinary *binary, xmlDoc *xdoc, xmlXPathCo /* Sauvegarde côté serveur */ if (result) - g_analyst_client_save(binary->local); + g_analyst_client_save(binary->client); return result; diff --git a/src/analysis/binary.h b/src/analysis/binary.h index 56f21a1..0241381 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -81,12 +81,6 @@ GLoadedContent *g_loaded_binary_new(GExeFormat *); /* ------------------------- INFORMATIONS D'ENREGISTREMENTS ------------------------- */ -/* Identifie l'utilisateur analysant le binaire courant. */ -const char *g_loaded_binary_get_username(const GLoadedBinary *); - -/* Définit l'utilisateur analysant le binaire courant. */ -void g_loaded_binary_set_username(GLoadedBinary *, const char *); - /* Détermine si tous les enregistrements sont locaux ou non. */ bool g_loaded_binary_use_remote_storage(const GLoadedBinary *); @@ -99,12 +93,6 @@ void g_loaded_binary_get_remote_server(const GLoadedBinary *, const char **, con /* Définit le serveur distant associé au binaire courant. */ void g_loaded_binary_set_remote_server(GLoadedBinary *, const char *, const char *); -/* Indique la forme d'enregistrement d'une fonctionnalité. */ -DBStorage g_loaded_binary_get_storage(const GLoadedBinary *, DBFeatures); - -/* Définit la forme d'enregistrement d'une fonctionnalité. */ -void g_loaded_binary_set_storage(GLoadedBinary *, DBFeatures, DBStorage); - /* Sauvegarde le cache des instructions désassemblées. */ bool g_loaded_binary_save_cache(const GLoadedBinary *); @@ -114,7 +102,7 @@ bool g_loaded_binary_save_cache(const GLoadedBinary *); /* Fournit un client assurant la liaison avec un serveur. */ -GAnalystClient *g_loaded_binary_get_client(const GLoadedBinary *, bool); +GAnalystClient *g_loaded_binary_get_client(const GLoadedBinary *); /* Fournit l'ensemble des collections utilisées par un binaire. */ GDbCollection **g_loaded_binary_get_collections(const GLoadedBinary *, size_t *); diff --git a/src/analysis/project.c b/src/analysis/project.c index 13985f3..b57afc7 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -381,14 +381,8 @@ bool g_study_project_save(GStudyProject *project, const char *filename) xmlDocPtr xdoc; /* Document XML à créer */ xmlXPathContextPtr context; /* Contexte pour les recherches*/ const char *final; /* Lieu d'enregistrement final */ - size_t root_count; /* Quantité d'origines */ size_t i; /* Boucle de parcours */ - GBinContent *content; /* Contenu brut à manipuler */ - GBinContent *root; /* Contenu d'origine à traiter */ - const gchar *hash; /* Empreinte d'un contenu */ char *access; /* Chemin pour une sous-config.*/ - xmlXPathObjectPtr xobject; /* Cible d'une recherche */ - char *format; /* Format associé à un élément */ /* Forme générale */ @@ -401,85 +395,26 @@ bool g_study_project_save(GStudyProject *project, const char *filename) result = add_string_attribute_to_node(xdoc, context, "/ChrysalideProject", "version", PROJECT_XML_VERSION); if (result) - result = (ensure_node_exist(xdoc, context, "/ChrysalideProject/RootContents") != NULL); - - if (result) result = (ensure_node_exist(xdoc, context, "/ChrysalideProject/LoadedContents") != NULL); final = filename != NULL ? filename : project->filename; /* Inscriptions des contenus */ - root_count = 0; - g_study_project_lock_contents(project); for (i = 0; i < project->count && result; i++) { - content = g_loaded_content_get_content(project->contents[i]); - - /* Racine */ - - root = g_binary_content_get_root(content); - - hash = g_binary_content_get_checksum(root); - - asprintf(&access, "/ChrysalideProject/RootContents/Content[@hash='%s']", hash); - - xobject = get_node_xpath_object(context, access); - - free(access); - - if (XPATH_OBJ_NODES_COUNT(xobject) == 0) - { - asprintf(&access, "/ChrysalideProject/RootContents/Content[position()=%zu]", ++root_count); - - if (result) - result = (ensure_node_exist(xdoc, context, access) != NULL); - - if (result) - { - hash = g_binary_content_get_checksum(content); - result = add_string_attribute_to_node(xdoc, context, access, "hash", hash); - } - - if (result) - result = g_binary_content_save(root, xdoc, context, access, final); - - free(access); - - } - - if(xobject != NULL) - xmlXPathFreeObject(xobject); - - /* Charge utile */ - asprintf(&access, "/ChrysalideProject/LoadedContents/Content[position()=%zu]", i + 1); if (result) result = (ensure_node_exist(xdoc, context, access) != NULL); if (result) - { - hash = g_binary_content_get_checksum(content); - result = add_string_attribute_to_node(xdoc, context, access, "hash", hash); - } - - if (result) - { - format = g_loaded_content_get_format_name(project->contents[i]); - result = add_string_attribute_to_node(xdoc, context, access, "format", format); - free(format); - } - - if (result) result = g_loaded_content_save(project->contents[i], xdoc, context, access); free(access); - g_object_unref(G_OBJECT(content)); - } g_study_project_unlock_contents(project); @@ -1093,7 +1028,7 @@ static GLoadingHandler *g_loading_handler_new_recovering(GStudyProject *project, { asprintf(&access, "/ChrysalideProject/RootContents/Content[position()=%zu]", i + 1); - content = g_binary_content_new_from_xml(context, access, project->filename); + content = NULL;//g_binary_content_new_from_xml(context, access, project->filename); free(access); |