Exemple #1
0
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;
    }
}
Exemple #2
0
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);
    */
}
Exemple #3
0
        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();
}
Exemple #4
0
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;
}
Exemple #5
0
                }
            }
            $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;
Exemple #6
0
        $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>
Exemple #7
0
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;
}
Exemple #8
0
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);
    */
}
Exemple #9
0
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;
}
Exemple #10
0
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;
}
Exemple #11
0
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);
    */
}
Exemple #12
0
}
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";
Exemple #13
0
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);
}