48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
// Copyright (c) 2021 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 (
|
|
"errors"
|
|
"net"
|
|
"runtime"
|
|
)
|
|
|
|
// Creds are the peer credentials.
|
|
type Creds struct {
|
|
pid int
|
|
uid string
|
|
}
|
|
|
|
func (c *Creds) PID() (pid int, ok bool) {
|
|
return c.pid, c.pid != 0
|
|
}
|
|
|
|
// UserID returns the userid (or Windows SID) that owns the other side
|
|
// of the connection, if known. (ok is false if not known)
|
|
// The returned string is suitable to passing to os/user.LookupId.
|
|
func (c *Creds) UserID() (uid string, ok bool) {
|
|
return c.uid, c.uid != ""
|
|
}
|
|
|
|
var osGet func(net.Conn) (*Creds, error)
|
|
|
|
var (
|
|
ErrNotImplemented = errors.New("not implemented on " + runtime.GOOS)
|
|
ErrUnsupportedConnType = errors.New("unsupported connection type")
|
|
)
|
|
|
|
// Get returns the peer credentials for c.
|
|
//
|
|
// For unsupported system, the error is ErrNotImplemented.
|
|
func Get(c net.Conn) (*Creds, error) {
|
|
if osGet == nil {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
return osGet(c)
|
|
}
|