mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-04 19:45:14 -04:00
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
//go:build windows
|
|
|
|
package daemonaddr
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/netbirdio/netbird/client/internal/ipcauth"
|
|
)
|
|
|
|
// daemonRunsAsSelf reads the owner of the daemon's pipe. A daemon running as the
|
|
// service account owns its pipe as LocalSystem, and an elevated one as
|
|
// BUILTIN\Administrators, so only a daemon the user started themselves matches.
|
|
func daemonRunsAsSelf(addr string) bool {
|
|
name, ok := strings.CutPrefix(addr, pipeScheme)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
for _, path := range PipePaths(name) {
|
|
// Bounded: this runs on the UI's path for deciding which controls to
|
|
// offer, so a pipe that does not answer promptly must not stall it. A
|
|
// timeout leaves the caller unprivileged, which only disables controls.
|
|
ctx, cancel := context.WithTimeout(context.Background(), probeTimeout)
|
|
conn, err := dialPipe(ctx, path)
|
|
cancel()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
owned := ipcauth.PipeOwnedBySelf(conn)
|
|
if cerr := conn.Close(); cerr != nil {
|
|
log.Debugf("close daemon pipe %s after ownership check: %v", path, cerr)
|
|
}
|
|
return owned
|
|
}
|
|
|
|
return false
|
|
}
|