diff --git a/src/infrastructure/daemon/PhabricatorDaemon.php b/src/infrastructure/daemon/PhabricatorDaemon.php --- a/src/infrastructure/daemon/PhabricatorDaemon.php +++ b/src/infrastructure/daemon/PhabricatorDaemon.php @@ -34,6 +34,24 @@ return $command; } + // We may reach this method while already running as the daemon user: for + // example, active and passive synchronization of clustered repositories + // run the same commands through the same code, but as different users. + + // By default, `sudo` won't let you sudo to yourself, so we can get into + // trouble if we're already running as the daemon user unless the host has + // been configured to let the daemon user run commands as itself. + + // Since this is silly and more complicated than doing this check, don't + // use `sudo` if we're already running as the correct user. + if (function_exists('posix_getuid')) { + $uid = posix_getuid(); + $info = posix_getpwuid($uid); + if ($info && $info['name'] == $user) { + return $command; + } + } + // Get the absolute path so we're safe against the caller wiping out // PATH. $sudo = Filesystem::resolveBinary('sudo');