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.Keyword = utf16PtrToString(attr.Keyword)
|
||||||
resultAttr.Value = C.GoBytes(unsafe.Pointer(attr.Value), C.int(attr.ValueSize))
|
resultAttr.Value = C.GoBytes(unsafe.Pointer(attr.Value), C.int(attr.ValueSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+32
@@ -1,6 +1,7 @@
|
|||||||
package wincred
|
package wincred
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"C"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
@@ -12,6 +13,7 @@ var (
|
|||||||
procCredWrite = modadvapi32.NewProc("CredWriteW")
|
procCredWrite = modadvapi32.NewProc("CredWriteW")
|
||||||
procCredDelete = modadvapi32.NewProc("CredDeleteW")
|
procCredDelete = modadvapi32.NewProc("CredDeleteW")
|
||||||
procCredFree = modadvapi32.NewProc("CredFree")
|
procCredFree = modadvapi32.NewProc("CredFree")
|
||||||
|
procCredEnumerate = modadvapi32.NewProc("CredEnumerateW")
|
||||||
)
|
)
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx
|
// 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
|
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) {
|
func (t *DomainPassword) SetPassword(pw string) {
|
||||||
t.CredentialBlob = utf16ToByte(syscall.StringToUTF16(pw))
|
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) {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
for i := range(creds) {
|
||||||
|
paths[i] = creds[i].TargetName
|
||||||
|
accts[i] = creds[i].UserName
|
||||||
|
}
|
||||||
return paths, accts, nil
|
return paths, accts, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,21 @@ func TestWinCredHelper(t *testing.T) {
|
|||||||
t.Fatalf("expected %s, got %s\n", "foobarbaz", secret)
|
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 {
|
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user