mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-14 08:21:28 +05:30
secretservice: add D-Bus secret service
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#include <string.h>
|
||||
#include "secretservice_linux.h"
|
||||
|
||||
const SecretSchema *docker_get_schema(void)
|
||||
{
|
||||
static const SecretSchema docker_schema = {
|
||||
"io.docker.Credentials", SECRET_SCHEMA_NONE,
|
||||
{
|
||||
{ "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "username", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "docker_cli", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "NULL", 0 },
|
||||
}
|
||||
};
|
||||
return &docker_schema;
|
||||
}
|
||||
|
||||
GError *add(char *server, char *username, char *password) {
|
||||
GError *err = NULL;
|
||||
|
||||
secret_password_store_sync (DOCKER_SCHEMA, SECRET_COLLECTION_DEFAULT,
|
||||
server, password, NULL, &err,
|
||||
"server", server,
|
||||
"username", username,
|
||||
"docker_cli", "1",
|
||||
NULL);
|
||||
return err;
|
||||
}
|
||||
|
||||
GError *delete(char *server) {
|
||||
GError *err = NULL;
|
||||
|
||||
secret_password_clear_sync(DOCKER_SCHEMA, NULL, &err,
|
||||
"server", server,
|
||||
"docker_cli", "1",
|
||||
NULL);
|
||||
if (err != NULL)
|
||||
return err;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *get_username(SecretItem *item) {
|
||||
GHashTable *attributes;
|
||||
GHashTableIter iter;
|
||||
gchar *value, *key;
|
||||
|
||||
attributes = secret_item_get_attributes(item);
|
||||
g_hash_table_iter_init(&iter, attributes);
|
||||
while (g_hash_table_iter_next(&iter, (void **)&key, (void **)&value)) {
|
||||
if (strncmp(key, "username", strlen(key)) == 0)
|
||||
return (char *)value;
|
||||
}
|
||||
g_hash_table_unref(attributes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GError *get(char *server, char **username, char **password) {
|
||||
GError *err = NULL;
|
||||
GHashTable *attributes;
|
||||
SecretService *service;
|
||||
GList *items, *l;
|
||||
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
||||
SecretValue *secret;
|
||||
gsize length;
|
||||
gchar *value;
|
||||
|
||||
attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
||||
g_hash_table_insert(attributes, g_strdup("server"), g_strdup(server));
|
||||
g_hash_table_insert(attributes, g_strdup("docker_cli"), g_strdup("1"));
|
||||
|
||||
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
||||
if (err == NULL) {
|
||||
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
||||
if (err == NULL) {
|
||||
for (l = items; l != NULL; l = g_list_next(l)) {
|
||||
value = secret_item_get_schema_name(l->data);
|
||||
if (strncmp(value, "io.docker.Credentials", strlen(value)) != 0) {
|
||||
g_free(value);
|
||||
continue;
|
||||
}
|
||||
g_free(value);
|
||||
secret = secret_item_get_secret(l->data);
|
||||
if (secret != NULL) {
|
||||
*password = strdup(secret_value_get(secret, &length));
|
||||
secret_value_unref(secret);
|
||||
}
|
||||
*username = get_username(l->data);
|
||||
}
|
||||
g_list_free_full(items, g_object_unref);
|
||||
}
|
||||
g_object_unref(service);
|
||||
}
|
||||
g_hash_table_unref(attributes);
|
||||
if (err != NULL) {
|
||||
return err;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user