summaryrefslogtreecommitdiff
path: root/src/analysis/db/auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/db/auth.c')
-rw-r--r--src/analysis/db/auth.c152
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. *
* *