rpcHeader(); echo "-:m"; } function displayFatalError($code, $i, $i2) { $this->rpcHeader(); echo "-:f:$code"; } function initSession() { $create = handler::$h->needsAuth; $r = session::handle($create); if ($r == 1 && $create) { $this->needsLogin(); } elseif ($r == 2 && $create) { l::debug("(RPC engine) tracknew? " . (tracking::$new ? "yes" : "no")); l::fatal(12); } } function sendKick($reason) { $this->rpcHeader(); echo "-:k:$reason"; endRequest(); } function needsLogin() { $this->rpcHeader(); echo "-:a"; endRequest(); } function checkAuth() { if (!handler::$h->needsAuth) { return; } if (tracking::$data['bat']) { // User tried to log in after being kicked session::kill(); $q = dbQuery("SELECT reason FROM account WHERE id=" . tracking::$data['uid'] . " AND status='KICKED'"); if ($q && dbCount($q) == 1) { list($reason) = dbFetchArray($q); } else { $reason = ""; } $this->sendKick($reason); } elseif ($_SESSION['login'] != "") { $q = dbQuery("SELECT status,reason FROM account WHERE id={$_SESSION['userid']}"); if (!($q && dbCount($q) == 1)) { $this->needsLogin(); } list($status,$reason) = dbFetchArray($q); if ($status == "STD" || $status == "VAC") { $this->checkGameRegistration(); return; } if ($status == 'KICKED') { session::kill(); $this->sendKick($reason); } $this->rpcHeader(); echo "-:"; endRequest(); } else { $this->needsLogin(); } } private function checkGameRegistration() { if (input::$path == "main") { return; } $game = input::$game; if (!($game->status() == 'PRE' || $game->status() == 'FINISHED')) { $lib = $game->getLib(); $pid = $lib->call("doesUserPlay", $_SESSION['userid']); if (!is_null($pid)) { if (!is_array($_SESSION["{$game->name}_data"])) { $_SESSION["{$game->name}_data"] = array("player" => $pid); } dbQuery("UPDATE main.credits SET resources_used = resources_used + 1 WHERE account = {$_SESSION['userid']}"); return; } } $this->rpcHeader(); echo "-:"; endRequest(); } function handleInput() { // Get arguments and function name $this->func = preg_replace('/[^A-Za-z0-9_]/', '', input::$input['rs']); $this->args = empty(input::$input['rsargs']) ? array() : input::$input['rsargs']; } function initRPC() { ajax::init(); } function outputData() { if (is_array($_SESSION) && $_SESSION['authok']) { if (is_null($_SESSION['last_page'])) { $_SESSION['last_page'] = time(); } else if (time() - $_SESSION['last_page'] >= 7200) { l::notice("Player '{$_SESSION['login']}' (#{$_SESSION['userid']}) is idling - forcing log out"); session::kill(); $this->needsLogin(); } } $this->rpcHeader(); $page = input::$page; if (ajax::canCall($this->func)) { $res = ajax::call($this->func, $this->args); // Trace activity /* FIXME: Disabled for now, should be somewhere else. $spyOn = array(); if (in_array($_SESSION['userid'], $spyOn)) { logText("*** TRACE ({$_SESSION['userid']}:{$_SESSION['login']}) RPC: {$page}::{$this->func} called, arguments:"); foreach ($this->args as $arg) { logText("*** TRACE ({$_SESSION['userid']}:{$_SESSION['login']}) RPC: -> $arg"); } logText("*** TRACE ({$_SESSION['userid']}:{$_SESSION['login']}) RPC: returning $res"); } */ echo "+:$res"; } else { l::notice("RPC: unknown function call {$page}::{$this->func}"); l::debug("Referer: " . $_SERVER['HTTP_REFERER']); echo "-:c:{$this->func}"; } } }