fleet/orbit/pkg/user/user_darwin.go
Scott Gress 866d8bcc00
Ensure MacOS desktop app launched as correct user (#27296)
For #25924  

This PR attempts to fix the issue where the Fleet desktop icon sometimes
fails to appear on MacOS hosts until the hosts are rebooted. Anecdotal
evidence points to this being an issue when system setup is happening,
leading to the theory that Orbit is attempting to launch the app as
`_mbsetupuser` rather than the real logged-in user. The fix here is to
use a different command to get the name of the logged-in user (ignoring
`_mbsetupuser` if it appears), and to launch the desktop app as that
user using `sudo`.

I have tested this on MacOS and Ubuntu hosts, and verified that the
desktop app launches as expected on both.

We don't have a solid reproduction scenario for the issue, but we do
have [some ways to look for relevant
errors](https://github.com/fleetdm/fleet/issues/19172#issuecomment-2627812786),
so we can try this out and see if those errors cease.
2025-03-20 09:49:23 -05:00

37 lines
833 B
Go

//go:build darwin
// +build darwin
package user
import (
"bytes"
"os/exec"
"regexp"
)
var re = regexp.MustCompile(`\s+Name : (\S+)`)
// UserLoggedInViaGui returns the name of the user logged into the machine via the GUI.
func UserLoggedInViaGui() (*string, error) {
// Attempt to get the console user.
cmd := exec.Command("/bin/sh", "-c", `scutil <<< "show State:/Users/ConsoleUser"`)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return nil, err
}
// Extract all "Name : username" entries, and return the first one that
// isn't _mbsetupuser (if any).
matches := re.FindAllStringSubmatch(out.String(), -1)
for _, match := range matches {
if len(match) > 1 && match[1] != "" && match[1] != "_mbsetupuser" {
return &match[1], nil
}
}
// No valid user found
return nil, nil
}