function DBNewUser($param, $c = null) { if (isset($param['contestnumber']) && !isset($param['contest'])) { $param['contest'] = $param['contestnumber']; } if (isset($param['sitenumber']) && !isset($param['site'])) { $param['site'] = $param['sitenumber']; } if (isset($param['usernumber']) && !isset($param['user'])) { $param['user'] = $param['usernumber']; } if (isset($param['number']) && !isset($param['user'])) { $param['user'] = $param['number']; } $ac = array('contest', 'site', 'user'); $ac1 = array('updatetime', 'username', 'usericpcid', 'userfull', 'userdesc', 'type', 'enabled', 'multilogin', 'pass', 'permitip', 'changepass', 'userip', 'userlastlogin', 'userlastlogout', 'usersession', 'usersessionextra'); $typei['contest'] = 1; $typei['updatetime'] = 1; $typei['site'] = 1; $typei['user'] = 1; foreach ($ac as $key) { if (!isset($param[$key]) || $param[$key] == "") { MSGError("DBNewUser param error: {$key} not found"); return false; } if (isset($typei[$key]) && !is_numeric($param[$key])) { MSGError("DBNewUser param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $username = "******" . $user; $updatetime = -1; $pass = null; $usericpcid = ''; $userfull = ''; $userdesc = ''; $type = 'team'; $enabled = 'f'; $changepass = '******'; $multilogin = '******'; $permitip = ''; $usersession = null; $usersessionextra = null; $userip = null; $userlastlogin = null; $userlastlogout = null; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($typei[$key]) && !is_numeric($param[$key])) { MSGError("DBNewUser param error: {$key} is not numeric"); return false; } } } $t = time(); if ($updatetime <= 0) { $updatetime = $t; } if ($type != "chief" && $type != "judge" && $type != "admin" && $type != "score" && $type != "staff" && $type != "site") { $type = "team"; } if ($type == "admin") { $changepass = "******"; } if ($enabled != "f") { $enabled = "t"; } if ($multilogin != "t") { $multilogin = "******"; } if ($changepass != "t") { $changepass = "******"; } $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewUser(begin)"); } DBExec($c, "lock table usertable", "DBNewUser(lock)"); $r = DBExec($c, "select * from sitetable where sitenumber={$site} and contestnumber={$contest}", "DBNewUser(get site)"); $n = DBnlines($r); if ($n == 0) { DBExec($c, "rollback work", "DBNewUser(no-site)"); MSGError("DBNewUser param error: site {$site} does not exist"); return false; } if ($pass != myhash("") && $type != "admin" && $changepass != "t") { $pass = '******' . $pass; } $r = DBExec($c, "select * from usertable where username='******' and usernumber!={$user} and " . "usersitenumber={$site} and contestnumber={$contest}", "DBNewUser(get user)"); $n = DBnlines($r); $ret = 1; if ($n == 0) { $sql = "select * from usertable where usernumber={$user} and usersitenumber={$site} and " . "contestnumber={$contest}"; $a = DBGetRow($sql, 0, $c); if ($a == null) { $ret = 2; $sql = "select * from sitetable where sitenumber={$site} and contestnumber={$contest}"; $aa = DBGetRow($sql, 0); if ($aa == null) { DBExec($c, "rollback work"); MSGError("Site {$site} does not exist"); return false; } $sql = "insert into usertable (contestnumber, usersitenumber, usernumber, username, usericpcid, userfullname, " . "userdesc, usertype, userenabled, usermultilogin, userpassword, userpermitip) values " . "({$contest}, {$site}, {$user}, '{$username}', '{$usericpcid}', '{$userfull}', '{$userdesc}', '{$type}', '{$enabled}', " . "'{$multilogin}', '{$pass}', '{$permitip}')"; DBExec($c, $sql, "DBNewUser(insert)"); if ($cw) { DBExec($c, "commit work"); } LOGLevel("User {$user} (site={$site},contest={$contest}) included.", 2); } else { if ($updatetime > $a['updatetime']) { $ret = 2; $sql = "update usertable set username='******', usericpcid='{$usericpcid}', userdesc='{$userdesc}', updatetime={$updatetime}, " . "userfullname='{$userfull}', usertype='{$type}', userpermitip='{$permitip}', "; if ($pass != null && $pass != myhash("")) { $sql .= "userpassword='******', "; } if ($usersession != null) { $sql .= "usersession='{$usersession}', "; } if ($usersessionextra != null) { $sql .= "usersessionextra='{$usersessionextra}', "; } if ($userip != null) { $sql .= "userip='{$userip}', "; } if ($userlastlogin != null) { $sql .= "userlastlogin='******', "; } if ($userlastlogout != null) { $sql .= "userlastlogout='{$userlastlogout}', "; } $sql .= "userenabled='{$enabled}', usermultilogin='******'"; $sql .= " where usernumber={$user} and usersitenumber={$site} and contestnumber={$contest}"; $r = DBExec($c, $sql, "DBNewUser(update)"); if ($cw) { DBExec($c, "commit work"); } LOGLevel("User {$user} (username={$username},site={$site},contest={$contest}) updated.", 2); } } } else { DBExec($c, "rollback work"); LOGLevel("Update problem for user {$user} (site={$site},contest={$contest}) (maybe username already in use).", 1); MSGError("Update problem for user {$user}, site {$site} (maybe username already in use)."); return false; } return $ret; }
function DBNewRun($param, $c = null) { if (isset($param['contestnumber']) && !isset($param['contest'])) { $param['contest'] = $param['contestnumber']; } if (isset($param['sitenumber']) && !isset($param['site'])) { $param['site'] = $param['sitenumber']; } if (isset($param['usernumber']) && !isset($param['user'])) { $param['user'] = $param['usernumber']; } if (isset($param['number']) && !isset($param['runnumber'])) { $param['runnumber'] = $param['number']; } if (isset($param['runlangnumber']) && !isset($param['lang'])) { $param['lang'] = $param['runlangnumber']; } if (isset($param['runproblem']) && !isset($param['problem'])) { $param['problem'] = $param['runproblem']; } $ac = array('contest', 'site', 'user', 'problem', 'lang', 'filename', 'filepath'); $ac1 = array('runnumber', 'rundate', 'rundatediff', 'rundatediffans', 'runanswer', 'runstatus', 'runjudge', 'runjudgesite', 'runjudge1', 'runjudgesite1', 'runanswer1', 'runjudge2', 'runjudgesite2', 'runanswer2', 'autoip', 'autobegindate', 'autoenddate', 'autoanswer', 'autostdout', 'autostderr', 'updatetime'); $type['contest'] = 1; $type['autobegindate'] = 1; $type['autoenddate'] = 1; $type['problem'] = 1; $type['updatetime'] = 1; $type['site'] = 1; $type['user'] = 1; $type['runnumber'] = 1; $type['rundatediffans'] = 1; $type['rundatediff'] = 1; $type['rundate'] = 1; $type['runanswer'] = 1; $type['runjudge'] = 1; $type['runjudgesite'] = 1; $type['runjudge1'] = 1; $type['runjudgesite1'] = 1; $type['runanswer1'] = 1; $type['runjudge2'] = 1; $type['runjudgesite2'] = 1; $type['runanswer2'] = 1; foreach ($ac as $key) { if (!isset($param[$key]) || $param[$key] == "") { MSGError("DBNewRun param error: {$key} not found"); return false; } if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewRun param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $t = time(); $autoip = ''; $autobegindate = 'NULL'; $autoenddate = 'NULL'; $autoanswer = ''; $autostdout = ''; $autostderr = ''; $runjudge = 'NULL'; $runjudgesite = 'NULL'; $runjudge1 = 'NULL'; $runjudgesite1 = 'NULL'; $runanswer1 = 0; $runjudge2 = 'NULL'; $runjudgesite2 = 'NULL'; $runanswer2 = 0; $runnumber = -1; $updatetime = -1; $rundatediff = -1; $rundate = $t; $runanswer = 0; $rundatediffans = 999999999; $runstatus = 'openrun'; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewRun param error: {$key} is not numeric"); return false; } } } if ($updatetime < 0) { $updatetime = $t; } $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewRun(transaction)"); } $insert = true; $oid1 = ''; $oid2 = ''; $oldold1 = ''; $oldold2 = ''; $sql = "select sitenextrun as nextrun from " . "sitetable where sitenumber={$site} and contestnumber={$contest} for update"; $r = DBExec($c, $sql, "DBNewRun(get site for update)"); if (DBnlines($r) != 1) { DBExec($c, "rollback work", "DBNewRun(rollback-site)"); LOGError("Unable to find a unique site/contest in the database. SQL=(" . $sql . ")"); MSGError("Unable to find a unique site/contest in the database."); return false; } $a = DBRow($r, 0); $n = $a["nextrun"] + 1; if ($runnumber > 0) { $sql = "select * from runtable as t where t.contestnumber={$contest} and " . "t.runsitenumber={$site} and t.runnumber={$runnumber}"; $r = DBExec($c, $sql . " for update", "DBNewRun(get run for update)"); $n = DBnlines($r); if ($n > 0) { $insert = false; $lr = DBRow($r, 0); $t = $lr['updatetime']; if (isset($lr['autostdout'])) { $oid1 = $lr['autostdout']; } if (isset($lr['autostderr'])) { $oid2 = $lr['autostderr']; } } $n = $runnumber; } else { $runnumber = $n; } if ($rundatediff < 0) { $b = DBSiteInfo($contest, $site, $c); $dif = $b["currenttime"]; $rundatediff = $dif; if ($dif < 0) { if (!isset($param['allowneg'])) { DBExec($c, "rollback work", "DBNewRun(rollback-started)"); LOGError("Tried to submit a run but the contest is not started. SQL=(" . $sql . ")"); MSGError("The contest is not started yet!"); return 0; } } if (!$b["siterunning"]) { DBExec($c, "rollback work", "DBNewRun(rollback-over)"); LOGError("Tried to submit a run but the contest is over. SQL=(" . $sql . ")"); MSGError("The contest is over!"); return 0; } } else { $dif = $rundatediff; } if ($updatetime > $t || $insert) { DBExec($c, "update sitetable set sitenextrun={$runnumber}, updatetime=" . $t . " where sitenumber={$site} and contestnumber={$contest} and sitenextrun<{$runnumber}", "DBNewRun(update site)"); // LOGError($autostdout); if (substr($autostdout, 0, 7) == "base64:") { $autostdout = base64_decode(substr($autostdout, 7)); $oldoid1 = $oid1; if (($oid1 = DB_lo_import_text($c, $autostdout)) == null) { DBExec($c, "rollback work", "DBNewRun(rollback-import stdout)"); LOGError("Unable to create a large object for file stdout (run={$runnumber},site={$site},contest={$contest})."); MSGError("problem importing stdout to database. Contact an admin now!"); return false; } } else { if ($autostdout != '') { DBExec($c, "rollback work", "DBNewRun(rollback-import stderr)"); LOGError("Unable to create a large object for file stdout that is not BASE64 (run={$runnumber},site={$site},contest={$contest})."); MSGError("problem importing stdout (not BASE64) to database. Contact an admin now!"); return false; } $oid1 = 'NULL'; } if (substr($autostderr, 0, 7) == "base64:") { // LOGError($autostderr); $autostderr = base64_decode(substr($autostderr, 7)); $oldoid2 = $oid2; if (($oid2 = DB_lo_import_text($c, $autostderr)) == null) { DBExec($c, "rollback work", "DBNewRun(rollback-import stderr)"); LOGError("Unable to create a large object for file stderr (run={$runnumber},site={$site},contest={$contest})."); MSGError("problem importing stderr to database. Contact an admin now!"); return false; } } else { if ($autostderr != '') { DBExec($c, "rollback work", "DBNewRun(rollback-import stderr)"); LOGError("Unable to create a large object for file stderr that is not BASE64 (run={$runnumber},site={$site},contest={$contest})."); MSGError("problem importing stderr (not BASE64) to database. Contact an admin now!"); return false; } $oid2 = 'NULL'; } } $ret = 1; if ($insert) { if (substr($filepath, 0, 7) != "base64:") { if (($oid = DB_lo_import($c, $filepath)) === false) { DBExec($c, "rollback work", "DBNewRun(rollback-import)"); LOGError("DBNewRun: Unable to create a large object for file {$filepath}."); MSGError("problem importing file {$filepath} to database. Contact an admin now!"); return false; } } else { $filepath = base64_decode(substr($filepath, 7)); if (($oid = DB_lo_import_text($c, $filepath)) == null) { DBExec($c, "rollback work", "DBNewRun(rollback-import)"); LOGError("DBNewRun: Unable to create a large object for file."); MSGError("problem importing file to database. Contact an admin now!"); return false; } } DBExec($c, "INSERT INTO runtable (contestnumber, runsitenumber, runnumber, usernumber, rundate, " . "rundatediff, rundatediffans, runproblem, runfilename, rundata, runanswer, runstatus, runlangnumber, " . "runjudge, runjudgesite, runanswer1, runjudge1, runjudgesite1, runanswer2, runjudge2, runjudgesite2, " . "autoip, autobegindate, autoenddate, autoanswer, autostdout, autostderr, updatetime) " . "VALUES ({$contest}, {$site}, {$n}, {$user}, {$rundate}, {$rundatediff}, {$rundatediffans}, {$problem}, '{$filename}', {$oid}, {$runanswer}, " . "'{$runstatus}', {$lang}, {$runjudge}, {$runjudgesite}, {$runanswer1}, {$runjudge1}, {$runjudgesite1}, {$runanswer2}, {$runjudge2}, " . "{$runjudgesite2}, '{$autoip}', {$autobegindate}, {$autoenddate}, '{$autoanswer}', {$oid1}, {$oid2}, {$updatetime})", "DBNewRun(insert run)"); if ($cw) { DBExec($c, "commit work", "DBNewRun(commit)"); LOGLevel("User {$user} submitted a run (#{$n}) on site #{$site} " . "(problem={$problem},filename={$filename},lang={$lang},contest={$contest},date={$t},datedif={$dif},oid={$oid}).", 2); } $ret = 2; } else { if ($updatetime > $t) { $ret = 2; DBExec($c, "update runtable set rundate={$rundate}, rundatediff={$rundatediff}, " . "rundatediffans={$rundatediffans}, runanswer={$runanswer}, runanswer1={$runanswer1}, runanswer2={$runanswer2}, runstatus='{$runstatus}', " . "runjudge1={$runjudge1}, runjudgesite1={$runjudgesite1}, runjudge2={$runjudge2}, runjudgesite2={$runjudgesite2}, " . "runjudge={$runjudge}, runjudgesite={$runjudgesite}, updatetime={$updatetime}, " . "autoip='{$autoip}', autobegindate={$autobegindate}, autoenddate={$autoenddate}, autoanswer='{$autoanswer}', " . "autostdout={$oid1}, autostderr={$oid2} " . "where runnumber={$runnumber} and contestnumber={$contest} and runsitenumber={$site}", "DBNewRun(update run)"); if (is_numeric($oldoid1)) { DB_lo_unlink($c, $oldoid1); } if (is_numeric($oldoid2)) { DB_lo_unlink($c, $oldoid2); } } if ($cw) { DBExec($c, "commit work", "DBNewRun(commit-update)"); } } return $ret; /* // isso gera problemas de portabilidade e de seguranca (quando outros usuarios tambem tem shell // no servidor e podem construir paginas web. Eles podem usar essas paginas para acessar esses arquivos, // pois os mesmos ficaram com dono apache/www-data/etc) umask(0077); @mkdir("/tmp/boca"); if (!move_uploaded_file ($filepath, "/tmp/boca/contest${contest}.site${site}.run${n}.user${user}.problem${problem}.time${t}.${filename}")) LOGLevel("Run not saved as file (run=$n,site=$site,contest=$contest", 1); */ }
$fout = fopen($temp, "wb"); fwrite($fout, base64_decode($_POST['data'])); fclose($fout); $size = filesize($temp); $name = $_POST['name']; if ($size > $ct["contestmaxfilesize"] || strlen($name) > 100 || strlen($name) < 1) { echo "\nRESULT: SUBMITTED FILE (OR NAME) TOO LARGE"; exit; } } else { $type = myhtmlspecialchars($_FILES["sourcefile"]["type"]); $size = myhtmlspecialchars($_FILES["sourcefile"]["size"]); $name = myhtmlspecialchars($_FILES["sourcefile"]["name"]); $temp = myhtmlspecialchars($_FILES["sourcefile"]["tmp_name"]); if ($size > $ct["contestmaxfilesize"]) { LOGLevel("User {$_SESSION["usertable"]["username"]} tried to submit file " . "{$name} with {$size} bytes ({$ct["contestmaxfilesize"]} max allowed).", 1); MSGError("File size exceeds the limit allowed."); ForceLoad($runteam); } if (!is_uploaded_file($temp) || strlen($name) > 100) { IntrusionNotify("file upload problem."); ForceLoad("../index.php"); } } if (strpos($name, ' ') === true || strpos($temp, ' ') === true || strpos($name, '/') === true || strpos($temp, '/') === true || strpos($name, '`') === true || strpos($temp, '`') === true || strpos($name, '\'') === true || strpos($temp, '\'') === true || strpos($name, "\"") === true || strpos($temp, "\"") === true || strpos($name, '$') === true || strpos($temp, '$') === true) { if (isset($_POST['name']) && $_POST['name'] != '') { echo "\nRESULT: FILE NAME PROBLEM (EG CANNOT HAVE SPACES)"; exit; } MSGError("File name cannot contain spaces."); ForceLoad($runteam);
//INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR //PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER //OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR //CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR //PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING //OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /////////////////////////////////////////////////////////////////////////////////////////// // created 14/June/2011 by cassio@ime.usp.br require 'header.php'; if (($ct = DBContestInfo($_SESSION["usertable"]["contestnumber"])) == null) { ForceLoad("../index.php"); } if (($st = DBSiteInfo($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usersitenumber"])) == null) { ForceLoad("../index.php"); } $fn = tempnam("/tmp", "bkp-"); $fout = fopen($fn, "wb"); echo $_POST; echo $_POST['data']; fwrite($fout, base64_decode($_POST['data'])); fclose($fout); $size = filesize($fn); $name = $_POST['name']; if ($size > $ct["contestmaxfilesize"] || strlen($name) > 100 || strlen($name) < 1) { LOGLevel("User {$_SESSION["usertable"]["username"]} tried to submit file " . ":{$name}: with {$size} bytes.", 1); MSGError("File size exceeds the limit allowed or invalid name."); } else { DBNewBkp($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"], $name, $fn, $size); } @unlink($fn); ForceLoad("../index.php");
function LOGError($msg) { LOGLevel($msg, 0, false); }
function DBNewLanguage($contestnumber, $param, $c = null) { if (isset($param["action"]) && $param["action"] == "delete") { return DBDeleteLanguage($contestnumber, $param, $c); } $ac = array('number', 'name'); $ac1 = array('updatetime', 'extension'); $type['number'] = 1; $type['updatetime'] = 1; $extension = ''; foreach ($ac as $key) { if (!isset($param[$key]) || $param[$key] == "") { MSGError("DBNewLanguage param error: {$key} not found"); return false; } if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewLanguage param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $updatetime = -1; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewLanguage param error: {$key} is not numeric"); return false; } } } $t = time(); if ($updatetime <= 0) { $updatetime = $t; } $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewLanguage(transaction)"); } $sql2 = "select * from langtable where contestnumber={$contestnumber} and langnumber={$number}"; $r = DBExec($c, $sql2 . " for update", "DBNewLanguage(get lang)"); $n = DBnlines($r); $ret = 1; if ($n == 0) { DBExec($c, "insert into langtable (contestnumber,langnumber, langname,langextension) values " . "({$contestnumber}, {$number}, '{$name}','{$extension}')", "DBNewLanguage(insert lang)"); $s = "created"; } else { $lr = DBRow($r, 0); $t = $lr['updatetime']; if ($updatetime > $t) { if ($name != "") { DBExec($c, "update langtable set langname='{$name}', updatetime={$updatetime} where contestnumber={$contestnumber} " . "and langnumber={$number}", "DBNewLanguage(update lang)"); } if ($extension != "") { DBExec($c, "update langtable set langextension='{$extension}', updatetime={$updatetime} where contestnumber={$contestnumber} " . "and langnumber={$number}", "DBNewLanguage(update lang)"); } } $s = "updated"; } if ($cw) { DBExec($c, "commit work", "DBNewLanguage(commit)"); } if ($s == "created" || $updatetime > $t) { LOGLevel("Language {$number} updated (user="******"usertable"]["usernumber"] . ",site=" . $_SESSION["usertable"]["usersitenumber"] . ",contest={$contestnumber})", 2); $ret = 2; } return $ret; }
function DBGetClarToAnswerC($number, $site, $contest, $chief) { $c = DBConnect(); DBExec($c, "begin work", "DBGetClarToAnswerC(transaction)"); $sql = "select c.contestnumber as contestnumber, c.clarsitenumber as sitenumber, c.claranswer as answer, " . "c.clarnumber as number, c.clardatediff as timestamp, c.clarstatus as status, " . "p.problemname as problemname, p.problemnumber as problemnumber, c.clardata as question " . "from clartable as c, problemtable as p " . "where c.contestnumber={$contest} and p.contestnumber=c.contestnumber and " . "c.clarproblem=p.problemnumber and c.clarsitenumber={$site} and " . "c.clarnumber={$number}"; if ($chief != 1) { $sql .= " and (c.clarstatus='openclar' or (c.clarstatus='answering' and " . "c.clarjudge=" . $_SESSION["usertable"]["usernumber"] . " and " . "c.clarjudgesite=" . $_SESSION["usertable"]["usersitenumber"] . "))"; $tx = "Chief is answering"; } else { $tx = "Judge is answering"; } $r = DBExec($c, $sql . " for update", "DBGetClarToAnswerC(get clar/prob for update)"); $n = DBnlines($r); if ($n != 1) { DBExec($c, "rollback work", "DBGetClarToAnswerC(rollback)"); LogLevel("Unable to get a clar (maybe other judge got it first). (clar={$number}, site={$site}, " . "contest={$contest})", 2); return false; } $a = DBRow($r, 0); if ($a["status"] == "answering") { $st = "DNA"; } else { $st = "started"; } if ($chief != 1) { DBExec($c, "update clartable set clarjudge=" . $_SESSION["usertable"]["usernumber"] . ", clarstatus='answering', updatetime=" . time() . ", " . "clarjudgesite=" . $_SESSION["usertable"]["usersitenumber"] . " " . "where contestnumber={$contest} and clarnumber={$number} and clarsitenumber={$site}", "DBGetClarToAnswerC(update clar)"); } DBExec($c, "commit work", "DBGetClarToAnswerC(commit)"); LOGLevel("User got a clarification (clar={$number}, site={$site}, contest={$contest}, status={$st}, " . "user="******"usertable"]["usernumber"] . "(site=" . $_SESSION["usertable"]["usersitenumber"] . ")).", 3); return $a; }
function DBLogOut($contest, $site, $user, $isadmin = false) { $c = DBConnect(); $r = DBExec($c, "update usertable set usersession='',usersessionextra='', updatetime=" . time() . ", " . "userlastlogout=" . time() . " where usernumber={$user} and " . "contestnumber={$contest} and usersitenumber={$site}", "DBLogOut(update user)"); if ($isadmin) { list($clockstr, $clocktime) = siteclock(); if ($clocktime < -600) { DBExec($c, "update contesttable set contestunlockkey='' where contestnumber={$contest}", "DBLogOut(update contest)"); DBExec($c, "update problemtable set problemfullname='', problembasefilename='' where problemfullname !~ '(DEL)' and contestnumber={$contest}", "DBLogOut(update problems)"); $ds = DIRECTORY_SEPARATOR; if ($ds == "") { $ds = "/"; } $dir = $_SESSION["locr"] . $ds . "private" . $ds . "problemtmp" . $ds; foreach (glob($dir . '*') as $file) { cleardir($file, false, true); } } } LOGLevel("User {$user} (contest={$contest},site={$site}) logged out.", 2); }
function DBExecNonStop($conn, $sql, $txt = '') { if ($txt == '') { $txt = 'unknown at ' . getFunctionName(); } $result = @DB_pg_exec($conn, $sql); if (!$result) { LOGLevel("Unable to exec SQL in the database ({$txt}). " . " Error=(" . pg_errormessage($conn) . ")", 2); } return $result; }
function GetExternalData($contest) { $c = DBConnect(); if ($c == null) { return; } $r = DBExec($c, "select * from contesttable where contestnumber={$contest}"); if (DBnLines($r) == 0) { echo "Unable to find the contest {$contest} in the database.\n"; exit; } $ct = DBRow($r, 0); $localsite = $ct["contestlocalsite"]; $mainsite = $ct["contestmainsite"]; if ($mainsite != $localsite) { $r = DBExec($c, "select * from sitetable where sitenumber=" . $ct["contestmainsite"] . " and contestnumber={$contest}"); if (DBnLines($r) == 0) { echo "Unable to find the main site in the database (site={$site}, contest={$contest}).\n"; exit; } $st = DBRow($r, 0); if (($t = DBExtConnect($c, $contest, $st["sitenumber"])) != null) { DBExec($c, "begin work"); // sincronizando contest $r = DBExec($t, "select * from contesttable where contestnumber={$contest}"); $n = DBnLines($r); $atual = DBRow($r, 0); if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } DBExec($c, "update contesttable set " . "contestduration=" . $atual["contestduration"] . "," . "conteststartdate=" . $atual["conteststartdate"] . "," . "contestmaxfilesize=" . $atual["contestmaxfilesize"] . "," . "contestactive='" . $atual["contestactive"] . "'," . "contestname='" . escape_string($atual["contestname"]) . "'," . "contestlastmileanswer=" . $atual["contestlastmileanswer"] . "," . "contestlastmilescore=" . $atual["contestlastmilescore"] . "," . "contestpenalty=" . $atual["contestpenalty"] . "," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and updatetime<" . $atual["updatetime"]); // sincronizando answers $r = DBExec($t, "select * from answertable where contestnumber={$contest}"); $rr = DBExec($c, "select * from answertable where contestnumber={$contest} for update"); $n = DBnLines($r); $nn = DBnLines($rr); echo "answers: external(site={$mainsite}, reading={$mainsite})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["answernumber"] == $aqui["answernumber"] && $la["contestnumber"] == $aqui["contestnumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; $upd = 0; $ins = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { DBExec($c, "delete from answertable where contestnumber={$contest} and answernumber=" . $atual["answernumber"]); $del++; } } for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { $upd++; DBExec($c, "update answertable set " . "runanswer='" . $atual["runanswer"] . "'," . "yes='" . $atual["yes"] . "'," . "fake='" . $atual["fake"] . "'," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and answernumber=" . $atual["answernumber"] . " and updatetime<" . $atual["updatetime"]); } else { if ($situacao[$j] == "inserir") { $ins++; DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake, updatetime) values (" . $contest . "," . $atual["answernumber"] . ",'" . $atual["runanswer"] . "','" . $atual["yes"] . "'," . "'" . $atual["fake"] . "'," . $atual["updatetime"] . ")"); } } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; // sincronizando languages $r = DBExec($t, "select * from langtable where contestnumber={$contest}"); $rr = DBExec($c, "select * from langtable where contestnumber={$contest} for update"); $n = DBnLines($r); $nn = DBnLines($rr); echo "languages: external(site={$mainsite}, reading={$mainsite})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["langnumber"] == $aqui["langnumber"] && $la["contestnumber"] == $aqui["contestnumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; $upd = 0; $ins = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { DBExec($c, "delete from langtable where contestnumber={$contest} and langnumber=" . $atual["langnumber"]); $del++; } } for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { $upd++; DBExec($c, "update langtable set " . "langname='" . escape_string($atual["langname"]) . "'," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and langnumber=" . $atual["langnumber"] . " and updatetime<" . $atual["updatetime"]); } else { if ($situacao[$j] == "inserir") { $ins++; DBExec($c, "insert into langtable (contestnumber, langnumber, langname, updatetime) values ({$contest}," . $atual["langnumber"] . ",'" . escape_string($atual["langname"]) . "'," . $atual["updatetime"] . ")"); } } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; // sincronizando problems $r = DBExec($t, "select * from problemtable where contestnumber={$contest}"); $rr = DBExec($c, "select * from problemtable where contestnumber={$contest} for update"); $n = DBnLines($r); $nn = DBnLines($rr); echo "problems: external(site={$mainsite}, reading={$mainsite})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["problemnumber"] == $aqui["problemnumber"] && $la["contestnumber"] == $aqui["contestnumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; $upd = 0; $ins = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { DBExec($c, "delete from problemtable where contestnumber={$contest} and problemnumber=" . $atual["problemnumber"]); $del++; } } for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "inserir") { $ins++; $upd--; DBExec($c, "insert into problemtable (contestnumber, problemnumber, problemname, updatetime) values ({$contest}," . $atual["problemnumber"] . ",'" . escape_string($atual["problemname"]) . "', 0)"); } if ($situacao[$j] == "atualizar" || $situacao[$j] == "inserir") { $upd++; $p = DBRow($r2, 0); if ($p["probleminputfile"] > 0) { DB_lo_unlink($c, $p["probleminputfile"]); } if ($p["problemsolfile"] > 0) { DB_lo_unlink($c, $p["problemsolfile"]); } DBExec($t, "begin work"); if ($atual["probleminputfile"] == "") { $inputfile = "null"; } else { $in = DB_lo_open($t, $atual["probleminputfile"], "r"); if (!$in) { $inputfile = "null"; } else { $inputfile = DB_lo_create($c); $out = DB_lo_open($c, $inputfile, "w"); while (($buf = DB_lo_read($in, 100000)) != false) { DB_lo_write($out, $buf); } DB_lo_close($out); DB_lo_close($in); } } if ($atual["problemsolfile"] == "") { $solfile = "null"; } else { $in = DB_lo_open($t, $atual["problemsolfile"], "r"); if (!$in) { $solfile = "null"; } else { $solfile = DB_lo_create($c); $out = DB_lo_open($c, $solfile, "w"); while (($buf = DB_lo_read($in, 100000)) != false) { DB_lo_write($out, $buf); } DB_lo_close($out); DB_lo_close($in); } } DBExec($t, "commit work"); DBExec($c, "update problemtable set " . "problemname='" . escape_string($atual["problemname"]) . "'," . "problemfullname='" . escape_string($atual["problemfullname"]) . "'," . "problembasefilename='" . escape_string($atual["problembasefilename"]) . "'," . "probleminputfilename='" . escape_string($atual["probleminputfilename"]) . "'," . "problemsolfilename='" . escape_string($atual["problemsolfilename"]) . "'," . "fake='" . $atual["fake"] . "'," . "probleminputfile=" . $inputfile . "," . "problemsolfile=" . $solfile . "," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and problemnumber=" . $atual["problemnumber"] . " and updatetime<" . $atual["updatetime"]); } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; DBExec($c, "commit work"); } } $r = DBExec($c, "select * from sitetable where contestnumber={$contest}"); $n = DBnlines($r); if ($n == 0) { echo "Unable to find sites in the database.\n"; exit; } $st = array(); for ($i = 0; $i < $n; $i++) { $st[$i] = DBRow($r, $i); } for ($i = 0; $i < count($st); $i++) { $site = $st[$i]["sitenumber"]; if ($site == $ct["contestlocalsite"]) { continue; } if (($t = DBExtConnect($c, $contest, $site)) == null) { continue; } DBExec($c, "begin work"); // sincronizando site $r = DBExec($t, "select * from sitetable where contestnumber={$contest} and sitenumber={$site}"); $rr = DBExec($c, "select * from sitetable where contestnumber={$contest} and sitenumber={$site} for update"); $n = DBnLines($r); $nn = DBnLines($rr); $atual = DBRow($r, 0); $p = DBRow($rr, 0); // if ($p["updatetime"]<$atual["updatetime"]) { if ($atual["sitestartdate"] == "") { $atual["sitestartdate"] = "null"; } if ($atual["sitelastmilescore"] == "") { $atual["sitelastmilescore"] = "null"; } if ($atual["sitelastmileanswer"] == "") { $atual["sitelastmileanswer"] = "null"; } if ($atual["siteenddate"] == "") { $atual["siteenddate"] = "null"; } if ($atual["siteendeddate"] == "") { $atual["siteendeddate"] = "null"; } if ($atual["siteautoend"] != "t") { $atual["siteautoend"] = "f"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } DBExec($c, "update sitetable set " . "sitename='" . escape_string($atual["sitename"]) . "'," . "siteactive='" . escape_string($atual["siteactive"]) . "'," . "sitepermitlogins='" . escape_string($atual["sitepermitlogins"]) . "'," . "sitestartdate=" . $atual["sitestartdate"] . "," . "sitelastmilescore=" . $atual["sitelastmilescore"] . "," . "sitelastmileanswer=" . $atual["sitelastmileanswer"] . "," . "siteenddate=" . $atual["siteenddate"] . "," . "siteendeddate=" . $atual["siteendeddate"] . "," . "siteautoend='" . escape_string($atual["siteautoend"]) . "'," . "sitejudging='" . escape_string($atual["sitejudging"]) . "'," . "siteglobalscore='" . escape_string($atual["siteglobalscore"]) . "'," . "sitescorelevel=" . $atual["sitescorelevel"] . "," . "sitenextuser="******"sitenextuser"] . "," . "sitenextclar=" . $atual["sitenextclar"] . "," . "sitenextrun=" . $atual["sitenextrun"] . "," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and sitenumber=" . $atual["sitenumber"]); // ." and updatetime<".$atual["updatetime"]); // } // sincronizando users $r = DBExec($t, "select * from usertable where contestnumber={$contest} and usersitenumber={$site}"); $rr = DBExec($c, "select * from usertable where contestnumber={$contest} and usersitenumber={$site}"); $n = DBnLines($r); $nn = DBnLines($rr); echo "users: external(site={$site}, reading={$site})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["usernumber"] == $aqui["usernumber"] && $la["contestnumber"] == $aqui["contestnumber"] && $la["usersitenumber"] == $aqui["usersitenumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { DBExec($c, "delete from usertable where contestnumber={$contest} and usersitenumber={$site} and usernumber=" . $atual["usernumber"]); $del++; } } $upd = 0; $ins = 0; for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["userlastlogin"] == "") { $atual["userlastlogin"] = "******"; } if ($atual["userlastlogout"] == "") { $atual["userlastlogout"] = "null"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { DBExec($c, "update usertable set " . "username='******'," . "userfullname='" . escape_string($atual["userfullname"]) . "'," . "userdesc='" . escape_string($atual["userdesc"]) . "'," . "usertype='" . escape_string($atual["usertype"]) . "'," . "userenabled='" . $atual["userenabled"] . "'," . "usermultilogin='******'," . "userpassword='******'," . "userip='" . $atual["userip"] . "'," . "userlastlogin="******"userlastlogin"] . "," . "userlastlogout=" . $atual["userlastlogout"] . "," . "usersession='" . $atual["usersession"] . "'," . "userpermitip='" . $atual["userpermitip"] . "'," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and usersitenumber=" . $atual["usersitenumber"] . " and usernumber=" . $atual["usernumber"] . " and updatetime<" . $atual["updatetime"]); $upd++; } else { if ($situacao[$j] == "inserir") { DBExec($c, "insert into usertable (username, userfullname, userdesc, usertype, userenabled, usermultilogin, " . "userpassword, userip, userlastlogin, userlastlogout, usersession, userpermitip, updatetime, " . "contestnumber, usersitenumber, usernumber) values (" . "'" . escape_string($atual["username"]) . "'," . "'" . escape_string($atual["userfullname"]) . "'," . "'" . escape_string($atual["userdesc"]) . "'," . "'" . $atual["usertype"] . "'," . "'" . $atual["userenabled"] . "'," . "'" . $atual["usermultilogin"] . "'," . "'" . $atual["userpassword"] . "'," . "'" . $atual["userip"] . "'," . $atual["userlastlogin"] . "," . $atual["userlastlogout"] . "," . "'" . $atual["usersession"] . "'," . "'" . $atual["userpermitip"] . "'," . $atual["updatetime"] . ",{$contest}," . $atual["usersitenumber"] . "," . $atual["usernumber"] . ")"); $ins++; } } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; // sincronizando clars $r = DBExec($t, "select * from clartable where contestnumber={$contest} and clarsitenumber={$site}"); $rr = DBExec($c, "select * from clartable where contestnumber={$contest} and clarsitenumber={$site}"); $n = DBnLines($r); $nn = DBnLines($rr); echo "clars: external(site={$site}, reading={$site})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["clarnumber"] == $aqui["clarnumber"] && $la["contestnumber"] == $aqui["contestnumber"] && $la["clarsitenumber"] == $aqui["clarsitenumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { DBExec($c, "delete from clartable where contestnumber={$contest} and clarsitenumber={$site} and clarnumber=" . $atual["clarnumber"]); $del++; } } $upd = 0; $ins = 0; for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["claranswer"] == "") { $atual["claranswer"] = "null"; } else { $atual["claranswer"] = "'" . escape_string($atual["claranswer"]) . "'"; } if ($atual["clarjudge"] == "") { $atual["clarjudge"] = "null"; } if ($atual["clarjudgesite"] == "") { $atual["clarjudgesite"] = "null"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { DBExec($c, "update clartable set " . "usernumber=" . $atual["usernumber"] . "," . "clardate=" . $atual["clardate"] . "," . "clardatediff=" . $atual["clardatediff"] . "," . "clardatediffans=" . $atual["clardatediffans"] . "," . "clarproblem=" . $atual["clarproblem"] . "," . "clardata='" . escape_string($atual["clardata"]) . "'," . "claranswer=" . $atual["claranswer"] . "," . "clarstatus='" . escape_string($atual["clarstatus"]) . "'," . "clarjudge=" . $atual["clarjudge"] . "," . "clarjudgesite=" . $atual["clarjudgesite"] . "," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and clarsitenumber=" . $atual["clarsitenumber"] . " and clarnumber=" . $atual["clarnumber"] . " and updatetime<" . $atual["updatetime"]); $upd++; } else { if ($situacao[$j] == "inserir") { DBExec($c, "insert into clartable (contestnumber, clarsitenumber, clarnumber, usernumber, clardate," . "clardatediff, clardatediffans, clarproblem, clardata, claranswer, clarstatus, clarjudge, clarjudgesite, updatetime) " . "values (" . $contest . "," . $atual["clarsitenumber"] . "," . $atual["clarnumber"] . "," . $atual["usernumber"] . "," . $atual["clardate"] . "," . $atual["clardatediff"] . "," . $atual["clardatediffans"] . "," . $atual["clarproblem"] . "," . "'" . escape_string($atual["clardata"]) . "'," . $atual["claranswer"] . "," . "'" . escape_string($atual["clarstatus"]) . "'," . $atual["clarjudge"] . "," . $atual["clarjudgesite"] . "," . $atual["updatetime"] . ")"); $ins++; } } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; // sincronizando clars $r = DBExec($t, "select * from clartable where contestnumber={$contest} and clarsitenumber={$localsite}"); $rr = DBExec($c, "select * from clartable where contestnumber={$contest} and clarsitenumber={$localsite}"); $n = DBnLines($r); $nn = DBnLines($rr); echo "clars: external(site={$site}, reading={$localsite})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["clarnumber"] == $aqui["clarnumber"] && $la["contestnumber"] == $aqui["contestnumber"] && $la["clarsitenumber"] == $aqui["clarsitenumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $upd = 0; $ins = 0; for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["claranswer"] == "") { $atual["claranswer"] = "null"; } else { $atual["claranswer"] = "'" . escape_string($atual["claranswer"]) . "'"; } if ($atual["clarjudge"] == "") { $atual["clarjudge"] = "null"; } if ($atual["clarjudgesite"] == "") { $atual["clarjudgesite"] = "null"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { DBExec($c, "update clartable set " . "usernumber=" . $atual["usernumber"] . "," . "clardate=" . $atual["clardate"] . "," . "clardatediff=" . $atual["clardatediff"] . "," . "clardatediffans=" . $atual["clardatediffans"] . "," . "clarproblem=" . $atual["clarproblem"] . "," . "clardata='" . escape_string($atual["clardata"]) . "'," . "claranswer=" . $atual["claranswer"] . "," . "clarstatus='" . escape_string($atual["clarstatus"]) . "'," . "clarjudge=" . $atual["clarjudge"] . "," . "clarjudgesite=" . $atual["clarjudgesite"] . "," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and clarsitenumber=" . $atual["clarsitenumber"] . " and clarnumber=" . $atual["clarnumber"] . " and updatetime<" . $atual["updatetime"]); $upd++; } else { if ($situacao[$j] == "inserir") { $ins++; echo "Clar inserts shouldn't exist (clarnumber=" . $atual["clarnumber"] . ")...\n"; } } } echo " updates={$upd}, insertions={$ins}\n\n"; // sincronizando runs $r = DBExec($t, "select * from runtable where contestnumber={$contest} and runsitenumber={$site}"); $rr = DBExec($c, "select * from runtable where contestnumber={$contest} and runsitenumber={$site}"); $n = DBnLines($r); $nn = DBnLines($rr); echo "runs: external(site={$site}, reading={$site})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["runnumber"] == $aqui["runnumber"] && $la["contestnumber"] == $aqui["contestnumber"] && $la["runsitenumber"] == $aqui["runsitenumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $del = 0; for ($k = 0; $k < $nn; $k++) { $atual = DBRow($rr, $k); if (!$needed[$k]) { $del++; DBExec($c, "delete from runtable where contestnumber={$contest} and runsitenumber={$site} and runnumber=" . $atual["runnumber"]); } } $upd = 0; $ins = 0; for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); /* $r2 = DBExec ($c,"select * from runtable where contestnumber=$contest and runsitenumber=".$atual["runsitenumber"]. " and runnumber=".$atual["runnumber"]." for update"); if (DBnLines($r2)>0) { $p = DBRow($r2, 0); DB_lo_unlink($c, $p["rundata"]); } */ if ($atual["runjudge"] == "") { $atual["runjudge"] = "null"; } if ($atual["runjudgesite"] == "") { $atual["runjudgesite"] = "null"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { $upd++; DBExec($c, "update runtable set " . "usernumber=" . $atual["usernumber"] . "," . "rundate=" . $atual["rundate"] . "," . "rundatediff=" . $atual["rundatediff"] . "," . "rundatediffans=" . $atual["rundatediffans"] . "," . "runproblem=" . $atual["runproblem"] . "," . "runlangnumber=" . $atual["runlangnumber"] . "," . "runanswer=" . $atual["runanswer"] . "," . "runstatus='" . escape_string($atual["runstatus"]) . "'," . "runjudge=" . $atual["runjudge"] . "," . "runjudgesite=" . $atual["runjudgesite"] . "," . "runfilename='" . escape_string($atual["runfilename"]) . "'," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and runsitenumber=" . $atual["runsitenumber"] . " and runnumber=" . $atual["runnumber"] . " and updatetime<" . $atual["updatetime"]); } else { if ($situacao[$j] == "inserir") { $ins++; DBExec($t, "begin work"); $in = DB_lo_open($t, $atual["rundata"], "r"); if (!$in) { $o = "0"; } else { $o = DB_lo_create($c); $out = DB_lo_open($c, $o, "w"); while (($buf = DB_lo_read($in, 1000)) != false) { DB_lo_write($out, $buf); } DB_lo_close($out); DB_lo_close($in); $in = DB_lo_open($t, $atual["rundata"], "r"); if (!$in) { $o = "0"; LOGLevel("Run not saved as file (run=" . $atual["runnumber"] . ",site=" . $atual["runsitenumber"] . ",contest={$contest}", 1); } else { $sitess = $atual["runsitenumber"]; $nss = $atual["runnumber"]; $user = $atual["usernumber"]; $problem = $atual["runproblem"]; $filename = escape_string($atual["runfilename"]); $ttimet = $atual["rundate"]; $fp = fopen("/tmp/boca/contest{$contest}.site{$sitess}.run{$nss}.user{$user}." . "problem{$problem}.time{$ttimet}.{$filename}", "w"); if ($fp) { while (($buf = DB_lo_read($in, 1000)) != false) { fwrite($fp, $buf); } fclose($fp); $fp = fopen("/tmp/check/contest{$contest}.site{$sitess}.run{$nss}.user{$user}." . "problem{$problem}.time{$ttimet}.{$filename}.check", "w"); if ($fp) { fwrite($fp, "1"); fclose($fp); } else { LOGLevel("Run not saved as check file (run=" . $atual["runnumber"] . ",site=" . $atual["runsitenumber"] . ",contest={$contest}", 1); } } else { LOGLevel("Run not saved as file (run=" . $atual["runnumber"] . ",site=" . $atual["runsitenumber"] . ",contest={$contest}", 1); } DB_lo_close($out); } } DBExec($c, "insert into runtable (contestnumber, runsitenumber, runnumber, usernumber, rundate," . "rundatediff, rundatediffans, runproblem, runfilename, rundata, runanswer, runstatus, runjudge," . "runjudgesite, runlangnumber, updatetime) " . "values (" . $contest . "," . $atual["runsitenumber"] . "," . $atual["runnumber"] . "," . $atual["usernumber"] . "," . $atual["rundate"] . "," . $atual["rundatediff"] . "," . $atual["rundatediffans"] . "," . $atual["runproblem"] . "," . "'" . escape_string($atual["runfilename"]) . "',{$o}," . $atual["runanswer"] . "," . "'" . escape_string($atual["runstatus"]) . "'," . $atual["runjudge"] . "," . $atual["runjudgesite"] . "," . $atual["runlangnumber"] . "," . $atual["updatetime"] . ")"); DBExec($t, "commit work"); } } } echo " deletions={$del}, updates={$upd}, insertions={$ins}\n\n"; // sincronizando runs $r = DBExec($t, "select * from runtable where contestnumber={$contest} and runsitenumber={$localsite}"); $rr = DBExec($c, "select * from runtable where contestnumber={$contest} and runsitenumber={$localsite}"); $n = DBnLines($r); $nn = DBnLines($rr); echo "runs: external(site={$site}, reading={$localsite})={$n}, local={$nn}\n"; for ($k = 0; $k < $nn; $k++) { $needed[$k] = false; } for ($j = 0; $j < $n; $j++) { $la = DBRow($r, $j); for ($k = 0; $k < $nn; $k++) { $aqui = DBRow($rr, $k); if ($la["runnumber"] == $aqui["runnumber"] && $la["contestnumber"] == $aqui["contestnumber"] && $la["runsitenumber"] == $aqui["runsitenumber"]) { $needed[$k] = true; if ($la["updatetime"] > $aqui["updatetime"]) { $situacao[$j] = "atualizar"; if ($la["runanswer"] != "") { $rrr = DBExec($c, "select * from answertable where answernumber=" . $la["runanswer"] . " and contestnumber=" . $la["contestnumber"]); $ans = DBnLines($rrr) > 0 ? DBRow($rrr, 0) : null; if ($ans == null) { echo "Problem with the answer table. Unable to send balloon because the answer was " . "not found (run=" . $la["runnumber"] . ", site=" . $la["runsite"] . ", contest=" . $la["contestnumber"] . ", answer=" . $la["runanswer"] . ")."; $yesla = 'x'; } else { $yesla = $ans["yes"]; } } else { $yesla = 'f'; } if ($aqui["runanswer"] != "") { $rrr = DBExec($c, "select * from answertable where answernumber=" . $aqui["runanswer"] . " and contestnumber=" . $aqui["contestnumber"]); $ans = DBnLines($rrr) > 0 ? DBRow($rrr, 0) : null; if ($ans == null) { echo "Problem with the answer table. Unable to send balloon because the answer was " . "not found (run=" . $aqui["runnumber"] . ", site=" . $aqui["runsite"] . ", contest=" . $aqui["contestnumber"] . ", answer=" . $aqui["runanswer"] . ")."; $yesaqui = 'x'; } else { $yesaqui = $ans["yes"]; } } else { $yesaqui = 'f'; } if ($yesla == 't' && $yesaqui == 'f') { $rrr = DBExec($c, "select * from sitetable where contestnumber=" . $aqui["contestnumber"] . " and sitenumber={$localsite}"); if (DBnLines($rrr) <= 0) { echo "Site info not found (contest={$aqui["contestnumber"]}, site={$localsite})."; } else { $b = DBRow($rrr, 0); $ti = $b["sitestartdate"]; $tempo = time(); $ta = $tempo - $ti; $tf = $b["sitelastmileanswer"]; // if ($ta < $tf) { $rrr = DBExec($c, "select * from usertable where contestnumber=" . $aqui["contestnumber"] . " and usersitenumber={$localsite} and usernumber=" . $aqui["usernumber"]); if (DBnLines($rrr) <= 0) { echo "User info not found (contest={$aqui["contestnumber"]}, " . "site={$localsite}, user={$aqui["runusernumber"]})."; } else { $u = DBRow($rrr, 0); $rrr = DBExec($c, "select * from problemtable where contestnumber=" . $aqui["contestnumber"] . " and problemnumber=" . $aqui["runproblem"]); if (DBnLines($rrr) <= 0) { echo "Problem info not found (contest={$aqui["contestnumber"]}, " . "problem={$aqui["runproblem"]})."; } else { $p = DBRow($rrr, 0); mail("balloon@mainserver", "YES: team=" . $u["username"] . ", problem=" . $p["problemname"], "User " . $u["username"] . " should receive a balloon for " . $p["problemfullname"] . "\n"); } } // } } } else { if ($yesla == 'f' && $yesaqui == 't') { $rrr = DBExec($c, "select * from usertable where contestnumber=" . $aqui["contestnumber"] . " and usersitenumber={$localsite} and usernumber=" . $aqui["usernumber"]); if (DBnLines($rrr) <= 0) { echo "User info not found (contest={$aqui["contestnumber"]}, " . "site={$localsite}, user={$aqui["runusernumber"]})."; } else { $u = DBRow($rrr, 0); $rrr = DBExec($c, "select * from problemtable where contestnumber=" . $aqui["contestnumber"] . " and problemnumber=" . $aqui["runproblem"]); if (DBnLines($rrr) <= 0) { echo "Problem info not found (contest={$aqui["contestnumber"]}, " . "problem={$aqui["runproblem"]})."; } else { $p = DBRow($rrr, 0); mail("balloon@mainserver", "NO: team=" . $u["username"] . ", problem=" . $p["problemname"], "Remove the balloon from user " . $u["username"] . " for " . $p["problemfullname"] . "\n"); } } } } } else { $situacao[$j] = "ok"; } break; } } if ($k >= $nn) { $situacao[$j] = "inserir"; } } $upd = 0; $ins = 0; for ($j = 0; $j < $n; $j++) { $atual = DBRow($r, $j); if ($atual["runjudge"] == "") { $atual["runjudge"] = "null"; } if ($atual["runjudgesite"] == "") { $atual["runjudgesite"] = "null"; } if ($atual["updatetime"] == "") { $atual["updatetime"] = time(); } if ($situacao[$j] == "atualizar") { $upd++; DBExec($c, "update runtable set " . "usernumber=" . $atual["usernumber"] . "," . "rundate=" . $atual["rundate"] . "," . "rundatediff=" . $atual["rundatediff"] . "," . "rundatediffans=" . $atual["rundatediffans"] . "," . "runproblem=" . $atual["runproblem"] . "," . "runlangnumber=" . $atual["runlangnumber"] . "," . "runanswer=" . $atual["runanswer"] . "," . "runstatus='" . escape_string($atual["runstatus"]) . "'," . "runjudge=" . $atual["runjudge"] . "," . "runjudgesite=" . $atual["runjudgesite"] . "," . "runfilename='" . escape_string($atual["runfilename"]) . "'," . "updatetime=" . $atual["updatetime"] . " where contestnumber={$contest} and runsitenumber=" . $atual["runsitenumber"] . " and runnumber=" . $atual["runnumber"] . " and updatetime<" . $atual["updatetime"]); } else { if ($situacao[$j] == "inserir") { $ins++; echo "Run Inserts shouldn't exist (run=" . $atual["runnumber"] . ")..."; } } } echo " updates={$upd}, insertions={$ins}\n\n"; DBExec($c, "commit work"); DBClose($t); } DBClose($c); }
function DBNewTask($param, $c = null) { if (isset($param['contestnumber']) && !isset($param['contest'])) { $param['contest'] = $param['contestnumber']; } if (isset($param['sitenumber']) && !isset($param['site'])) { $param['site'] = $param['sitenumber']; } if (isset($param['usernumber']) && !isset($param['user'])) { $param['user'] = $param['usernumber']; } if (isset($param['number']) && !isset($param['tasknumber'])) { $param['tasknumber'] = $param['number']; } $ac = array('contest', 'site', 'user', 'desc'); $ac1 = array('color', 'colorname', 'updatetime', 'filename', 'filepath', 'sys', 'tasknumber', 'status', 'taskdate', 'taskdatediff', 'taskdatediffans', 'taskstaffnumber', 'taskstaffsite'); $type['contest'] = 1; $type['updatetime'] = 1; $type['site'] = 1; $type['user'] = 1; $type['tasknumber'] = 1; $type['taskdate'] = 1; $type['taskdatediff'] = 1; $type['taskdatediffans'] = 1; $type['taskstaffnumber'] = 1; $type['taskstaffsite'] = 1; foreach ($ac as $key) { if (!isset($param[$key]) || $param[$key] == "") { MSGError("DBNewTask param error: {$key} not found"); return false; } if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewTask param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $taskstaffnumber = -1; $taskstaffsite = -1; $t = time(); $taskdate = $t; $sys = 'f'; $filename = ''; $filepath = ''; $color = ''; $colorname = ''; $tasknumber = -1; $taskdatediffans = 999999999; $updatetime = -1; $status = 'opentask'; $taskdatediff = -1; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewTask param error: {$key} is not numeric"); return false; } } } if ($updatetime <= 0) { $updatetime = $t; } if ($sys != 't') { $sys = 'f'; } $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewTask(transaction)"); } $insert = true; if ($tasknumber < 0) { $sql = "select sitenexttask as nexttask, sitemaxtask as maxtask from " . "sitetable where sitenumber={$site} and contestnumber={$contest} for update"; $r = DBExec($c, $sql, "DBNewTask(get site for update)"); if (DBnlines($r) != 1) { DBExec($c, "rollback work", "DBNewTask(rollback-site)"); LOGError("Unable to find a unique site/contest in the database. SQL=(" . $sql . ")"); MSGError("Unable to find a unique site/contest in the database."); exit; } $a = DBRow($r, 0); $b = DBSiteInfo($contest, $site, $c); $dif = $b["currenttime"]; if ($taskdatediff < 0) { $taskdatediff = $dif; } if ($sys != 't' && DBCountOpenTasks($contest, $site, $user) > $a["maxtask"]) { DBExec($c, "rollback work", "DBNewTask(rollback-maxtask)"); LOGError("Too many open tasks for user={$user}, site={$site}, contest={$contest}"); MSGError("Too many open tasks! Task not included."); exit; } if ($sys != 't' && $dif < 0) { DBExec($c, "rollback work", "DBNewTask(rollback-started)"); LOGError("Tried to submit a task but the contest is not started. SQL=(" . $sql . ")"); MSGError("The contest is not started yet!"); exit; } if ($sys != 't' && !$b["siterunning"]) { DBExec($c, "rollback work", "DBNewTask(rollback-over)"); LOGError("Tried to submit a task but the contest is over. SQL=(" . $sql . ")"); MSGError("The contest is over!"); exit; } $tasknumber = $a["nexttask"] + 1; } else { $sql = "select * from tasktable as t where t.contestnumber={$contest} and " . "t.sitenumber={$site} and t.tasknumber={$tasknumber}"; $r = DBExec($c, $sql . " for update", "DBNewTask(get task for update)"); $n = DBnlines($r); if ($n > 0) { $insert = false; $lr = DBRow($r, 0); $t = $lr['updatetime']; } } DBExec($c, "update sitetable set sitenexttask={$tasknumber}, updatetime=" . $t . " where sitenumber={$site} and contestnumber={$contest} and sitenexttask<{$tasknumber}", "DBNewTask(update site)"); $ret = 1; if ($insert) { if ($filename != "" && $filepath != "") { if (substr($filepath, 0, 7) != "base64:") { if (($oid = DB_lo_import($c, $filepath)) === false) { DBExec($c, "rollback work", "DBNewTask(rollback-import)"); LOGError("DBNewTask: Unable to create a large object for file {$filepath}."); MSGError("problem importing file to database. Contact an admin now!"); exit; } } else { $filepath = base64_decode(substr($filepath, 7)); if (($oid = DB_lo_import_text($c, $filepath)) == null) { DBExec($c, "rollback work", "DBNewTask(rollback-import)"); LOGError("DBNewTask: Unable to create a large object for file."); MSGError("problem importing file to database. Contact an admin now!"); exit; } } } else { $oid = "NULL"; } DBExec($c, "INSERT INTO tasktable (contestnumber, sitenumber, tasknumber, usernumber, taskdate, " . "taskdatediff, taskdatediffans, taskfilename, taskdata, taskstatus, taskdesc, tasksystem, " . "color, colorname, updatetime) " . "VALUES ({$contest}, {$site}, {$tasknumber}, {$user}, {$taskdate}, {$taskdatediff}, {$taskdatediffans}, '{$filename}', {$oid}, '{$status}', " . "'{$desc}', '{$sys}', '{$color}', '{$colorname}', {$updatetime})", "DBNewTask(insert task)"); if ($sys == "t") { $u = "System"; } else { $u = "User {$user}"; } if ($cw) { DBExec($c, "commit work", "DBNewTask(commit-insert)"); LOGLevel("{$u} submitted a task (#{$tasknumber}) on site #{$site} " . "(filename={$filename}, contest={$contest}).", 2); } $ret = 2; } else { if ($updatetime > $t) { $ret = 2; $sql = "update tasktable set usernumber={$user}, taskdesc='{$desc}', " . "color='{$color}',colorname='{$colorname}',taskstatus='{$status}',"; if ($taskstaffnumber > 0) { $sql .= "taskstaffnumber={$taskstaffnumber}, "; } if ($taskstaffsite > 0) { $sql .= "taskstaffsite={$taskstaffsite}, "; } $sql .= "taskdatediffans={$taskdatediffans}, updatetime={$updatetime} where " . "contestnumber={$contest} and sitenumber={$site} and tasknumber={$tasknumber}"; DBExec($c, $sql, "DBNewTask(update task)"); } if ($cw) { DBExec($c, "commit work", "DBNewTask(commit-update)"); } } return $ret; }
function DBNewProblem($contestnumber, $param, $c = null) { if (isset($param["action"]) && $param["action"] == "delete") { return DBDeleteProblem($contestnumber, $param); } $ac = array('number', 'name'); $type['number'] = 1; $type['updatetime'] = 1; $ac1 = array('colorname', 'fake', 'color', 'updatetime', 'fullname', 'basename', 'inputfilename', 'inputfilepath'); $colorname = ''; $color = ''; $fake = 'f'; foreach ($ac as $key) { if (!isset($param[$key])) { MSGError("DBNewProblem param error: {$key} is not set"); return false; } if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewProblem param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $basename = ''; $inputfilename = ''; $inputfilepath = ''; $fullname = ''; $updatetime = -1; foreach ($ac1 as $key) { if (isset($param[$key])) { if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewProblem param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } } $t = time(); if ($updatetime <= 0) { $updatetime = $t; } $inputhash = ''; $sql2 = "select * from problemtable where contestnumber={$contestnumber} and problemnumber={$number} for update"; // "select * from problemtable where contestnumber=$contestnumber and problemnumber=$number " . // "and probleminputfilename='$inputfilename'"; $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewProblem(transaction)"); } $r = DBExec($c, $sql2, "DBNewProblem(get problem for update)"); $n = DBnlines($r); $ret = 1; $oldfullname = ''; $deservesupdatetime = false; if ($n == 0) { DBExec($c, "insert into problemtable (contestnumber, problemnumber, problemname, problemcolor) values " . "({$contestnumber}, {$number}, '{$name}','-1')", "DBNewProblem(insert problem)"); $deservesupdatetime = true; $s = "created"; } else { $lr = DBRow($r, 0); $t = $lr['updatetime']; $oldfullname = $lr['problemfullname']; $s = "updated"; $inputhash = $lr['probleminputfilehash']; } if ($s == "created" || $updatetime > $t) { if (substr($inputfilepath, 0, 7) != "base64:") { if ($inputfilepath != "") { $hash = myshorthash(file_get_contents($inputfilepath)); if ($hash != $inputhash) { $oldoid = ''; if (isset($lr)) { $oldoid = $lr['probleminputfile']; } if (($oid1 = DB_lo_import($c, $inputfilepath)) === false) { DBExec($c, "rollback work", "DBNewProblem(rollback-input)"); LOGError("Unable to create a large object for file {$inputfilename}."); MSGError("problem importing file to database. See log for details!"); exit; } if ($oldoid != '') { DB_lo_unlink($c, $oldoid); } $inputhash = DBcrc($contestnumber, $oid1, $c); } else { $oid1 = $lr['probleminputfile']; } } } else { $inputfilepath = base64_decode(substr($inputfilepath, 7)); $hash = myshorthash($inputfilepath); if ($hash != $inputhash) { $oldoid = ''; if (isset($lr)) { $oldoid = $lr['probleminputfile']; } if (($oid1 = DB_lo_import_text($c, $inputfilepath)) == null) { DBExec($c, "rollback work", "DBNewProblem(rollback-i-import)"); LOGError("Unable to import the large object for file {$inputfilename}."); MSGError("problem importing file to database. See log for details!"); exit; } if ($oldoid != '') { DB_lo_unlink($c, $oldoid); } $inputhash = DBcrc($contestnumber, $oid1, $c); } else { $oid1 = $lr['probleminputfile']; } } if ($name != "") { DBExec($c, "update problemtable set problemname='{$name}' where contestnumber={$contestnumber} " . "and problemnumber={$number}", "DBNewProblem(update name)"); } if ($fullname != "" || strpos($oldfullname, '(DEL)') !== false) { $deservesupdatetime = true; DBExec($c, "update problemtable set problemfullname='{$fullname}' where contestnumber={$contestnumber} " . "and problemnumber={$number}", "DBNewProblem(update fullname)"); } if ($basename != "") { $deservesupdatetime = true; DBExec($c, "update problemtable set problembasefilename='{$basename}' where contestnumber={$contestnumber} " . "and problemnumber={$number}", "DBNewProblem(update basename)"); } if ($colorname != "") { DBExec($c, "update problemtable set problemcolorname='{$colorname}' where contestnumber={$contestnumber} " . "and problemnumber={$number}", "DBNewProblem(update colorname)"); } if ($color != "") { DBExec($c, "update problemtable set problemcolor='{$color}' where contestnumber={$contestnumber} " . "and problemnumber={$number}", "DBNewProblem(update color)"); } if ($inputfilename != "") { $deservesupdatetime = true; DBExec($c, "update problemtable set probleminputfilename='{$inputfilename}' where " . "contestnumber={$contestnumber} and problemnumber={$number} ", "DBNewProblem(update inputfilename)"); } if ($inputfilepath != "") { $deservesupdatetime = true; DBExec($c, "update problemtable set probleminputfile={$oid1},probleminputfilehash='{$inputhash}' where contestnumber={$contestnumber} and " . "problemnumber={$number} ", "DBNewProblem(update inputfile)"); } if ($fake == "t") { $deservesupdatetime = true; DBExec($c, "update problemtable set fake='{$fake}' where contestnumber={$contestnumber} and " . "problemnumber={$number}", "DBNewProblem(update fake)"); } if ($deservesupdatetime) { $ds = DIRECTORY_SEPARATOR; if ($ds == "") { $ds = "/"; } @unlink($_SESSION["locr"] . $ds . "private" . $ds . "problemtmp" . $ds . "contest" . $contestnumber . "-problem" . $number . '.name'); DBExec($c, "update problemtable set updatetime=" . $updatetime . " where contestnumber={$contestnumber} and problemnumber={$number}", "DBNewProblem(time)"); } if ($cw) { DBExec($c, "commit work", "DBNewProblem(commit)"); } LOGLevel("Problem {$number} (inputfile={$inputfilename}) {$s} (user="******"usertable"]["usernumber"] . ",site=" . $_SESSION["usertable"]["usersitenumber"] . ",contest={$contestnumber})", 2); $ret = 2; } else { if ($cw) { DBExec($c, "commit work", "DBNewProblem(commit)"); } } return $ret; }
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. //////////////////////////////////////////////////////////////////////////////// // Last modified 05/aug/2012 by cassio@ime.usp.br require 'header.php'; header("Content-transfer-encoding: binary\n"); ob_end_flush(); if (($ct = DBContestInfo($_SESSION["usertable"]["contestnumber"])) == null) { echo "<!-- <ERROR4> " . session_id() . " " . session_id() . " -->\n"; exit; } if ($ct["contestlocalsite"] == $ct["contestmainsite"]) { $fromsite = $_SESSION["usertable"]["usericpcid"]; LOGLevel("Connection received from site={$fromsite} PHPID=" . $_COOKIE['PHPSESSID'] . ",extra=" . $_SESSION['usertable']['usersessionextra'] . ",session=" . session_id() . ",name=" . $getx['name'] . ", check=" . $getx['check'], 2); if ($fromsite != '' && is_numeric($fromsite) && $fromsite > 0) { $siteinfo = DBSiteInfo($_SESSION["usertable"]["contestnumber"], $fromsite); $scores = explode(",", $siteinfo['siteglobalscore']); if (count($scores) == 0 || count($scores) == 1 && !is_numeric($scores[0])) { $scores = array($fromsite); } $judges = explode(",", $siteinfo['sitejudging']); if (count($judges) == 0 || count($judges) == 1 && !is_numeric($judges[0])) { $judges = array($fromsite); } $scores = array_unique(array_merge($scores, $judges)); if (in_array(0, $scores)) { $scores = null; } $tasks = explode(",", $siteinfo['sitetasking']);
function DBNewBkp($contest, $site, $user, $filename, $filepath, $size) { $c = DBConnect(); DBExec($c, "begin work", "DBNewBkp(transaction)"); DBExec($c, "lock table bkptable"); $sql = "select count(*) as n from " . "bkptable where sitenumber={$site} and contestnumber={$contest} and usernumber={$user} and bkpstatus='active'"; $r = DBExec($c, $sql, "DBNewBkp(get bkp of user)"); if (DBnlines($r) != 1) { DBExec($c, "rollback work", "DBNewBkp(rollback-toomanyerror)"); LOGError("Error in bkp table. SQL=(" . $sql . ")"); MSGError("Error in bkp table."); exit; } $a = DBRow($r, 0); if ($a['n'] > 100) { DBExec($c, "rollback work", "DBNewBkp(rollback-toomany)"); LOGError("Too many bkps from user={$user}, site={$site}, contest={$contest}.", 2); MSGError("Too many bkp files. Try remove some of them before uploading another."); return false; } $sql = "select max(bkpnumber) as nextbkp from " . "bkptable where sitenumber={$site} and contestnumber={$contest}"; $r = DBExec($c, $sql, "DBNewBkp(get bkp for update)"); if (DBnlines($r) != 1) { DBExec($c, "rollback work", "DBNewBkp(rollback-max)"); LOGError("Error in bkp table. SQL=(" . $sql . ")"); MSGError("Error in bkp table."); exit; } $a = DBRow($r, 0); $t = time(); $n = $a["nextbkp"] + 1; if (($oid = DB_lo_import($c, $filepath)) === false) { DBExec($c, "rollback work", "DBNewBkp(rollback-import)"); LOGError("Unable to create a large object for file {$filepath}."); MSGError("problem importing bkp to database. Contact an admin now!"); exit; } DBExec($c, "INSERT INTO bkptable (contestnumber, sitenumber, bkpnumber, usernumber, bkpdate, bkpfilename, bkpdata, bkpstatus, bkpsize) " . "VALUES ({$contest}, {$site}, {$n}, {$user}, {$t}, '{$filename}', {$oid}, 'active', {$size})", "DBNewBkp(insert bkp)"); DBExec($c, "commit work", "DBNewBkp(commit)"); LOGLevel("User {$user} submitted a bkp (#{$n}) on site #{$site} " . "(filename={$filename}, contest={$contest}).", 2); /* // isso gera problemas de portabilidade e de seguranca (quando outros usuarios tambem tem shell // no servidor e podem construir paginas web. Eles podem usar essas paginas para acessar esses arquivos, // pois os mesmos ficaram com dono apache/www-data/etc) umask(0077); @mkdir("/tmp/boca"); if (!move_uploaded_file ($filepath, "/tmp/boca/contest${contest}.site${site}.run${n}.user${user}.problem${problem}.time${t}.${filename}")) LOGLevel("Run not saved as file (run=$n,site=$site,contest=$contest", 1); */ }
function DBNewAnswer($contest, $param, $c = null) { if (isset($param["action"]) && $param["action"] == "delete") { return DBDeleteAnswer($contestnumber, $param, $c); } $ac = array('number', 'name', 'yes'); $type['number'] = 1; foreach ($ac as $key) { if (!isset($param[$key])) { MSGError("DBNewAnswer param error: {$key} is not set"); return false; } ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewAnswer param error: {$key} is not numeric"); return false; } } $t = time(); $updatetime = $t; if (isset($param['updatetime']) && is_numeric($param["updatetime"])) { $updatetime = $param["updatetime"]; } if ($yes != "t") { $y = "f"; } else { $y = "t"; } $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewAnswer(transaction)"); } $r = DBExec($c, "select * from answertable as a where a.contestnumber={$contest} and a.answernumber={$number} for update", "DBNewAnswer(get answer)"); $n = DBnlines($r); $ret = 1; if ($n == 0) { $ret = 2; DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, updatetime) values " . "({$contest}, {$number}, '{$name}', '{$y}', {$t})", "DBNewAnswer(insert answer)"); if ($cw) { DBExec($c, "commit work", "DBNewAnswer(commit)"); } LOGLevel("Answer {$number} inserted (contest={$contest},user="******"usertable"]["username"] . "/" . $_SESSION["usertable"]["usersitenumber"] . ")", 2); } else { $lr = DBRow($r, 0); if ($updatetime > $lr['updatetime']) { $ret = 2; DBExec($c, "update answertable set runanswer='{$name}', yes='{$y}', updatetime=" . $updatetime . " where " . "contestnumber={$contest} and answernumber={$number} and fake='f'", "DBNewAnswer(update answer)"); if ($cw) { DBExec($c, "commit work", "DBNewAnswer(commit)"); } LOGLevel("Answer {$number} updated (contest={$contest},user="******"usertable"]["username"] . "/" . $_SESSION["usertable"]["usersitenumber"] . ")", 2); } else { if ($cw) { DBExec($c, "commit work", "DBNewAnswer(commit)"); } } } return $ret; }