mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-04 19:45:14 -04:00
57 lines
1.9 KiB
Go
57 lines
1.9 KiB
Go
//go:build linux || darwin || freebsd
|
|
|
|
package ipcauth
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
|
|
"google.golang.org/grpc/credentials"
|
|
)
|
|
|
|
// NewTransportCredentials returns gRPC transport credentials that expose the
|
|
// caller's kernel-authenticated identity via IdentityFromContext. It returns
|
|
// nil on platforms that have no peer-identity primitive, which the caller must
|
|
// treat as "authorization cannot be enforced".
|
|
//
|
|
// The handshake exchanges no bytes on the wire, so a client dialing with
|
|
// insecure credentials interoperates with a server using these. That keeps
|
|
// older CLI and UI binaries working against an upgraded daemon.
|
|
func NewTransportCredentials() credentials.TransportCredentials {
|
|
return unixCreds{}
|
|
}
|
|
|
|
// ConnIdentity extracts the caller's identity from an accepted local IPC
|
|
// connection. It is shared by the gRPC transport credentials and by the JSON
|
|
// gateway, which reads the identity of its own HTTP clients.
|
|
func ConnIdentity(conn net.Conn) (Identity, error) {
|
|
return PeerIdentity(conn)
|
|
}
|
|
|
|
type unixCreds struct{}
|
|
|
|
func (unixCreds) ClientHandshake(_ context.Context, _ string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) {
|
|
return conn, AuthInfo{}, nil
|
|
}
|
|
|
|
// ServerHandshake extracts the peer identity and fails closed when it cannot
|
|
// be read, so a connection whose caller is unknown never reaches a handler.
|
|
func (unixCreds) ServerHandshake(conn net.Conn) (net.Conn, credentials.AuthInfo, error) {
|
|
id, err := ConnIdentity(conn)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return conn, AuthInfo{
|
|
CommonAuthInfo: credentials.CommonAuthInfo{SecurityLevel: credentials.NoSecurity},
|
|
Identity: id,
|
|
}, nil
|
|
}
|
|
|
|
func (unixCreds) Info() credentials.ProtocolInfo {
|
|
return credentials.ProtocolInfo{SecurityProtocol: AuthInfo{}.AuthType()}
|
|
}
|
|
|
|
func (unixCreds) Clone() credentials.TransportCredentials { return unixCreds{} }
|
|
|
|
func (unixCreds) OverrideServerName(string) error { return nil }
|