aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCassio de Campos <cassiopc@gmail.com>2017-10-24 14:58:09 +0000
committerCassio de Campos <cassiopc@gmail.com>2017-10-24 14:58:09 +0000
commitaaee4537fc9201e9d6a242583d82fd1bea97928c (patch)
treeff57c7f621382492910292b490d9c67e6f99e739
parent006561454093d44a789463d531cfbc640c519867 (diff)
parent2c862aa5c6ac4afe4005582fc836b13775a99eac (diff)
downloadboca-aaee4537fc9201e9d6a242583d82fd1bea97928c.tar.gz
boca-aaee4537fc9201e9d6a242583d82fd1bea97928c.zip
Merge branch 'devel'
-rw-r--r--src/Css.php18
-rw-r--r--src/admin/contest.php8
-rw-r--r--src/admin/header.php6
-rw-r--r--src/admin/misc.php199
-rw-r--r--src/admin/site.php30
-rw-r--r--src/db.php4
-rw-r--r--src/fclar.php15
-rw-r--r--src/fcontest.php6
-rw-r--r--src/fextdata.php104
-rw-r--r--src/frun.php54
-rw-r--r--src/ftask.php11
-rwxr-xr-xsrc/globals.php129
-rw-r--r--src/logexternal.php2
-rwxr-xr-xsrc/private/autojudging.php25
-rw-r--r--src/private/conf.php3
-rw-r--r--src/private/score.sep42
-rw-r--r--src/private/score.sep.sample23
-rw-r--r--src/scoretable.php30
-rw-r--r--src/version2
-rw-r--r--src/versionnum.php2
20 files changed, 573 insertions, 140 deletions
diff --git a/src/Css.php b/src/Css.php
index 50680b3..94d774a 100644
--- a/src/Css.php
+++ b/src/Css.php
@@ -21,6 +21,24 @@ $corfrente = "#000000";
$corfundo2 = "#dfdfdf";
$cormenu = "#dfdfdf";
?>
+div#popupnew {
+position:absolute;
+left:50%;
+top:17%;
+margin-left:-202px;
+font-family:'Raleway',sans-serif
+}
+div#normal {
+width:100%;
+height:100%;
+opacity:.95;
+top:0;
+left:0;
+display:none;
+position:fixed;
+background-color:#313131;
+overflow:auto
+}
DIV.menu {background-color:<?php echo $corfundo?>; layer-background-color:<?php echo $corfundo?>}
DIV.menudown {background-color:<?php echo $cormenu?>; border-bottom:1px solid white; border-right:1px solid white;border-top:2px solid #555555;border-left:1px solid #555555}
DIV.fname {background-color:<?php echo $corfundo2?>; layer-background-color:<?php echo $corfundo2?>; position:absolute; visibility:hidden; border:0; left:0px; top:0px; height:19px; z-index:100;}
diff --git a/src/admin/contest.php b/src/admin/contest.php
index d55361e..58df217 100644
--- a/src/admin/contest.php
+++ b/src/admin/contest.php
@@ -22,7 +22,9 @@ $contest=$_SESSION["usertable"]["contestnumber"];
if(($ct = DBContestInfo($contest)) == null)
ForceLoad("$loc/index.php");
-if ($ct["contestlocalsite"]==$ct["contestmainsite"]) $main=true; else $main=false;
+$localsite=$ct["contestlocalsite"];
+$mainsite=$ct["contestmainsite"];
+if ($localsite == $mainsite) $main=true; else $main=false;
if (isset($_POST["Submit3"]) && isset($_POST["penalty"]) && is_numeric($_POST["penalty"]) &&
isset($_POST["maxfilesize"]) && isset($_POST["mainsite"]) && isset($_POST["name"]) &&
@@ -106,6 +108,10 @@ if (isset($_POST["Submit3"]) && isset($_POST["penalty"]) && is_numeric($_POST["p
DBGetFullProblemData($_SESSION["usertable"]["contestnumber"],true);
}
}
+ if(($ct = DBContestInfo($contest)) == null)
+ ForceLoad("$loc/index.php");
+ if ($ct["contestlocalsite"]!=$localsite || $mainsite!=$ct["contestmainsite"])
+ ForceLoad("$loc/index.php");
ForceLoad("contest.php");
}
?>
diff --git a/src/admin/header.php b/src/admin/header.php
index 1677469..6002b18 100644
--- a/src/admin/header.php
+++ b/src/admin/header.php
@@ -15,7 +15,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
-// Last modified 21/jul/2012 by cassio@ime.usp.br
+// Last modified 19/oct/2017 by cassio@ime.usp.br
ob_start();
header ("Expires: " . gmdate("D, d M Y H:i:s") . " GMT");
@@ -53,7 +53,7 @@ if($_SESSION["usertable"]["usertype"] != "admin") {
}
if(!isset($_POST['noflush'])) {
- echo "</head><body><table border=1 width=\"100%\">\n";
+ echo "</head><body id=\"body\"><table border=1 width=\"100%\">\n";
echo "<tr><td nowrap bgcolor=\"eeee00\" align=center>";
echo "<img src=\"../images/smallballoontransp.png\" alt=\"\">";
echo "<font color=\"#000000\">BOCA</font>";
@@ -71,7 +71,7 @@ if(!isset($_POST['noflush'])) {
echo " <td align=center><a class=menu style=\"font-weight:bold\" href=problem.php>Problems</a></td>\n";
echo " <td align=center><a class=menu style=\"font-weight:bold\" href=language.php>Languages</a></td>\n";
echo " <td align=center><a class=menu style=\"font-weight:bold\" href=answer.php>Answers</a></td>\n";
- // echo " <td align=center><a class=menu style=\"font-weight:bold\" href=export.php>Export</a></td>\n";
+ echo " <td align=center><a class=menu style=\"font-weight:bold\" href=misc.php>Misc</a></td>\n";
//echo " </tr></table><hr><table border=0 width=\"100%\" align=center><tr>\n";
echo " </tr><tr>\n";
echo " <td align=center><a class=menu style=\"font-weight:bold\" href=task.php>Tasks</a></td>\n";
diff --git a/src/admin/misc.php b/src/admin/misc.php
new file mode 100644
index 0000000..7a4bd89
--- /dev/null
+++ b/src/admin/misc.php
@@ -0,0 +1,199 @@
+<?php
+////////////////////////////////////////////////////////////////////////////////
+//BOCA Online Contest Administrator
+// Copyright (C) 2003-2013 by BOCA System (bocasystem@gmail.com)
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+////////////////////////////////////////////////////////////////////////////////
+//Last updated 16/oct/2017 by cassio@ime.usp.br
+require 'header.php';
+?>
+<br>
+<form name="form1" enctype="multipart/form-data" method="post" action="misc.php">
+ <input type=hidden name="confirmation" value="noconfirm" />
+ <script language="javascript" type="text/javascript">
+ function conf() {
+ if (confirm("Confirm?")) {
+ document.form1.confirmation.value='confirm';
+ }
+ }
+ function conf2() {
+ if (confirm("Confirm updating BOCA?")) {
+ if (confirm("This operation may perform considerable changes to your BOCA system. Confirm?")) {
+ document.form1.confirmation.value='confirm';
+ }
+ }
+ }
+ </script>
+ <center>
+ <input type="submit" name="Submit1" value="Transfer" onClick="conf()"> &nbsp;
+ <input type="submit" name="Submit2" value="Transfer all" onClick="conf()"> &nbsp;
+ <input type="submit" name="Submit3" value="Transfer scores"> &nbsp;
+ <input type="submit" name="Submit4" value="Clear cache" onClick="conf()"> &nbsp;
+ <input type="submit" name="Submit5" value="Full clear" onClick="conf2()"> &nbsp;
+ <input type="submit" name="Submit6" value="Update BOCA" onClick="conf2()"> &nbsp;
+ <input type="submit" name="Submit7" value="Revert Update" onClick="conf2()">
+ </center>
+</form>
+<pre>
+OPERATION LOG DISPLAYS BELOW:
+
+<?php
+if(isset($_POST['confirmation']) && $_POST['confirmation'] == 'confirm') {
+$ds = DIRECTORY_SEPARATOR;
+if($ds=="") $ds = "/";
+$dotransfer=false;
+$doscore=false;
+$dotransferall=false;
+if (isset($_POST["Submit1"]) && $_POST["Submit1"] == "Transfer") {
+ $dotransfer=true;
+ $doscore=true;
+}
+if (isset($_POST["Submit2"]) && $_POST["Submit2"] == "Transfer all") {
+ $dotransfer=true;
+ $dotransferall=true;
+ $doscore=true;
+}
+if (isset($_POST["Submit3"]) && $_POST["Submit3"] == "Transfer scores") {
+ $doscore=true;
+}
+if (isset($_POST["Submit4"]) && $_POST["Submit4"] == "Clear cache") {
+ if(fixbocadir(dirname(__DIR__)))
+ echo "Done\n";
+ else echo "Error (likely permission/ownership issues)\n";
+}
+if (isset($_POST["Submit5"]) && $_POST["Submit5"] == "Full clear") {
+ if(fixbocadir(dirname(__DIR__),true))
+ echo "Done\n";
+ else echo "Error (likely permission/ownership issues)\n";
+}
+if (isset($_POST["Submit6"]) && $_POST["Submit6"] == "Update BOCA") {
+ $dir = dirname(__DIR__);
+ if(!is_readable($dir . $ds . "private" . $ds . "updateboca.log")) @file_put_contents($dir . $ds . "private" . $ds . "updateboca.log", "");
+ if(is_writable($dir . $ds . "private" . $ds . "updateboca.log")) {
+ require('..' . $ds . 'versionnum.php');
+ $curv = explode('.',$BOCAVERSION);
+ fixbocadir($dir);
+ $tmpfname = $dir . $ds . "private" . $ds . 'newboca.zip';
+ if(($str = @file_get_contents('http://www.bombonera.org/updateboca.zip')) !== false) {
+ @file_put_contents($tmpfname, $str);
+ $t = mytime();
+ $zip = new ZipArchive;
+ if ($zip->open($tmpfname) === true) {
+ $zip->extractTo($dir . $ds . "private" . $ds . "newboca." . $t);
+ $zip->close();
+ require($dir . $ds . "private" . $ds . "newboca." . $t . $ds . 'versionnum.php');
+ $newv = explode('.',$BOCAVERSION);
+ if($curv[0] != $newv[0] || $curv[1] != $newv[1])
+ echo "Cannot updated because of major version difference\n";
+ else {
+ echo "Updating\n";
+ $q = updatebocafile($dir, $dir . $ds . "private" . $ds . "newboca." . $t, $t);
+ echo $q . " files updated to " . $BOCAVERSION . "\n\n";
+ $str = @file_get_contents($dir . $ds . "private" . $ds . "updateboca.log");
+ @file_put_contents($dir . $ds . "private" . $ds . "updateboca.log", $str . $t . "\n");
+ }
+ } else {
+ echo "Downloaded file corrupted\n";
+ }
+ @unlink($tmpfname);
+ } else echo "Download error\n";
+ } else {
+ echo "Cannot update log file\n";
+ }
+}
+if (isset($_POST["Submit7"]) && $_POST["Submit7"] == "Revert Update") {
+ $dir = dirname(__DIR__);
+ if(!is_readable($dir . $ds . "private" . $ds . "updateboca.log")) @file_put_contents($dir . $ds . "private" . $ds . "updateboca.log", "");
+ if(is_writable($dir . $ds . "private" . $ds . "updateboca.log")) {
+ $str = @file($dir . $ds . "private" . $ds . "updateboca.log");
+ if(count($str) >= 1) {
+ $t = trim($str[count($str)-1]);
+ unset($str[count($str)-1]);
+ $str = implode("\n", $str);
+ fixbocadir($dir);
+ if($t != '') {
+ echo "Reverting last update\n";
+ $q = revertupdatebocafile($dir, $t);
+ echo $q . " files reverted properly\n";
+ fixbocadir($dir);
+ }
+ @file_put_contents($dir . $ds . "private" . $ds . "updateboca.log", $str);
+ } else {
+ echo "No updates to revert\n";
+ }
+ } else {
+ echo "Cannot update log file\n";
+ }
+}
+if($dotransfer || $doscore || $dotransferall) {
+ $privatedir = $_SESSION['locr'] . $ds . "private";
+ $remotedir = $_SESSION['locr'] . $ds . "private" . $ds . "remotescores";
+ $destination = $remotedir . $ds ."scores.zip";
+ if(is_writable($remotedir)) {
+ if(($fp = @fopen($destination . ".lck",'x')) !== false) {
+ if($doscore) {
+ if (($s = DBSiteInfo($_SESSION["usertable"]["contestnumber"],$_SESSION["usertable"]["usersitenumber"])) == null)
+ ForceLoad("index.php");
+ echo "Building scores\n";
+ $level=$s["sitescorelevel"];
+ $data0 = array();
+ if($level>0) {
+ list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"],
+ $_SESSION["usertable"]["usersitenumber"], 0, -1);
+ }
+ $ct=DBGetActiveContest();
+ $localsite=$ct['contestlocalsite'];
+ $fname = $privatedir . $ds . "score_localsite_" . $localsite . "_x"; // . md5($_SERVER['HTTP_HOST']);
+ @file_put_contents($fname . ".tmp",base64_encode(serialize($data0)));
+ @rename($fname . ".tmp",$fname . ".dat");
+
+ $data0 = array();
+ if($level>0) {
+ list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"],
+ $_SESSION["usertable"]["usersitenumber"], 1, -1);
+ }
+ $ct=DBGetActiveContest();
+ $localsite=$ct['contestlocalsite'];
+ $fname = $remotedir . $ds . "score_site" . $localsite . "_" . $localsite . "_x"; // . md5($_SERVER['HTTP_HOST']);
+ @file_put_contents($fname . ".tmp",base64_encode(serialize($data0)));
+ @rename($fname . ".tmp",$fname . ".dat");
+ echo "Transferring scores\n";
+ echo scoretransfer($fname . ".dat", $localsite);
+ echo "Saving scores\n";
+ if(@create_zip($remotedir,glob($remotedir . '/*.dat'),$fname . ".tmp") != 1) {
+ LOGError("Cannot create score zip file");
+ if(@create_zip($remotedir,array(),$fname . ".tmp") == 1)
+ @rename($fname . ".tmp",$destination);
+ } else {
+ @rename($fname . ".tmp",$destination);
+ }
+ @fclose($fp);
+ }
+ if($dotransfer) {
+ echo "Processing other data\n";
+ getMainXML($_SESSION["usertable"]["contestnumber"],10,$dotransferall);
+ }
+ @unlink($destination . ".lck");
+ } else {
+ if(file_exists($destination . ".lck") && filemtime($destination . ".lck") < time() - 120)
+ @unlink($destination . ".lck");
+ echo "Transfers locked by other process - try again soon\n";
+ }
+ }
+}
+}
+?>
+</pre>
+</body>
+</html>
diff --git a/src/admin/site.php b/src/admin/site.php
index 84241f3..dd88d1c 100644
--- a/src/admin/site.php
+++ b/src/admin/site.php
@@ -23,9 +23,21 @@ if(($ct = DBContestInfo($_SESSION["usertable"]["contestnumber"])) == null)
if($ct["contestlocalsite"]==$ct["contestmainsite"]) $main=true; else $main=false;
if ($main) {
+ if(isset($_GET["Number"]) && isset($_GET["Go"]) && is_numeric($_GET["Number"]) && $_GET["Number"]>0) {
+ $param = array();
+ $param['number'] = $_GET["Number"];
+ if(($n = DBNewSite($_SESSION["usertable"]["contestnumber"],null,$param)) === false) {
+ MSGError("Error creating site");
+ $n = 1;
+ }
+ ForceLoad("site.php?site=$n");
+ }
if(isset($_GET["new"]) && $_GET["new"]=="1") {
- $n = DBNewSite($_SESSION["usertable"]["contestnumber"]);
- ForceLoad("site.php?site=$n");
+ if(($n = DBNewSite($_SESSION["usertable"]["contestnumber"])) === false) {
+ MSGError("Error creating site");
+ $n = 1;
+ }
+ ForceLoad("site.php?site=$n");
}
}
if (isset($_GET["site"]) && is_numeric($_GET["site"]))
@@ -282,7 +294,7 @@ if ($main && isset($_FILES["importfile"]) && isset($_POST["Submit"]) && $_POST["
}
}
function newsite() {
- document.location='site.php?new=1';
+ document.getElementById('normal').style.display = "block";
}
function sitech(n) {
if(n==null) {
@@ -599,7 +611,15 @@ if($main) {
</center>
<?php } ?>
</form>
-
-
+<div id="normal">
+<div id="popupnew">
+<form action="site.php" id="formnew" method="get" name="formnew">
+<h2>Choose site number</h2>
+<input id="new" name="Number" placeholder="new" type="text">
+<input type="submit" name="Go" value="Go">
+</form>
+</div>
+</div>
+
</body>
</html>
diff --git a/src/db.php b/src/db.php
index 8f0c735..2f6dd57 100644
--- a/src/db.php
+++ b/src/db.php
@@ -188,8 +188,8 @@ function DBExecNonStop($conn,$sql,$txt='') {
if($txt=='') $txt='unknown at '. getFunctionName();
$result = @DB_pg_exec ($conn, $sql);
if (!$result) {
- LOGLevel("Unable to exec SQL in the database ($txt). " .
- " Error=(" . pg_errormessage($conn) . ")", 2);
+ LOGError("Unable to exec SQL in the database ($txt). " .
+ " Error=(" . pg_errormessage($conn) . ")");
}
return $result;
}
diff --git a/src/fclar.php b/src/fclar.php
index fd99c53..72364e8 100644
--- a/src/fclar.php
+++ b/src/fclar.php
@@ -300,7 +300,7 @@ function DBNewClar($param,$c=null) {
DBExec($c, "update sitetable set sitenextclar=$clarnumber" .
" where sitenumber=$site and contestnumber=$contest and sitenextclar<$clarnumber",
"DBNewClar(update site)");
- $clarnumber = myunique();
+ $clarnumber = myunique($clarnumber);
$clarinc = $clarnumber;
} else {
$sql = "select * from clartable as t where t.contestnumber=$contest and " .
@@ -338,11 +338,14 @@ function DBNewClar($param,$c=null) {
$ret=1;
if($insert) {
if($clarinc >= $clarnumber) {
- while(!DBExecNonStop($c, "INSERT INTO clartable (contestnumber, clarsitenumber, clarnumber, usernumber, clardate, " .
- "clardatediff, clardatediffans, clarproblem, clardata, claranswer, clarjudge, clarjudgesite, clarstatus, updatetime) VALUES " .
- "($contest, $site, $clarnumber, $user, $clardate, $clardatediff, $clardatediffans, $problem, '$question', " .
- "'$claranswer', $clarjudge, $clarjudgesite, '$clarstatus', $updatetime)",
- "DBNewClar(insert clar)")) {
+ while(true) {
+ DBExec($c,"SAVEPOINT sp" . $clarnumber,"DBNewClar(insert clar sp)");
+ if(DBExecNonStop($c, "INSERT INTO clartable (contestnumber, clarsitenumber, clarnumber, usernumber, clardate, " .
+ "clardatediff, clardatediffans, clarproblem, clardata, claranswer, clarjudge, clarjudgesite, clarstatus, updatetime) VALUES " .
+ "($contest, $site, $clarnumber, $user, $clardate, $clardatediff, $clardatediffans, $problem, '$question', " .
+ "'$claranswer', $clarjudge, $clarjudgesite, '$clarstatus', $updatetime)",
+ "DBNewClar(insert clar)")) break;
+ DBExec($c,"ROLLBACK TO SAVEPOINT sp" . $clarnumber,"DBNewClar(insert clar sp rollback)");
$clarnumber++;
if($clarnumber > $clarinc + 3) break;
}
diff --git a/src/fcontest.php b/src/fcontest.php
index 045f28e..f8f2cff 100644
--- a/src/fcontest.php
+++ b/src/fcontest.php
@@ -1122,7 +1122,7 @@ function DBNewSite ($contest, $c=null, $param=array()) {
$a = DBGetRow ("select * from sitetable where contestnumber=$contest and sitenumber=$number", 0, $c);
if($a != null) {
if($cw) DBExec($c, "commit work");
- return 1;
+ return false;
}
}
if($duration=='') $duration = $ct["contestduration"];
@@ -1140,7 +1140,7 @@ function DBNewSite ($contest, $c=null, $param=array()) {
$ct["contestlastmileanswer"].",".$ct["contestlastmilescore"].
", $duration, 't', '$number', '$number', '$number', $sitescorelevel, 0, 0, 0, 0, 10, $updatetime)")) {
if($cw) DBExec($c, "commit work");
- return 1;
+ return false;
}
$cf=globalconf();
@@ -1160,7 +1160,7 @@ function DBNewSite ($contest, $c=null, $param=array()) {
if($cw) DBExec($c, "commit work");
LOGLevel("User " . $_SESSION["usertable"]["username"]."/". $_SESSION["usertable"]["usersitenumber"] .
" created site $number on contest $contest.",2);
- return 2;
+ return $number;
}
function DBUserUpdate($contest, $site, $user, $username, $userfull, $userdesc, $passo, $passn) {
diff --git a/src/fextdata.php b/src/fextdata.php
index c7ebc31..49fc8fb 100644
--- a/src/fextdata.php
+++ b/src/fextdata.php
@@ -15,7 +15,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
-// Last modified 10/aug/2017 by cassio@ime.usp.br
+// Last modified 16/oct/2017 by cassio@ime.usp.br
function makeurlhttps($siteurl) {
if(substr($siteurl,0,7) == 'http://')
@@ -30,16 +30,21 @@ function makeurlhttps($siteurl) {
function scoretransfer($putname, $localsite, $timeo=5) {
$ds = DIRECTORY_SEPARATOR;
if($ds=="") $ds = "/";
+ $logstr='';
if(is_readable('/etc/boca.conf')) {
$pif=parse_ini_file('/etc/boca.conf');
$bocaproxy = @trim($pif['proxy']);
- if($bocaproxy != "" && substr($bocaproxy,0,6) != 'tcp://')
+ if($bocaproxy != "" && substr($bocaproxy,0,6) != 'tcp://') {
$bocaproxy = 'tcp://' . $bocaproxy;
+ $logstr .= "proxy configuration found\n";
+ }
$bocaproxylogin = @trim($pif['proxylogin']);
$bocaproxypass = @trim($pif['proxypassword']);
- if($bocaproxylogin != "")
+ if($bocaproxylogin != "") {
+ $logstr .= "proxy authentication found\n";
$bocaproxypass = base64_encode($bocaproxylogin . ":" . $bocaproxypass);
+ }
} else {
$bocaproxy = "";
$bocaproxypass = "";
@@ -72,12 +77,14 @@ function scoretransfer($putname, $localsite, $timeo=5) {
if(strpos($siteurl,'#') !== false) continue;
LOGError("scoretransfer: found site $siteurl");
$siteurl = makeurlhttps($siteurl);
+ $logstr .= "Found site $siteurl to share info\n";
// LOGError("url=" .$siteurl . "index.php?getsessionid=1");
$opts = array();
$opts['http']['timeout'] = $timeo;
$context = stream_context_create($opts);
if(($sess = @file_get_contents($siteurl . "index.php?getsessionid=1", 0, $context))===false) {
LOGError("scoretransfer: timeout at get session id for $siteurl");
+ $logstr .= "timeout at get-session-id for $siteurl\n";
continue;
}
// LOGError("sess=$sess pass=" . trim($sitedata[2]) . " hash=" . myhash(trim($sitedata[2])));
@@ -104,12 +111,14 @@ function scoretransfer($putname, $localsite, $timeo=5) {
}
if($ok===false) {
LOGError("scoretransfer: timeout at login for $siteurl");
+ $logstr .= "timeout at login for $siteurl\n";
continue;
}
// LOGError("ok=" . $ok);
if(substr($ok,strlen($ok)-strlen('TRANSFER OK'),strlen('TRANSFER OK')) == 'TRANSFER OK') {
if(($res = @file_get_contents($siteurl . "scoretable.php?remote=-42", 0, $context))===false) {
LOGError("scoretransfer: timeout at get score for $siteurl");
+ $logstr .= "timeout at get-score for $siteurl\n";
continue;
}
@file_put_contents($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip', $res);
@@ -130,16 +139,20 @@ function scoretransfer($putname, $localsite, $timeo=5) {
}
$zip->close();
LOGError("scoretransfer: download OK");
+ $logstr .= "download OK from $siteurl\n";
} else {
+ $logstr .= "reading failed from $siteurl (zip open error)\n";
LOGError("scoretransfer: download failed (2)");
}
cleardir($privatedir . $ds . 'remotescores' . $ds . 'tmp');
@unlink($privatedir . $ds . 'remotescores' . $ds . 'tmp.zip');
} else {
LOGError("scoretransfer: download failed (3)");
+ $logstr .= "download failed from $siteurl (file error)\n";
}
} else {
LOGError("scoretransfer: download failed (1)");
+ $logstr .= "download failed from $siteurl (connection establishing error)\n";
}
if(is_readable($putname)) {
@@ -168,11 +181,15 @@ function scoretransfer($putname, $localsite, $timeo=5) {
}
if($s===false) {
LOGError("scoretransfer: timeout at upload for $siteurl");
+ $logstr .= "timeout at full upload to $siteurl\n";
} else {
- if(strpos($s,'SCORE UPLOADED OK') !== false)
+ if(strpos($s,'SCORE UPLOADED OK') !== false) {
LOGError("scoretransfer: upload OK");
- else
+ $logstr .= "upload of score to $siteurl OK\n";
+ } else {
LOGError("scoretransfer: upload failed (" . $s . ")");
+ $logstr .= "upload of score to $siteurl failed (" . $s . ")\n";
+ }
}
}
if(is_readable($superlfile)) {
@@ -200,19 +217,25 @@ function scoretransfer($putname, $localsite, $timeo=5) {
}
if($s===false) {
LOGError("scoretransfer: timeout at full upload for $siteurl");
+ $logstr .= "timeout at full upload to $siteurl\n";
continue;
} else {
- if(strpos($s,'SCORE UPLOADED OK') !== false)
+ if(strpos($s,'SCORE UPLOADED OK') !== false) {
LOGError("scoretransfer: upload full OK");
- else
+ $logstr .= 'upload of full score to $siteurl OK\n';
+ }
+ else {
LOGError("scoretransfer: upload full failed (" . $s . ")");
+ $logstr .= 'upload of full score to $siteurl failed (' . $s . ')';
+ }
}
}
}
+ return $logstr;
}
-function getMainXML($contest,$timeo=5) {
+function getMainXML($contest,$timeo=5,$upd=false) {
$ds = DIRECTORY_SEPARATOR;
if($ds=="") $ds = "/";
@@ -236,7 +259,7 @@ function getMainXML($contest,$timeo=5) {
if ($c==null) return false;
$r = DBExec($c, "select * from contesttable where contestnumber=$contest");
if (DBnLines($r)==0) {
- echo "Unable to find the contest $contest in the database.";
+ echo "Unable to find the contest $contest in the database.\n";
LOGError("Unable to find the contest $contest in the database.");
return false;
}
@@ -252,7 +275,7 @@ function getMainXML($contest,$timeo=5) {
LOGError("getMainXML: invalid mainsiteurl entry");
return false;
}
- if(count($sitedata) == 3) {
+ if(count($sitedata) == 3 || $upd) {
$updatetime=0;
} else
$updatetime=trim($sitedata[3]);
@@ -264,12 +287,14 @@ function getMainXML($contest,$timeo=5) {
$opts = array();
$opts['http']['timeout'] = $timeo;
$context = stream_context_create($opts);
+ echo "Connecting to ". $siteurl . "\n";
try {
$sess = @file_get_contents($siteurl . "index.php?getsessionid=1", 0, $context);
} catch(Exception $e) {
$sess=false;
}
if($sess===false) {
+ echo "timeout at connection\n";
LOGError("getMainXML: timeout at get session id for $siteurl");
return false;
}
@@ -288,19 +313,21 @@ function getMainXML($contest,$timeo=5) {
$opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass;
$opts['http']['timeout'] = $timeo;
$context = stream_context_create($opts);
+ echo "Authorizing\n";
try {
$ok = @file_get_contents($siteurl . "index.php?name=${user}&password=${res}&action=transfer", 0, $context);
} catch(Exception $e) {
$ok=false;
}
if($ok===false) {
+ echo "timeout at authorization\n";
LOGError("getMainXML: timeout at login for $siteurl");
return false;
}
$ti = mytime();
// LOGError("ok=" . $ok);
if(substr($ok,strlen($ok)-strlen('TRANSFER OK'),strlen('TRANSFER OK')) == 'TRANSFER OK') {
-
+ echo "Generating local data\n";
$data = encryptData(generateSiteXML($contest, $localsite, $updatetime-30),myhash(trim($sitedata[2])));
$data_url = http_build_query(array('xml' => $data, 'updatetime' => ($updatetime-30)
@@ -320,27 +347,35 @@ function getMainXML($contest,$timeo=5) {
$opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass;
$opts['http']['timeout'] = $timeo;
$context = stream_context_create($opts);
+ echo "Transferring data\n";
try {
$s = @file_get_contents($siteurl . "site/getsite.php", 0, $context);
} catch(Exception $e) {
$s=false;
}
if($s===false) {
+ echo "timeout at transferring\n";
LOGError("getMainXML: timeout at transfer for $siteurl");
return false;
}
-
- if(strpos($s,'<OK>') !== false)
+ $chstr = "<!-- <OK> -->\n";
+ if(strpos($s,$chstr) !== false) {
+ echo "Transfer succeeded\n";
LOGInfo("xmltransfer: OK");
- else
+ } else {
+ echo "Transfer error (" . $s . ")\n";
LOGError("xmltransfer: failed (" . $s . ")");
+ }
- $s = substr($s, strpos($s, "\n") + 1);
+ echo "Processing received data\n";
+ $s = substr($s, strpos($s, $chstr) + strlen($chstr));
// LOGError("string: " . substr($s,0,50));
$s = decryptData($s,myhash (trim($sitedata[2])),'xml from main not ok');
if(strtoupper(substr($s,0,5)) != "<XML>") {
+ echo "Data corrupted\n";
return false;
}
+ echo "Importing data to local server\n";
if(importFromXML($s, $contest, $localsite, false, 1+$ct['updatetime'])) {
$str = $sitedata[0] . ' ' . $sitedata[1] . ' ' . $sitedata[2] . ' ' . $ti;
$ti = 2+$ct['updatetime'];
@@ -348,9 +383,11 @@ function getMainXML($contest,$timeo=5) {
DBUpdateContest ($param, null);
return true;
} else {
+ echo "Importing error\n";
LOGError("error importing xml");
}
} else {
+ echo "Transfer error (" . $ok . ")\n";
LOGError("xmltransfer: failed (" . $ok . ")");
}
return false;
@@ -358,6 +395,7 @@ function getMainXML($contest,$timeo=5) {
function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
LOGInfo("importFromXML: contest $contest site $site tomain $tomain");
+ if($tomain) $serv='Main'; else $serv='Local';
$data = implode("",explode("\n",$ar));
$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1);
@@ -372,6 +410,7 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
// DBExec($conn,"lock","importFromXML(lock)");
$r = DBExec($conn, "select * from contesttable where contestnumber=$contest");
if (DBnLines($r)==0) {
+ echo "$serv - error finding contest $contest \n";
LOGError("importFromXML: Unable to find the contest $contest in the database.");
// DBExec($conn,"rollback work");
return false;
@@ -411,10 +450,12 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if($uptime > 0) $param['updatetime']=$uptime;
if(($ret=DBUpdateContest ($param, $conn))) {
if($ret==2) {
+ echo "$serv - Contest " . $param["contestnumber"] . " updated\n";
LOGInfo("importFromXML: Contest " . $param["contestnumber"] . " updated");
}
}
else {
+ echo "$serv - error to update $table ". $param["contestnumber"] . "\n";
LOGError("importFromXML: error to update $table ". $param["contestnumber"]);
if($conn != null)
DBExec($conn,"rollback work");
@@ -427,10 +468,12 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if(!$tomain && $table == "answertable") {
if(($ret=DBNewAnswer ($contest, $param, $conn))) {
if($ret==2) {
+ echo "$serv - Answer " . $param["answernumber"] . " updated\n";
LOGInfo("importFromXML: Answer " . $param["answernumber"] . " updated");
}
}
else {
+ echo "$serv - error to update $table ". $param["answernumber"] . "\n";
LOGError("importFromXML: error to update $table ". $param["answernumber"]);
if($conn != null)
DBExec($conn,"rollback work");
@@ -440,10 +483,12 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if(!$tomain && $table == "langtable") {
if(($ret=DBNewLanguage ($contest,$param, $conn))) {
if($ret==2) {
+ echo "$serv - Language " . $param['langnumber'] ." updated\n";
LOGInfo("importFromXML: Language " . $param['langnumber'] ." updated");
}
}
else {
+ echo "$serv - error to update $table ". $param['langnumber'] . "\n";
LOGError("importFromXML: error to update $table ". $param['langnumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -453,9 +498,11 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if(!$tomain && $table == "problemtable") {
if(($ret=DBNewProblem ($contest,$param, $conn))) {
if($ret==2)
+ echo "$serv - Problem " . $param['problemnumber'] ." updated\n";
LOGInfo("importFromXML: Problem " . $param['problemnumber'] ." updated");
}
else {
+ echo "$serv - error to update $table ". $param['problemnumber'] . "\n";
LOGError("importFromXML: error to update $table " . $param['problemnumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -466,11 +513,13 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if(isset($param['clarsitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['clarsitenumber'];
if(isset($param['runsitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['runsitenumber'];
if(!isset($param['sitenumber']) || $param['sitenumber'] != $site) {
+ echo "$serv - site mismatch $site " . $param['sitenumber'] . "\n";
LOGError("importFromXML: site mismatch $site " . $param['sitenumber']);
continue;
}
if($tomain && $table == "sitetable") {
if(!DBNewSite($contest, $conn, $param)) {
+ echo "$serv - error to update $table \n";
LOGError("importFromXML: error to update $table");
if($conn != null)
DBExec($conn,"rollback work");
@@ -478,9 +527,11 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
if(($ret=DBUpdateSite($param, $conn))) {
if($ret==2) {
+ echo "$serv - Site " . $param["sitenumber"] . " updated\n";
LOGInfo("importFromXML: Site " . $param["sitenumber"] . " updated");
}
} else {
+ echo "$serv - error to update $table ". $param["sitenumber"] . "\n";
LOGError("importFromXML: error to update $table ". $param["sitenumber"]);
if($conn != null)
DBExec($conn,"rollback work");
@@ -489,6 +540,7 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
if($tomain && $table == "sitetimetable") {
if(!DBUpdateSiteTime($contest, $param, $firsttimetime, $conn)) {
+ echo "$serv - error to update $table \n";
LOGError("importFromXML: error to update $table");
if($conn != null)
DBExec($conn,"rollback work");
@@ -501,9 +553,11 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
if($table == "usertable") {
if(($ret=DBNewUser($param, $conn))) {
if($ret==2) {
+ echo "$serv - User " . $param["usernumber"]."/".$param['sitenumber']. " updated\n";
LOGInfo("importFromXML: User " . $param["usernumber"]."/".$param['sitenumber']. " updated");
}
} else {
+ echo "$serv - error to update $table ". $param["usernumber"]."/".$param['sitenumber'] . "\n";
LOGError("importFromXML: error to update $table ". $param["usernumber"]."/".$param['sitenumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -512,10 +566,13 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
if($table == "tasktable") {
if(($ret=DBNewTask ($param, $conn))) {
- if($ret==2)
+ if($ret==2) {
+ echo "$serv - Task " . $param['tasknumber']."/".$param['sitenumber']." updated\n";
LOGInfo("importFromXML: Task " . $param['tasknumber']."/".$param['sitenumber']." updated");
+ }
}
else {
+ echo "$serv - error to update $table " . $param['tasknumber']."/".$param['sitenumber'] . "\n";
LOGError("importFromXML: error to update $table " . $param['tasknumber']."/".$param['sitenumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -524,10 +581,13 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
if($table == "clartable") {
if(($ret=DBNewClar ($param, $conn))) {
- if($ret==2)
+ if($ret==2) {
+ echo "$serv - Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated\n";
LOGInfo("importFromXML: Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated");
+ }
}
else {
+ echo "$serv - error to update $table ". $param['clarnumber']."/".$param['sitenumber'] . "\n";
LOGError("importFromXML: error to update $table ". $param['clarnumber']."/".$param['sitenumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -536,10 +596,13 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
if($table == "runtable") {
if(($ret=DBNewRun ($param, $conn))) {
- if($ret==2)
+ if($ret==2) {
+ echo "$serv - Run " . $param['runnumber'] ."/".$param['sitenumber']." updated\n";
LOGInfo("importFromXML: Run " . $param['runnumber'] ."/".$param['sitenumber']." updated");
+ }
}
else {
+ echo "$serv - error to update $table ". $param['runnumber'] ."/".$param['sitenumber'] . "\n";
LOGError("importFromXML: error to update $table ". $param['runnumber'] ."/".$param['sitenumber']);
if($conn != null)
DBExec($conn,"rollback work");
@@ -550,7 +613,8 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) {
}
}
}
- // DBExec($conn,"commit work","importFromXML(commit)");
+ if($conn != null)
+ DBExec($conn,"commit work","importFromXML(commit)");
return true;
}
@@ -601,7 +665,7 @@ function generateSiteXML($contest,$site,$updatetime) {
}
}
$str .= "</XML>\n";
- DBExec($c,"commit work","generateXML(commit)");
+ DBExec($c,"commit work","generateSiteXML(commit)");
LOGInfo("xml data generated for contest $contest site $site at time $updatetime");
return $str;
}
diff --git a/src/frun.php b/src/frun.php
index 3624456..20fb616 100644
--- a/src/frun.php
+++ b/src/frun.php
@@ -481,21 +481,22 @@ function DBUpdateRunAutojudging($contest, $site, $number, $ip, $answer, $stdout,
$b = DBSiteInfo($contest, $site, $c);
- if( true ||
- $a["runproblem"] == 1 ||
- $a["runproblem"] == 2 ||
- $a["runproblem"] == 3 ||
- $a["runproblem"] == 4 ||
- $a["runproblem"] == 5 ||
- $a["runproblem"] == 6 ||
- $a["runproblem"] == 7 ||
- $a["runproblem"] == 8 ||
- $a["runproblem"] == 9 ||
- $a["runproblem"] == 10 ||
- $a["runproblem"] == 11 ||
- $a["runproblem"] == 12 ||
- $a["runproblem"] == 13 ||
- ($retval != 1 && $retval != 6)) {
+ if(true || //cassiopc remove the true here if you want this to take effect
+ (($retval != 1 || // for some problems, YES is not automatic
+ $a["runproblem"] == 1 ||
+ $a["runproblem"] == 2 ||
+ $a["runproblem"] == 3 ||
+ $a["runproblem"] == 4 ||
+ $a["runproblem"] == 5 ||
+ $a["runproblem"] == 6 ||
+ $a["runproblem"] == 7 ||
+ $a["runproblem"] == 8 ||
+ $a["runproblem"] == 9 ||
+ $a["runproblem"] == 10 ||
+ $a["runproblem"] == 11 ||
+ $a["runproblem"] == 12 ||
+ $a["runproblem"] == 13)
+ && $retval != 4 && $retval != 6)) { // but WA and TLE are automatic for all problems
if($b["siteautojudge"]!="t") {
// && (($retval != 1 && $retval != 6) || $a["runproblem"] == 1 || $a["runproblem"] == 2) ) { //cassiopc incluir automatic judging of some codes 1:YES WA:6
@@ -608,6 +609,8 @@ function DBOpenRunsSNS($contest,$site,$st,$order='run') {
$sql .= " and (u.usertype != 'judge')";
$sql .= " and (not r.runstatus = 'judged') " .
" and not r.runstatus ~ 'deleted' order by ";
+ } else if($st == 2) {
+ $sql .= " and (not r.runanswer1 = 0) and (not r.runanswer2 = 0) and (not r.runstatus = 'judged') order by ";
} else $sql .= " order by ";
if($order == "site")
@@ -760,7 +763,7 @@ function DBNewRun($param,$c=null) {
$runnumber = $a["nextrun"] + 1;
DBExec($c, "update sitetable set sitenextrun=$runnumber" .
" where sitenumber=$site and contestnumber=$contest and sitenextrun<$runnumber", "DBNewRun(update site)");
- $runnumber = myunique();
+ $runnumber = myunique($runnumber);
$runinc = $runnumber;
}
@@ -855,14 +858,17 @@ function DBNewRun($param,$c=null) {
}
if($runinc >= $runnumber) {
- while(!DBExecNonStop($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, $runnumber, $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)")) {
+ while(true) {
+ DBExec($c,"SAVEPOINT sp" . $runnumber,"DBNewRun(insert run sp)");
+ if(DBExecNonStop($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, $runnumber, $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)")) break;
+ DBExec($c,"ROLLBACK TO SAVEPOINT sp" . $runnumber,"DBNewRun(insert run sp rollback)");
$runnumber++;
if($runnumber > $runinc + 3) break;
}
diff --git a/src/ftask.php b/src/ftask.php
index 73336c3..c54503a 100644
--- a/src/ftask.php
+++ b/src/ftask.php
@@ -396,7 +396,7 @@ function DBNewTask($param, $c=null, $autotask=false) {
$tasknumber = $a["nexttask"] + 1;
DBExec($c, "update sitetable set sitenexttask=$tasknumber" .
" where sitenumber=$site and contestnumber=$contest and sitenexttask<$tasknumber", "DBNewTask(update site)");
- $taskinc = myunique();
+ $taskinc = myunique($tasknumber);
if(($taskinc % 2) == 0) $taskinc--;
if($autotask) $taskinc++;
$tasknumber = $taskinc;
@@ -435,12 +435,17 @@ function DBNewTask($param, $c=null, $autotask=false) {
} else $oid="NULL";
if($taskinc >= $tasknumber) {
- while(!DBExecNonStop($c, "INSERT INTO tasktable (contestnumber, sitenumber, tasknumber, usernumber, taskdate, " .
+ while(true) {
+ DBExec($c,"SAVEPOINT sp" . $tasknumber,"DBNewTask(insert task sp)");
+ if(DBExecNonStop($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)")) {
+ "DBNewTask(insert task)")) {
+ break;
+ }
+ DBExec($c,"ROLLBACK TO SAVEPOINT sp" . $tasknumber,"DBNewTask(insert task sp rollback)");
$tasknumber+=2;
if($tasknumber > $taskinc + 6) {
DBExec($c, "INSERT INTO tasktable (contestnumber, sitenumber, tasknumber, usernumber, taskdate, " .
diff --git a/src/globals.php b/src/globals.php
index cb7c419..b4f754e 100755
--- a/src/globals.php
+++ b/src/globals.php
@@ -40,8 +40,107 @@ function filedownload($oid,$fname,$msg='') {
if($msg != '') $str .= "&msg=" . rawurlencode($msg);
return $str;
}
+function dirrec($dir, $user, $group, $dirPermissions, $filePermissions, $avoid=array()) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ if(is_dir($dir)) {
+ $u = posix_getpwuid(fileowner($dir));
+ $un = $u['name'];
+ $ug = $u['gid'];
+ if($un != $user) echo "user of $dir must be fixed!!\n";
+ if($ug != $group) echo "group of $dir must be fixed!!\n";
+ if(@chmod($dir, $dirPermissions) === false) echo "cannot chmod $dir\n";
+ if(($dp = @opendir($dir)) === false) return;
+ while($file = readdir($dp)) {
+ if (($file == ".") || ($file == ".."))
+ continue;
+ $cont = false;
+ for($i = 0; $i < count($avoid); $i++)
+ if(substr($file, strlen($file)-strlen($avoid[$i])) == $avoid[$i]) {
+ $cont = true;
+ break;
+ }
+ if($cont) continue;
+ $fullPath = $dir . $ds . $file;
+ dirrec($fullPath, $user, $group, $dirPermissions, $filePermissions, $avoid);
+ }
+ closedir($dp);
+ } else {
+ if(!is_link($dir)) {
+ $t = myunique();
+ @copy($dir, $dir . '.tmp' . $t);
+ @rename($dir . '.tmp' . $t, $dir);
+ if(@chmod($dir, $filePermissions)=== false) echo "cannot chmod $dir\n";
+ }
+ }
+}
-function cleardir($dir,$cddir=true,$secure=false) {
+function fixbocadir($dir,$full=false) {
+ if(is_dir($dir)) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $u = posix_getpwuid(fileowner($dir));
+ $un = $u['name'];
+ $ug = $u['gid'];
+ @file_put_contents($dir . $ds . 'private' . $ds . '.htaccess', "Deny from all\n");
+ @touch($dir . $ds . 'private' . $ds . 'remotescores' . $ds . 'otherservers');
+ if($full)
+ $d = array('problemtmp','runtmp','scoretmp','remotescores','remotescoresfull','comp','logexternal','runslog');
+ else
+ $d = array('problemtmp','runtmp','scoretmp');
+ foreach($d as $a) cleardir($a,true,true,false);
+ dirrec($dir, $un, $ug, 0755, 0644, array('private', '.oldboca'));
+ dirrec($dir . $ds . 'private', $un, $ug, 0750, 0640, array('.oldboca'));
+ if(@file_put_contents($dir . $ds . 'private' . $ds . '.htaccess', "Deny from all\n") === false) return false;
+ return true;
+ } else {
+ return false;
+ }
+}
+function updatebocafile($dirboca, $dirz, $t) {
+ $ok = 0;
+ if(is_dir($dirz)) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $d = @opendir($dirz);
+ while (($file = @readdir($d)) !== false) {
+ if($file != '.' && $file != '..')
+ $ok = $ok + updatebocafile($dirboca . $ds . $file, $dirz . $ds . $file, $t);
+ }
+ @closedir($d);
+ @cleardir($dirz);
+ } else {
+ if(is_file($dirboca)) {
+ copy($dirboca, $dirboca . '.' . $t . '.oldboca');
+ } else {
+ file_put_contents($dirboca . '.' . $t . '.oldboca', "");
+ }
+ @chmod($dirboca . '.' . $t . '.oldboca', 0000);
+ if(rename($dirz, $dirboca) === true) $ok=1;
+ }
+ return $ok;
+}
+function revertupdatebocafile($dirboca, $t) {
+ $ok = 0;
+ if(is_dir($dirboca)) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $d = @opendir($dirboca);
+ while (($file = @readdir($d)) !== false) {
+ if($file != '.' && $file != '..')
+ $ok = $ok + revertupdatebocafile($dirboca . $ds . $file, $t);
+ }
+ @closedir($d);
+ } else {
+ if(is_file($dirboca) && substr($dirboca, strlen($dirboca) - strlen('.' . $t . '.oldboca')) == '.' . $t . '.oldboca') {
+ @chmod($dirboca, 0600);
+ if(@copy($dirboca, substr($dirboca, 0, strlen($dirboca) - strlen('.' . $t . '.oldboca'))) === true) $ok=1;
+ @chmod($dirboca, 0000);
+ }
+ }
+ return $ok;
+}
+function cleardir($dir,$cddir=true,$secure=true,$removedir=true) {
if(is_dir($dir)) {
$ds = DIRECTORY_SEPARATOR;
if($ds=="") $ds = "/";
@@ -51,26 +150,12 @@ function cleardir($dir,$cddir=true,$secure=false) {
}
$d = @opendir($dir);
while (($file = @readdir($d)) !== false) {
- if(!is_dir($dir . $ds . $file)) {
- if($secure)
- file_put_contents($dir . $ds . $file,str_repeat('XXXXXXXXXX',10000));
- @unlink($dir . $ds . $file);
- }
- else {
- if($file != '.' && $file != '..') {
- $cdir1 = $dir . $ds . $file;
- $d1 = @opendir($cdir1);
- while (($file1 = @readdir($d1)) !== false)
- if(!is_dir($cdir1 . $ds . $file1)) {
- if($secure)
- file_put_contents($cdir1 . $ds . $file1,str_repeat('XXXXXXXXXX',10000));
- @unlink($cdir1 . $ds . $file1);
- }
- @rmdir($cdir1);
- }
- }
+ if($file != '.' && $file != '..')
+ cleardir($dir . $ds . $file, false, $secure, true);
}
- @rmdir($dir);
+ @closedir($d);
+ if($removedir)
+ @rmdir($dir);
} else {
if($secure)
file_put_contents($dir,str_repeat('XXXXXXXXXX',10000));
@@ -284,8 +369,8 @@ function mytime() {
function mymtime() {
return microtime(true);
}
-function myunique() {
- return ((int)(100*microtime(true))) % 100000000;
+function myunique($val=0) {
+ return (((int)(100*microtime(true))) % 10000000)*100 + ($val % 100);
}
//retorna data e hora atuais
function now () {
diff --git a/src/logexternal.php b/src/logexternal.php
index 402fe9c..b85aaef 100644
--- a/src/logexternal.php
+++ b/src/logexternal.php
@@ -45,7 +45,7 @@ if(isset($_POST["comp"]) && $_POST["comp"] != "" ) {
$p = myhash($secret[2] . session_id());
if($p == $password) {
@mkdir('/var/www/boca/src/private/logexternal/',0770,true);
- @file_put_contents("/var/www/boca/src/private/logexternal/" . $secret[0] . '.' . $name, base64_decode($_POST['data']), LOCK_EX | FILE_APPEND);
+ @file_put_contents("/var/www/boca/src/private/logexternal/" . $secret[0] . '.' . $name, '\nbegin ' . time() . ' ' . base64_decode($_POST['data']), LOCK_EX | FILE_APPEND);
@file_put_contents("/var/www/boca/src/private/logexternal/logexternal.log", $name . "|" . $secret[0] . '|' . date(DATE_RFC2822) . "\n", LOCK_EX | FILE_APPEND);
echo "ok\n";
exit;
diff --git a/src/private/autojudging.php b/src/private/autojudging.php
index dcb7398..2a8b1ed 100755
--- a/src/private/autojudging.php
+++ b/src/private/autojudging.php
@@ -44,7 +44,7 @@ if(system('test "`id -u`" -eq "0"',$retval)===false || $retval!=0) {
exit;
}
-ini_set('memory_limit','600M');
+ini_set('memory_limit','1200M');
ini_set('output_buffering','off');
ini_set('implicit_flush','on');
@ob_end_flush();
@@ -487,10 +487,14 @@ while(42) {
$answertmp = substr(trim($dif[count($dif)-1]),0,200);
$answertmp = sanitizeText($answertmp);
fclose($fp);
+ /*
foreach (glob($dir . $ds . '*') as $fne) {
- @chown($fne,"nobody");
- @chmod($fne,0755);
+ if(is_file($fne)) {
+ @chown($fne,"nobody");
+ @chmod($fne,0755);
+ }
}
+ */
// retval 5 (presentation) and retval 6 (wronganswer) are already compatible with the compare script
if($localretval < 4 || $localretval > 6) {
// contact staff
@@ -616,9 +620,14 @@ while(42) {
if(count($ans) > 0)
$anstmp = substr(trim(escape_string($ans[count($ans)-1])),0,100);
unset($ans);
- $answer = "(probably runtime error - unusual code: $retval) " . $anstmp;
- // runtime error
- $retval = 3;
+ if(strpos(file_get_contents('allerr'),'Error: Could not find or load main class') === false) {
+ $answer = "(probably runtime error - unusual code: $retval) " . $anstmp;
+ // runtime error
+ $retval = 3;
+ } else {
+ $answer = "(probably wrong name of class - unusual code: $retval) "; // . $anstmp;
+ $retval = 8;
+ }
}
if($retval == 0 || $retval > 9) {
$ans = file("allout");
@@ -638,7 +647,7 @@ while(42) {
//echo "err==> "; system("tail -n1 ". $dir.$ds.'allerr');
$answer=substr($answer,0,200);
DBUpdateRunAutojudging($contest, $site, $number, $ip, $answer, $dir.$ds.'allout', $dir.$ds.'allerr', $retval);
- LogLevel("Autojudging: answered '$answer' (run=$number, site=$site, contest=$contest)",3);
- echo "Autojudging answered '$answer' (contest=$contest, site=$site, run=$number)\n";
+ LogLevel("Autojudging: answered $retval '$answer' (run=$number, site=$site, contest=$contest)",3);
+ echo "Autojudging answered $retval '$answer' (contest=$contest, site=$site, run=$number)\n";
}
?>
diff --git a/src/private/conf.php b/src/private/conf.php
index 9ad1a80..71956c0 100644
--- a/src/private/conf.php
+++ b/src/private/conf.php
@@ -20,8 +20,9 @@
function globalconf() {
$conf["dbencoding"]="UTF8";
$conf["dbclientenc"]="UTF8";
+ $conf['doenc']=FALSE;
- $conf["dblocal"]="false"; // use unix socket to connect?
+ $conf["dblocal"]="false"; // use unix socket to connect?
$conf["dbhost"]="localhost";
$conf["dbport"]="5432";
diff --git a/src/private/score.sep b/src/private/score.sep
index fb45aae..b4798d9 100644
--- a/src/private/score.sep
+++ b/src/private/score.sep
@@ -1,23 +1,19 @@
-General 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 100 9999
-Site_1 1
-Site_2 2
-Site_3 3
-Site_4 4
-Site_5 5
-Site_6 6
-Site_7 7
-Site_8 8
-Site_9 9
-Site_10 10
-Site_11 11
-Site_12 12
-Site_13 13
-Site_14 14
-Site_15 15
-Site_16 16
-Site_17 17
-Site_18 18
-Site_19 19
-Site_20 20
-Site_100 100
-Site_9999 9999
+Global 101 102 103 104 105 106 107 108 109 110 121 122 123 124
+Caribbean 110 121 123
+MexicoCA 104 109 122 124
+NorthRegion 102 103
+SouthRegion 105 106 107 108
+Argentina 105
+Bolivia 106
+Brasil 101
+Chile 107
+Colombia 102
+CostaRica 122
+Cuba 110
+ElSalvador 124
+Mexico 109
+Panama 104
+Peru 108
+PuertoRico 123
+RepDominicana 121
+Venezuela 103
diff --git a/src/private/score.sep.sample b/src/private/score.sep.sample
new file mode 100644
index 0000000..fb45aae
--- /dev/null
+++ b/src/private/score.sep.sample
@@ -0,0 +1,23 @@
+General 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 100 9999
+Site_1 1
+Site_2 2
+Site_3 3
+Site_4 4
+Site_5 5
+Site_6 6
+Site_7 7
+Site_8 8
+Site_9 9
+Site_10 10
+Site_11 11
+Site_12 12
+Site_13 13
+Site_14 14
+Site_15 15
+Site_16 16
+Site_17 17
+Site_18 18
+Site_19 19
+Site_20 20
+Site_100 100
+Site_9999 9999
diff --git a/src/scoretable.php b/src/scoretable.php
index 850ee9a..33c421f 100644
--- a/src/scoretable.php
+++ b/src/scoretable.php
@@ -47,7 +47,7 @@ if(isset($_GET["clock"]) && $_GET["clock"]==1) {
else echo "0";
exit;
}
-if(isset($_GET['remote']) && is_numeric($_GET['remote'])) {
+if(isset($_GET['remote'])) {
ob_start();
header ("Expires: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
@@ -59,13 +59,13 @@ if(isset($_GET['remote']) && is_numeric($_GET['remote'])) {
if (isset($_SESSION["usertable"])) {
$tmp = DBUserInfo($_SESSION["usertable"]["contestnumber"],
- $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"]);
+ $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"]);
$_SESSION["usertable"]['usersessionextra'] = $tmp['usersessionextra'];
} else {
IntrusionNotify("scoretable1");
ForceLoad("index.php");
}
- if(!isset($_SESSION['usertable']['usertype']) || ($_SESSION["usertable"]["usertype"] != "score" && $_SESSION["usertable"]["usertype"] != "site")) {
+ if(!isset($_SESSION['usertable']['usertype']) || $_SESSION["usertable"]["usertype"] != "site") {
IntrusionNotify("scoretable2");
ForceLoad("index.php");
}
@@ -83,7 +83,7 @@ $scoredelay["score"] = 60;
$scoredelay["team"] = 30;
$scoredelay["judge"] = 20;
$scoredelay["staff"] = 30;
-$actualdelay = 60;
+$actualdelay = 30;
if(isset($scoredelay[$_SESSION["usertable"]["usertype"]])) $actualdelay = $scoredelay[$_SESSION["usertable"]["usertype"]];
$ds = DIRECTORY_SEPARATOR;
if($ds=="") $ds = "/";
@@ -99,7 +99,7 @@ if(file_exists($scoretmp)) {
}
}
-if($_SESSION["usertable"]["usertype"]=='score' || $_SESSION["usertable"]["usertype"]=='admin' || (isset($_GET["remote"]) && is_numeric($_GET["remote"]))) {
+if(isset($_GET["remote"])) {
$privatedir = $_SESSION['locr'] . $ds . "private";
$remotedir = $_SESSION['locr'] . $ds . "private" . $ds . "remotescores";
$destination = $remotedir . $ds ."scores.zip";
@@ -132,7 +132,7 @@ if($_SESSION["usertable"]["usertype"]=='score' || $_SESSION["usertable"]["userty
$fname = $remotedir . $ds . "score_site" . $localsite . "_" . $localsite . "_x"; // . md5($_SERVER['HTTP_HOST']);
@file_put_contents($fname . ".tmp",base64_encode(serialize($data0)));
@rename($fname . ".tmp",$fname . ".dat");
- scoretransfer($fname . ".dat", $localsite);
+ //scoretransfer($fname . ".dat", $localsite);
if(@create_zip($remotedir,glob($remotedir . '/*.dat'),$fname . ".tmp") != 1) {
LOGError("Cannot create score zip file");
@@ -143,7 +143,7 @@ if($_SESSION["usertable"]["usertype"]=='score' || $_SESSION["usertable"]["userty
}
@fclose($fp);
- getMainXML($_SESSION["usertable"]["contestnumber"]);
+ //getMainXML($_SESSION["usertable"]["contestnumber"]);
@unlink($destination . ".lck");
} else {
@@ -152,10 +152,7 @@ if($_SESSION["usertable"]["usertype"]=='score' || $_SESSION["usertable"]["userty
}
}
}
-}
-
-if(isset($_GET["remote"])) {
- if(is_numeric($_GET["remote"])) {
+ if(is_numeric($_GET["remote"])) {
if($_GET["remote"]==-42) {
echo file_get_contents($destination);
} else {
@@ -166,15 +163,16 @@ if(isset($_GET["remote"])) {
$score = array();
if($level>0) {
list($score,$data0) = DBScoreSite($_SESSION["usertable"]["contestnumber"],
- $_SESSION["usertable"]["usersitenumber"], 1, -1, $_GET["remote"]);
+ $_SESSION["usertable"]["usersitenumber"], 1, -1, $_GET["remote"]);
}
echo base64_encode(serialize($score));
}
- } else {
- echo base64_encode(serialize(array()));
- }
- exit;
+ } else {
+ echo base64_encode(serialize(array()));
+ }
+ exit;
}
+
if(!$redo) {
$conf=globalconf();
if($conf['doenc'])
diff --git a/src/version b/src/version
index 2924c77..07c98a8 100644
--- a/src/version
+++ b/src/version
@@ -1 +1 @@
-boca-1.5.11
+boca-1.5.12
diff --git a/src/versionnum.php b/src/versionnum.php
index 5cebd5e..560983d 100644
--- a/src/versionnum.php
+++ b/src/versionnum.php
@@ -1,5 +1,5 @@
<?php
-$BOCAVERSION='boca-1.5.11';
+$BOCAVERSION='boca-1.5.12';
$YEAR='2017';
?>