|
@@ -7,6 +7,7 @@ const SecretSchema *docker_get_schema(void)
|
|
static const SecretSchema docker_schema = {
|
|
static const SecretSchema docker_schema = {
|
|
"io.docker.Credentials", SECRET_SCHEMA_NONE,
|
|
"io.docker.Credentials", SECRET_SCHEMA_NONE,
|
|
{
|
|
{
|
|
|
|
+ { "label", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "username", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "username", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "docker_cli", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
{ "docker_cli", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
|
@@ -16,11 +17,12 @@ const SecretSchema *docker_get_schema(void)
|
|
return &docker_schema;
|
|
return &docker_schema;
|
|
}
|
|
}
|
|
|
|
|
|
-GError *add(char *server, char *username, char *secret) {
|
|
|
|
|
|
+GError *add(char *label, char *server, char *username, char *secret) {
|
|
GError *err = NULL;
|
|
GError *err = NULL;
|
|
|
|
|
|
secret_password_store_sync (DOCKER_SCHEMA, SECRET_COLLECTION_DEFAULT,
|
|
secret_password_store_sync (DOCKER_SCHEMA, SECRET_COLLECTION_DEFAULT,
|
|
server, secret, NULL, &err,
|
|
server, secret, NULL, &err,
|
|
|
|
+ "label", label,
|
|
"server", server,
|
|
"server", server,
|
|
"username", username,
|
|
"username", username,
|
|
"docker_cli", "1",
|
|
"docker_cli", "1",
|
|
@@ -40,7 +42,7 @@ GError *delete(char *server) {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-char *get_username(SecretItem *item) {
|
|
|
|
|
|
+char *get_attribute(const char *attribute, SecretItem *item) {
|
|
GHashTable *attributes;
|
|
GHashTable *attributes;
|
|
GHashTableIter iter;
|
|
GHashTableIter iter;
|
|
gchar *value, *key;
|
|
gchar *value, *key;
|
|
@@ -48,7 +50,7 @@ char *get_username(SecretItem *item) {
|
|
attributes = secret_item_get_attributes(item);
|
|
attributes = secret_item_get_attributes(item);
|
|
g_hash_table_iter_init(&iter, attributes);
|
|
g_hash_table_iter_init(&iter, attributes);
|
|
while (g_hash_table_iter_next(&iter, (void **)&key, (void **)&value)) {
|
|
while (g_hash_table_iter_next(&iter, (void **)&key, (void **)&value)) {
|
|
- if (strncmp(key, "username", strlen(key)) == 0)
|
|
|
|
|
|
+ if (strncmp(key, attribute, strlen(key)) == 0)
|
|
return (char *)value;
|
|
return (char *)value;
|
|
}
|
|
}
|
|
g_hash_table_unref(attributes);
|
|
g_hash_table_unref(attributes);
|
|
@@ -71,7 +73,7 @@ GError *get(char *server, char **username, char **secret) {
|
|
|
|
|
|
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
if (err == NULL) {
|
|
if (err == NULL) {
|
|
- items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
|
|
|
|
|
+ items = secret_service_search_sync(service, DOCKER_SCHEMA, attributes, flags, NULL, &err);
|
|
if (err == NULL) {
|
|
if (err == NULL) {
|
|
for (l = items; l != NULL; l = g_list_next(l)) {
|
|
for (l = items; l != NULL; l = g_list_next(l)) {
|
|
value = secret_item_get_schema_name(l->data);
|
|
value = secret_item_get_schema_name(l->data);
|
|
@@ -85,7 +87,7 @@ GError *get(char *server, char **username, char **secret) {
|
|
*secret = strdup(secret_value_get(secretValue, &length));
|
|
*secret = strdup(secret_value_get(secretValue, &length));
|
|
secret_value_unref(secretValue);
|
|
secret_value_unref(secretValue);
|
|
}
|
|
}
|
|
- *username = get_username(l->data);
|
|
|
|
|
|
+ *username = get_attribute("username", l->data);
|
|
}
|
|
}
|
|
g_list_free_full(items, g_object_unref);
|
|
g_list_free_full(items, g_object_unref);
|
|
}
|
|
}
|
|
@@ -98,22 +100,30 @@ GError *get(char *server, char **username, char **secret) {
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-GError *list(char *** paths, char *** accts, unsigned int *list_l) {
|
|
|
|
|
|
+GError *list(char *ref_label, char *** paths, char *** accts, unsigned int *list_l) {
|
|
GList *items;
|
|
GList *items;
|
|
GError *err = NULL;
|
|
GError *err = NULL;
|
|
SecretService *service;
|
|
SecretService *service;
|
|
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
|
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
|
- GHashTable *attributes;
|
|
|
|
- g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
|
|
|
- attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
|
|
|
|
|
+ GHashTable *attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
|
|
|
+
|
|
|
|
+ // List credentials with the right label only
|
|
|
|
+ g_hash_table_insert(attributes, g_strdup("label"), g_strdup(ref_label));
|
|
|
|
+
|
|
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
|
|
|
+ if (err != NULL) {
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+
|
|
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
|
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
|
int numKeys = g_list_length(items);
|
|
int numKeys = g_list_length(items);
|
|
if (err != NULL) {
|
|
if (err != NULL) {
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
- *paths = (char **) malloc((int)sizeof(char *)*numKeys);
|
|
|
|
- *accts = (char **) malloc((int)sizeof(char *)*numKeys);
|
|
|
|
|
|
+
|
|
|
|
+ char **tmp_paths = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
|
|
|
+ char **tmp_accts = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
|
|
|
+
|
|
// items now contains our keys from the gnome keyring
|
|
// items now contains our keys from the gnome keyring
|
|
// we will now put it in our two lists to return it to go
|
|
// we will now put it in our two lists to return it to go
|
|
GList *current;
|
|
GList *current;
|
|
@@ -121,21 +131,25 @@ GError *list(char *** paths, char *** accts, unsigned int *list_l) {
|
|
for(current = items; current!=NULL; current = current->next) {
|
|
for(current = items; current!=NULL; current = current->next) {
|
|
char *pathTmp = secret_item_get_label(current->data);
|
|
char *pathTmp = secret_item_get_label(current->data);
|
|
// you cannot have a key without a label in the gnome keyring
|
|
// you cannot have a key without a label in the gnome keyring
|
|
- char *acctTmp = get_username(current->data);
|
|
|
|
|
|
+ char *acctTmp = get_attribute("username",current->data);
|
|
if (acctTmp==NULL) {
|
|
if (acctTmp==NULL) {
|
|
acctTmp = "account not defined";
|
|
acctTmp = "account not defined";
|
|
}
|
|
}
|
|
- char *path = (char *) malloc(strlen(pathTmp));
|
|
|
|
- char *acct = (char *) malloc(strlen(acctTmp));
|
|
|
|
- path = pathTmp;
|
|
|
|
- acct = acctTmp;
|
|
|
|
- (*paths)[listNumber] = (char *) malloc(sizeof(char)*(strlen(path)));
|
|
|
|
- memcpy((*paths)[listNumber], path, sizeof(char)*(strlen(path)));
|
|
|
|
- (*accts)[listNumber] = (char *) malloc(sizeof(char)*(strlen(acct)));
|
|
|
|
- memcpy((*accts)[listNumber], acct, sizeof(char)*(strlen(acct)));
|
|
|
|
|
|
+
|
|
|
|
+ tmp_paths[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(pathTmp)+1));
|
|
|
|
+ tmp_accts[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(acctTmp)+1));
|
|
|
|
+
|
|
|
|
+ memcpy(tmp_paths[listNumber], pathTmp, sizeof(char)*(strlen(pathTmp)+1));
|
|
|
|
+ memcpy(tmp_accts[listNumber], acctTmp, sizeof(char)*(strlen(acctTmp)+1));
|
|
|
|
+
|
|
listNumber = listNumber + 1;
|
|
listNumber = listNumber + 1;
|
|
}
|
|
}
|
|
- *list_l = numKeys;
|
|
|
|
|
|
+
|
|
|
|
+ *paths = (char **) realloc(tmp_paths, (int)sizeof(char *)*listNumber);
|
|
|
|
+ *accts = (char **) realloc(tmp_accts, (int)sizeof(char *)*listNumber);
|
|
|
|
+
|
|
|
|
+ *list_l = listNumber;
|
|
|
|
+
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|