summaryrefslogtreecommitdiff
path: root/src/glibext/secstorage.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2025-02-12 07:43:51 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2025-02-12 07:43:51 (GMT)
commit80428ecdd6411a94cf1248d113535b938fe6dbea (patch)
treea84c0a410696226446460533a6f5472dd001287e /src/glibext/secstorage.c
parentfd2f458abac21ceefa55468e1cb072ed16224a8e (diff)
Create a dialog window allowing to configure the default secret storage.
Diffstat (limited to 'src/glibext/secstorage.c')
-rw-r--r--src/glibext/secstorage.c132
1 files changed, 127 insertions, 5 deletions
diff --git a/src/glibext/secstorage.c b/src/glibext/secstorage.c
index ed2e4e6..b118aa6 100644
--- a/src/glibext/secstorage.c
+++ b/src/glibext/secstorage.c
@@ -84,6 +84,9 @@ static void g_secret_storage_dispose(GObject *);
/* Procède à la libération totale de la mémoire. */
static void g_secret_storage_finalize(GObject *);
+/* Teste un mot de passe par Déverrouillage de clef maître. */
+static bool g_secret_storage_check_primary_password(GSecretStorage *, const char *, void **);
+
/* Indique le type défini pour un gardien des secrets avec support des stockages. */
@@ -298,7 +301,7 @@ bool g_secret_storage_has_key(const GSecretStorage *storage)
* *
******************************************************************************/
-bool g_secret_storage_set_password(const GSecretStorage *storage, const char *passwd)
+bool g_secret_storage_set_password(GSecretStorage *storage, const char *passwd)
{
bool result; /* Bilan à retourner */
unsigned char salt[SECRET_STORAGE_SALT_SIZE]; /* Sel pour la dérivation*/
@@ -422,6 +425,8 @@ bool g_secret_storage_set_password(const GSecretStorage *storage, const char *pa
g_settings_set_value(storage->settings, "master", value);
+ g_signal_emit_by_name(storage, "lock-update");
+
result = true;
exit_with_ctx:
@@ -438,6 +443,89 @@ bool g_secret_storage_set_password(const GSecretStorage *storage, const char *pa
/******************************************************************************
* *
* Paramètres : storage = espace de stockage sécurisé à consulter. *
+* old = ancien mot de passe principal à vérifier. *
+* new = nouveau mot de passe principal à appliquer. *
+* *
+* Description : Modifie le mot de passe protégeant une clef maître. *
+* *
+* Retour : Bilan de la mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_secret_storage_change_password(GSecretStorage *storage, const char *old, const char *new)
+{
+ bool result; /* Bilan à retourner */
+
+ result = false;
+
+ if (!g_secret_storage_has_key(storage))
+ goto exit;
+
+ if (!g_secret_storage_check_primary_password(storage, old, NULL))
+ goto exit;
+
+ if (!g_secret_storage_is_locked(storage))
+ g_secret_storage_lock(storage);
+
+ g_settings_reset(storage->settings, "salt");
+ g_settings_reset(storage->settings, "master");
+
+ result = g_secret_storage_set_password(storage, new);
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : storage = espace de stockage sécurisé à consulter. *
+* password = mot de passe principal à appliquer. *
+* *
+* Description : Supprime le mot de passe protégeant une clef maître. *
+* *
+* Retour : Bilan de la mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_secret_storage_remove_password(GSecretStorage *storage, const char *passwd)
+{
+ bool result; /* Bilan à retourner */
+
+ result = false;
+
+ if (!g_secret_storage_has_key(storage))
+ goto exit;
+
+ if (!g_secret_storage_check_primary_password(storage, passwd, NULL))
+ goto exit;
+
+ if (!g_secret_storage_is_locked(storage))
+ g_secret_storage_lock(storage);
+
+ g_settings_reset(storage->settings, "salt");
+ g_settings_reset(storage->settings, "master");
+
+ g_signal_emit_by_name(storage, "lock-update");
+
+ result = true;
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : storage = espace de stockage sécurisé à consulter. *
* *
* Description : Détermine si la clef de chiffrement maître est vérouillée. *
* *
@@ -462,8 +550,9 @@ bool g_secret_storage_is_locked(const GSecretStorage *storage)
* *
* Paramètres : storage = espace de stockage sécurisé à manipuler. *
* password = mot de passe principal à utiliser. *
+* master = éventuelle adresse pour un stockage de clef. [OUT]*
* *
-* Description : Déverrouille la clef de chiffrement maître. *
+* Description : Teste un mot de passe par Déverrouillage de clef maître. *
* *
* Retour : Bilan de l'opération. *
* *
@@ -471,7 +560,7 @@ bool g_secret_storage_is_locked(const GSecretStorage *storage)
* *
******************************************************************************/
-bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd)
+static bool g_secret_storage_check_primary_password(GSecretStorage *storage, const char *passwd, void **master)
{
bool result; /* Bilan à retourner */
GVariant *salt_value; /* Valeur du sel configuré */
@@ -572,8 +661,11 @@ bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd)
/* Stockage de la clef maître en mémoire */
- storage->master_key = malloc(SECRET_STORAGE_KEY_SIZE);
- memcpy(storage->master_key, key, SECRET_STORAGE_KEY_SIZE);
+ if (master != NULL)
+ {
+ *master = malloc(SECRET_STORAGE_KEY_SIZE);
+ memcpy(*master, key, SECRET_STORAGE_KEY_SIZE);
+ }
result = true;
@@ -600,6 +692,33 @@ bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd)
/******************************************************************************
* *
+* Paramètres : storage = espace de stockage sécurisé à manipuler. *
+* password = mot de passe principal à utiliser. *
+* *
+* Description : Déverrouille la clef de chiffrement maître. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd)
+{
+ bool result; /* Bilan à retourner */
+
+ result = g_secret_storage_check_primary_password(storage, passwd, &storage->master_key);
+
+ if (result)
+ g_signal_emit_by_name(storage, "lock-update");
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : storage = espace de stockage sécurisé à manipuler. *
* *
* Description : Verrouille la clef de chiffrement maître. *
@@ -616,6 +735,9 @@ void g_secret_storage_lock(GSecretStorage *storage)
{
free(storage->master_key);
storage->master_key = NULL;
+
+ g_signal_emit_by_name(storage, "lock-update");
+
}
}