package secretservice /* #cgo pkg-config: libsecret-1 #include "secretservice_linux.h" #include */ import "C" import ( "errors" "unsafe" "github.com/docker/docker-credential-helpers/credentials" ) type secretservice struct{} // New creates a new secretservice. func New() credentials.Helper { return secretservice{} } // Add adds new credentials to the keychain. func (h secretservice) Add(creds *credentials.Credentials) error { if creds == nil { return errors.New("missing credentials") } server := C.CString(creds.ServerURL) defer C.free(unsafe.Pointer(server)) username := C.CString(creds.Username) defer C.free(unsafe.Pointer(username)) password := C.CString(creds.Password) defer C.free(unsafe.Pointer(password)) if err := C.add(server, username, password); err != nil { defer C.g_error_free(err) errMsg := (*C.char)(unsafe.Pointer(err.message)) return errors.New(C.GoString(errMsg)) } return nil } // Delete removes credentials from the keychain. func (h secretservice) Delete(serverURL string) error { if serverURL == "" { return errors.New("missing server url") } server := C.CString(serverURL) defer C.free(unsafe.Pointer(server)) if err := C.delete(server); err != nil { defer C.g_error_free(err) errMsg := (*C.char)(unsafe.Pointer(err.message)) return errors.New(C.GoString(errMsg)) } return nil } // Get returns the username and password to use for a given registry server URL. func (h secretservice) Get(serverURL string) (string, string, error) { if serverURL == "" { return "", "", errors.New("missing server url") } var username *C.char defer C.free(unsafe.Pointer(username)) var password *C.char defer C.free(unsafe.Pointer(password)) server := C.CString(serverURL) defer C.free(unsafe.Pointer(server)) err := C.get(server, &username, &password) if err != nil { defer C.g_error_free(err) errMsg := (*C.char)(unsafe.Pointer(err.message)) return "", "", errors.New(C.GoString(errMsg)) } user := C.GoString(username) pass := C.GoString(password) if pass == "" { return "", "", credentials.ErrCredentialsNotFound } return user, pass, nil }