mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-02 10:48:45 -04:00
42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
//go:build windows
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/Microsoft/go-winio"
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/netbirdio/netbird/client/internal/daemonaddr"
|
|
"github.com/netbirdio/netbird/client/internal/ipcauth"
|
|
)
|
|
|
|
// listenNamedPipe creates the daemon control pipe and reports the path it ended
|
|
// up on. The security descriptor lets any local caller connect, as a Unix socket
|
|
// at 0666 does, and the privileged operations are authorized separately from the
|
|
// caller's token.
|
|
//
|
|
// The protected name comes first so that an unprivileged process cannot take the
|
|
// name before the service does. Creating it requires being an administrator or
|
|
// LocalSystem, so a daemon an ordinary user runs themselves, as in netstack mode,
|
|
// falls back to the plain name; clients try both and check who serves them.
|
|
func listenNamedPipe(name string) (net.Listener, string, error) {
|
|
var errs []error
|
|
for _, path := range daemonaddr.PipePaths(name) {
|
|
listener, err := winio.ListenPipe(path, &winio.PipeConfig{
|
|
SecurityDescriptor: ipcauth.DefaultPipeSDDL(),
|
|
})
|
|
if err != nil {
|
|
log.Debugf("not serving the daemon on %s: %v", path, err)
|
|
errs = append(errs, fmt.Errorf("%s: %w", path, err))
|
|
continue
|
|
}
|
|
return listener, path, nil
|
|
}
|
|
|
|
return nil, "", errors.Join(errs...)
|
|
}
|