From dcf2844318d3f2ac046da6b480d9714bebfa8e51 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Sat, 5 Apr 2025 14:43:55 -0400 Subject: [PATCH] Initial Windows support --- README.md | 3 ++- peercred.go | 12 +---------- peercred_darwin.go | 4 ++-- peercred_freebsd.go | 4 ++-- peercred_linux.go | 4 ++-- peercred_solaris.go | 4 ++-- peercred_unix_generic.go | 17 ++++++++++++++++ peercred_unix_test.go | 2 +- peercred_windows.go | 43 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 peercred_unix_generic.go create mode 100644 peercred_windows.go diff --git a/README.md b/README.md index 081cc8f..0ce8f97 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# peercred \ No newline at end of file +# peercred-mini +A simple module for getting the PID and UID of processes accessing UNIX domain sockets and Windows named pipes. diff --git a/peercred.go b/peercred.go index 1f19f56..72b2c9a 100644 --- a/peercred.go +++ b/peercred.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2024 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -6,10 +6,6 @@ // other side of the connection, using various OS-specific facilities. package peercred -import ( - "net" -) - // Creds are the peer credentials. type Creds struct { pid int @@ -26,9 +22,3 @@ func (c *Creds) PID() (pid int) { func (c *Creds) UID() (uid string) { return c.uid } - -// Get returns the peer credentials for c. -func Get(c net.Conn) *Creds { - creds, _ := getUnix(c.(*net.UnixConn)) - return creds -} diff --git a/peercred_darwin.go b/peercred_darwin.go index 83e791e..de4152d 100644 --- a/peercred_darwin.go +++ b/peercred_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -12,7 +12,7 @@ import ( "github.com/rwinkhart/sys-freebsd-13-xucred/unix" ) -func getUnix(c *net.UnixConn) (*Creds, error) { +func get(c *net.UnixConn) (*Creds, error) { raw, err := c.SyscallConn() if err != nil { return nil, fmt.Errorf("SyscallConn: %w", err) diff --git a/peercred_freebsd.go b/peercred_freebsd.go index 441ddc3..6262e11 100644 --- a/peercred_freebsd.go +++ b/peercred_freebsd.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -12,7 +12,7 @@ import ( "github.com/rwinkhart/sys-freebsd-13-xucred/unix" ) -func getUnix(c *net.UnixConn) (*Creds, error) { +func get(c *net.UnixConn) (*Creds, error) { raw, err := c.SyscallConn() if err != nil { return nil, fmt.Errorf("SyscallConn: %w", err) diff --git a/peercred_linux.go b/peercred_linux.go index 0dd38e6..1261fe6 100644 --- a/peercred_linux.go +++ b/peercred_linux.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -12,7 +12,7 @@ import ( "github.com/rwinkhart/sys-freebsd-13-xucred/unix" ) -func getUnix(c *net.UnixConn) (*Creds, error) { +func get(c *net.UnixConn) (*Creds, error) { raw, err := c.SyscallConn() if err != nil { return nil, fmt.Errorf("SyscallConn: %w", err) diff --git a/peercred_solaris.go b/peercred_solaris.go index 498b045..0e1fdbb 100644 --- a/peercred_solaris.go +++ b/peercred_solaris.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -12,7 +12,7 @@ import ( "github.com/rwinkhart/sys-freebsd-13-xucred/unix" ) -func getUnix(c *net.UnixConn) (*Creds, error) { +func get(c *net.UnixConn) (*Creds, error) { raw, err := c.SyscallConn() if err != nil { return nil, fmt.Errorf("SyscallConn: %w", err) diff --git a/peercred_unix_generic.go b/peercred_unix_generic.go new file mode 100644 index 0000000..f4b37b0 --- /dev/null +++ b/peercred_unix_generic.go @@ -0,0 +1,17 @@ +//go:build !windows + +// Copyright (c) 2021-2025 AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package peercred maps from a net.Conn to information about the +// other side of the connection, using various OS-specific facilities. +package peercred + +import "net" + +// Get returns the peer credentials for c. +func Get(c net.Conn) *Creds { + creds, _ := get(c.(*net.UnixConn)) + return creds +} diff --git a/peercred_unix_test.go b/peercred_unix_test.go index 15c9362..ec39181 100644 --- a/peercred_unix_test.go +++ b/peercred_unix_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 AUTHORS All rights reserved. +// Copyright (c) 2021-2025 AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/peercred_windows.go b/peercred_windows.go new file mode 100644 index 0000000..fa44cd5 --- /dev/null +++ b/peercred_windows.go @@ -0,0 +1,43 @@ +// Copyright (c) 2021-2025 AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package peercred + +import ( + "fmt" + + "github.com/rwinkhart/sys-freebsd-13-xucred/windows" +) + +// Get returns the peer credentials for c. +func Get(h *windows.Handle) *Creds { + creds, _ := get(h) + return creds +} + +func get(h *windows.Handle) (*Creds, error) { + // get PID + var clientPID uint32 + windows.GetNamedPipeClientProcessId(*h, &clientPID) + + // get SID (UID) + var access uint32 = windows.PROCESS_QUERY_INFORMATION + hProcess, herr := windows.OpenProcess(access, false, clientPID) + defer windows.CloseHandle(hProcess) + var hToken windows.Token + windows.OpenProcessToken(hProcess, windows.TOKEN_QUERY, &hToken) + defer hToken.Close() + tokenUser, terr := hToken.GetTokenUser() + if terr != nil { + return nil, fmt.Errorf("windows.OpenProcessToken: %w", terr) + } + if herr != nil { + return nil, fmt.Errorf("windows.OpenProcess: %w", herr) + } + + return &Creds{ + pid: int(clientPID), + uid: tokenUser.User.Sid.String(), + }, nil +}