/** * Helper method which allows to execute a callable as the super user the server got started by. * * @param callable $callable The callable to run * @param array $arguments Arguments to pass to the callable * * @return mixed The callables result */ public static function sudo(callable $callable, array $arguments = array()) { // don't do anything under Windows if (FileSystem::getOsIdentifier() === FileSystem::OS_IDENTIFIER_WIN) { return call_user_func_array($callable, $arguments); } // get the current user user pair (super user and effective user) $currentUserId = (int) posix_geteuid(); $superUserId = (int) posix_getuid(); // temporarily switch to the super user posix_seteuid($superUserId); // execute the callable $result = call_user_func_array($callable, $arguments); // switch back to the effective user posix_seteuid($currentUserId); return $result; }
/** * Handle an event. * * @param \League\Event\EventInterface $event The triggering event * * @return void * @see \League\Event\ListenerInterface::handle() */ public function handle(EventInterface $event) { try { // load the application server instance /** @var \AppserverIo\Appserver\Core\Interfaces\ApplicationServerInterface $applicationServer */ $applicationServer = $this->getApplicationServer(); // write a log message that the event has been invoked $applicationServer->getSystemLogger()->info($event->getName()); // don't do anything under Windows if (FileSystem::getOsIdentifier() === 'WIN') { $applicationServer->getSystemLogger()->info('Don\'t switch UID to \'%s\' because OS is Windows'); return; } // initialize the variable for user/group $uid = 0; $gid = 0; // throw an exception if the POSIX extension is not available if (extension_loaded('posix') === false) { throw new \Exception('Can\'t switch user, because POSIX extension is not available'); } // print a message with the old UID/EUID $applicationServer->getSystemLogger()->info("Running as " . posix_getuid() . "/" . posix_geteuid()); // extract the user and group name as variables extract(posix_getgrnam($applicationServer->getSystemConfiguration()->getGroup())); extract(posix_getpwnam($applicationServer->getSystemConfiguration()->getUser())); // switch the effective GID to the passed group if (posix_setegid($gid) === false) { $applicationServer->getSystemLogger()->error(sprintf('Can\'t switch GID to \'%s\'', $gid)); } // print a message with the new GID/EGID $applicationServer->getSystemLogger()->info("Running as group" . posix_getgid() . "/" . posix_getegid()); // switch the effective UID to the passed user if (posix_seteuid($uid) === false) { $applicationServer->getSystemLogger()->error(sprintf('Can\'t switch UID to \'%s\'', $uid)); } // print a message with the new UID/EUID $applicationServer->getSystemLogger()->info("Running as user " . posix_getuid() . "/" . posix_geteuid()); } catch (\Exception $e) { $applicationServer->getSystemLogger()->error($e->__toString()); } }
/** * Will return a three character OS identifier e.g. WIN or LIN * * @return string */ public function getOsIdentifier() { return FileSystem::getOsIdentifier(); }