diff --git a/application/configs/authentication.xml b/application/configs/authentication.xml index 8027ecd8..5b6c3b2e 100644 --- a/application/configs/authentication.xml +++ b/application/configs/authentication.xml @@ -2,35 +2,12 @@ - - - + + steeffeen kremsy - + - - - - gorby - canyondrive - - - - - - eyebo - jojo95183 - xanashea - ardid - gugli - phil13hebert - xcaliber - eole - fix - papychampy - titishu - wurstigewurst - + diff --git a/application/core/authentication.php b/application/core/authentication.php index 3d2398ba..e126f472 100644 --- a/application/core/authentication.php +++ b/application/core/authentication.php @@ -5,98 +5,148 @@ namespace ManiaControl; /** * Class handling authentication levels * - * @author steeffeen + * @author steeffeen & kremsy */ class Authentication { - /** * Constants */ - public $RIGHTS_LEVELS = array(-1 => 'none', 0 => 'superadmin', 1 => 'admin', 2 => 'operator', 3 => 'all'); - + const AUTH_LEVEL_PLAYER = 0; + const AUTH_LEVEL_OPERATOR = 1; + const AUTH_LEVEL_ADMIN = 2; + const AUTH_LEVEL_SUPERADMIN = 3; + const AUTH_LEVEL_XSUPERADMIN = 4; + /** * Private properties */ - private $mc = null; - - private $config = null; + private $maniaControl = null; /** * Construct authentication manager + * + * @param ManiaControl $maniaControl */ - public function __construct($mc) { - $this->mc = $mc; + public function __construct(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + $this->loadConfig(); + } + + /** + * Load config and initialize strong superadmins + * + * @return bool + */ + private function loadConfig() { + $config = FileUtil::loadConfig('authentication.xml'); + $mysqli = $this->maniaControl->database->mysqli; - // Load config - $this->config = FileUtil::loadConfig('authentication.xml'); - } - - /** - * Check if the player has enough rights - * - * @param string $login - * @param string $defaultRight - * @param string $neededRight - * @return bool - */ - public function checkRight($login, $neededRight) { - $right = $this->getRights($login); - return $this->compareRights($right, $neededRight); - } - - /** - * Compare if the rights are enough - * - * @param string $hasRight - * @param string $neededRight - * @return bool - */ - public function compareRights($hasRight, $neededRight) { - if (!in_array($hasRight, $this->RIGHTS_LEVELS) || !in_array($neededRight, $this->RIGHTS_LEVELS)) { + // Remove all XSuperadmins + $adminQuery = "UPDATE `" . PlayerHandler::TABLE_PLAYERS . "` + SET `authLevel` = ? + WHERE `authLevel` = ?;"; + $adminStatement = $mysqli->prepare($adminQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); return false; } - $hasLevel = array_search($hasRight, $this->RIGHTS_LEVELS); - $neededLevel = array_search($neededRight, $this->RIGHTS_LEVELS); - if ($hasLevel > $neededLevel) { + $adminLevel = self::AUTH_LEVEL_SUPERADMIN; + $xAdminLevel = self::AUTH_LEVEL_XSUPERADMIN; + $adminStatement->bind_param('ii', $adminLevel, $xAdminLevel); + $adminStatement->execute(); + if ($adminStatement->error) { + trigger_error($adminStatement->error); + } + $adminStatement->close(); + + // Set XSuperAdmins + $xAdmins = $config->xsuperadmins->xpath('login'); + $adminQuery = "INSERT INTO `" . PlayerHandler::TABLE_PLAYERS . "` ( + `login`, + `authLevel` + ) VALUES ( + ?, ? + ) ON DUPLICATE KEY UPDATE + `authLevel` = VALUES(`authLevel`);"; + $adminStatement = $mysqli->prepare($adminQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); return false; } - else { - return true; - } - } - - /** - * Get rights of the given login - * - * @param string $login - * @param string $defaultRights - * @return string - */ - public function getRights($login, $defaultRight = 'all') { - $groups = $this->config->xpath('//login[text()="' . $login . '"]/..'); - if (empty($groups)) return $defaultRight; - $right = $defaultRight; - $rightLevel = array_search($right, $this->RIGHTS_LEVELS); - foreach ($groups as $group) { - $level = array_search($group->getName(), $this->RIGHTS_LEVELS); - if ($level === false) continue; - if ($level < $rightLevel || $rightLevel === false) { - $right = $group->getName(); - $rightLevel = $level; + $adminStatement->bind_param('si', $login, $xAdminLevel); + $success = true; + foreach ($xAdmins as $xAdmin) { + $login = (string) $xAdmin; + $adminStatement->execute(); + if ($adminStatement->error) { + trigger_error($adminStatement->error); + $success = false; } } - return $right; + $adminStatement->close(); + return $success; + } + + /** + * Grant the auth level to the player + * + * @param Player $player + * @param int $authLevel + * @return bool + */ + public function grantAuthLevel(Player $player, $authLevel) { + if (!$player || $authLevel  >= self::AUTH_LEVEL_XSUPERADMIN) { + return false; + } + $mysqli = $this->maniaControl->database->mysqli; + $authQuery = "INSERT INTO `" . PlayerHandler::TABLE_PLAYERS . "` ( + `login`, + `authLevel` + ) VALUES ( + ?, ? + ) ON DUPLICATE KEY UPDATE + `authLevel` = VALUES(`authLevel`);"; + $authStatement = $mysqli->prepare($authQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $authStatement->bind_param('si', $player->login, $authLevel); + $authStatement->execute(); + if ($authStatement->error) { + trigger_error($authStatement->error); + $authStatement->close(); + return false; + } + $authStatement->close(); + return $success; } /** * Sends an error message to the login * * @param string $login + * @return bool */ - public function sendNotAllowed($login) { - if (!$this->mc->chat->sendError('You do not have the required rights to perform this command!', $login)) { - trigger_error("Couldn't send forbidden message to login '" . $login . "'. " . $this->mc->getClientErrorText()); + public function sendNotAllowed(Player $player) { + if (!$player) { + return false; } + return $this->maniaControl->chat->sendError('You do not have the required rights to perform this command!', $player->login); + } + + /** + * Check if the player has enough rights + * + * @param Player $login + * @param int $neededAuthLevel + * @return bool + */ + public static function checkRight(Player $player, $neededAuthLevel) { + if (!$player) { + return false; + } + return ($player->authLevel >= $neededAuthLevel); } } diff --git a/application/core/commands.php b/application/core/commands.php index 9a18dbc4..665c11cd 100644 --- a/application/core/commands.php +++ b/application/core/commands.php @@ -7,13 +7,13 @@ namespace ManiaControl; * * @author steeffeen & kremsy */ +// TODO: settings for command auth levels class Commands { /** * Private properties */ private $maniaControl = null; - private $config = null; private $commandHandlers = array(); private $openBills = array(); private $serverShutdownTime = -1; @@ -25,17 +25,14 @@ class Commands { public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - // Load config - $this->config = FileUtil::loadConfig('commands.xml'); - // Register for callbacks $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MC_5_SECOND, $this, 'each5Seconds'); $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated'); $this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback'); // Register basic commands - $commands = array('help', 'version', 'shutdown', 'shutdownserver', 'networkstats', 'systeminfo', 'setservername', 'getplanets', - 'donate', 'pay', 'kick', 'nextmap', 'restartmap', 'addmap', 'removemap', 'startwarmup', 'stopwarmup'); + $commands = array('help', 'version', 'shutdown', 'shutdownserver', 'systeminfo', 'setservername', 'getplanets', 'donate', + 'pay', 'kick', 'nextmap', 'restartmap', 'addmap', 'removemap'); foreach ($commands as $command) { $this->registerCommandHandler($command, $this, 'command_' . $command); } @@ -77,7 +74,8 @@ class Commands { return false; } // Check for valid player - if ($chat[0] <= 0 || strlen($chat[1]) <= 0) { + $player = $this->maniaControl->playerHandler->getPlayer($login); + if (!$player) { return false; } // Handle command @@ -89,7 +87,7 @@ class Commands { } // Inform command handlers foreach ($this->commandHandlers[$command] as $handler) { - call_user_func(array($handler[0], $handler[1]), $callback); + call_user_func(array($handler[0], $handler[1]), $callback, $player); } return true; } @@ -134,33 +132,6 @@ class Commands { return true; } - /** - * Retrieve the needed rights level to perform the given command - * - * @param string $commandName - * @param string $defaultLevel - * @return string - */ - private function getRightsLevel($commandName, $defaultLevel) { - $command_rights = $this->config->xpath('//' . strtolower($commandName) . '/..'); - if (empty($command_rights)) { - return $defaultLevel; - } - $rights = $this->maniaControl->authentication->RIGHTS_LEVELS; - $highest_level = null; - foreach ($command_rights as $right) { - $levelName = $right->getName(); - $levelInt = array_search($levelName, $rights); - if ($levelInt !== false && ($highest_level === null || $highest_level < $levelInt)) { - $highest_level = $levelInt; - } - } - if ($highest_level === null || !array_key_exists($highest_level, $rights)) { - return $defaultLevel; - } - return $rights[$highest_level]; - } - /** * Send ManiaControl version * @@ -169,11 +140,6 @@ class Commands { */ private function command_version(array $chat) { $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('version', 'all'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return false; - } $message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!'; return $this->maniaControl->chat->sendInformation($message, $login); } @@ -186,11 +152,6 @@ class Commands { */ private function command_help(array $chat) { $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('help', 'all'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return false; - } // TODO: improve help command // TODO: enable help for specific commands $list = 'Available commands: '; @@ -217,13 +178,12 @@ class Commands { * Handle getplanets command * * @param array $chat + * @param Player $player * @return bool */ - private function command_getplanets(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('getplanets', 'admin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_getplanets(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_ADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } if (!$this->maniaControl->client->query('GetServerPlanets')) { @@ -232,22 +192,17 @@ class Commands { } $planets = $this->maniaControl->client->getResponse(); $message = "This Server has {$planets} Planets!"; - return $this->maniaControl->chat->sendInformation($message, $login); + return $this->maniaControl->chat->sendInformation($message, $player->login); } /** * Handle donate command * * @param array $chat + * @param Player $player * @return bool */ - private function command_donate(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('donate', 'all'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return; - } + private function command_donate(array $chat, Player $player) { $params = explode(' ', $chat[1][2]); if (count($params) < 2) { // TODO: send usage information @@ -260,7 +215,7 @@ class Commands { } if (count($params) >= 3) { $receiver = $params[2]; - $receiverPlayer = $this->maniaControl->database->getPlayer($receiver); + $receiverPlayer = $this->maniaControl->playerHandler->getPlayer($receiver); $receiverName = ($receiverPlayer ? $receiverPlayer['NickName'] : $receiver); } else { @@ -268,16 +223,15 @@ class Commands { $receiverName = $this->maniaControl->server->getName(); } $message = 'Donate ' . $amount . ' Planets to $<' . $receiverName . '$>?'; - if (!$this->maniaControl->client->query('SendBill', $login, $amount, $message, $receiver)) { + if (!$this->maniaControl->client->query('SendBill', $pl, $amount, $message, $receiver)) { trigger_error( - "Couldn't create donation of {$amount} planets from '{$login}' for '{$receiver}'. " . + "Couldn't create donation of {$amount} planets from '{$player->login}' for '{$receiver}'. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError("Creating donation failed.", $login); + $this->maniaControl->chat->sendError("Creating donation failed.", $player->login); return false; } - $bill = $this->maniaControl->client->getResponse(); - $this->openBills[$bill] = $login; + $this->openBills[$bill] = $player->login; return true; } @@ -285,13 +239,12 @@ class Commands { * Handle pay command * * @param array $chat + * @param Player $player * @return bool */ - private function command_pay(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('pay', 'superadmin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_pay(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } $params = explode(' ', $chat[1][2]); @@ -308,119 +261,64 @@ class Commands { $receiver = $params[2]; } else { - $receiver = $login; + $receiver = $player->login; } $message = 'Payout from $<' . $this->maniaControl->server->getName() . '$>.'; if (!$this->maniaControl->client->query('Pay', $receiver, $amount, $message)) { trigger_error( - "Couldn't create payout of {$amount} planets by '{$login}' for '{$receiver}'. " . + "Couldn't create payout of {$amount} planets by '{$player->login}' for '{$receiver}'. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError("Creating payout failed.", $login); + $this->maniaControl->chat->sendError("Creating payout failed.", $player->login); return false; } $bill = $this->maniaControl->client->getResponse(); - $this->openBills[$bill] = $login; + $this->openBills[$bill] = $player->login; return true; } - /** - * Handle networkstats command - * - * @param array $chat - * @return bool - */ - private function command_networkstats(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('networkstats', 'superadmin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return false; - } - $networkStats = $this->maniaControl->server->getNetworkStats(); - $message = 'NetworkStats: uptime=' . $networkStats['Uptime'] . ', nbConn=' . $networkStats['NbrConnection'] . ', recvRate=' . - $networkStats['RecvNetRate'] . ', sendRate=' . $networkStats['SendNetRate'] . ', recvTotal=' . - $networkStats['SendNetRate'] . ', sentTotal=' . $networkStats['SendNetRate']; - return $this->maniaControl->chat->sendInformation($message, $login); - } - /** * Handle systeminfo command * * @param array $chat + * @param Player $player * @return bool */ - private function command_systeminfo(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('systeminfo', 'superadmin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_systeminfo(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } $systemInfo = $this->maniaControl->server->getSystemInfo(); $message = 'SystemInfo: ip=' . $systemInfo['PublishedIp'] . ', port=' . $systemInfo['Port'] . ', p2pPort=' . $systemInfo['P2PPort'] . ', title=' . $systemInfo['TitleId'] . ', login=' . $systemInfo['ServerLogin'] . ', '; - return $this->maniaControl->chat->sendInformation($message, $login); + return $this->maniaControl->chat->sendInformation($message, $player->login); } /** * Handle shutdown command * * @param array $chat + * @param Player $player * @return bool */ - private function command_shutdown(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('shutdown', 'superadmin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_shutdown(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } - return $this->maniaControl->quit("ManiaControl shutdown requested by '{$login}'"); - } - - /** - * Handle startwarmup command - * - * @param array $chat - * @return bool - */ - private function command_startwarmup(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('startwarmup', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return false; - } - return $this->maniaControl->client->query("SetWarmUp", true); - } - - /** - * Handle stopwarmup command - * - * @param array $chat - * @return bool - */ - private function command_stopwarmup(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('stopwarmup', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); - return false; - } - return $this->maniaControl->client->query("SetWarmUp", false); + return $this->maniaControl->quit("ManiaControl shutdown requested by '{$player->login}'"); } /** * Handle server shutdown command * * @param array $chat + * @param Player $player * @return bool */ - private function command_shutdownserver(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('shutdownserver', 'superadmin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_shutdownserver(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } // Check for delayed shutdown @@ -430,38 +328,37 @@ class Commands { if ($param == 'empty') { $this->serverShutdownEmpty = !$this->serverShutdownEmpty; if ($this->serverShutdownEmpty) { - $this->maniaControl->chat->sendInformation("The server will shutdown as soon as it's empty!", $login); + $this->maniaControl->chat->sendInformation("The server will shutdown as soon as it's empty!", $player->login); return true; } - $this->maniaControl->chat->sendInformation("Empty-shutdown cancelled!", $login); + $this->maniaControl->chat->sendInformation("Empty-shutdown cancelled!", $player->login); return true; } $delay = (int) $param; if ($delay <= 0) { // Cancel shutdown $this->serverShutdownTime = -1; - $this->maniaControl->chat->sendInformation("Delayed shutdown cancelled!", $login); + $this->maniaControl->chat->sendInformation("Delayed shutdown cancelled!", $player->login); return true; } // Trigger delayed shutdown $this->serverShutdownTime = time() + $delay * 60.; - $this->maniaControl->chat->sendInformation("The server will shut down in " . $delay . " minutes!", $login); + $this->maniaControl->chat->sendInformation("The server will shut down in {$delay} minutes!", $player->login); return true; } - return $this->shutdownServer($login); + return $this->shutdownServer($player->login); } /** * Handle kick command * * @param array $chat + * @param Player $player * @return bool */ - private function command_kick(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_kick(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } $params = explode(' ', $chat[1][2], 3); @@ -470,49 +367,44 @@ class Commands { return false; } $target = $params[1]; - $players = $this->maniaControl->server->getPlayers(); - foreach ($players as $player) { - if ($player['Login'] != $target) { - continue; - } - // Kick player - $message = ''; - if (isset($params[2])) { - $message = $params[2]; - } - return $this->maniaControl->client->query('Kick', $target, $message); + $target = $this->maniaControl->playerHandler->getPlayer($target); + if (!$target) { + $this->maniaControl->chat->sendError("Invalid player login.", $player->login); + return false; } - $this->maniaControl->chat->sendError("Invalid player login.", $login); - return false; + $message = ''; + if (isset($params[2])) { + $message = $params[2]; + } + return $this->maniaControl->client->query('Kick', $target->login, $message); } /** * Handle removemap command * * @param array $chat + * @param Player $player * @return bool */ - private function command_removemap(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('kick', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_removemap(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } - // TODO: allow params // Get map name $map = $this->maniaControl->server->getMap(); if (!$map) { - $this->maniaControl->chat->sendError("Couldn't remove map.", $login); + $this->maniaControl->chat->sendError("Couldn't remove map.", $player->login); return false; } $mapName = $map['FileName']; // Remove map if (!$this->maniaControl->client->query('RemoveMap', $mapName)) { trigger_error("Couldn't remove current map. " . $this->maniaControl->getClientErrorText()); + $this->maniaControl->chat->sendError("Couldn't remove map.", $player->login); return false; } - $this->maniaControl->chat->sendSuccess('Map removed.', $login); + $this->maniaControl->chat->sendSuccess('Map removed.', $player->login); return true; } @@ -520,13 +412,12 @@ class Commands { * Handle addmap command * * @param array $chat + * @param Player $player * @return bool */ - private function command_addmap(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('addmap', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_addmap(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } $params = explode(' ', $chat[1][2], 2); @@ -537,20 +428,20 @@ class Commands { // Check if ManiaControl can even write to the maps dir if (!$this->maniaControl->client->query('GetMapsDirectory')) { trigger_error("Couldn't get map directory. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError("ManiaControl couldn't retrieve the maps directory.", $login); + $this->maniaControl->chat->sendError("ManiaControl couldn't retrieve the maps directory.", $player->login); return false; } $mapDir = $this->maniaControl->client->getResponse(); if (!is_dir($mapDir)) { trigger_error("ManiaControl doesn't have have access to the maps directory in '{$mapDir}'."); - $this->maniaControl->chat->sendError("ManiaControl doesn't have access to the maps directory.", $login); + $this->maniaControl->chat->sendError("ManiaControl doesn't have access to the maps directory.", $player->login); return false; } $downloadDirectory = $this->maniaControl->settingManager->getSetting($this, 'MapDownloadDirectory', 'mx'); // Create download directory if necessary if (!is_dir($mapDir . $downloadDirectory) && !mkdir($mapDir . $downloadDirectory)) { trigger_error("ManiaControl doesn't have to rights to save maps in '{$mapDir}{$downloadDirectory}'."); - $this->maniaControl->chat->sendError("ManiaControl doesn't have the rights to save maps.", $login); + $this->maniaControl->chat->sendError("ManiaControl doesn't have the rights to save maps.", $player->login); return false; } $mapDir .= $downloadDirectory . '/'; @@ -565,7 +456,7 @@ class Commands { $mapInfo = FileUtil::loadFile($url); if (!$mapInfo || strlen($mapInfo) <= 0) { // Invalid id - $this->maniaControl->chat->sendError('Invalid MX-Id!', $login); + $this->maniaControl->chat->sendError('Invalid MX-Id!', $player->login); return false; } $mapInfo = json_decode($mapInfo, true); @@ -573,34 +464,34 @@ class Commands { $file = FileUtil::loadFile($url); if (!$file) { // Download error - $this->maniaControl->chat->sendError('Download failed!', $login); + $this->maniaControl->chat->sendError('Download failed!', $player->login); return false; } // Save map $fileName = $mapDir . $mapInfo['TrackID'] . '_' . $mapInfo['Name'] . '.Map.Gbx'; if (!file_put_contents($fileName, $file)) { // Save error - $this->maniaControl->chat->sendError('Saving map failed!', $login); + $this->maniaControl->chat->sendError('Saving map failed!', $player->login); return false; } // Check for valid map if (!$this->maniaControl->client->query('CheckMapForCurrentServerParams', $fileName)) { trigger_error("Couldn't check if map is valid. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError('Error checking map!', $login); + $this->maniaControl->chat->sendError('Error checking map!', $player->login); return false; } $response = $this->maniaControl->client->getResponse(); if (!$response) { // Inalid map type - $this->maniaControl->chat->sendError("Invalid map type.", $login); + $this->maniaControl->chat->sendError("Invalid map type.", $player->login); return false; } // Add map to map list if (!$this->maniaControl->client->query('InsertMap', $fileName)) { - $this->maniaControl->chat->sendError("Couldn't add map to match settings!", $login); + $this->maniaControl->chat->sendError("Couldn't add map to match settings!", $player->login); return false; } - $this->maniaControl->chat->sendSuccess('Map $<' . $mapInfo['Name'] . '$> successfully added!'); + $this->maniaControl->chat->sendSuccess('Map $<' . $mapInfo['Name'] . '$> added!'); return true; } // TODO: add local map by filename @@ -611,13 +502,12 @@ class Commands { * Handle nextmap command * * @param array $chat + * @param Player $player * @return bool */ - private function command_nextmap(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('nextmap', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_nextmap(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } return $this->maniaControl->client->query('NextMap'); @@ -627,13 +517,12 @@ class Commands { * Handle retartmap command * * @param array $chat + * @param Player $player * @return bool */ - private function command_restartmap(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('restartmap', 'operator'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_restartmap(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } return $this->maniaControl->client->query('RestartMap'); @@ -643,13 +532,12 @@ class Commands { * Handle setservername command * * @param array $chat + * @param Player $player * @return bool */ - private function command_setservername(array $chat) { - $login = $chat[1][1]; - if (!$this->maniaControl->authentication->checkRight($login, $this->getRightsLevel('setservername', 'admin'))) { - // Not allowed! - $this->maniaControl->authentication->sendNotAllowed($login); + private function command_setservername(array $chat, Player $player) { + if (!$this->maniaControl->authentication->checkRight($player, Authentication::AUTH_LEVEL_ADMIN)) { + $this->maniaControl->authentication->sendNotAllowed($player); return false; } $params = explode(' ', $chat[1][2], 2); @@ -660,11 +548,11 @@ class Commands { $serverName = $params[1]; if (!$this->maniaControl->client->query('SetServerName', $serverName)) { trigger_error("Couldn't set server name. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError("Error!", $login); + $this->maniaControl->chat->sendError("Error setting server name!", $player->login); return false; } $serverName = $this->maniaControl->server->getName(); - $this->maniaControl->chat->sendInformation("New Name: " . $serverName, $login); + $this->maniaControl->chat->sendInformation("New Name: " . $serverName, $player->login); return true; } @@ -699,7 +587,7 @@ class Commands { */ private function shutdownServer($login = '#') { if (!$this->maniaControl->client->query('StopServer')) { - trigger_error("Server shutdown command from '{$login}' failed. " . $this->maniaControl->getClientErrorText()); + trigger_error("Server shutdown command from '{login}' failed. " . $this->maniaControl->getClientErrorText()); return false; } $this->maniaControl->quit("Server shutdown requested by '{$login}'"); diff --git a/application/core/maniaControl.php b/application/core/maniaControl.php index 31df238b..7eefa148 100644 --- a/application/core/maniaControl.php +++ b/application/core/maniaControl.php @@ -72,8 +72,8 @@ class ManiaControl { $this->chat = new Chat($this); $this->callbacks = new Callbacks($this); $this->server = new Server($this); - $this->authentication = new Authentication($this); $this->playerHandler = new PlayerHandler($this); + $this->authentication = new Authentication($this); $this->manialinkIdHandler = new ManialinkIdHandler(); $this->commands = new Commands($this); $this->pluginHandler = new PluginHandler($this); diff --git a/application/core/player.php b/application/core/player.php index 712f8574..ecf2874c 100644 --- a/application/core/player.php +++ b/application/core/player.php @@ -16,6 +16,7 @@ class Player { public $login = ''; public $nickname = ''; public $path = ''; + public $authLevel = 0; public $joinCount = 0; public $totalPlayed = 0; public $language = ''; @@ -64,6 +65,7 @@ class Player { * * @return bool */ + // TODO: check for bot players public function isFakePlayer() { return ($this->pid <= 0); } diff --git a/application/core/playerHandler.php b/application/core/playerHandler.php index d266d1b2..14b8b4ef 100644 --- a/application/core/playerHandler.php +++ b/application/core/playerHandler.php @@ -15,11 +15,6 @@ class PlayerHandler { */ const TABLE_PLAYERS = 'mc_players'; - /** - * Public properties - */ - public $rightLevels = array(0 => 'Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'Owner'); - /** * Private properties */ @@ -53,6 +48,8 @@ class PlayerHandler { `login` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `nickname` varchar(150) COLLATE utf8_unicode_ci NOT NULL, `path` varchar(100) COLLATE utf8_unicode_ci NOT NULL, + `authLevel` int(11) NOT NULL DEFAULT '0', + `joinCount` int(11) NOT NULL DEFAULT '0', `totalPlayed` int(11) NOT NULL DEFAULT '0' COMMENT 'Seconds', `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`index`), @@ -201,7 +198,7 @@ class PlayerHandler { $playerStatement->close(); // Fill up properties - $playerQuery = "SELECT `joinCount`, `totalPlayed` FROM `" . self::TABLE_PLAYERS . "` + $playerQuery = "SELECT `authLevel`, `joinCount`, `totalPlayed` FROM `" . self::TABLE_PLAYERS . "` WHERE `index` = ?;"; $playerStatement = $mysqli->prepare($playerQuery); if ($mysqli->error) { @@ -216,7 +213,7 @@ class PlayerHandler { return false; } $playerStatement->store_result(); - $playerStatement->bind_result($player->joinCount, $player->totalPlayed); + $playerStatement->bind_result($player->authLevel, $player->joinCount, $player->totalPlayed); $playerStatement->fetch(); $playerStatement->free_result(); $playerStatement->close(); diff --git a/application/readme.txt b/application/readme.txt index d74c4ef1..87347004 100644 --- a/application/readme.txt +++ b/application/readme.txt @@ -22,7 +22,7 @@ SETUP: Enter your mysql server information. 2.3 Open the file 'configs/authentication.xml'. - Add the player logins who should have access to the commands of ManiaControl. + Add the player logins of administrators. 3. Run the tool via the shell script 'ManiaControl.sh' (UNIX) or the batch file 'ManiaControl.bat' (Windows)