diff options
Diffstat (limited to 'src/analysis/db/cdb.c')
-rw-r--r-- | src/analysis/db/cdb.c | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index c2855f7..74e8501 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -51,7 +51,6 @@ #include "../../common/xml.h" #include "../../core/collections.h" #include "../../core/logs.h" -#include "../../core/params.h" @@ -59,7 +58,7 @@ typedef struct _cdb_client { SSL *ssl_fd; /* Canal de communication */ - rle_string user; /* Utilisateur à l'autre bout */ + char *user; /* Utilisateur à l'autre bout */ uint64_t last_time; /* Date de dernier envoi */ @@ -125,7 +124,7 @@ static bool g_cdb_archive_read(GCdbArchive *); /* Crée la description XML correspondant à l'archive. */ -static bool g_cdb_archive_create_xml_desc(GCdbArchive *, const rle_string *); +static bool g_cdb_archive_create_xml_desc(GCdbArchive *); /* Vérifie la conformité d'une description XML avec le serveur. */ static bool g_cdb_archive_check_xml_version(const GCdbArchive *); @@ -263,7 +262,7 @@ static void g_cdb_archive_finalize(GCdbArchive *archive) if (archive->xml_desc != NULL) { ret = unlink(archive->xml_desc); - if (ret != 0) perror("unlink"); + if (ret != 0) LOG_ERROR_N("unlink"); free(archive->xml_desc); @@ -272,7 +271,7 @@ static void g_cdb_archive_finalize(GCdbArchive *archive) if (archive->sql_db != NULL) { ret = unlink(archive->sql_db); - if (ret != 0) perror("unlink"); + if (ret != 0) LOG_ERROR_N("unlink"); free(archive->sql_db); @@ -290,8 +289,8 @@ static void g_cdb_archive_finalize(GCdbArchive *archive) /****************************************************************************** * * * Paramètres : basedir = répertoire de stockage des enregistrements. * +* tmpdir = répertoire de travail temporaire. * * hash = empreinte du binaire à représenter. * -* user = désignation d'un éventuel nouveau créateur. * * error = indication éventuelle en cas d'échec. [OUT] * * * * Description : Définit ou ouvre une archive d'éléments utilisateur. * @@ -303,11 +302,9 @@ static void g_cdb_archive_finalize(GCdbArchive *archive) * * ******************************************************************************/ -GCdbArchive *g_cdb_archive_new(const char *basedir, const rle_string *hash, const rle_string *user, DBError *error) +GCdbArchive *g_cdb_archive_new(const char *basedir, const char *tmpdir, const rle_string *hash, DBError *error) { GCdbArchive *result; /* Adresse à retourner */ - const char *tmpdir; /* Répertoire d'accueil */ - bool status; /* Bilan d'un consultation */ int ret; /* Retour d'un appel */ struct stat finfo; /* Information sur l'archive */ @@ -318,7 +315,6 @@ GCdbArchive *g_cdb_archive_new(const char *basedir, const rle_string *hash, cons /* Chemin de l'archive */ result->filename = strdup(basedir); - result->filename = stradd(result->filename, G_DIR_SEPARATOR_S); result->filename = stradd(result->filename, hash->data); result->filename = stradd(result->filename, ".cdb.tar.xz"); @@ -327,8 +323,8 @@ GCdbArchive *g_cdb_archive_new(const char *basedir, const rle_string *hash, cons /* Chemin des enregistrements temporaires */ - status = g_generic_config_get_value(get_main_configuration(), MPK_TMPDIR, &tmpdir); - if (!status) goto gcan_no_tmp; + if (!mkpath(tmpdir)) + goto gcan_error; ret = asprintf(&result->xml_desc, "%s" G_DIR_SEPARATOR_S "%s_desc.xml", tmpdir, result->hash.data); if (ret == -1) goto gcan_no_tmp; @@ -348,7 +344,7 @@ GCdbArchive *g_cdb_archive_new(const char *basedir, const rle_string *hash, cons /* Le soucis ne vient pas de l'absence du fichier... */ if (errno != ENOENT) goto gcan_error; - g_cdb_archive_create_xml_desc(result, user); + g_cdb_archive_create_xml_desc(result); g_cdb_archive_create_db(result); *error = g_cdb_archive_write(result); @@ -573,7 +569,6 @@ int g_cdb_archive_compare_hash(const GCdbArchive *archive, const rle_string *has /****************************************************************************** * * * Paramètres : archive = archive à constituer. * -* user = désignation d'un éventuel nouveau créateur. * * * * Description : Crée la description XML correspondant à l'archive. * * * @@ -583,34 +578,38 @@ int g_cdb_archive_compare_hash(const GCdbArchive *archive, const rle_string *has * * ******************************************************************************/ -static bool g_cdb_archive_create_xml_desc(GCdbArchive *archive, const rle_string *user) +static bool g_cdb_archive_create_xml_desc(GCdbArchive *archive) { bool result; /* Bilan à retourner */ timestamp_t timestamp; /* Date de création */ char tmp[sizeof(XSTR(UINT64_MAX))]; /* Stockage temporaire */ result = create_new_xml_file(&archive->xdoc, &archive->context); - if (!result) return false; - result &= add_content_to_node(archive->xdoc, archive->context, - "/ChrysalideBinary/Version", PACKAGE_VERSION); + if (result) + result = add_content_to_node(archive->xdoc, archive->context, + "/ChrysalideBinary/Version", PACKAGE_VERSION); - result &= add_content_to_node(archive->xdoc, archive->context, - "/ChrysalideBinary/Protocol", XSTR(CDB_PROTOCOL_VERSION)); + if (result) + result = add_content_to_node(archive->xdoc, archive->context, + "/ChrysalideBinary/Protocol", XSTR(CDB_PROTOCOL_VERSION)); - result &= add_content_to_node(archive->xdoc, archive->context, - "/ChrysalideBinary/Hash", archive->hash.data); + if (result) + result = add_content_to_node(archive->xdoc, archive->context, + "/ChrysalideBinary/Hash", archive->hash.data); - result &= add_content_to_node(archive->xdoc, archive->context, - "/ChrysalideBinary/Creation/Author", user->data); + if (result) + { + init_timestamp(×tamp); + snprintf(tmp, sizeof(tmp), "%" PRIu64, timestamp); - init_timestamp(×tamp); - snprintf(tmp, sizeof(tmp), "%" PRIu64, timestamp); + result = add_content_to_node(archive->xdoc, archive->context, + "/ChrysalideBinary/CreationDate", tmp); - result &= add_content_to_node(archive->xdoc, archive->context, - "/ChrysalideBinary/Creation/Date", tmp); + } - save_xml_file(archive->xdoc, archive->xml_desc); + if (result) + result = save_xml_file(archive->xdoc, archive->xml_desc); return result; @@ -863,7 +862,7 @@ static void *g_cdb_archive_process(GCdbArchive *archive) { if (errno == EINTR) continue; - perror("poll"); + LOG_ERROR_N("poll"); break; } @@ -874,7 +873,15 @@ static void *g_cdb_archive_process(GCdbArchive *archive) { /* Le canal est fermé, une sortie doit être demandée... */ if (fds[i].revents & POLLNVAL) - goto gcap_closed_exchange; + goto closed_exchange; + + /** + * Même chose, cf. "TCP: When is EPOLLHUP generated?" + * https://stackoverflow.com/questions/52976152/tcp-when-is-epollhup-generated/52976327#52976327 + */ + + if (fds[i].revents & (POLLHUP | POLLRDHUP)) + goto closed_exchange; /* Données présentes en entrée */ if (fds[i].revents & (POLLIN | POLLPRI)) @@ -979,7 +986,7 @@ static void *g_cdb_archive_process(GCdbArchive *archive) exit_packed_buffer(&in_pbuf); - gcap_closed_exchange: + closed_exchange: g_cdb_archive_remove_client(archive, i); @@ -1012,7 +1019,6 @@ static void *g_cdb_archive_process(GCdbArchive *archive) * * * Paramètres : archive = archive à connecter avec un utilisateur. * * fd = canal de communication réseau ouvert. * -* user = désignation de l'utilisateur associé. * * * * Description : Associe un nouvel utilisateur à l'archive. * * * @@ -1022,8 +1028,9 @@ static void *g_cdb_archive_process(GCdbArchive *archive) * * ******************************************************************************/ -void g_cdb_archive_add_client(GCdbArchive *archive, SSL *fd, const rle_string *user) +void g_cdb_archive_add_client(GCdbArchive *archive, SSL *fd) { + X509 *peer_cert; /* Certificat présenté */ volatile pthread_t *process_id; /* Identifiant de la procédure */ /** @@ -1051,7 +1058,12 @@ void g_cdb_archive_add_client(GCdbArchive *archive, SSL *fd, const rle_string *u archive->clients = realloc(archive->clients, ++archive->count * sizeof(cdb_client)); archive->clients[archive->count - 1].ssl_fd = fd; - dup_into_rle_string(&archive->clients[archive->count - 1].user, get_rle_string(user)); + + peer_cert = SSL_get_peer_certificate(fd); + + archive->clients[archive->count - 1].user = X509_NAME_oneline(X509_get_subject_name(peer_cert), NULL, -1); + + X509_free(peer_cert); /* Démarrage ou redémarrage du processus d'écoute */ @@ -1099,7 +1111,7 @@ static void g_cdb_archive_remove_client(GCdbArchive *archive, size_t index) g_mutex_lock(&archive->clients_access); SSL_free(client->ssl_fd); - exit_rle_string(&client->user); + free(client->user); if ((index + 1) < archive->count) memmove(&archive->clients[index], &archive->clients[index + 1], |