This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/lib/engines/rpc.inc

168 lines
3.9 KiB
PHP
Raw Normal View History

2016-01-10 11:01:49 +01:00
<?php
class display_engine {
function rpcHeader() {
header("Expires: Thu, 19 Feb 1981 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: text/plain; charset=utf-8");
}
function maintenance($maintenance) {
$this->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}";
}
}
}