mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-13 16:01:28 +05:30
changes to wincred, completes list functionality in windows
Signed-off-by: avaid96 <avaid1996@gmail.com>
This commit is contained in:
-1
@@ -58,7 +58,6 @@ func nativeToCredential(cred *nativeCREDENTIAL) (result *Credential) {
|
||||
resultAttr.Keyword = utf16PtrToString(attr.Keyword)
|
||||
resultAttr.Value = C.GoBytes(unsafe.Pointer(attr.Value), C.int(attr.ValueSize))
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
+32
@@ -1,6 +1,7 @@
|
||||
package wincred
|
||||
|
||||
import (
|
||||
"C"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
@@ -12,6 +13,7 @@ var (
|
||||
procCredWrite = modadvapi32.NewProc("CredWriteW")
|
||||
procCredDelete = modadvapi32.NewProc("CredDeleteW")
|
||||
procCredFree = modadvapi32.NewProc("CredFree")
|
||||
procCredEnumerate = modadvapi32.NewProc("CredEnumerateW")
|
||||
)
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx
|
||||
@@ -97,3 +99,33 @@ func nativeCredDelete(cred *Credential, typ nativeCRED_TYPE) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa374794(v=vs.85).aspx
|
||||
func nativeCredEnumerate(filter string, all bool) ([]*Credential, error) {
|
||||
var count int
|
||||
var pcreds uintptr
|
||||
var filterPtr uintptr
|
||||
if !all {
|
||||
filterUtf16Ptr, _ := syscall.UTF16PtrFromString(filter)
|
||||
filterPtr = uintptr(unsafe.Pointer(filterUtf16Ptr))
|
||||
} else {
|
||||
filterPtr = 0
|
||||
}
|
||||
ret, _, err := procCredEnumerate.Call(
|
||||
filterPtr,
|
||||
0,
|
||||
uintptr(unsafe.Pointer(&count)),
|
||||
uintptr(unsafe.Pointer(&pcreds)),
|
||||
)
|
||||
if ret == 0 {
|
||||
return nil, err
|
||||
}
|
||||
defer procCredFree.Call(pcreds)
|
||||
pcredsSlice := (*[1 << 30]uintptr)(unsafe.Pointer(pcreds))[:count:count]
|
||||
creds := make([]*Credential, count)
|
||||
for i := range creds {
|
||||
creds[i] = nativeToCredential((*nativeCREDENTIAL)(unsafe.Pointer(pcredsSlice[i])))
|
||||
}
|
||||
|
||||
return creds, nil
|
||||
}
|
||||
|
||||
+5
@@ -67,3 +67,8 @@ func (t *DomainPassword) Delete() (err error) {
|
||||
func (t *DomainPassword) SetPassword(pw string) {
|
||||
t.CredentialBlob = utf16ToByte(syscall.StringToUTF16(pw))
|
||||
}
|
||||
|
||||
// List the contents of the Credentials store
|
||||
func List() ([]*Credential, error) {
|
||||
return nativeCredEnumerate("", true)
|
||||
}
|
||||
|
||||
@@ -39,9 +39,15 @@ func (h Wincred) Get(serverURL string) (string, string, error) {
|
||||
}
|
||||
|
||||
func (h Wincred) List() ([]string, []string, error) {
|
||||
accts, paths, err := winc.List()
|
||||
creds, err := winc.List()
|
||||
paths := make([]string, len(creds))
|
||||
accts := make([]string, len(creds))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := range(creds) {
|
||||
paths[i] = creds[i].TargetName
|
||||
accts[i] = creds[i].UserName
|
||||
}
|
||||
return paths, accts, nil
|
||||
}
|
||||
|
||||
@@ -31,6 +31,21 @@ func TestWinCredHelper(t *testing.T) {
|
||||
t.Fatalf("expected %s, got %s\n", "foobarbaz", secret)
|
||||
}
|
||||
|
||||
paths, accts, err := helper.List()
|
||||
if err != nil || len(paths) == 0 || len(accts) == 0 {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
helper.Add(creds1)
|
||||
defer helper.Delete(creds1.ServerURL)
|
||||
newpaths, newaccts, err := helper.List()
|
||||
if len(newpaths)-len(paths) != 1 || len(newaccts)-len(accts) != 1 {
|
||||
if(err == nil) {
|
||||
t.Fatalf("Error: len(newpaths): %d, len(paths): %d\n len(newaccts): %d, len(accts): %d\n Error= %s", len(newpaths), len(paths), len(newaccts), len(accts), "")
|
||||
}
|
||||
t.Fatalf("Error: len(newpaths): %d, len(paths): %d\n len(newaccts): %d, len(accts): %d\n Error= %s", len(newpaths), len(paths), len(newaccts), len(accts), err.Error())
|
||||
}
|
||||
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user