summaryrefslogtreecommitdiff
path: root/src/analysis/db/cdb.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-08-29 21:43:47 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-08-29 21:43:47 (GMT)
commitfa40856e942a7e1bd1cb2729645182c1fa717468 (patch)
tree954db169d2b734e661d904e502cd1c803f51c6ea /src/analysis/db/cdb.c
parent7f973e015eb59b626edc584a19a1ad3ffddf4867 (diff)
Defined a new way to launch updates share servers.
Diffstat (limited to 'src/analysis/db/cdb.c')
-rw-r--r--src/analysis/db/cdb.c84
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(&timestamp);
+ snprintf(tmp, sizeof(tmp), "%" PRIu64, timestamp);
- init_timestamp(&timestamp);
- 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],