diff options
Diffstat (limited to 'src/analysis/db/auth.c')
-rw-r--r-- | src/analysis/db/auth.c | 152 |
1 files changed, 151 insertions, 1 deletions
diff --git a/src/analysis/db/auth.c b/src/analysis/db/auth.c index 5e62f58..5869794 100644 --- a/src/analysis/db/auth.c +++ b/src/analysis/db/auth.c @@ -38,6 +38,7 @@ #include "../../common/io.h" #include "../../common/pathname.h" #include "../../common/xdg.h" +#include "../../common/xml.h" #include "../../core/logs.h" @@ -48,6 +49,14 @@ static char *get_cert_storage_directory(const char *, const char *, const char * /* Calcule l'empreinte d'un fichier de demande de signature. */ static char *compute_csr_fingerprint(const char *); +/* Renvoie un accès à la configuration XML des privilèges. */ +static bool open_server_priv_config(const char *, const char *, xmlDocPtr *, xmlXPathContextPtr *); + +/* Assure la présence d'au moins un administrateur. */ +static bool ensure_one_admin_is_registered(const char *, const char *, const char *); + +/* Enregistre et clôture la configuration XML des privilèges. */ +static bool close_server_priv_config(const char *, const char *, xmlDocPtr, xmlXPathContextPtr); /****************************************************************************** @@ -458,6 +467,8 @@ bool add_client_to_server(const char *host, const char *port, unsigned long vali char *cakey; /* Clef de cette autorité */ char *storage; /* Répertoire de stockage */ char *dest; /* Destination d'une copie */ + x509_entries entries; /* Identitié du client */ + char *id; /* Identifiant associé */ result = false; @@ -517,6 +528,22 @@ bool add_client_to_server(const char *host, const char *port, unsigned long vali } + if (result) + { + result = load_identity_from_cert(hash, &entries); + + if (result) + { + id = translate_x509_entries(&entries); + + result = ensure_one_admin_is_registered(host, port, id); + + free_x509_entries(&entries); + + } + + } + free(storage); } @@ -539,9 +566,132 @@ bool add_client_to_server(const char *host, const char *port, unsigned long vali /****************************************************************************** * * +* Paramètres : host = désignation du serveur à contacter. * +* port = port d'écoute correspondant. * +* xdoc = document XML prêt à emploi. [OUT] * +* context = contexte de recherche XPath. [OUT] * +* * +* Description : Renvoie un accès à la configuration XML des privilèges. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool open_server_priv_config(const char *host, const char *port, xmlDocPtr *xdoc, xmlXPathContextPtr *context) +{ + bool result; /* Bilan à retourner */ + char *filename; /* Chemin d'accès à la config. */ + int ret; /* Test de présence de fichier */ + + filename = get_db_working_directory("servers", host, port, NULL); + filename = stradd(filename, "privs.xml"); + + ret = access(filename, F_OK); + + if (ret == 0) + result = open_xml_file(filename, xdoc, context); + + else + { + result = create_new_xml_file(xdoc, context); + + if (result) + result = (ensure_node_exist(*xdoc, *context, "/ServerPrivLevels") != NULL); + + } + + free(filename); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : host = désignation du serveur à contacter. * +* port = port d'écoute correspondant. * +* id = identification d'un utilisateur. * +* * +* Description : Assure la présence d'au moins un administrateur. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool ensure_one_admin_is_registered(const char *host, const char *port, const char *id) +{ + bool result; /* Bilan à retourner */ + xmlDocPtr xdoc; /* Document XML de configurat° */ + xmlXPathContextPtr context; /* Contexte de recherche XPath */ + xmlXPathObjectPtr xobject; /* Cible d'une recherche */ + size_t count; /* Nombre de contenus premiers */ + + result = open_server_priv_config(host, port, &xdoc, &context); + if (!result) goto exit; + + xobject = get_node_xpath_object(context, "/ServerPrivLevels/Administrators/User"); + + count = XPATH_OBJ_NODES_COUNT(xobject); + + if (count == 0) + result = add_content_to_node(xdoc, context, "/ServerPrivLevels/Administrators/User", id); + + if(xobject != NULL) + xmlXPathFreeObject(xobject); + + result = close_server_priv_config(host, port, xdoc, context); + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : host = désignation du serveur à contacter. * +* port = port d'écoute correspondant. * +* xdoc = document XML prêt à emploi. * +* context = contexte de recherche XPath. * +* * +* Description : Enregistre et clôture la configuration XML des privilèges. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool close_server_priv_config(const char *host, const char *port, xmlDocPtr xdoc, xmlXPathContextPtr context) +{ + bool result; /* Bilan à retourner */ + char *filename; /* Chemin d'accès à la config. */ + + filename = get_db_working_directory("servers", host, port, NULL); + filename = stradd(filename, "privs.xml"); + + result = save_xml_file(xdoc, filename); + + close_xml_file(xdoc, context); + + free(filename); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : - * * * -* Description : Assure la présence d'unenvironnement pour serveur interne. * +* Description : Assure la présence d'un environnement pour serveur interne. * * * * Retour : Bilan de l'opération. * * * |