mirror of
https://github.com/docker/docker-credential-helpers.git
synced 2026-06-13 16:01:28 +05:30
Merge pull request #265 from crazy-max/bump-golang-sys
Bump golang.org/x/sys to v0.7.0
This commit is contained in:
@@ -4,5 +4,5 @@ go 1.18
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/danieljoos/wincred v1.1.2
|
github.com/danieljoos/wincred v1.1.2
|
||||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64
|
golang.org/x/sys v0.7.0
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
|||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM=
|
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
+1
-1
@@ -63,7 +63,7 @@ func LookPath(file string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fixCmd(name string, cmd *exec.Cmd) {
|
func fixCmd(name string, cmd *exec.Cmd) {
|
||||||
if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) {
|
if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) && !isGo119ErrFieldSet(cmd) {
|
||||||
// exec.Command was called with a bare binary name and
|
// exec.Command was called with a bare binary name and
|
||||||
// exec.LookPath returned a path which is not absolute.
|
// exec.LookPath returned a path which is not absolute.
|
||||||
// Set cmd.lookPathErr and clear cmd.Path so that it
|
// Set cmd.lookPathErr and clear cmd.Path so that it
|
||||||
|
|||||||
+6
@@ -7,6 +7,12 @@
|
|||||||
|
|
||||||
package execabs
|
package execabs
|
||||||
|
|
||||||
|
import "os/exec"
|
||||||
|
|
||||||
func isGo119ErrDot(err error) bool {
|
func isGo119ErrDot(err error) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isGo119ErrFieldSet(cmd *exec.Cmd) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
+9
-3
@@ -7,9 +7,15 @@
|
|||||||
|
|
||||||
package execabs
|
package execabs
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"errors"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
func isGo119ErrDot(err error) bool {
|
func isGo119ErrDot(err error) bool {
|
||||||
// TODO: return errors.Is(err, exec.ErrDot)
|
return errors.Is(err, exec.ErrDot)
|
||||||
return strings.Contains(err.Error(), "current directory")
|
}
|
||||||
|
|
||||||
|
func isGo119ErrFieldSet(cmd *exec.Cmd) bool {
|
||||||
|
return cmd.Err != nil
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-9
@@ -30,8 +30,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"golang.org/x/sys/internal/unsafeheader"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ByteSliceFromString returns a NUL-terminated slice of bytes
|
// ByteSliceFromString returns a NUL-terminated slice of bytes
|
||||||
@@ -83,13 +81,7 @@ func BytePtrToString(p *byte) string {
|
|||||||
ptr = unsafe.Pointer(uintptr(ptr) + 1)
|
ptr = unsafe.Pointer(uintptr(ptr) + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
var s []byte
|
return string(unsafe.Slice(p, n))
|
||||||
h := (*unsafeheader.Slice)(unsafe.Pointer(&s))
|
|
||||||
h.Data = unsafe.Pointer(p)
|
|
||||||
h.Len = n
|
|
||||||
h.Cap = n
|
|
||||||
|
|
||||||
return string(s)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
// Single-word zero for use when we need a valid pointer to 0 bytes.
|
||||||
|
|||||||
+30
-26
@@ -10,7 +10,6 @@ import (
|
|||||||
errorspkg "errors"
|
errorspkg "errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@@ -87,22 +86,13 @@ func StringToUTF16(s string) []uint16 {
|
|||||||
// s, with a terminating NUL added. If s contains a NUL byte at any
|
// s, with a terminating NUL added. If s contains a NUL byte at any
|
||||||
// location, it returns (nil, syscall.EINVAL).
|
// location, it returns (nil, syscall.EINVAL).
|
||||||
func UTF16FromString(s string) ([]uint16, error) {
|
func UTF16FromString(s string) ([]uint16, error) {
|
||||||
if strings.IndexByte(s, 0) != -1 {
|
return syscall.UTF16FromString(s)
|
||||||
return nil, syscall.EINVAL
|
|
||||||
}
|
|
||||||
return utf16.Encode([]rune(s + "\x00")), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
|
// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
|
||||||
// with a terminating NUL and any bytes after the NUL removed.
|
// with a terminating NUL and any bytes after the NUL removed.
|
||||||
func UTF16ToString(s []uint16) string {
|
func UTF16ToString(s []uint16) string {
|
||||||
for i, v := range s {
|
return syscall.UTF16ToString(s)
|
||||||
if v == 0 {
|
|
||||||
s = s[:i]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string(utf16.Decode(s))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
|
// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
|
||||||
@@ -138,13 +128,7 @@ func UTF16PtrToString(p *uint16) string {
|
|||||||
ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p))
|
ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p))
|
||||||
}
|
}
|
||||||
|
|
||||||
var s []uint16
|
return string(utf16.Decode(unsafe.Slice(p, n)))
|
||||||
h := (*unsafeheader.Slice)(unsafe.Pointer(&s))
|
|
||||||
h.Data = unsafe.Pointer(p)
|
|
||||||
h.Len = n
|
|
||||||
h.Cap = n
|
|
||||||
|
|
||||||
return string(utf16.Decode(s))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Getpagesize() int { return 4096 }
|
func Getpagesize() int { return 4096 }
|
||||||
@@ -364,6 +348,16 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
|||||||
//sys SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
|
//sys SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
|
||||||
//sys GetActiveProcessorCount(groupNumber uint16) (ret uint32)
|
//sys GetActiveProcessorCount(groupNumber uint16) (ret uint32)
|
||||||
//sys GetMaximumProcessorCount(groupNumber uint16) (ret uint32)
|
//sys GetMaximumProcessorCount(groupNumber uint16) (ret uint32)
|
||||||
|
//sys EnumWindows(enumFunc uintptr, param unsafe.Pointer) (err error) = user32.EnumWindows
|
||||||
|
//sys EnumChildWindows(hwnd HWND, enumFunc uintptr, param unsafe.Pointer) = user32.EnumChildWindows
|
||||||
|
//sys GetClassName(hwnd HWND, className *uint16, maxCount int32) (copied int32, err error) = user32.GetClassNameW
|
||||||
|
//sys GetDesktopWindow() (hwnd HWND) = user32.GetDesktopWindow
|
||||||
|
//sys GetForegroundWindow() (hwnd HWND) = user32.GetForegroundWindow
|
||||||
|
//sys IsWindow(hwnd HWND) (isWindow bool) = user32.IsWindow
|
||||||
|
//sys IsWindowUnicode(hwnd HWND) (isUnicode bool) = user32.IsWindowUnicode
|
||||||
|
//sys IsWindowVisible(hwnd HWND) (isVisible bool) = user32.IsWindowVisible
|
||||||
|
//sys GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) = user32.GetGUIThreadInfo
|
||||||
|
//sys GetLargePageMinimum() (size uintptr)
|
||||||
|
|
||||||
// Volume Management Functions
|
// Volume Management Functions
|
||||||
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
|
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
|
||||||
@@ -439,6 +433,10 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
|||||||
//sys RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable
|
//sys RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable
|
||||||
//sys RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable
|
//sys RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable
|
||||||
|
|
||||||
|
// Desktop Window Manager API (Dwmapi)
|
||||||
|
//sys DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute
|
||||||
|
//sys DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute
|
||||||
|
|
||||||
// syscall interface implementation for other packages
|
// syscall interface implementation for other packages
|
||||||
|
|
||||||
// GetCurrentProcess returns the handle for the current process.
|
// GetCurrentProcess returns the handle for the current process.
|
||||||
@@ -748,7 +746,7 @@ func Utimes(path string, tv []Timeval) (err error) {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
defer Close(h)
|
defer CloseHandle(h)
|
||||||
a := NsecToFiletime(tv[0].Nanoseconds())
|
a := NsecToFiletime(tv[0].Nanoseconds())
|
||||||
w := NsecToFiletime(tv[1].Nanoseconds())
|
w := NsecToFiletime(tv[1].Nanoseconds())
|
||||||
return SetFileTime(h, nil, &a, &w)
|
return SetFileTime(h, nil, &a, &w)
|
||||||
@@ -768,7 +766,7 @@ func UtimesNano(path string, ts []Timespec) (err error) {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
defer Close(h)
|
defer CloseHandle(h)
|
||||||
a := NsecToFiletime(TimespecToNsec(ts[0]))
|
a := NsecToFiletime(TimespecToNsec(ts[0]))
|
||||||
w := NsecToFiletime(TimespecToNsec(ts[1]))
|
w := NsecToFiletime(TimespecToNsec(ts[1]))
|
||||||
return SetFileTime(h, nil, &a, &w)
|
return SetFileTime(h, nil, &a, &w)
|
||||||
@@ -826,6 +824,9 @@ const socket_error = uintptr(^uint32(0))
|
|||||||
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
|
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
|
||||||
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
|
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
|
||||||
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
|
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
|
||||||
|
//sys WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
|
||||||
|
//sys WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
|
||||||
|
//sys WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
|
||||||
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
|
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
|
||||||
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
|
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
|
||||||
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
|
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
|
||||||
@@ -1021,8 +1022,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
|
|||||||
for n < len(pp.Path) && pp.Path[n] != 0 {
|
for n < len(pp.Path) && pp.Path[n] != 0 {
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
|
sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
|
||||||
sa.Name = string(bytes)
|
|
||||||
return sa, nil
|
return sa, nil
|
||||||
|
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
@@ -1108,9 +1108,13 @@ func Shutdown(fd Handle, how int) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
|
func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
|
||||||
rsa, l, err := to.sockaddr()
|
var rsa unsafe.Pointer
|
||||||
if err != nil {
|
var l int32
|
||||||
return err
|
if to != nil {
|
||||||
|
rsa, l, err = to.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
|
return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
|
||||||
}
|
}
|
||||||
|
|||||||
+132
-2
@@ -1243,6 +1243,51 @@ const (
|
|||||||
DnsSectionAdditional = 0x0003
|
DnsSectionAdditional = 0x0003
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// flags of WSALookupService
|
||||||
|
LUP_DEEP = 0x0001
|
||||||
|
LUP_CONTAINERS = 0x0002
|
||||||
|
LUP_NOCONTAINERS = 0x0004
|
||||||
|
LUP_NEAREST = 0x0008
|
||||||
|
LUP_RETURN_NAME = 0x0010
|
||||||
|
LUP_RETURN_TYPE = 0x0020
|
||||||
|
LUP_RETURN_VERSION = 0x0040
|
||||||
|
LUP_RETURN_COMMENT = 0x0080
|
||||||
|
LUP_RETURN_ADDR = 0x0100
|
||||||
|
LUP_RETURN_BLOB = 0x0200
|
||||||
|
LUP_RETURN_ALIASES = 0x0400
|
||||||
|
LUP_RETURN_QUERY_STRING = 0x0800
|
||||||
|
LUP_RETURN_ALL = 0x0FF0
|
||||||
|
LUP_RES_SERVICE = 0x8000
|
||||||
|
|
||||||
|
LUP_FLUSHCACHE = 0x1000
|
||||||
|
LUP_FLUSHPREVIOUS = 0x2000
|
||||||
|
|
||||||
|
LUP_NON_AUTHORITATIVE = 0x4000
|
||||||
|
LUP_SECURE = 0x8000
|
||||||
|
LUP_RETURN_PREFERRED_NAMES = 0x10000
|
||||||
|
LUP_DNS_ONLY = 0x20000
|
||||||
|
|
||||||
|
LUP_ADDRCONFIG = 0x100000
|
||||||
|
LUP_DUAL_ADDR = 0x200000
|
||||||
|
LUP_FILESERVER = 0x400000
|
||||||
|
LUP_DISABLE_IDN_ENCODING = 0x00800000
|
||||||
|
LUP_API_ANSI = 0x01000000
|
||||||
|
|
||||||
|
LUP_RESOLUTION_HANDLE = 0x80000000
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// values of WSAQUERYSET's namespace
|
||||||
|
NS_ALL = 0
|
||||||
|
NS_DNS = 12
|
||||||
|
NS_NLA = 15
|
||||||
|
NS_BTH = 16
|
||||||
|
NS_EMAIL = 37
|
||||||
|
NS_PNRPNAME = 38
|
||||||
|
NS_PNRPCLOUD = 39
|
||||||
|
)
|
||||||
|
|
||||||
type DNSSRVData struct {
|
type DNSSRVData struct {
|
||||||
Target *uint16
|
Target *uint16
|
||||||
Priority uint16
|
Priority uint16
|
||||||
@@ -2184,10 +2229,10 @@ const (
|
|||||||
JobObjectExtendedLimitInformation = 9
|
JobObjectExtendedLimitInformation = 9
|
||||||
JobObjectGroupInformation = 11
|
JobObjectGroupInformation = 11
|
||||||
JobObjectGroupInformationEx = 14
|
JobObjectGroupInformationEx = 14
|
||||||
JobObjectLimitViolationInformation2 = 35
|
JobObjectLimitViolationInformation2 = 34
|
||||||
JobObjectNetRateControlInformation = 32
|
JobObjectNetRateControlInformation = 32
|
||||||
JobObjectNotificationLimitInformation = 12
|
JobObjectNotificationLimitInformation = 12
|
||||||
JobObjectNotificationLimitInformation2 = 34
|
JobObjectNotificationLimitInformation2 = 33
|
||||||
JobObjectSecurityLimitInformation = 5
|
JobObjectSecurityLimitInformation = 5
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -3213,3 +3258,88 @@ type ModuleInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ALL_PROCESSOR_GROUPS = 0xFFFF
|
const ALL_PROCESSOR_GROUPS = 0xFFFF
|
||||||
|
|
||||||
|
type Rect struct {
|
||||||
|
Left int32
|
||||||
|
Top int32
|
||||||
|
Right int32
|
||||||
|
Bottom int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type GUIThreadInfo struct {
|
||||||
|
Size uint32
|
||||||
|
Flags uint32
|
||||||
|
Active HWND
|
||||||
|
Focus HWND
|
||||||
|
Capture HWND
|
||||||
|
MenuOwner HWND
|
||||||
|
MoveSize HWND
|
||||||
|
CaretHandle HWND
|
||||||
|
CaretRect Rect
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
DWMWA_NCRENDERING_ENABLED = 1
|
||||||
|
DWMWA_NCRENDERING_POLICY = 2
|
||||||
|
DWMWA_TRANSITIONS_FORCEDISABLED = 3
|
||||||
|
DWMWA_ALLOW_NCPAINT = 4
|
||||||
|
DWMWA_CAPTION_BUTTON_BOUNDS = 5
|
||||||
|
DWMWA_NONCLIENT_RTL_LAYOUT = 6
|
||||||
|
DWMWA_FORCE_ICONIC_REPRESENTATION = 7
|
||||||
|
DWMWA_FLIP3D_POLICY = 8
|
||||||
|
DWMWA_EXTENDED_FRAME_BOUNDS = 9
|
||||||
|
DWMWA_HAS_ICONIC_BITMAP = 10
|
||||||
|
DWMWA_DISALLOW_PEEK = 11
|
||||||
|
DWMWA_EXCLUDED_FROM_PEEK = 12
|
||||||
|
DWMWA_CLOAK = 13
|
||||||
|
DWMWA_CLOAKED = 14
|
||||||
|
DWMWA_FREEZE_REPRESENTATION = 15
|
||||||
|
DWMWA_PASSIVE_UPDATE_MODE = 16
|
||||||
|
DWMWA_USE_HOSTBACKDROPBRUSH = 17
|
||||||
|
DWMWA_USE_IMMERSIVE_DARK_MODE = 20
|
||||||
|
DWMWA_WINDOW_CORNER_PREFERENCE = 33
|
||||||
|
DWMWA_BORDER_COLOR = 34
|
||||||
|
DWMWA_CAPTION_COLOR = 35
|
||||||
|
DWMWA_TEXT_COLOR = 36
|
||||||
|
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37
|
||||||
|
)
|
||||||
|
|
||||||
|
type WSAQUERYSET struct {
|
||||||
|
Size uint32
|
||||||
|
ServiceInstanceName *uint16
|
||||||
|
ServiceClassId *GUID
|
||||||
|
Version *WSAVersion
|
||||||
|
Comment *uint16
|
||||||
|
NameSpace uint32
|
||||||
|
NSProviderId *GUID
|
||||||
|
Context *uint16
|
||||||
|
NumberOfProtocols uint32
|
||||||
|
AfpProtocols *AFProtocols
|
||||||
|
QueryString *uint16
|
||||||
|
NumberOfCsAddrs uint32
|
||||||
|
SaBuffer *CSAddrInfo
|
||||||
|
OutputFlags uint32
|
||||||
|
Blob *BLOB
|
||||||
|
}
|
||||||
|
|
||||||
|
type WSAVersion struct {
|
||||||
|
Version uint32
|
||||||
|
EnumerationOfComparison int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type AFProtocols struct {
|
||||||
|
AddressFamily int32
|
||||||
|
Protocol int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type CSAddrInfo struct {
|
||||||
|
LocalAddr SocketAddress
|
||||||
|
RemoteAddr SocketAddress
|
||||||
|
SocketType int32
|
||||||
|
Protocol int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type BLOB struct {
|
||||||
|
Size uint32
|
||||||
|
BlobData *byte
|
||||||
|
}
|
||||||
|
|||||||
+122
@@ -40,6 +40,7 @@ var (
|
|||||||
modadvapi32 = NewLazySystemDLL("advapi32.dll")
|
modadvapi32 = NewLazySystemDLL("advapi32.dll")
|
||||||
modcrypt32 = NewLazySystemDLL("crypt32.dll")
|
modcrypt32 = NewLazySystemDLL("crypt32.dll")
|
||||||
moddnsapi = NewLazySystemDLL("dnsapi.dll")
|
moddnsapi = NewLazySystemDLL("dnsapi.dll")
|
||||||
|
moddwmapi = NewLazySystemDLL("dwmapi.dll")
|
||||||
modiphlpapi = NewLazySystemDLL("iphlpapi.dll")
|
modiphlpapi = NewLazySystemDLL("iphlpapi.dll")
|
||||||
modkernel32 = NewLazySystemDLL("kernel32.dll")
|
modkernel32 = NewLazySystemDLL("kernel32.dll")
|
||||||
modmswsock = NewLazySystemDLL("mswsock.dll")
|
modmswsock = NewLazySystemDLL("mswsock.dll")
|
||||||
@@ -175,6 +176,8 @@ var (
|
|||||||
procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W")
|
procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W")
|
||||||
procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W")
|
procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W")
|
||||||
procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree")
|
procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree")
|
||||||
|
procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
|
||||||
|
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
||||||
procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
|
procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
|
||||||
procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo")
|
procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo")
|
||||||
procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx")
|
procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx")
|
||||||
@@ -249,6 +252,7 @@ var (
|
|||||||
procGetFileType = modkernel32.NewProc("GetFileType")
|
procGetFileType = modkernel32.NewProc("GetFileType")
|
||||||
procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW")
|
procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW")
|
||||||
procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW")
|
procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW")
|
||||||
|
procGetLargePageMinimum = modkernel32.NewProc("GetLargePageMinimum")
|
||||||
procGetLastError = modkernel32.NewProc("GetLastError")
|
procGetLastError = modkernel32.NewProc("GetLastError")
|
||||||
procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
|
procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
|
||||||
procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
|
procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
|
||||||
@@ -444,9 +448,18 @@ var (
|
|||||||
procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW")
|
procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW")
|
||||||
procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath")
|
procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath")
|
||||||
procShellExecuteW = modshell32.NewProc("ShellExecuteW")
|
procShellExecuteW = modshell32.NewProc("ShellExecuteW")
|
||||||
|
procEnumChildWindows = moduser32.NewProc("EnumChildWindows")
|
||||||
|
procEnumWindows = moduser32.NewProc("EnumWindows")
|
||||||
procExitWindowsEx = moduser32.NewProc("ExitWindowsEx")
|
procExitWindowsEx = moduser32.NewProc("ExitWindowsEx")
|
||||||
|
procGetClassNameW = moduser32.NewProc("GetClassNameW")
|
||||||
|
procGetDesktopWindow = moduser32.NewProc("GetDesktopWindow")
|
||||||
|
procGetForegroundWindow = moduser32.NewProc("GetForegroundWindow")
|
||||||
|
procGetGUIThreadInfo = moduser32.NewProc("GetGUIThreadInfo")
|
||||||
procGetShellWindow = moduser32.NewProc("GetShellWindow")
|
procGetShellWindow = moduser32.NewProc("GetShellWindow")
|
||||||
procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId")
|
procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId")
|
||||||
|
procIsWindow = moduser32.NewProc("IsWindow")
|
||||||
|
procIsWindowUnicode = moduser32.NewProc("IsWindowUnicode")
|
||||||
|
procIsWindowVisible = moduser32.NewProc("IsWindowVisible")
|
||||||
procMessageBoxW = moduser32.NewProc("MessageBoxW")
|
procMessageBoxW = moduser32.NewProc("MessageBoxW")
|
||||||
procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock")
|
procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock")
|
||||||
procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock")
|
procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock")
|
||||||
@@ -461,6 +474,9 @@ var (
|
|||||||
procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW")
|
procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW")
|
||||||
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult")
|
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult")
|
||||||
procWSAIoctl = modws2_32.NewProc("WSAIoctl")
|
procWSAIoctl = modws2_32.NewProc("WSAIoctl")
|
||||||
|
procWSALookupServiceBeginW = modws2_32.NewProc("WSALookupServiceBeginW")
|
||||||
|
procWSALookupServiceEnd = modws2_32.NewProc("WSALookupServiceEnd")
|
||||||
|
procWSALookupServiceNextW = modws2_32.NewProc("WSALookupServiceNextW")
|
||||||
procWSARecv = modws2_32.NewProc("WSARecv")
|
procWSARecv = modws2_32.NewProc("WSARecv")
|
||||||
procWSARecvFrom = modws2_32.NewProc("WSARecvFrom")
|
procWSARecvFrom = modws2_32.NewProc("WSARecvFrom")
|
||||||
procWSASend = modws2_32.NewProc("WSASend")
|
procWSASend = modws2_32.NewProc("WSASend")
|
||||||
@@ -1525,6 +1541,22 @@ func DnsRecordListFree(rl *DNSRecord, freetype uint32) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procDwmGetWindowAttribute.Addr(), 4, uintptr(hwnd), uintptr(attribute), uintptr(value), uintptr(size), 0, 0)
|
||||||
|
if r0 != 0 {
|
||||||
|
ret = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) {
|
||||||
|
r0, _, _ := syscall.Syscall6(procDwmSetWindowAttribute.Addr(), 4, uintptr(hwnd), uintptr(attribute), uintptr(value), uintptr(size), 0, 0)
|
||||||
|
if r0 != 0 {
|
||||||
|
ret = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
|
func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
|
||||||
r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0)
|
r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
@@ -2152,6 +2184,12 @@ func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetLargePageMinimum() (size uintptr) {
|
||||||
|
r0, _, _ := syscall.Syscall(procGetLargePageMinimum.Addr(), 0, 0, 0, 0)
|
||||||
|
size = uintptr(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetLastError() (lasterr error) {
|
func GetLastError() (lasterr error) {
|
||||||
r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
|
r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
@@ -3802,6 +3840,19 @@ func ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *ui
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EnumChildWindows(hwnd HWND, enumFunc uintptr, param unsafe.Pointer) {
|
||||||
|
syscall.Syscall(procEnumChildWindows.Addr(), 3, uintptr(hwnd), uintptr(enumFunc), uintptr(param))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func EnumWindows(enumFunc uintptr, param unsafe.Pointer) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(param), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func ExitWindowsEx(flags uint32, reason uint32) (err error) {
|
func ExitWindowsEx(flags uint32, reason uint32) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall(procExitWindowsEx.Addr(), 2, uintptr(flags), uintptr(reason), 0)
|
r1, _, e1 := syscall.Syscall(procExitWindowsEx.Addr(), 2, uintptr(flags), uintptr(reason), 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
@@ -3810,6 +3861,35 @@ func ExitWindowsEx(flags uint32, reason uint32) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetClassName(hwnd HWND, className *uint16, maxCount int32) (copied int32, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall(procGetClassNameW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(className)), uintptr(maxCount))
|
||||||
|
copied = int32(r0)
|
||||||
|
if copied == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDesktopWindow() (hwnd HWND) {
|
||||||
|
r0, _, _ := syscall.Syscall(procGetDesktopWindow.Addr(), 0, 0, 0, 0)
|
||||||
|
hwnd = HWND(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetForegroundWindow() (hwnd HWND) {
|
||||||
|
r0, _, _ := syscall.Syscall(procGetForegroundWindow.Addr(), 0, 0, 0, 0)
|
||||||
|
hwnd = HWND(r0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procGetGUIThreadInfo.Addr(), 2, uintptr(thread), uintptr(unsafe.Pointer(info)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetShellWindow() (shellWindow HWND) {
|
func GetShellWindow() (shellWindow HWND) {
|
||||||
r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0)
|
r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0)
|
||||||
shellWindow = HWND(r0)
|
shellWindow = HWND(r0)
|
||||||
@@ -3825,6 +3905,24 @@ func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsWindow(hwnd HWND) (isWindow bool) {
|
||||||
|
r0, _, _ := syscall.Syscall(procIsWindow.Addr(), 1, uintptr(hwnd), 0, 0)
|
||||||
|
isWindow = r0 != 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsWindowUnicode(hwnd HWND) (isUnicode bool) {
|
||||||
|
r0, _, _ := syscall.Syscall(procIsWindowUnicode.Addr(), 1, uintptr(hwnd), 0, 0)
|
||||||
|
isUnicode = r0 != 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsWindowVisible(hwnd HWND) (isVisible bool) {
|
||||||
|
r0, _, _ := syscall.Syscall(procIsWindowVisible.Addr(), 1, uintptr(hwnd), 0, 0)
|
||||||
|
isVisible = r0 != 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) {
|
func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) {
|
||||||
r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0)
|
r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0)
|
||||||
ret = int32(r0)
|
ret = int32(r0)
|
||||||
@@ -3972,6 +4070,30 @@ func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procWSALookupServiceBeginW.Addr(), 3, uintptr(unsafe.Pointer(querySet)), uintptr(flags), uintptr(unsafe.Pointer(handle)))
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceEnd(handle Handle) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procWSALookupServiceEnd.Addr(), 1, uintptr(handle), 0, 0)
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall6(procWSALookupServiceNextW.Addr(), 4, uintptr(handle), uintptr(flags), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(querySet)), 0, 0)
|
||||||
|
if r1 == socket_error {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
|
func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
|
r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
|
||||||
if r1 == socket_error {
|
if r1 == socket_error {
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# github.com/danieljoos/wincred v1.1.2
|
# github.com/danieljoos/wincred v1.1.2
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/danieljoos/wincred
|
github.com/danieljoos/wincred
|
||||||
# golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64
|
# golang.org/x/sys v0.7.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
|
|||||||
Reference in New Issue
Block a user