mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-13 16:01:28 +05:30
vendor: github.com/danieljoos/wincred v1.2.0
full diff: https://github.com/danieljoos/wincred/compare/v1.1.2...v1.2.0 - Calling SyscallN directly when dealing with pointer-pointers to try to address "Unexpected (nil, nil) result from wincred.GetGenericCredential". - Bumped required Go version to 1.18. - Bumped dependency to golang.org/x/sys to version 0.8.0. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
@@ -2,6 +2,6 @@ module github.com/docker/docker-credential-helpers
|
|||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require github.com/danieljoos/wincred v1.1.2
|
require github.com/danieljoos/wincred v1.2.0
|
||||||
|
|
||||||
require golang.org/x/sys v0.7.0 // indirect
|
require golang.org/x/sys v0.8.0 // indirect
|
||||||
|
|||||||
@@ -1,16 +1,9 @@
|
|||||||
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
|
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
|
||||||
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
|
github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
||||||
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ wincred
|
|||||||
Go wrapper around the Windows Credential Manager API functions.
|
Go wrapper around the Windows Credential Manager API functions.
|
||||||
|
|
||||||
[](https://github.com/danieljoos/wincred/releases/latest)
|
[](https://github.com/danieljoos/wincred/releases/latest)
|
||||||
[](https://github.com/danieljoos/wincred/actions?query=workflow%3Atest)
|
[](https://github.com/danieljoos/wincred/actions?query=workflow%3Atest)
|
||||||
[](https://goreportcard.com/report/github.com/danieljoos/wincred)
|
[](https://goreportcard.com/report/github.com/danieljoos/wincred)
|
||||||
[](https://codecov.io/gh/danieljoos/wincred)
|
[](https://codecov.io/gh/danieljoos/wincred)
|
||||||
[](https://pkg.go.dev/github.com/danieljoos/wincred)
|
[](https://pkg.go.dev/github.com/danieljoos/wincred)
|
||||||
|
|||||||
+16
-12
@@ -1,21 +1,23 @@
|
|||||||
|
//go:build windows
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package wincred
|
package wincred
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
syscall "golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
|
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
|
||||||
procCredRead proc = modadvapi32.NewProc("CredReadW")
|
procCredRead = modadvapi32.NewProc("CredReadW")
|
||||||
procCredWrite proc = modadvapi32.NewProc("CredWriteW")
|
procCredWrite proc = modadvapi32.NewProc("CredWriteW")
|
||||||
procCredDelete proc = modadvapi32.NewProc("CredDeleteW")
|
procCredDelete proc = modadvapi32.NewProc("CredDeleteW")
|
||||||
procCredFree proc = modadvapi32.NewProc("CredFree")
|
procCredFree proc = modadvapi32.NewProc("CredFree")
|
||||||
procCredEnumerate proc = modadvapi32.NewProc("CredEnumerateW")
|
procCredEnumerate = modadvapi32.NewProc("CredEnumerateW")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Interface for syscall.Proc: helps testing
|
// Interface for syscall.Proc: helps testing
|
||||||
@@ -29,7 +31,7 @@ type sysCREDENTIAL struct {
|
|||||||
Type uint32
|
Type uint32
|
||||||
TargetName *uint16
|
TargetName *uint16
|
||||||
Comment *uint16
|
Comment *uint16
|
||||||
LastWritten syscall.Filetime
|
LastWritten windows.Filetime
|
||||||
CredentialBlobSize uint32
|
CredentialBlobSize uint32
|
||||||
CredentialBlob uintptr
|
CredentialBlob uintptr
|
||||||
Persist uint32
|
Persist uint32
|
||||||
@@ -59,15 +61,16 @@ const (
|
|||||||
sysCRED_TYPE_DOMAIN_EXTENDED sysCRED_TYPE = 0x6
|
sysCRED_TYPE_DOMAIN_EXTENDED sysCRED_TYPE = 0x6
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/desktop/Debug/system-error-codes
|
// https://docs.microsoft.com/en-us/windows/desktop/Debug/system-error-codes
|
||||||
sysERROR_NOT_FOUND = syscall.Errno(1168)
|
sysERROR_NOT_FOUND = windows.Errno(1168)
|
||||||
sysERROR_INVALID_PARAMETER = syscall.Errno(87)
|
sysERROR_INVALID_PARAMETER = windows.Errno(87)
|
||||||
)
|
)
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-credreadw
|
// https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-credreadw
|
||||||
func sysCredRead(targetName string, typ sysCRED_TYPE) (*Credential, error) {
|
func sysCredRead(targetName string, typ sysCRED_TYPE) (*Credential, error) {
|
||||||
var pcred *sysCREDENTIAL
|
var pcred *sysCREDENTIAL
|
||||||
targetNamePtr, _ := syscall.UTF16PtrFromString(targetName)
|
targetNamePtr, _ := windows.UTF16PtrFromString(targetName)
|
||||||
ret, _, err := procCredRead.Call(
|
ret, _, err := syscall.SyscallN(
|
||||||
|
procCredRead.Addr(),
|
||||||
uintptr(unsafe.Pointer(targetNamePtr)),
|
uintptr(unsafe.Pointer(targetNamePtr)),
|
||||||
uintptr(typ),
|
uintptr(typ),
|
||||||
0,
|
0,
|
||||||
@@ -98,7 +101,7 @@ func sysCredWrite(cred *Credential, typ sysCRED_TYPE) error {
|
|||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-creddeletew
|
// https://docs.microsoft.com/en-us/windows/desktop/api/wincred/nf-wincred-creddeletew
|
||||||
func sysCredDelete(cred *Credential, typ sysCRED_TYPE) error {
|
func sysCredDelete(cred *Credential, typ sysCRED_TYPE) error {
|
||||||
targetNamePtr, _ := syscall.UTF16PtrFromString(cred.TargetName)
|
targetNamePtr, _ := windows.UTF16PtrFromString(cred.TargetName)
|
||||||
ret, _, err := procCredDelete.Call(
|
ret, _, err := procCredDelete.Call(
|
||||||
uintptr(unsafe.Pointer(targetNamePtr)),
|
uintptr(unsafe.Pointer(targetNamePtr)),
|
||||||
uintptr(typ),
|
uintptr(typ),
|
||||||
@@ -117,9 +120,10 @@ func sysCredEnumerate(filter string, all bool) ([]*Credential, error) {
|
|||||||
var pcreds uintptr
|
var pcreds uintptr
|
||||||
var filterPtr *uint16
|
var filterPtr *uint16
|
||||||
if !all {
|
if !all {
|
||||||
filterPtr, _ = syscall.UTF16PtrFromString(filter)
|
filterPtr, _ = windows.UTF16PtrFromString(filter)
|
||||||
}
|
}
|
||||||
ret, _, err := procCredEnumerate.Call(
|
ret, _, err := syscall.SyscallN(
|
||||||
|
procCredEnumerate.Addr(),
|
||||||
uintptr(unsafe.Pointer(filterPtr)),
|
uintptr(unsafe.Pointer(filterPtr)),
|
||||||
0,
|
0,
|
||||||
uintptr(unsafe.Pointer(&count)),
|
uintptr(unsafe.Pointer(&count)),
|
||||||
|
|||||||
+3
-3
@@ -37,14 +37,14 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer DestroyEnvironmentBlock(block)
|
defer DestroyEnvironmentBlock(block)
|
||||||
blockp := uintptr(unsafe.Pointer(block))
|
blockp := unsafe.Pointer(block)
|
||||||
for {
|
for {
|
||||||
entry := UTF16PtrToString((*uint16)(unsafe.Pointer(blockp)))
|
entry := UTF16PtrToString((*uint16)(blockp))
|
||||||
if len(entry) == 0 {
|
if len(entry) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
env = append(env, entry)
|
env = append(env, entry)
|
||||||
blockp += 2 * (uintptr(len(entry)) + 1)
|
blockp = unsafe.Add(blockp, 2*(len(entry)+1))
|
||||||
}
|
}
|
||||||
return env, nil
|
return env, nil
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -95,12 +95,17 @@ func ComposeCommandLine(args []string) string {
|
|||||||
// DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv,
|
// DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv,
|
||||||
// as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that
|
// as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that
|
||||||
// command lines are passed around.
|
// command lines are passed around.
|
||||||
|
// DecomposeCommandLine returns error if commandLine contains NUL.
|
||||||
func DecomposeCommandLine(commandLine string) ([]string, error) {
|
func DecomposeCommandLine(commandLine string) ([]string, error) {
|
||||||
if len(commandLine) == 0 {
|
if len(commandLine) == 0 {
|
||||||
return []string{}, nil
|
return []string{}, nil
|
||||||
}
|
}
|
||||||
|
utf16CommandLine, err := UTF16FromString(commandLine)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errorspkg.New("string with NUL passed to DecomposeCommandLine")
|
||||||
|
}
|
||||||
var argc int32
|
var argc int32
|
||||||
argv, err := CommandLineToArgv(StringToUTF16Ptr(commandLine), &argc)
|
argv, err := CommandLineToArgv(&utf16CommandLine[0], &argc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -141,6 +141,12 @@ const (
|
|||||||
SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1
|
SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ENUM_SERVICE_STATUS struct {
|
||||||
|
ServiceName *uint16
|
||||||
|
DisplayName *uint16
|
||||||
|
ServiceStatus SERVICE_STATUS
|
||||||
|
}
|
||||||
|
|
||||||
type SERVICE_STATUS struct {
|
type SERVICE_STATUS struct {
|
||||||
ServiceType uint32
|
ServiceType uint32
|
||||||
CurrentState uint32
|
CurrentState uint32
|
||||||
@@ -245,3 +251,4 @@ type QUERY_SERVICE_LOCK_STATUS struct {
|
|||||||
//sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications?
|
//sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications?
|
||||||
//sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW
|
//sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW
|
||||||
//sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation?
|
//sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation?
|
||||||
|
//sys EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) = advapi32.EnumDependentServicesW
|
||||||
|
|||||||
+5
-1
@@ -2220,15 +2220,19 @@ type JOBOBJECT_BASIC_UI_RESTRICTIONS struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// JobObjectInformationClass
|
// JobObjectInformationClass for QueryInformationJobObject and SetInformationJobObject
|
||||||
JobObjectAssociateCompletionPortInformation = 7
|
JobObjectAssociateCompletionPortInformation = 7
|
||||||
|
JobObjectBasicAccountingInformation = 1
|
||||||
|
JobObjectBasicAndIoAccountingInformation = 8
|
||||||
JobObjectBasicLimitInformation = 2
|
JobObjectBasicLimitInformation = 2
|
||||||
|
JobObjectBasicProcessIdList = 3
|
||||||
JobObjectBasicUIRestrictions = 4
|
JobObjectBasicUIRestrictions = 4
|
||||||
JobObjectCpuRateControlInformation = 15
|
JobObjectCpuRateControlInformation = 15
|
||||||
JobObjectEndOfJobTimeInformation = 6
|
JobObjectEndOfJobTimeInformation = 6
|
||||||
JobObjectExtendedLimitInformation = 9
|
JobObjectExtendedLimitInformation = 9
|
||||||
JobObjectGroupInformation = 11
|
JobObjectGroupInformation = 11
|
||||||
JobObjectGroupInformationEx = 14
|
JobObjectGroupInformationEx = 14
|
||||||
|
JobObjectLimitViolationInformation = 13
|
||||||
JobObjectLimitViolationInformation2 = 34
|
JobObjectLimitViolationInformation2 = 34
|
||||||
JobObjectNetRateControlInformation = 32
|
JobObjectNetRateControlInformation = 32
|
||||||
JobObjectNotificationLimitInformation = 12
|
JobObjectNotificationLimitInformation = 12
|
||||||
|
|||||||
+9
@@ -86,6 +86,7 @@ var (
|
|||||||
procDeleteService = modadvapi32.NewProc("DeleteService")
|
procDeleteService = modadvapi32.NewProc("DeleteService")
|
||||||
procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
|
procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
|
||||||
procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
|
procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
|
||||||
|
procEnumDependentServicesW = modadvapi32.NewProc("EnumDependentServicesW")
|
||||||
procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW")
|
procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW")
|
||||||
procEqualSid = modadvapi32.NewProc("EqualSid")
|
procEqualSid = modadvapi32.NewProc("EqualSid")
|
||||||
procFreeSid = modadvapi32.NewProc("FreeSid")
|
procFreeSid = modadvapi32.NewProc("FreeSid")
|
||||||
@@ -734,6 +735,14 @@ func DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EnumDependentServices(service Handle, activityState uint32, services *ENUM_SERVICE_STATUS, buffSize uint32, bytesNeeded *uint32, servicesReturned *uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procEnumDependentServicesW.Addr(), 6, uintptr(service), uintptr(activityState), uintptr(unsafe.Pointer(services)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)))
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
|
func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
|
r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|||||||
Vendored
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
# github.com/danieljoos/wincred v1.1.2
|
# github.com/danieljoos/wincred v1.2.0
|
||||||
## explicit; go 1.13
|
## explicit; go 1.18
|
||||||
github.com/danieljoos/wincred
|
github.com/danieljoos/wincred
|
||||||
# golang.org/x/sys v0.7.0
|
# golang.org/x/sys v0.8.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
|
|||||||
Reference in New Issue
Block a user