mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-04 19:45:14 -04:00
41 lines
964 B
Go
41 lines
964 B
Go
//go:build !windows
|
|
|
|
package daemonaddr
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"syscall"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// daemonRunsAsSelf compares the owner of the daemon's Unix socket with this
|
|
// process's uid. Root is not treated specially here: a root caller is privileged
|
|
// on its own merits, and a root-owned socket says nothing about the caller.
|
|
func daemonRunsAsSelf(addr string) bool {
|
|
path, ok := strings.CutPrefix(addr, "unix://")
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
info, err := os.Stat(path)
|
|
if err != nil {
|
|
log.Debugf("stat daemon socket %s: %v", path, err)
|
|
return false
|
|
}
|
|
|
|
// Only a socket says anything about a daemon. A directory or a leftover
|
|
// regular file at that path is not one, and reading it as "the daemon runs as
|
|
// us" would offer controls the daemon then refuses.
|
|
if info.Mode()&os.ModeSocket == 0 {
|
|
return false
|
|
}
|
|
|
|
stat, ok := info.Sys().(*syscall.Stat_t)
|
|
if !ok {
|
|
return false
|
|
}
|
|
return stat.Uid == uint32(os.Getuid())
|
|
}
|