function scoretransfer($putname, $localsite) { $ds = DIRECTORY_SEPARATOR; if ($ds == "") { $ds = "/"; } if (is_readable('/etc/boca.conf')) { $pif = parse_ini_file('/etc/boca.conf'); $bocaproxy = @trim($pif['proxy']); if (substr($bocaproxy, 0, 6) != 'tcp://') { $bocaproxy = 'tcp://' . $bocaproxy; } $bocaproxylogin = @trim($pif['proxylogin']); $bocaproxypass = @trim($pif['proxypassword']); if ($bocaproxylogin != "") { $bocaproxypass = base64_encode($bocaproxylogin . ":" . $bocaproxypass); } } else { $bocaproxy = ""; $bocaproxypass = ""; } $privatedir = $_SESSION['locr'] . $ds . "private"; if (!is_readable($privatedir . $ds . 'remotescores' . $ds . "otherservers")) { return; } $localfile = "score_site" . $localsite . "_" . $localsite . "_x.dat"; $remotesite = @file($privatedir . $ds . 'remotescores' . $ds . "otherservers"); $contest = $_SESSION["usertable"]["contestnumber"]; if ($contest != '' && ($ct = DBContestInfo($contest)) != null) { if (trim($ct['contestmainsiteurl']) != '') { $tmp = explode(' ', $ct['contestmainsiteurl']); if (count($tmp) == 3) { $remotesite[count($remotesite)] = $ct['contestmainsiteurl']; } } } for ($i = 0; $i < count($remotesite); $i++) { $sitedata = explode(' ', $remotesite[$i]); if (count($sitedata) < 3) { continue; } $siteurl = $sitedata[0]; if (strpos($siteurl, '#') !== false) { continue; } LOGError("scoretransfer: found site {$siteurl}"); if (substr($siteurl, 0, 7) != 'http://') { $siteurl = 'http://' . $siteurl; } $urldiv = '/'; if (substr($siteurl, strlen($siteurl) - 1, 1) == '/') { $urldiv = ''; } // LOGError("url=" .$siteurl . $urldiv . "index.php?getsessionid=1"); $sess = @file_get_contents($siteurl . $urldiv . "index.php?getsessionid=1"); // LOGError("sess=$sess pass="******" hash=" . myhash(trim($sitedata[2]))); $user = trim($sitedata[1]); $res = myhash(myhash(trim($sitedata[2])) . $sess); // LOGError("url=" . $siteurl . $urldiv . "index.php?name=${user}&password=${res}&action=scoretransfer"); $opts = array('http' => array('method' => 'GET', 'request_fulluri' => true, 'header' => 'Cookie: PHPSESSID=' . $sess)); if ($bocaproxy != "") { $opts['http']['proxy'] = $bocaproxy; } if ($bocapass != "") { $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocapass; } $context = stream_context_create($opts); $ok = @file_get_contents($siteurl . $urldiv . "index.php?name={$user}&password={$res}&action=scoretransfer", 0, $context); // LOGError("ok=" . $ok); if (substr($ok, strlen($ok) - strlen('SCORETRANSFER OK'), strlen('SCORETRANSFER OK')) == 'SCORETRANSFER OK') { $res = @file_get_contents($siteurl . $urldiv . "scoretable.php?remote=-42", 0, $context); @file_put_contents($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip', $res); if (is_readable($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip')) { $zip = new ZipArchive(); if ($zip->open($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip') === true) { cleardir($privatedir . $ds . 'remotescores' . $ds . 'tmp'); @mkdir($privatedir . $ds . 'remotescores' . $ds . 'tmp'); $zip->extractTo($privatedir . $ds . 'remotescores' . $ds . 'tmp'); foreach (glob($privatedir . $ds . 'remotescores' . $ds . 'tmp' . $ds . '*.dat') as $file) { @chown($file, "www-data"); @chmod($file, 0660); $bn = basename($file); if ($bn == $localfile) { @rename($file, $privatedir . $ds . 'remotescores' . $ds . "score_site" . $localsite . "__y.dat"); } else { @rename($file, $privatedir . $ds . 'remotescores' . $ds . basename($file)); } } $zip->close(); LOGError("scoretransfer: download OK"); } else { LOGError("scoretransfer: download failed (2)"); } cleardir($privatedir . $ds . 'remotescores' . $ds . 'tmp'); @unlink($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip'); } else { LOGError("scoretransfer: download failed (3)"); } } else { LOGError("scoretransfer: download failed (1)"); } if (is_readable($putname)) { $data = @file_get_contents($putname); $data_url = http_build_query(array('data' => $data)); $opts = array('http' => array('method' => 'POST', 'request_fulluri' => true, 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", 'content' => $data_url)); if ($bocaproxy != "") { $opts['http']['proxy'] = $bocaproxy; } if ($bocapass != "") { $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocapass; } $context = stream_context_create($opts); $s = @file_get_contents($siteurl . $urldiv . "site/putfile.php", 0, $context); if (strpos($s, 'SCORE UPLOADED OK') !== false) { LOGError("scoretransfer: upload OK"); } else { LOGError("scoretransfer: upload failed (" . $s . ")"); } } break; } }
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); */ }
echo "<script>window.close();</script></html>"; exit; } ob_end_flush(); // echo "</pre>\n"; DB_lo_close($lo); if ($msg != '') { // echo " <a href=\"#\" onClick=\"window.print()\"><h1>".$_GET["msg"]."</h1></a>"; echo "\n\n\n" . $msg . "\n"; echo $msg . "\n"; echo $msg . "\n"; } DBExec($c, "commit work"); DBClose($c); } else { header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); if (($str = file_get_contents($fname)) === false) { header("Content-type: text/html"); echo "<html><head><title>View Page</title>"; MSGError("Unable to open file (" . basename($fname) . ")"); LOGError("Unable to open file (" . basename($fname) . ")"); echo "<script>window.close();</script></html>"; exit; } header("Content-type: text/plain"); echo decryptData($str, $cf["key"]); ob_end_flush(); }
function DBUpdateContest($param, $c = null) { if (isset($param['contestnumber']) && !isset($param['number'])) { $param['number'] = $param['contestnumber']; } $ac = array('number'); $ac1 = array('updatetime', 'atualizasites', 'scorelevel', 'mainsite', 'localsite', 'mainsiteurl', 'keys', 'unlockkey', 'name', 'active', 'lastmileanswer', 'lastmilescore', 'penalty', 'startdate', 'duration', 'maxfilesize'); $type['number'] = 1; $type['scorelevel'] = 1; $type['startdate'] = 1; $type['updatetime'] = 1; $type['duration'] = 1; $type['penalty'] = 1; $type['maxfilesize'] = 1; $type['active'] = 1; $type['lastmilescore'] = 1; $type['lastmileanswer'] = 1; $type['mainsite'] = 1; $type['localsite'] = 1; foreach ($ac as $key) { if (!isset($param[$key])) { MSGError("DBUpdateContest param error: {$key} is not set"); return false; } ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBUpdateContest param error: {$key} is not numeric"); return false; } } $name = ''; $atualizasites = false; $mainsiteurl = ''; $keys = ''; $unlockkey = ''; $mainsite = -1; $duration = -1; $lastmilescore = -1; $lastmileanswer = -1; $penalty = -1; $maxfilesize = -1; $active = 0; $startdate = -1; $localsite = -1; $updatetime = -1; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBUpdateContest 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", "DBUpdateContest(begin)"); } $a = DBGetRow("select * from contesttable where contestnumber={$number} for update", 0, $c, "DBUpdateContest(get for update)"); if ($a == null) { MSGError("Error updating contest {$number} -- not found"); LOGError("DBUpdateContest contest {$number} not found"); return false; } $ret = 1; if ($active == 1) { $ret = 2; DBExec($c, "update contesttable set contestactive='f'", "DBUpdateContest(deactivate)"); DBExec($c, "update contesttable set contestactive='t' where contestnumber={$number}", "DBUpdateContest(active)"); LOGLevel("User " . $_SESSION["usertable"]["username"] . "/" . $_SESSION["usertable"]["usersitenumber"] . " activated contest {$number}.", 2); } $chd = false; if ($updatetime > $a['updatetime']) { $ret = 2; $sql = "update contesttable set updatetime=" . $updatetime; if ($name != '') { $sql .= ", contestname='{$name}'"; } if ($maxfilesize > 0) { $sql .= ", contestmaxfilesize={$maxfilesize}"; } if ($penalty > 0) { $sql .= ", contestpenalty={$penalty}"; } if ($lastmileanswer > 0) { $sql .= ", contestlastmileanswer={$lastmileanswer}"; } if ($lastmilescore > 0) { $sql .= ", contestlastmilescore={$lastmilescore}"; } if ($startdate > 0) { $sql .= ", conteststartdate={$startdate}"; } if ($duration > 0) { $sql .= ", contestduration={$duration}"; } if ($mainsite > 0) { $sql .= ", contestmainsite={$mainsite}"; } if ($mainsiteurl != '') { $sql .= ", contestmainsiteurl='{$mainsiteurl}'"; } if ($unlockkey != '') { $sql .= ", contestunlockkey='{$unlockkey}'"; } if ($keys != '') { $sql .= ", contestkeys='{$keys}'"; } if ($localsite > 0) { $sql .= ", contestlocalsite={$localsite}"; } $sql .= " where contestnumber={$number}"; DBExec($c, $sql, "DBUpdateContest(update contest)"); if ($localsite > 0) { $param['contestnumber'] = $number; $param['sitename'] = 'Local site'; if ($duration > 0) { $param['siteduration'] = $duration; } if (isset($param['scorelevel'])) { $param['sitescorelevel'] = $scorelevel; } if ($lastmileanswer > 0) { $param['sitelastmileanswer'] = $lastmileanswer; } if ($lastmilescore > 0) { $param['sitelastmilescore'] = $lastmilescore; } $param['number'] = $localsite; DBNewSite($number, $c, $param); } if ($mainsite > 0) { $param['contestnumber'] = $number; $param['sitename'] = 'Main site'; if ($duration > 0) { $param['siteduration'] = $duration; } if (isset($param['scorelevel'])) { $param['sitescorelevel'] = $scorelevel; } if ($lastmileanswer > 0) { $param['sitelastmileanswer'] = $lastmileanswer; } if ($lastmilescore > 0) { $param['sitelastmilescore'] = $lastmilescore; } $param['number'] = $mainsite; DBNewSite($number, $c, $param); } if ($atualizasites) { $s = DBAllSiteInfo($number, $c); for ($i = 0; $i < count($s); $i++) { $param = $s[$i]; $param['contestnumber'] = $number; if ($duration > 0) { $param['siteduration'] = $duration; } if (isset($param['scorelevel'])) { $param['sitescorelevel'] = $scorelevel; } if ($lastmileanswer > 0) { $param['sitelastmileanswer'] = $lastmileanswer; } if ($lastmilescore > 0) { $param['sitelastmilescore'] = $lastmilescore; } unset($param['updatetime']); DBUpdateSite($param, $c); if ($startdate > 0) { $p = array(); $p['contest'] = $number; $p['site'] = $s[$i]["sitenumber"]; $p['start'] = $startdate; DBRenewSiteTime($p, $c); } } } $chd = true; } if ($cw) { DBExec($c, "commit work", "DBUpdateContest(commit)"); } if ($chd) { LOGLevel("User " . $_SESSION["usertable"]["username"] . "/" . $_SESSION["usertable"]["usersitenumber"] . " changed the contest {$number} settings.", 2); } return $ret; }
} } $strtmp .= " <td nowrap>" . $score[$e]["totalcount"] . " (" . $score[$e]["totaltime"] . ")</td>\n"; $strtmp .= " </tr>\n"; $n++; } } $strtmp .= "</table>"; if ($n == 0) { $strtmp .= "<br><center><b><font color=\"#ff0000\">SCOREBOARD IS EMPTY</font></b></center>"; } else { if (!$des) { if ($level > 0) { $strtmp .= "<br><font color=\"#ff0000\">P.S. Problem names are hidden.</font>"; } else { $strtmp .= "<br><font color=\"#ff0000\">P.S. Problem data are hidden.</font>"; } } } $conf = globalconf(); $strtmp = "<!-- " . time() . " --> <?php exit; ?>\n" . encryptData($strtmp, $conf["key"], false); if (file_put_contents($scoretmp, $strtmp, LOCK_EX) === FALSE) { if ($_SESSION["usertable"]["usertype"] == 'admin') { MSGError("Cannot write to the score cache file -- performance might be compromised"); } LOGError("Cannot write to the " . $_SESSION["usertable"]["usertype"] . "-score cache file -- performance might be compromised"); } $conf = globalconf(); $strtmp = decryptData(substr($strtmp, strpos($strtmp, "\n")), $conf["key"]); } echo $strtmp;
$prob = DBGetProblems($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usertype"] == 'judge'); $strtmp .= "<option selected value=\"-1\"> -- </option>\n"; for ($i = 0; $i < count($prob); $i++) { $strtmp .= "<option value=\"" . $prob[$i]["number"] . "\">" . $prob[$i]["problem"] . "</option>\n"; } $strtmp .= "\t </select>\n" . " </td>\n" . " </tr>\n" . " <tr> \n" . " <td width=\"25%\" align=right>Language:</td>\n" . " <td width=\"75%\"> \n" . " <select name=\"language\" onclick=\"Arquivo()\">\n"; $lang = DBGetLanguages($_SESSION["usertable"]["contestnumber"]); $strtmp .= "<option selected value=\"-1\"> -- </option>\n"; for ($i = 0; $i < count($lang); $i++) { $strtmp .= "<option value=\"" . $lang[$i]["number"] . "\">" . $lang[$i]["name"] . "</option>\n"; } $strtmp .= "\t </select>\n" . " </td>\n" . " </tr>\n" . " <tr> \n" . " <td width=\"25%\" align=right>Source code:</td>\n" . " <td width=\"75%\">\n" . "\t <input type=\"file\" name=\"sourcefile\" size=\"40\" onclick=\"Arquivo()\">\n" . " </td>\n" . " </tr>\n" . " </table>\n" . " </center>\n" . " <script language=\"javascript\">\n" . " function conf() {\n" . " if (document.form1.problem.value != '-1' && document.form1.language.value != '-1') {\n" . " if (confirm(\"Confirm submission?\")) {\n" . " document.form1.confirmation.value='confirm';\n" . " }\n" . " } else {\n" . " alert('Invalid problem and/or language');\n" . " }\n" . " }\n" . " </script>\n" . " <center>\n" . " <input type=\"submit\" name=\"Submit\" value=\"Send\" onClick=\"conf()\">\n" . " <input type=\"reset\" name=\"Submit2\" value=\"Clear\">\n" . " </center>\n" . "</form>\n"; } $conf = globalconf(); $strtmp1 = "<!-- " . time() . " --> <?php exit; ?>\t" . encryptData($strcolors, $conf["key"], false) . "\n" . encryptData($strtmp, $conf["key"], false); $randnum = session_id() . "_" . rand(); if (file_put_contents($runtmp . "_" . $randnum, $strtmp1, LOCK_EX) === FALSE) { if (!isset($_SESSION['writewarn'])) { LOGError("Cannot write to the user-run cache file {$runtmp} -- performance might be compromised"); $_SESSION['writewarn'] = true; } } @rename($runtmp . "_" . $randnum, $runtmp); } echo $strtmp; ?> </body> </html>
function DBGetRow($sql, $i, $c = null, $txt = '') { if ($txt == '') { $txt = 'unknown at ' . getFunctionName(); } if ($c == null) { $c = DBConnect(); } $r = DBExec($c, $sql, $txt); if (DBnlines($r) < $i + 1) { return null; } $a = DBRow($r, $i); if (!$a) { LOGError("Unable to get row {$i} from a query ({$txt}). SQL=(" . $sql . ")"); MSGError("Unable to get row from query ({$txt})."); exit; } return $a; }
function DBNewClar($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['clarnumber'])) { $param['clarnumber'] = $param['number']; } $ac = array('contest', 'site', 'user', 'problem', 'question'); $ac1 = array('clarnumber', 'clardate', 'clardatediff', 'clardatediffans', 'claranswer', 'clarstatus', 'clarjudge', 'clarjudgesite', 'updatetime'); $type['contest'] = 1; $type['problem'] = 1; $type['updatetime'] = 1; $type['site'] = 1; $type['user'] = 1; $type['clarnumber'] = 1; $type['clardatediffans'] = 1; $type['clardatediff'] = 1; $type['clardate'] = 1; $type['clarjudge'] = 1; $type['clarjudgesite'] = 1; foreach ($ac as $key) { if (!isset($param[$key]) || $param[$key] == "") { MSGError("DBNewClar param error: {$key} not found"); return false; } if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewClar param error: {$key} is not numeric"); return false; } ${$key} = sanitizeText($param[$key]); } $t = time(); $clarnumber = -1; $updatetime = -1; $clardatediff = -1; $clardate = $t; $claranswer = ''; $clardatediffans = 999999999; $clarjudge = 'NULL'; $clarjudgesite = 'NULL'; $clarstatus = 'openclar'; foreach ($ac1 as $key) { if (isset($param[$key])) { ${$key} = sanitizeText($param[$key]); if (isset($type[$key]) && !is_numeric($param[$key])) { MSGError("DBNewClar 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", "DBNewClar(transaction)"); } $insert = true; if ($clarnumber < 0) { $sql = "select sitenextclar as nextclar from sitetable where sitenumber={$site} and contestnumber={$contest} for update"; $r = DBExec($c, $sql, "DBNewClar(get site for update)"); if (DBnlines($r) != 1) { DBExec($c, "rollback work", "DBNewClar(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. Contact an admin now!"); exit; } $a = DBRow($r, 0); $n = $a["nextclar"] + 1; $clarnumber = $n; } else { $sql = "select * from clartable as t where t.contestnumber={$contest} and " . "t.clarsitenumber={$site} and t.clarnumber={$clarnumber}"; $r = DBExec($c, $sql . " for update", "DBNewClar(get clar for update)"); $n = DBnlines($r); if ($n > 0) { $insert = false; $lr = DBRow($r, 0); $t = $lr['updatetime']; } $n = $clarnumber; } DBExec($c, "update sitetable set sitenextclar={$clarnumber}, updatetime=" . $t . " where sitenumber={$site} and contestnumber={$contest} and sitenextclar<{$clarnumber}", "DBNewClar(update site)"); if ($clardatediff < 0) { $b = DBSiteInfo($contest, $site, $c); $dif = $b["currenttime"]; $clardatediff = $dif; if ($dif < 0) { DBExec($c, "rollback work", "DBNewClar(rollback-started)"); LOGError("Tried to submit a clarification but the contest is not started. SQL=(" . $sql . ")"); MSGError("The contest is not started yet!"); return false; } if (!$b["siterunning"]) { DBExec($c, "rollback work", "DBNewClar(rollback-over)"); LOGError("Tried to submit a clarification but the contest is over. SQL=(" . $sql . ")"); MSGError("The contest is over!"); return false; } } else { $dif = $clardatediff; } $ret = 1; if ($insert) { DBExec($c, "INSERT INTO clartable (contestnumber, clarsitenumber, clarnumber, usernumber, clardate, " . "clardatediff, clardatediffans, clarproblem, clardata, claranswer, clarjudge, clarjudgesite, clarstatus, updatetime) VALUES " . "({$contest}, {$site}, {$n}, {$user}, {$clardate}, {$clardatediff}, {$clardatediffans}, {$problem}, '{$question}', " . "'{$claranswer}', {$clarjudge}, {$clarjudgesite}, '{$clarstatus}', {$updatetime})", "DBNewClar(insert clar)"); if ($cw) { DBExec($c, "commit work", "DBNewClar(commit-insert)"); } LOGLevel("User {$user} submitted a clarification (#{$n}) on site #{$site} " . "(problem={$problem}, contest={$contest}).", 2); $ret = 2; } else { if ($updatetime > $t) { $ret = 2; DBExec($c, "update clartable set clardate={$clardate}, clardatediff={$clardatediff}, " . "clardatediffans={$clardatediffans}, claranswer='{$claranswer}', clarstatus='{$clarstatus}', " . "clarjudge={$clarjudge}, clarjudgesite={$clarjudgesite}, updatetime={$updatetime}, clardata='{$question}', clarproblem={$problem} " . "where clarnumber={$clarnumber} and contestnumber={$contest} and clarsitenumber={$site}", "DBNewClar(update clar)"); } if ($cw) { DBExec($c, "commit work", "DBNewClar(commit-update)"); } } return $ret; /* // isso gera problemas de portabilidade e de seguranca se os demais usuarios tiverem shell no servidor // por outro lado, garante que as coisas estao guardadas em arquivos fora do banco, caso haja outros problemas. umask(0077); @mkdir("/tmp/boca"); $fp = fopen("/tmp/boca/contest${contest}.site${site}.clar${n}.user${user}.problem${problem}.time${t}", "w"); if ($fp) { fwrite($fp, $question); fclose($fp); } else LOGLevel("Clarification not saved as file (clar=$n,site=$site,contest=$contest)", 1); */ }
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; }
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); */ }
} cleardir($webcastdir); @mkdir($webcastdir); if (is_writable($webcastdir)) { file_put_contents($webcastdir . $ds . 'runs', $runfile); file_put_contents($webcastdir . $ds . 'contest', $contestfile); file_put_contents($webcastdir . $ds . 'version', $versionfile); file_put_contents($webcastdir . $ds . 'time', $timefile); if (@create_zip($webcastparentdir, array('webcast'), $webcastdir . ".tmp") != 1) { LOGError("Cannot create score webcast.tmp file"); MSGError("Cannot create score webcast.tmp file"); } else { $cf = globalconf(); file_put_contents($webcastdir . ".tmp", encryptData(file_get_contents($webcastdir . ".tmp"), $cf["key"], false)); @rename($webcastdir . ".tmp", $webcastdir . '.zip'); } echo "<br><br><br><center>"; echo "<a href=\"{$locr}/filedownload.php?" . filedownload(-1, $webcastdir . '.zip') . "\">CLICK TO DOWNLOAD</a>"; echo "</center>"; } else { LOGError('Error creating the folder for the ZIP file: ' . $webcastdir); MSGError('Error creating the folder for the ZIP file: ' . $webcastdir); ForceLoad("../index.php"); } echo "<br><br><br>\n"; echo "<br><br><br>\n"; echo "<br><br><br>\n"; echo "<br><br><br>\n"; echo "<br><br><br>\n"; echo "<br><br><br>\n"; include "{$locr}/footnote.php";
function DBScoreSite($contest, $site, $verifylastmile, $hor = -1, $data = null) { if (($blocal = DBSiteInfo($contest, $_SESSION["usertable"]["usersitenumber"])) == null) { exit; } if (($b = DBSiteInfo($contest, $site, null, false)) == null) { $b = $blocal; } if (($ct = DBContestInfo($contest)) == null) { exit; } $t = time(); $ta = $blocal["currenttime"]; if ($hor >= 0) { $ta = $hor; } if ($verifylastmile) { $tf = $b["sitelastmilescore"]; } else { $tf = $b["siteduration"]; } if ($data != null && is_numeric($data)) { if ($data < $ta) { $ta = $data; } $data = null; } $data0 = array(); if ($data == null) { $c = DBConnect(); $resp = array(); $r = DBExec($c, "select * from usertable where contestnumber={$contest} and usersitenumber={$site} and " . "usertype='team' and userlastlogin is not null and userenabled='t'", "DBScoreSite(get users)"); $n = DBnlines($r); for ($i = 0; $i < $n; $i++) { $a = DBRow($r, $i); $resp[$a["usernumber"]]["user"] = $a["usernumber"]; $resp[$a["usernumber"]]["site"] = $a["usersitenumber"]; $resp[$a["usernumber"]]["username"] = $a["username"]; $resp[$a["usernumber"]]["usertype"] = $a["usertype"]; $resp[$a["usernumber"]]["userfullname"] = $a["userfullname"]; $resp[$a["usernumber"]]["totaltime"] = 0; $resp[$a["usernumber"]]["totalcount"] = 0; $resp[$a["usernumber"]]["problem"] = array(); } $r = DBExec($c, "select r.usernumber as user, p.problemname as problemname, r.runproblem as problem, " . "p.problemcolor as color, p.problemcolorname as colorname, " . "r.rundatediff as time, r.rundatediffans as anstime, a.yes as yes, r.runanswer as answer from " . "runtable as r, answertable as a, problemtable as p where r.runanswer=a.answernumber and " . "a.contestnumber={$contest} and p.problemnumber=r.runproblem and p.contestnumber={$contest} and " . "r.contestnumber={$contest} and r.runsitenumber={$site} and (r.runstatus ~ 'judged' or r.runstatus ~ 'judged+') and " . "r.rundatediff>=0 and r.rundatediff<={$tf} and r.rundatediffans<={$ta} " . "order by r.usernumber, r.runproblem, r.rundatediff", "DBScoreSite(get runs)"); $n = DBnlines($r); $a = array(); for ($i = 0; $i < $n; $i++) { $a[$i] = DBRow($r, $i); } $data0['n'] = $n; $data0['resp'] = $resp; $data0['a'] = $a; $data0['site'] = $site; } else { $resp = $data['resp']; $n = $data['n']; $a = $data['a']; } $i = 0; while ($i < $n) { if ($a[$i]["anstime"] > $ta) { $i++; continue; } $user = $a[$i]["user"]; $problem = $a[$i]["problem"]; $time = 0; $k = 0; if (!isset($resp[$user])) { $i++; continue; } $resp[$user]["user"] = $user; $resp[$user]["site"] = $site; $resp[$user]["problem"][$problem]["name"] = $a[$i]["problemname"]; $resp[$user]["problem"][$problem]["color"] = $a[$i]["color"]; $resp[$user]["problem"][$problem]["colorname"] = $a[$i]["colorname"]; $resp[$user]["problem"][$problem]["solved"] = false; $resp[$user]["problem"][$problem]["judging"] = false; $resp[$user]["problem"][$problem]["time"] = 0; $resp[$user]["problem"][$problem]["penalty"] = 0; $resp[$user]["problem"][$problem]["count"] = 0; while ($i < $n && $a[$i]["anstime"] <= $ta && $a[$i]["user"] == $user && $a[$i]["problem"] == $problem && $a[$i]["yes"] != 't') { $time += (int) ($ct["contestpenalty"] / 60); $k++; $i++; } $resp[$user]["problem"][$problem]["count"] = $k; if ($i >= $n) { break; } if ($a[$i]["anstime"] <= $ta && $a[$i]["user"] == $user && $a[$i]["problem"] == $problem && $a[$i]["yes"] == 't') { $timet = (int) ($a[$i]["time"] / 60); if (!isset($resp[$user]["first"]) || $timet < $resp[$user]["first"]) { $resp[$user]["first"] = $timet; } $time += $timet; $resp[$user]["problem"][$problem]["time"] = $timet; $resp[$user]["problem"][$problem]["penalty"] = $time; $resp[$user]["problem"][$problem]["solved"] = true; $resp[$user]["problem"][$problem]["count"]++; $resp[$user]["totaltime"] += $time; $resp[$user]["totalcount"]++; } while ($i < $n && $a[$i]["user"] == $user && $a[$i]["problem"] == $problem) { $i++; } } if ($data == null) { $aa = DBRecentNews($contest, $site, $verifylastmile, $ta); $data0['aa'] = $aa; } else { $aa = $data['aa']; } for ($i = 0; $i < count($aa); $i++) { if ($aa[$i]["fut"] == 't') { $resp[$aa[$i]["usernumber"]]["problem"][$aa[$i]["problemnumber"]]["judging"] = true; } } if (($result = ordena($resp)) === false) { LOGError("Error while sorting scores (contest={$contest}, site={$site})."); MSGError("Error while sorting scores. Contact an admin now!"); } return array($result, $data0); }