mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-13 16:01:28 +05:30
Implemented list functionality for secretservice- linux
Signed-off-by: Avi Vaid <avaid1996@gmail.com>
This commit is contained in:
@@ -140,7 +140,7 @@ char *keychain_list(char *** paths, char *** accts, unsigned int *list_l) {
|
|||||||
CFStringRef pathTmp = CFDictionaryGetValue(currKey, CFSTR("path"));
|
CFStringRef pathTmp = CFDictionaryGetValue(currKey, CFSTR("path"));
|
||||||
CFStringRef acctTmp = CFDictionaryGetValue(currKey, CFSTR("acct"));
|
CFStringRef acctTmp = CFDictionaryGetValue(currKey, CFSTR("acct"));
|
||||||
if (acctTmp == NULL) {
|
if (acctTmp == NULL) {
|
||||||
acctTmp = CFSTR("<unknown>");
|
acctTmp = CFSTR("account not defined");
|
||||||
}
|
}
|
||||||
char * path = (char *) malloc(CFStringGetLength(pathTmp)+1);
|
char * path = (char *) malloc(CFStringGetLength(pathTmp)+1);
|
||||||
path = CFStringToCharArr(pathTmp);
|
path = CFStringToCharArr(pathTmp);
|
||||||
@@ -172,4 +172,4 @@ void freeListData(char *** data, unsigned int length) {
|
|||||||
free((*data)[i]);
|
free((*data)[i]);
|
||||||
}
|
}
|
||||||
free(*data);
|
free(*data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,3 +96,44 @@ GError *get(char *server, char **username, char **secret) {
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GError *list(char *** paths, char *** accts, unsigned int *list_l) {
|
||||||
|
GList *items;
|
||||||
|
GError *err = NULL;
|
||||||
|
SecretService *service;
|
||||||
|
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);
|
||||||
|
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
||||||
|
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
||||||
|
int numKeys = g_list_length(items);
|
||||||
|
if (err != NULL) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
*paths = (char **) malloc((int)sizeof(char *)*numKeys);
|
||||||
|
*accts = (char **) malloc((int)sizeof(char *)*numKeys);
|
||||||
|
// items now contains our keys from the gnome keyring
|
||||||
|
// we will now put it in our two lists to return it to go
|
||||||
|
GList *current;
|
||||||
|
int listNumber = 0;
|
||||||
|
for(current = items; current!=NULL; current = current->next) {
|
||||||
|
char *pathTmp = secret_item_get_label(current->data);
|
||||||
|
// you cannot have a key without a label in the gnome keyring
|
||||||
|
char *acctTmp = get_username(current->data);
|
||||||
|
if (acctTmp==NULL) {
|
||||||
|
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)));
|
||||||
|
listNumber = listNumber + 1;
|
||||||
|
}
|
||||||
|
*list_l = numKeys;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -78,3 +78,26 @@ func (h Secretservice) Get(serverURL string) (string, string, error) {
|
|||||||
}
|
}
|
||||||
return user, pass, nil
|
return user, pass, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h Secretservice) List() ([]string, []string, error) {
|
||||||
|
var pathsC **C.char
|
||||||
|
defer C.free(unsafe.Pointer(pathsC))
|
||||||
|
var acctsC **C.char
|
||||||
|
defer C.free(unsafe.Pointer(acctsC))
|
||||||
|
var listLenC C.uint
|
||||||
|
err := C.list(&pathsC, &acctsC, &listLenC)
|
||||||
|
if err != nil {
|
||||||
|
defer C.free(unsafe.Pointer(err))
|
||||||
|
return nil, nil, errors.New("Error from list function in secretservice_linux.c likely due to error in secretservice library")
|
||||||
|
}
|
||||||
|
listLen := int(listLenC)
|
||||||
|
pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
|
||||||
|
acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
|
||||||
|
paths := make([]string, listLen)
|
||||||
|
accts := make([]string, listLen)
|
||||||
|
for i := 0; i < listLen; i++ {
|
||||||
|
paths[i] = C.GoString(pathTmp[i])
|
||||||
|
accts[i] = C.GoString(acctTmp[i])
|
||||||
|
}
|
||||||
|
return paths, accts, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ const SecretSchema *docker_get_schema(void) G_GNUC_CONST;
|
|||||||
GError *add(char *server, char *username, char *secret);
|
GError *add(char *server, char *username, char *secret);
|
||||||
GError *delete(char *server);
|
GError *delete(char *server);
|
||||||
GError *get(char *server, char **username, char **secret);
|
GError *get(char *server, char **username, char **secret);
|
||||||
|
GError *list(char *** paths, char *** accts, unsigned int *list_l);
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ func TestSecretServiceHelper(t *testing.T) {
|
|||||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
if _, _, err := helper.List(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMissingCredentials(t *testing.T) {
|
func TestMissingCredentials(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user