diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/.htaccess | 2 | ||||
| -rw-r--r-- | src/admin/contest.php | 36 | ||||
| -rw-r--r-- | src/admin/header.php | 6 | ||||
| -rw-r--r-- | src/admin/misc.php | 28 | ||||
| -rw-r--r-- | src/admin/option.php | 1 | ||||
| -rw-r--r-- | src/admin/problem.php | 55 | ||||
| -rw-r--r-- | src/admin/site.php | 18 | ||||
| -rw-r--r-- | src/admin/task.php | 3 | ||||
| -rw-r--r-- | src/admin/user.php | 24 | ||||
| -rw-r--r-- | src/db.php | 25 | ||||
| -rw-r--r-- | src/fclar.php | 92 | ||||
| -rw-r--r-- | src/fcontest.php | 101 | ||||
| -rw-r--r-- | src/fextdata.php | 312 | ||||
| -rw-r--r-- | src/filedownload.php | 2 | ||||
| -rw-r--r-- | src/filewindow.php | 2 | ||||
| -rw-r--r-- | src/fproblem.php | 2 | ||||
| -rw-r--r-- | src/frun.php | 40 | ||||
| -rw-r--r-- | src/fscore.php | 2 | ||||
| -rw-r--r-- | src/ftask.php | 3 | ||||
| -rwxr-xr-x | src/globals.php | 9 | ||||
| -rw-r--r-- | src/judge/runeditchief.php | 8 | ||||
| -rw-r--r-- | src/optionlower.php | 29 | ||||
| -rwxr-xr-x | src/private/autojudging.php | 115 | ||||
| -rw-r--r-- | src/private/conf.php | 2 | ||||
| -rw-r--r-- | src/private/score.sep | 1 | ||||
| -rw-r--r-- | src/site/getsite.php | 16 | ||||
| -rw-r--r-- | src/staff/header.php | 8 | ||||
| -rw-r--r-- | src/system/header.php | 2 | ||||
| -rw-r--r-- | src/team/run.php | 3 | ||||
| -rw-r--r-- | src/version | 2 | ||||
| -rw-r--r-- | src/versionnum.php | 2 |
31 files changed, 623 insertions, 328 deletions
diff --git a/src/.htaccess b/src/.htaccess index dbafa30..7c89b5b 100644 --- a/src/.htaccess +++ b/src/.htaccess @@ -1,5 +1,5 @@ php_flag output_buffering on -php_value memory_limit 256M +php_value memory_limit 1024M php_value post_max_size 128M php_flag magic_quotes_gpc off php_value upload_max_filesize 128M diff --git a/src/admin/contest.php b/src/admin/contest.php index 58df217..fda17da 100644 --- a/src/admin/contest.php +++ b/src/admin/contest.php @@ -26,6 +26,37 @@ $localsite=$ct["contestlocalsite"]; $mainsite=$ct["contestmainsite"]; if ($localsite == $mainsite) $main=true; else $main=false; +if($main) { + if (isset($_POST["SubmitDC"]) && $_POST["SubmitDC"] == "Delete ALL clars") { + if ($_POST["confirmation"] == "confirm") { + DBSiteDeleteAllClars ($_SESSION["usertable"]["contestnumber"], -1, + $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); + } + ForceLoad("contest.php"); + } + if (isset($_POST["SubmitDR"]) && $_POST["SubmitDR"] == "Delete ALL runs") { + if ($_POST["confirmation"] == "confirm") { + DBSiteDeleteAllRuns ($_SESSION["usertable"]["contestnumber"], -1, + $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); + } + ForceLoad("contest.php"); + } + if (isset($_POST["SubmitDT"]) && $_POST["SubmitDT"] == "Delete ALL tasks") { + if ($_POST["confirmation"] == "confirm") { + DBSiteDeleteAllTasks ($_SESSION["usertable"]["contestnumber"], -1, + $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); + } + ForceLoad("contest.php"); + } + if (isset($_POST["SubmitDB"]) && $_POST["SubmitDB"] == "Delete ALL bkps") { + if ($_POST["confirmation"] == "confirm") { + DBSiteDeleteAllBkps ($_SESSION["usertable"]["contestnumber"], -1, + $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); + } + ForceLoad("contest.php"); + } +} + if (isset($_POST["Submit3"]) && isset($_POST["penalty"]) && is_numeric($_POST["penalty"]) && isset($_POST["maxfilesize"]) && isset($_POST["mainsite"]) && isset($_POST["name"]) && $_POST["name"] != "" && isset($_POST["lastmileanswer"]) && is_numeric($_POST["lastmileanswer"]) && @@ -254,6 +285,11 @@ echo $contest; <input type="submit" name="Submit3" value="Update" onClick="conf()"> <input type="submit" name="Submit3" value="Update Contest and All Sites" onClick="conf2()"> <input type="reset" name="Submit4" value="Clear"> +<br><br> + <input type="submit" name="SubmitDC" value="Delete ALL clars" onClick="conf2()"> + <input type="submit" name="SubmitDR" value="Delete ALL runs" onClick="conf2()"> + <input type="submit" name="SubmitDT" value="Delete ALL tasks" onClick="conf2()"> + <input type="submit" name="SubmitDB" value="Delete ALL bkps" onClick="conf2()"> <?php } else { ?> <input type="submit" name="Submit3" value="Update" onClick="conf()"> <input type="submit" name="Submit3" value="Become Main Site" onClick="conf3()"> diff --git a/src/admin/header.php b/src/admin/header.php index 6002b18..116f4f6 100644 --- a/src/admin/header.php +++ b/src/admin/header.php @@ -42,7 +42,6 @@ if(!isset($_POST['noflush'])) { echo "<link rel=stylesheet href=\"$loc/Css.php\" type=\"text/css\">\n"; } -//echo "<meta http-equiv=\"refresh\" content=\"60\" />"; if(!ValidSession()) { InvalidSession("admin/index.php"); ForceLoad("$loc/index.php"); @@ -52,6 +51,11 @@ if($_SESSION["usertable"]["usertype"] != "admin") { ForceLoad("$loc/index.php"); } +if ((isset($_GET["Submit1"]) && $_GET["Submit1"] == "Transfer") || + (isset($_GET["Submit3"]) && $_GET["Submit3"] == "Transfer scores")) { + echo "<meta http-equiv=\"refresh\" content=\"60\" />"; +} + if(!isset($_POST['noflush'])) { echo "</head><body id=\"body\"><table border=1 width=\"100%\">\n"; echo "<tr><td nowrap bgcolor=\"eeee00\" align=center>"; diff --git a/src/admin/misc.php b/src/admin/misc.php index 3e8d224..8ff1aeb 100644 --- a/src/admin/misc.php +++ b/src/admin/misc.php @@ -19,7 +19,7 @@ require 'header.php'; ?> <br> -<form name="form1" enctype="multipart/form-data" method="post" action="misc.php"> +<form name="form1" enctype="multipart/form-data" method="get" action="misc.php"> <input type=hidden name="confirmation" value="noconfirm" /> <script language="javascript" type="text/javascript"> function conf() { @@ -38,7 +38,7 @@ require 'header.php'; <center> <input type="submit" name="Submit1" value="Transfer" onClick="conf()"> <input type="submit" name="Submit2" value="Transfer all" onClick="conf()"> - <input type="submit" name="Submit3" value="Transfer scores"> + <input type="submit" name="Submit3" value="Transfer scores" onClick="conf()"> <input type="submit" name="Submit4" value="Clear cache" onClick="conf()"> <input type="submit" name="Submit5" value="Full clear" onClick="conf2()"> <input type="submit" name="Submit6" value="Update BOCA" onClick="conf2()"> @@ -49,35 +49,36 @@ require 'header.php'; OPERATION LOG DISPLAYS BELOW: <?php -if(isset($_POST['confirmation']) && $_POST['confirmation'] == 'confirm') { +echo "Start: " . now() . "\n"; +if(isset($_GET['confirmation']) && $_GET['confirmation'] == 'confirm') { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; $dotransfer=false; $doscore=false; $dotransferall=false; -if (isset($_POST["Submit1"]) && $_POST["Submit1"] == "Transfer") { +if (isset($_GET["Submit1"]) && $_GET["Submit1"] == "Transfer") { $dotransfer=true; $doscore=true; } -if (isset($_POST["Submit2"]) && $_POST["Submit2"] == "Transfer all") { +if (isset($_GET["Submit2"]) && $_GET["Submit2"] == "Transfer all") { $dotransfer=true; $dotransferall=true; $doscore=true; } -if (isset($_POST["Submit3"]) && $_POST["Submit3"] == "Transfer scores") { +if (isset($_GET["Submit3"]) && $_GET["Submit3"] == "Transfer scores") { $doscore=true; } -if (isset($_POST["Submit4"]) && $_POST["Submit4"] == "Clear cache") { +if (isset($_GET["Submit4"]) && $_GET["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 (isset($_GET["Submit5"]) && $_GET["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") { +if (isset($_GET["Submit6"]) && $_GET["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")) { @@ -112,7 +113,7 @@ if (isset($_POST["Submit6"]) && $_POST["Submit6"] == "Update BOCA") { echo "Cannot update log file\n"; } } -if (isset($_POST["Submit7"]) && $_POST["Submit7"] == "Revert Update") { +if (isset($_GET["Submit7"]) && $_GET["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")) { @@ -168,7 +169,7 @@ if($dotransfer || $doscore || $dotransferall) { $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 "Checking for transfers\n"; echo scoretransfer($fname . ".dat", $localsite); echo "Saving scores\n"; if(@create_zip($remotedir,glob($remotedir . '/*.dat'),$fname . ".tmp") != 1) { @@ -181,8 +182,8 @@ if($dotransfer || $doscore || $dotransferall) { @fclose($fp); } if($dotransfer) { - echo "Processing other data\n"; - getMainXML($_SESSION["usertable"]["contestnumber"],10,$dotransferall); + echo "Processing contest data\n"; + echo getMainXML($_SESSION["usertable"]["contestnumber"],10,$dotransferall); } @unlink($destination . ".lck"); } else { @@ -193,6 +194,7 @@ if($dotransfer || $doscore || $dotransferall) { } } } +echo "End: " . now() . "\n"; ?> </pre> </body> diff --git a/src/admin/option.php b/src/admin/option.php index 81e5879..d3581a4 100644 --- a/src/admin/option.php +++ b/src/admin/option.php @@ -15,7 +15,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. //////////////////////////////////////////////////////////////////////////////// -// Last modified 05/aug/2012 by cassio@ime.usp.br require('header.php'); require('../optionlower.php'); ?> diff --git a/src/admin/problem.php b/src/admin/problem.php index d462e79..a01bd35 100644 --- a/src/admin/problem.php +++ b/src/admin/problem.php @@ -192,13 +192,36 @@ if (isset($_POST["Submit3"]) && isset($_POST["problemnumber"]) && is_numeric($_P $param['inputfilename'] = $name; $param['inputfilepath'] = $temp; $param['fake'] = 'f'; - $param['colorname'] = $_POST["colorname"]; - $param['color'] = $_POST["color"]; + $param['colorname'] = trim($_POST["colorname"]); + $param['color'] = trim($_POST["color"]); DBNewProblem ($_SESSION["usertable"]["contestnumber"], $param); } } ForceLoad("problem.php"); } + +$prob = DBGetFullProblemData($_SESSION["usertable"]["contestnumber"],true); +for ($i=0; $i<count($prob); $i++) { + if($prob[$i]["fake"]!='t') { + if (isset($_POST["SubmitProblem" . $prob[$i]['number']]) && $_POST["SubmitProblem" . $prob[$i]['number']] == 'Update' && + isset($_POST["colorname" . $prob[$i]['number']]) && strlen($_POST["colorname" . $prob[$i]['number']]) <= 100 && + isset($_POST["color" . $prob[$i]['number']]) && strlen($_POST["color" . $prob[$i]['number']]) <= 6 && + isset($_POST["problemname" . $prob[$i]['number']]) && $_POST["problemname" . $prob[$i]['number']] != "" && strlen($_POST["problemname" . $prob[$i]['number']]) <= 20) { + if(strpos(trim($_POST["problemname" . $prob[$i]['number']]),' ')!==false) { + MSGError('Problem short name cannot have spaces'); + } else { + $param = array(); + $param['number'] = $prob[$i]['number']; + $param['name'] = trim($_POST["problemname" . $prob[$i]['number']]); + $param['fake'] = 'f'; + $param['colorname'] = trim($_POST["colorname" . $prob[$i]['number']]); + $param['color'] = trim($_POST["color" . $prob[$i]['number']]); + DBNewProblem ($_SESSION["usertable"]["contestnumber"], $param); + } + ForceLoad("problem.php"); + } + } +} ?> <br> <script language="javascript"> @@ -221,6 +244,7 @@ if (isset($_POST["Submit3"]) && isset($_POST["problemnumber"]) && is_numeric($_P } } </script> +<form name="form0" enctype="multipart/form-data" method="post" action="problem.php"> <table width="100%" border=1> <tr> <td><b>Problem #</b></td> @@ -234,7 +258,6 @@ if (isset($_POST["Submit3"]) && isset($_POST["problemnumber"]) && is_numeric($_P <td><b>Color</b></td> </tr> <?php - $prob = DBGetFullProblemData($_SESSION["usertable"]["contestnumber"],true); for ($i=0; $i<count($prob); $i++) { echo " <tr>\n"; if($prob[$i]["fake"]!='t') { @@ -247,10 +270,15 @@ for ($i=0; $i<count($prob); $i++) { "')\">" . $prob[$i]["number"]; } echo "</a></td>\n"; + echo "<input type=hidden name=\"problemname" . $prob[$i]['number'] . "\" value=\"" . $prob[$i]["name"] . "\" />"; + echo " <td nowrap>" . $prob[$i]["name"] . "</td>\n"; + //echo " <td nowrap>"; + //echo "<input type=\"text\" name=\"problemname" . $prob[$i]['number'] . "\" value=\"" . $prob[$i]["name"] . "\" size=\"4\" maxlength=\"20\" />"; + //echo "</td>\n"; } else { echo " <td nowrap>" . $prob[$i]["number"] . " (fake)</td>\n"; + echo " <td nowrap>" . $prob[$i]["name"] . "</td>\n"; } - echo " <td nowrap>" . $prob[$i]["name"] . "</td>\n"; echo " <td nowrap>" . $prob[$i]["fullname"] . " </td>\n"; echo " <td nowrap>" . $prob[$i]["basefilename"] . " </td>\n"; if (isset($prob[$i]["descoid"]) && $prob[$i]["descoid"] != null && isset($prob[$i]["descfilename"])) { @@ -283,15 +311,20 @@ for ($i=0; $i<count($prob); $i++) { else echo " <td nowrap> </td>\n"; */ - if ($prob[$i]["color"]!="") { - echo " <td nowrap>" . $prob[$i]["colorname"] . - "<img title=\"".$prob[$i]["color"]."\" alt=\"".$prob[$i]["colorname"]."\" width=\"25\" src=\"" . - balloonurl($prob[$i]["color"]) . "\" /></td>\n"; - } else - echo " <td nowrap> </td>\n"; + echo " <td nowrap>"; + if($prob[$i]["fake"]!='t') { + if ($prob[$i]["color"]!="") { + echo "<img title=\"".$prob[$i]["color"]."\" alt=\"".$prob[$i]["colorname"]."\" width=\"25\" src=\"" . + balloonurl($prob[$i]["color"]) . "\" />\n"; + } + echo "<input type=\"text\" name=\"colorname" . $prob[$i]['number'] . "\" value=\"" . $prob[$i]["colorname"] . "\" size=\"10\" maxlength=\"100\" />"; + echo "<input type=\"text\" name=\"color" . $prob[$i]['number'] . "\" value=\"" . $prob[$i]["color"]. "\" size=\"6\" maxlength=\"6\" />"; + echo "<input type=\"submit\" name=\"SubmitProblem" . $prob[$i]["number"] . "\" value=\"Update\">"; + } else echo " "; + echo "</td>\n"; echo " </tr>\n"; } -echo "</table>"; +echo "</table></form>"; if (count($prob) == 0) echo "<br><center><b><font color=\"#ff0000\">NO PROBLEMS DEFINED</font></b></center>"; ?> diff --git a/src/admin/site.php b/src/admin/site.php index dd88d1c..b71d9c8 100644 --- a/src/admin/site.php +++ b/src/admin/site.php @@ -76,28 +76,30 @@ if (isset($_POST["Submit2"]) && $_POST["Submit2"] == "Start Now") { } ForceLoad("site.php?site=$site"); } -if (isset($_POST["SubmitDC"]) && $_POST["SubmitDC"] == "Delete ALL site clars") { +if (isset($_POST["SubmitDC"]) && $_POST["SubmitDC"] == "Delete ALL clars") { if ($_POST["confirmation"] == "confirm") { DBSiteDeleteAllClars ($_SESSION["usertable"]["contestnumber"], $site, $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); + DBSiteDeleteAllClars ($_SESSION["usertable"]["contestnumber"], $ct["contestmainsite"], + $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); } ForceLoad("site.php?site=$site"); } -if (isset($_POST["SubmitDR"]) && $_POST["SubmitDR"] == "Delete ALL site runs") { +if (isset($_POST["SubmitDR"]) && $_POST["SubmitDR"] == "Delete ALL runs") { if ($_POST["confirmation"] == "confirm") { DBSiteDeleteAllRuns ($_SESSION["usertable"]["contestnumber"], $site, $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); } ForceLoad("site.php?site=$site"); } -if (isset($_POST["SubmitDT"]) && $_POST["SubmitDT"] == "Delete ALL site tasks") { +if (isset($_POST["SubmitDT"]) && $_POST["SubmitDT"] == "Delete ALL tasks") { if ($_POST["confirmation"] == "confirm") { DBSiteDeleteAllTasks ($_SESSION["usertable"]["contestnumber"], $site, $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); } ForceLoad("site.php?site=$site"); } -if (isset($_POST["SubmitDB"]) && $_POST["SubmitDB"] == "Delete ALL site bkps") { +if (isset($_POST["SubmitDB"]) && $_POST["SubmitDB"] == "Delete ALL bkps") { if ($_POST["confirmation"] == "confirm") { DBSiteDeleteAllBkps ($_SESSION["usertable"]["contestnumber"], $site, $_SESSION["usertable"]["usernumber"], $_SESSION["usertable"]["usersitenumber"]); @@ -530,10 +532,10 @@ echo "):</td>"; <input type="submit" name="Logins" value="Enable logins" onClick="conf()"> <br><br><br> - <input type="submit" name="SubmitDC" value="Delete ALL site clars" onClick="conf2()"> - <input type="submit" name="SubmitDR" value="Delete ALL site runs" onClick="conf2()"> - <input type="submit" name="SubmitDT" value="Delete ALL site tasks" onClick="conf2()"> - <input type="submit" name="SubmitDB" value="Delete ALL site bkps" onClick="conf2()"> + <input type="submit" name="SubmitDC" value="Delete ALL clars" onClick="conf2()"> + <input type="submit" name="SubmitDR" value="Delete ALL runs" onClick="conf2()"> + <input type="submit" name="SubmitDT" value="Delete ALL tasks" onClick="conf2()"> + <input type="submit" name="SubmitDB" value="Delete ALL bkps" onClick="conf2()"> <?php } ?> diff --git a/src/admin/task.php b/src/admin/task.php index a1446ce..cf707bc 100644 --- a/src/admin/task.php +++ b/src/admin/task.php @@ -81,6 +81,9 @@ if (isset($_GET["done"]) && is_numeric($_GET["done"]) && isset($_GET["site"]) && if (($s=DBSiteInfo($_SESSION["usertable"]["contestnumber"],$_SESSION["usertable"]["usersitenumber"])) == null) ForceLoad("../index.php"); +if (trim($s["sitetasking"])!="") $s["sitetasking"].=",".$_SESSION["usertable"]["usersitenumber"]; +else $s["sitetasking"]=$_SESSION["usertable"]["usersitenumber"]; + $task = DBAllTasksInSites($_SESSION["usertable"]["contestnumber"], $s["sitetasking"], $order, true); for ($i=0; $i<count($task); $i++) { $st = $task[$i]["status"]; diff --git a/src/admin/user.php b/src/admin/user.php index 9085e45..466cb07 100644 --- a/src/admin/user.php +++ b/src/admin/user.php @@ -15,9 +15,6 @@ // 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 26/oct/2014 by cassio@ime.usp.br -// allow passwords to be changed by default -// require('header.php'); if (isset($_GET["site"]) && isset($_GET["user"]) && is_numeric($_GET["site"]) && is_numeric($_GET["user"]) && @@ -52,6 +49,7 @@ if (isset($_POST["username"]) && isset($_POST["userfullname"]) && isset($_POST[" $param['permitip'] = htmlspecialchars($_POST["userip"]); $param['contest'] = $_SESSION["usertable"]["contestnumber"]; $param['changepass']='t'; + if(isset($_POST['changepass']) && $_POST['changepass'] != 't') $param['changepass']='f'; /* $param['user'] = myhtmlspecialchars($_POST["usernumber"]); $param['site'] = myhtmlspecialchars($_POST["usersitenumber"]); @@ -66,13 +64,14 @@ if (isset($_POST["username"]) && isset($_POST["userfullname"]) && isset($_POST[" */ - $passcheck = htmlspecialchars($_POST["passwordo"]); + $passcheck = $_POST["passwordo"]; $a = DBUserInfo($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"], null, false); if(myhash($a['userpassword'] . session_id()) != $passcheck) { MSGError('Admin password is incorrect'); } else { if ($_POST["passwordn1"] == $_POST["passwordn2"]) { - $param['pass'] = bighexsub(htmlspecialchars($_POST["passwordn1"]),$a['userpassword']); + $param['pass'] = bighexsub($_POST["passwordn1"],$a['userpassword']); + while(strlen($param['pass']) < strlen($a['userpassword'])) $param['pass'] = '0' . $param['pass']; if($param['user'] != 1000) DBNewUser($param); } @@ -257,9 +256,11 @@ for ($i=0; $i < count($usr); $i++) { ($usr[$i]["usernumber"] != $_SESSION["usertable"]["usernumber"] || $usr[$i]["usersitenumber"] != $_SESSION["usertable"]["usersitenumber"])) echo " <td nowrap><a href=\"user.php?site=" . $usr[$i]["usersitenumber"] . "&user=" . - $usr[$i]["usernumber"] . "\">" . $usr[$i]["usernumber"] . "</a></td>\n"; + $usr[$i]["usernumber"] . "\">" . $usr[$i]["usernumber"] . "</a>"; else - echo " <td nowrap>" . $usr[$i]["usernumber"] . "</td>\n"; + echo " <td nowrap>" . $usr[$i]["usernumber"]; + if($usr[$i]['userenabled'] != 't' && $usr[$i]['userlastlogin'] < 1) echo "(inactive)"; + echo "</td>\n"; echo " <td nowrap>" . $usr[$i]["usersitenumber"] . "</td>\n"; echo " <td nowrap>" . $usr[$i]["username"] . " </td>\n"; @@ -473,6 +474,15 @@ echo $u["userdesc"]; } ?>" size="50" maxlength="300" /> </td> </tr> <tr> + <td width="35%" align=right>Allow password change:</td> + <td width="65%"> + <select name="changepass"> + <option <?php if(isset($u) && $u["changepassword"]) echo "selected"; ?> value="t">Yes</option> + <option <?php if(!isset($u) || !$u["changepassword"]) echo "selected"; ?> value="f">No</option> + </select> + </td> + </tr> + <tr> <td width="35%" align=right>Admin (this user) Password:</td> <td width="65%"> <input type="password" name="passwordo" value="" size="20" maxlength="200" /> @@ -33,28 +33,28 @@ function DB_lo_open($conn, $file, $mode) { else return pg_lo_open ($conn, $file, $mode); } -function DB_lo_read_tobrowser($contest,$id) { - $str = DB_lo_read($contest,$id); - echo $str; - return true; +function DB_lo_read_tobrowser($contest,$id,$c=null) { + $str = DB_lo_read($contest,$id,-1,$c); + echo $str; + return true; } -function DB_lo_read($contest,$id,$s=-1) { +function DB_lo_read($contest,$id,$s=-1,$c=null) { if (strcmp(phpversion(),'4.2.0')<0) { if($s<0) { $str=''; - while (($buf = pg_loread ($id, 100000)) != false) $str .= $buf; + while (($buf = pg_loread ($id, 1000000)) != false) $str .= $buf; } else $str = pg_loread ($id, $s); } else { if($s<0) { $str=''; - while (($buf = pg_lo_read ($id, 100000)) != false) $str .= $buf; + while (($buf = pg_lo_read ($id, 1000000)) != false) $str .= $buf; } else $str = pg_lo_read ($id, $s); } - if(($str2 = DB_unlock($contest,$str))===false) return $str; + if(($str2 = DB_unlock($contest,$str,$c))===false) return $str; return $str2; } function DB_unlock($contest,$str,$c=null) { @@ -245,9 +245,10 @@ function DBGetRow ($sql,$i,$c=null,$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; + DBClose($c); + LOGError("Unable to get row $i from a query ($txt). SQL=(" . $sql . ")"); + MSGError("Unable to get row from query ($txt)."); + exit; } return $a; } @@ -296,7 +297,7 @@ function DBcrc($contest,$id, $c=null) { // just to return a unique string that will not match any other... return "no-HASH-" . rand() . "-" . rand() . "-" . time(); } - $str = DB_lo_read($contest,$f); + $str = DB_lo_read($contest,$f,-1,$c); DB_lo_close($f); if($docommit) DBExec($c, "commit work", "DBcrc(commit)"); diff --git a/src/fclar.php b/src/fclar.php index 72364e8..2ac61fb 100644 --- a/src/fclar.php +++ b/src/fclar.php @@ -157,10 +157,38 @@ function DBUpdateClarC($contest, $usersite, $usernumber, $clarsite, $clarnumber, $time = time(); $t = $b["currenttime"]; - DBExec($c, "update clartable set clarstatus='$status', clarjudge=$usernumber, clarjudgesite=$usersite, " . - "claranswer='$answer', clardatediffans=$t, updatetime=".time()." " . - "where contestnumber=$contest and clarnumber=$clarnumber and clarsitenumber=$clarsite", - "DBUpdateClarC(update clar)"); + $theclar = DBRow($r,0); + if($type=="all" && $usersite != $theclar['clarsitenumber']) { + $param = $theclar; + $param['clarsitenumber'] = $usersite; + $param['usernumber'] = $usernumber; + $param['clarstatus'] = $status; + $param['clarjudge'] = $usernumber; + $param['clarjudgesite'] = $usersite; + $param['claranswer'] = $answer; + $param['clardatediffans'] = $t; + $param['updatetime'] = time(); + $param['contest'] = $contest; + if(DBNewClar($param, $c, false) !== false) { + if(DBClarDelete($clarnumber, $theclar['clarsitenumber'], $contest, $usernumber, $usersite, $c)) { + LOGInfo("CLAR number $clarnumber site $clarsite contest $contest: user " . $theclar['usernumber'] . " replaced"); + } else { + DBExec($c, "rollback work", "DBUpdateClarC(rollback promoted)"); + LOGError("CLAR number $clarnumber site $clarsite contest $contest should be promoted (delete)"); + MSGError("Clarification not update (error promoting it for answer all)"); + return false; + } + } else { + DBExec($c, "rollback work", "DBUpdateClarC(rollback promoted2)"); + LOGError("CLAR number $clarnumber site $clarsite contest $contest should be promoted (insert)"); + MSGError("Clarification not update (error2 promoting it for answer all)"); + return false; + } + } else + DBExec($c, "update clartable set clarstatus='$status', clarjudge=$usernumber, clarjudgesite=$usersite, " . + "claranswer='$answer', clardatediffans=$t, updatetime=".time()." " . + "where contestnumber=$contest and clarnumber=$clarnumber and clarsitenumber=$clarsite", + "DBUpdateClarC(update clar)"); DBExec($c, "commit work", "DBUpdateClarC(commit)"); LOGLevel("Clarification updated (clar=$clarnumber, site=$clarsite, contest=$contest, status=$status, " . @@ -202,28 +230,32 @@ function DBClarGiveUp($number,$site,$contest, $usernumber, $usersite) { } //seta o status como 'deleted' de uma clarification que estava sendo respondida. Recebe o numero da clar, //o numero do site e o numero do contest. Se nao conseguir retorna false. -function DBClarDelete($number,$site,$contest,$user,$usersite) { - $c = DBConnect(); - DBExec($c, "begin work", "DBClarDelete(transaction)"); - $r = DBExec($c, "select * from clartable as c where c.contestnumber=$contest and " . - "c.clarsitenumber=$site and c.clarnumber=$number for update", "DBClarDelete(get clar for update)"); - $n = DBnlines($r); - if ($n != 1) { - DBExec($c, "rollback work", "DBClarDelete(rollback)"); - LogLevel("Unable to delete a clar. " . - "(clar=$number, site=$site, contest=$contest)",1); - return false; - } +function DBClarDelete($number,$site,$contest,$user,$usersite,$c=null) { + $cw=false; + if($c == null) { + $c = DBConnect(); + DBExec($c, "begin work", "DBClarDelete(transaction)"); + $cw = true; + } + $r = DBExec($c, "select * from clartable as c where c.contestnumber=$contest and " . + "c.clarsitenumber=$site and c.clarnumber=$number for update", "DBClarDelete(get clar for update)"); + $n = DBnlines($r); + if ($n != 1) { + if($cw) DBExec($c, "rollback work", "DBClarDelete(rollback)"); + LOGError("Unable to delete a clar. " . + "(clar=$number, site=$site, contest=$contest)"); + return false; + } - DBExec($c, "update clartable set clarstatus='deleted', clarjudge=$user, clarjudgesite=$usersite, updatetime=" . - time(). " where contestnumber=$contest and clarnumber=$number and clarsitenumber=$site", - "DBClarDelete(update clar)"); - - DBExec($c, "commit work", "DBClarDelete(commit)"); - LOGLevel("Clarification deleted (clar=$number, site=$site, contest=$contest, user=$user(site=$usersite)).", 3); - return true; + DBExec($c, "update clartable set clarstatus='deleted', clarjudge=$user, clarjudgesite=$usersite, updatetime=" . + time(). " where contestnumber=$contest and clarnumber=$number and clarsitenumber=$site", + "DBClarDelete(update clar)"); + + if ($cw) DBExec($c, "commit work", "DBClarDelete(commit)"); + LOGInfo("Clarification deleted (clar=$number, site=$site, contest=$contest, user=$user(site=$usersite))."); + return true; } -function DBNewClar($param,$c=null) { +function DBNewClar($param,$c=null,$allowupdate=true) { 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['clarsitenumber']) && !isset($param['site'])) $param['site']=$param['clarsitenumber']; @@ -308,9 +340,13 @@ function DBNewClar($param,$c=null) { $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']; + if(!$allowupdate) { + if($cw) DBExec($c, "rollback work", "DBNewClar(rollback-allowupdate)"); + return false; + } + $insert=false; + $lr = DBRow($r,0); + $t = $lr['updatetime']; } $clarinc = $clarnumber - 1; } @@ -478,7 +514,7 @@ function DBOpenClarsSNS($contest,$site,$st,$order='clar') { "from clartable as c, problemtable as p " . "where c.contestnumber=$contest and p.contestnumber=c.contestnumber and " . "c.clarproblem=p.problemnumber"; - if ($site != "x") { + if (strpos($site,"x")===false) { $str = explode(",", $site); $sql .= " and (c.clarstatus='answeredall'"; for ($i=0;$i<count($str);$i++) { diff --git a/src/fcontest.php b/src/fcontest.php index f8f2cff..e61631b 100644 --- a/src/fcontest.php +++ b/src/fcontest.php @@ -125,6 +125,10 @@ CREATE TABLE \"sitetimetable\" ( $r = DBexec($c, "CREATE INDEX \"sitetimesite_index\" ON \"sitetimetable\" USING btree ". "(\"contestnumber\" int4_ops, \"sitenumber\" int4_ops)", "DBCreateSiteTimeTable(create site_index)"); } +// begin; update answertable set updatetime=EXTRACT(EPOCH FROM now()); +// begin; update langtable set updatetime=EXTRACT(EPOCH FROM now()); select * from langtable; +// begin; update problemtable set updatetime=EXTRACT(EPOCH FROM now()); select * from problemtable; + function DBDropUserTable() { $c = DBConnect(); $r = DBExec($c, "drop table \"usertable\"", "DBDropUserTable(drop table)"); @@ -298,8 +302,8 @@ function cleanuserdesc($a) { $inst = explode('[',$inst[1]); if(isset($inst[1])) { $inst2 = explode(',',trim($inst[1])); - $a['userflag'] = $inst2[0]; - if(isset($inst2[1])) $a['usersitename']=trim($inst2[1]); + $a['userflag'] = strtolower($inst2[0]); + if(isset($inst2[1])) $a['usersitename']=strtoupper(trim($inst2[1])); } } else { $a['userdesc']=trim($inst[1]); @@ -315,14 +319,26 @@ function DBDeleteUser($contest, $site, $user) { DBExec($c, "begin work"); DBExec($c, "lock table usertable"); $sql = "select * from usertable where usernumber=$user and usersitenumber=$site and " . - "contestnumber=$contest"; - $a = DBGetRow ($sql, 0); + "contestnumber=$contest for update"; + $a = DBGetRow ($sql, 0, $c); if ($a != null) { - $sql = "delete from usertable where usernumber=$user and usersitenumber=$site and " . + $sql = "update usertable set userenabled='f', userlastlogin=NULL, usersessionextra='', usersession='', updatetime=".time(). " where usernumber=$user and usersitenumber=$site and " . "contestnumber=$contest"; + // $sql = "delete from usertable where usernumber=$user and usersitenumber=$site and " . + // "contestnumber=$contest"; DBExec ($c, $sql); + $r = DBExec($c,"select runnumber as number, runsitenumber as site from runtable where contestnumber=$contest and usernumber=$user and runsitenumber=$site for update"); + $n = DBnlines($r); + for ($i=0;$i<$n;$i++) { + $a = DBRow($r,$i); + if(DBRunDelete($a["number"],$a["site"],$contest,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c) === false) { + DBExec($c, "rollback work"); + LOGLevel("User $user (site=$site,contest=$contest) could not be removed (run delete error).", 1); + return false; + } + } DBExec($c, "commit work"); - LOGLevel("User $user (site=$site,contest=$contest) removed.", 1); + LOGLevel("User $user (site=$site,contest=$contest) marked as inactive.", 1); return true; } else { DBExec($c, "rollback work"); @@ -490,11 +506,11 @@ function DBSiteDeleteAllClars ($contest, $site, $user, $usersite, $c=null) { DBExec($c, "lock table sitetable"); DBExec($c, "lock table clartable"); DBExec($c, "select * from sitetable where contestnumber=$contest and sitenumber=$site for update"); - $r = DBExec($c, "select * from clartable as c where c.contestnumber=$contest and " . - "c.clarsitenumber=$site for update"); - DBExec($c, "delete from clartable where contestnumber=$contest and clarsitenumber=$site"); + $r = DBExec($c, "select * from clartable as c where c.contestnumber=$contest " . + " and (c.clarsitenumber=$site or $site < 0) for update"); + DBExec($c, "delete from clartable where contestnumber=$contest and (clarsitenumber=$site or $site < 0)"); DBExec($c, "update sitetable set sitenextclar=0, updatetime=".time()." " . - "where contestnumber=$contest and sitenumber=$site"); + "where contestnumber=$contest and (sitenumber=$site or $site < 0)"); if($cw) { DBExec($c, "commit work"); LOGLevel("All Clarifications deleted (site=$site, contest=$contest, user=$user(site=$usersite)).", 3); @@ -512,10 +528,10 @@ function DBSiteDeleteAllTasks ($contest, $site, $user, $usersite,$c=null) { DBExec($c, "lock table tasktable"); DBExec($c, "select * from sitetable where contestnumber=$contest and sitenumber=$site for update"); $r = DBExec($c, "select * from tasktable as t where t.contestnumber=$contest and " . - "t.sitenumber=$site for update"); - DBExec($c, "delete from tasktable where contestnumber=$contest and sitenumber=$site"); + "(t.sitenumber=$site or $site < 0) for update"); + DBExec($c, "delete from tasktable where contestnumber=$contest and (sitenumber=$site or $site < 0)"); DBExec($c, "update sitetable set sitenexttask=0, updatetime=".time()." " . - "where contestnumber=$contest and sitenumber=$site"); + "where contestnumber=$contest and (sitenumber=$site or $site < 0)"); if($cw) { DBExec($c, "commit work"); LOGLevel("All Tasks deleted (site=$site, contest=$contest, user=$user(site=$usersite)).", 3); @@ -530,13 +546,13 @@ function DBSiteDeleteAllBkps ($contest, $site, $user, $usersite,$c=null) { DBExec($c, "begin work"); } DBExec($c, "lock table bkptable"); - $r = DBExec($c, "select bkpdata from bkptable where contestnumber=$contest and sitenumber=$site and bkpstatus='active'"); + $r = DBExec($c, "select bkpdata from bkptable where contestnumber=$contest and (sitenumber=$site or $site < 0) and bkpstatus='active'"); $n = DBnlines($r); for ($i=0;$i<$n;$i++) { $a = DBRow($r,$i); DB_lo_unlink($c,$a["bkpdata"]); } - DBExec($c, "delete from bkptable where contestnumber=$contest and sitenumber=$site"); + DBExec($c, "delete from bkptable where contestnumber=$contest and (sitenumber=$site or $site < 0)"); if($cw) { DBExec($c, "commit work"); LOGLevel("All Bkps deleted (site=$site, contest=$contest, user=$user(site=$usersite)).", 3); @@ -552,13 +568,13 @@ function DBSiteDeleteAllRuns ($contest, $site, $user, $usersite,$c=null) { } DBExec($c, "lock table sitetable"); DBExec($c, "lock table runtable"); - DBExec($c, "select * from sitetable where contestnumber=$contest and sitenumber=$site for update"); + DBExec($c, "select * from sitetable where contestnumber=$contest and (sitenumber=$site or $site < 0) for update"); $sql = "select * from runtable as r where r.contestnumber=$contest and " . "r.runsitenumber=$site"; $r = DBExec ($c, $sql . " for update"); - DBExec($c, "delete from runtable where contestnumber=$contest and runsitenumber=$site"); + DBExec($c, "delete from runtable where contestnumber=$contest and (runsitenumber=$site or $site < 0)"); DBExec($c, "update sitetable set sitenextrun=0, updatetime=".time()." " . - "where contestnumber=$contest and sitenumber=$site"); + "where contestnumber=$contest and (sitenumber=$site or $site < 0)"); if($cw) { DBExec($c, "commit work"); LOGLevel("All Runs deleted (site=$site, contest=$contest, user=$user(site=$usersite)).", 3); @@ -685,12 +701,12 @@ function DBUpdateSite ($param,$c=null) { $ret=1; if($updatetime > $a['updatetime']) { $ret=2; - if($sitenextrun==0) - DBSiteDeleteAllRuns($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); - if($sitenextclar==0) - DBSiteDeleteAllClars($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); - if($sitenexttask==0) - DBSiteDeleteAllTasks($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); + // if($sitenextrun==0) + // DBSiteDeleteAllRuns($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); + //if($sitenextclar==0) + // DBSiteDeleteAllClars($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); + //if($sitenexttask==0) + // DBSiteDeleteAllTasks($contestnumber,$sitenumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"],$c); $sql = "update sitetable set sitename='$sitename', "; if ($sitepermitlogins!="") $sql .= "sitepermitlogins='$sitepermitlogins', "; @@ -1179,11 +1195,12 @@ function DBUserUpdate($contest, $site, $user, $username, $userfull, $userdesc, $ else $temp = $a["userpassword"]; $lentmp = strlen($temp); $temp = bighexsub($passn, $temp); - if($lentmp > strlen($temp)) - $newpass = '0' . $temp; - else - $newpass = substr($temp, strlen($temp)-$lentmp); - + if($lentmp > strlen($temp)) { + $newpass = '0' . $temp; + while(strlen($newpass) < $lentmp) $newpass = '0' . $newpass; + } else { + $newpass = substr($temp, strlen($temp)-$lentmp); + } $c = DBConnect(); DBExec($c, "begin work"); DBExec($c, "lock table usertable"); @@ -1291,11 +1308,12 @@ function DBNewUser($param, $c=null) { $r = DBExec($c, "select * from sitetable where sitenumber=$site and contestnumber=$contest", "DBNewUser(get site)"); $n = DBnlines ($r); if($n == 0) { - DBExec ($c, "rollback work","DBNewUser(no-site)"); - MSGError("DBNewUser param error: site $site does not exist"); - return false; + if($cw) + DBExec ($c, "rollback work","DBNewUser(no-site)"); + MSGError("DBNewUser param error: site $site does not exist"); + return false; } - if($pass != myhash("") && $type != "admin" && $changepass != "t") $pass='!'.$pass; + if($pass != myhash("") && $type != "admin" && $changepass != "t" && substr($pass,0,1) != "!") $pass='!'.$pass; $r = DBExec($c, "select * from usertable where username='$username' and usernumber!=$user and ". "usersitenumber=$site and contestnumber=$contest", "DBNewUser(get user)"); $n = DBnlines ($r); @@ -1307,11 +1325,12 @@ function DBNewUser($param, $c=null) { if ($a == null) { $ret=2; $sql = "select * from sitetable where sitenumber=$site and contestnumber=$contest"; - $aa = DBGetRow ($sql, 0); + $aa = DBGetRow ($sql, 0, $c); if($aa==null) { + if($cw) DBExec ($c, "rollback work"); - MSGError("Site $site does not exist"); - return false; + MSGError("Site $site does not exist"); + return false; } $sql = "insert into usertable (contestnumber, usersitenumber, usernumber, username, usericpcid, userfullname, " . "userdesc, usertype, userenabled, usermultilogin, userpassword, userpermitip) values " . @@ -1343,11 +1362,13 @@ function DBNewUser($param, $c=null) { } } } else { - DBExec ($c, "rollback work"); - LOGLevel ("Update problem for user $user (site=$site,contest=$contest) (maybe username already in use).",1); - MSGError ("Update problem for user $user, site $site (maybe username already in use)."); - return false; + if($cw) + DBExec ($c, "rollback work"); + LOGLevel ("Update problem for user $user (site=$site,contest=$contest) (maybe username already in use).",1); + MSGError ("Update problem for user $user, site $site (maybe username already in use)."); + return false; } + if($cw) DBExec($c, "commit work"); return $ret; } diff --git a/src/fextdata.php b/src/fextdata.php index 8dfb134..070031a 100644 --- a/src/fextdata.php +++ b/src/fextdata.php @@ -15,7 +15,6 @@ // 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 24/oct/2017 by cassio@ime.usp.br function makeurlhttps($siteurl) { if(substr($siteurl,0,7) == 'http://') @@ -24,10 +23,10 @@ function makeurlhttps($siteurl) { $siteurl = 'https://' . $siteurl; if(substr($siteurl,strlen($siteurl)-1,1) != '/') $siteurl .= '/'; - return $siterul; + return $siteurl; } -function scoretransfer($putname, $localsite, $timeo=5) { +function scoretransfer($putname, $localsite, $timeo=60) { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; $logstr=''; @@ -66,8 +65,10 @@ function scoretransfer($putname, $localsite, $timeo=5) { $tmp = explode(' ',$ct['contestmainsiteurl']); if(count($tmp) >= 3) { $remotesite[count($remotesite)] = $ct['contestmainsiteurl']; - } - } + } else $logstr .= "Main site URL is invalid\n"; + } else $logstr .= "Main site URL not defined\n"; + } else { + $logstr .= "Error to load contest data\n"; } for($i = 0; $i < count($remotesite); $i++) { @@ -81,7 +82,9 @@ function scoretransfer($putname, $localsite, $timeo=5) { // LOGError("url=" .$siteurl . "index.php?getsessionid=1"); $opts = array(); $opts['http']['timeout'] = $timeo; - $context = stream_context_create($opts); + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $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"; @@ -95,14 +98,17 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'GET', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\n" ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $ok = @file_get_contents($siteurl . "index.php?name=${user}&password=${res}&action=transfer", 0, $context); @@ -138,7 +144,7 @@ function scoretransfer($putname, $localsite, $timeo=5) { @rename($file, $privatedir . $ds . 'remotescores' . $ds . $bn); } $zip->close(); - LOGError("scoretransfer: download OK"); + LOGInfo("scoretransfer: download OK"); $logstr .= "download OK from $siteurl\n"; } else { $logstr .= "reading failed from $siteurl (zip open error)\n"; @@ -164,15 +170,18 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $s = @file_get_contents($siteurl . "site/putfile.php", 0, $context); @@ -184,7 +193,7 @@ function scoretransfer($putname, $localsite, $timeo=5) { $logstr .= "timeout at full upload to $siteurl\n"; } else { if(strpos($s,'SCORE UPLOADED OK') !== false) { - LOGError("scoretransfer: upload OK"); + LOGInfo("scoretransfer: upload OK"); $logstr .= "upload of score to $siteurl OK\n"; } else { LOGError("scoretransfer: upload failed (" . $s . ")"); @@ -200,15 +209,17 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $s = @file_get_contents($siteurl . "site/putfilesuper.php", 0, $context); @@ -221,12 +232,12 @@ function scoretransfer($putname, $localsite, $timeo=5) { continue; } else { if(strpos($s,'SCORE UPLOADED OK') !== false) { - LOGError("scoretransfer: upload full OK"); - $logstr .= 'upload of full score to $siteurl OK\n'; + LOGInfo("scoretransfer: upload full OK"); + $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 . ')'; + $logstr .= "upload of full score to $siteurl failed (" . $s . ")\n"; } } } @@ -235,10 +246,11 @@ function scoretransfer($putname, $localsite, $timeo=5) { } -function getMainXML($contest,$timeo=5,$upd=false) { +function getMainXML($contest,$timeo=60,$upd=false) { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; - + $logstr = ''; + // $logstr .= "A: " . now() . "\n" if(is_readable('/etc/boca.conf')) { $pif=parse_ini_file('/etc/boca.conf'); $bocaproxy = @trim($pif['proxy']); @@ -252,28 +264,33 @@ function getMainXML($contest,$timeo=5,$upd=false) { $bocaproxy = ""; $bocaproxypass = ""; } - + // $logstr .= "AA: " . now() . "\n" $privatedir = $_SESSION['locr'] . $ds . "private"; $c = DBConnect(); - if ($c==null) return false; + if ($c==null) { + $logstr .= "local database connection problem\n"; + return $logstr; + } $r = DBExec($c, "select * from contesttable where contestnumber=$contest"); if (DBnLines($r)==0) { - echo "Unable to find the contest $contest in the database.\n"; + $logstr .= "Unable to find the contest $contest in the database.\n"; LOGError("Unable to find the contest $contest in the database."); - return false; + return $logstr; } $ct = DBRow($r,0); $localsite = $ct["contestlocalsite"]; $mainsite = $ct["contestmainsite"]; if(trim($ct['contestmainsiteurl']) == '') { - return false; + $logstr .= "Main site URL not defined\n"; + return $logstr; } $sitedata = explode(' ',$ct['contestmainsiteurl']); if(count($sitedata) < 3) { LOGError("getMainXML: invalid mainsiteurl entry"); - return false; + $logstr .= "Main site URL is invalid\n"; + return $logstr; } if(count($sitedata) == 3 || $upd) { $updatetime=0; @@ -286,17 +303,19 @@ function getMainXML($contest,$timeo=5,$upd=false) { // LOGError("url=" .$siteurl . "index.php?getsessionid=1"); $opts = array(); $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Connecting to ". $siteurl . "\n"; + $logstr .= "Connecting to ". $siteurl . " (updatetime=" . $updatetime . ")\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"; + $logstr .= "timeout at connection\n"; LOGError("getMainXML: timeout at get session id for $siteurl"); - return false; + return $logstr; } $user = trim($sitedata[1]); $res = myhash( myhash (trim($sitedata[2])) . $sess); @@ -304,31 +323,39 @@ function getMainXML($contest,$timeo=5,$upd=false) { 'http' => array( 'method' => 'GET', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\n" ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Authorizing\n"; + $logstr .= "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"; + $logstr .= "timeout at authorization\n"; LOGError("getMainXML: timeout at login for $siteurl"); - return false; + return $logstr; } + // $logstr .= "AAA: " . now() . "\n" $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]))); + $logstr .= "Generating local data for site [$localsite] at time [$updatetime]\n"; + $data = generateSiteXML($contest, $localsite, $updatetime-30, $localsite); + $logstr .= $data[1]; + // $logstr .= $s; + $data = encryptData($data[0], myhash(trim($sitedata[2])),false); + // $logstr .= "AB: " . now() . "\n" $data_url = http_build_query(array('xml' => $data, 'updatetime' => ($updatetime-30) )); @@ -337,64 +364,75 @@ function getMainXML($contest,$timeo=5,$upd=false) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Transferring data\n"; + $logstr .= "Transferring data to main server\n"; try { $s = @file_get_contents($siteurl . "site/getsite.php", 0, $context); } catch(Exception $e) { $s=false; } + // $logstr .= "ABB: " . now() . "\n" if($s===false) { - echo "timeout at transferring\n"; + $logstr .= "timeout at transferring\n"; LOGError("getMainXML: timeout at transfer for $siteurl"); - return false; + return $logstr; } - $chstr = "<!-- <OK> -->\n"; + $chstr = "<!-- <OK> --><!-- "; if(strpos($s,$chstr) !== false) { - echo "Transfer succeeded\n"; + $logstr .= "Transfer succeeded\n"; LOGInfo("xmltransfer: OK"); } else { - echo "Transfer error (" . $s . ")\n"; + $logstr .= "Transfer error (" . $s . ")\n"; LOGError("xmltransfer: failed (" . $s . ")"); + $chstr = "<!-- <NOTOK> --><!-- "; } - echo "Processing received data\n"; + $logstr .= "Processing received data from main server\n"; $s = substr($s, strpos($s, $chstr) + strlen($chstr)); + $s = substr($s, 0, strpos($s, " -->")); // LOGError("string: " . substr($s,0,50)); - $s = decryptData($s,myhash (trim($sitedata[2])),'xml from main not ok'); + $s = decryptData($s,myhash(trim($sitedata[2])),'xml from main not ok'); + // $logstr .= "ABBB: " . now() . "\n" if(strtoupper(substr($s,0,5)) != "<XML>") { - echo "Data corrupted\n"; - return false; + $logstr .= "Data corrupted\n"; + return $logstr; } - echo "Importing data to local server\n"; - if(importFromXML($s, $contest, $localsite, false, 1+$ct['updatetime'])) { + $logstr .= "Importing data to local server\n"; + $resp = importFromXML($s, $contest, $localsite, false, 1+$ct['updatetime'], $mainsite); + // $logstr .= "AC: " . now() . "\n" + $logstr .= $resp[1]; + if($resp[0]) { $str = $sitedata[0] . ' ' . $sitedata[1] . ' ' . $sitedata[2] . ' ' . $ti; $ti = 2+$ct['updatetime']; $param = array('contestnumber' => $contest, 'mainsiteurl' => $str, 'updatetime' => $ti); DBUpdateContest ($param, null); - return true; + return $logstr; } else { - echo "Importing error\n"; + $logstr .= "Importing error\n"; LOGError("error importing xml"); } } else { - echo "Transfer error (" . $ok . ")\n"; - LOGError("xmltransfer: failed (" . $ok . ")"); + $logstr .= "Transfer init connection error (" . $ok . ")\n"; + LOGError("xmltransfer: init connection failed (" . $ok . ")"); } - return false; + return $logstr; } -function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { +function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0,$mainsite=-1) { LOGInfo("importFromXML: contest $contest site $site tomain $tomain"); + $logstr = ''; if($tomain) $serv='Main'; else $serv='Local'; $data = implode("",explode("\n",$ar)); $parser = xml_parser_create(''); @@ -405,15 +443,15 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { // print_r($tags); // print_r($values); $conn = DBConnect(); - if ($conn==null) return false; - DBExec($conn,"begin work","importFromXML(begin)"); + if ($conn==null) return array(false, $logstr); + //DBExec($conn,"begin work","importFromXML(begin)"); // 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"; + $logstr .= "$serv - error finding contest $contest \n"; LOGError("importFromXML: Unable to find the contest $contest in the database."); // DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } $ct = DBRow($r,0); @@ -446,105 +484,107 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { if(count($param) < 2) continue; unset($param['number']); - if(!$tomain && $table == "contesttable") { + if($table == "contesttable") { + if($tomain) continue; if($uptime > 0) $param['updatetime']=$uptime; if(($ret=DBUpdateContest ($param, $conn))) { if($ret==2) { - echo "$serv - Contest " . $param["contestnumber"] . " updated\n"; + $logstr .= "$serv - Contest " . $param["contestnumber"] . " updated\n"; LOGInfo("importFromXML: Contest " . $param["contestnumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["contestnumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["contestnumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["contestnumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } // LOGInfo("importFromXML: $key params " .print_r( $param,true)); - if(!$tomain && $table == "answertable") { + if($table == "answertable") { + if($tomain) continue; if(($ret=DBNewAnswer ($contest, $param, $conn))) { if($ret==2) { - echo "$serv - Answer " . $param["answernumber"] . " updated\n"; + $logstr .= "$serv - Answer " . $param["answernumber"] . " updated\n"; LOGInfo("importFromXML: Answer " . $param["answernumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["answernumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["answernumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["answernumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } - if(!$tomain && $table == "langtable") { + if($table == "langtable") { + if($tomain) continue; if(($ret=DBNewLanguage ($contest,$param, $conn))) { if($ret==2) { - echo "$serv - Language " . $param['langnumber'] ." updated\n"; + $logstr .= "$serv - Language " . $param['langnumber'] ." updated\n"; LOGInfo("importFromXML: Language " . $param['langnumber'] ." updated"); } } else { - echo "$serv - error to update $table ". $param['langnumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['langnumber'] . "\n"; LOGError("importFromXML: error to update $table ". $param['langnumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } - if(!$tomain && $table == "problemtable") { + if($table == "problemtable") { + if($tomain) continue; if(($ret=DBNewProblem ($contest,$param, $conn))) { if($ret==2) - echo "$serv - Problem " . $param['problemnumber'] ." updated\n"; + $logstr .= "$serv - Problem " . $param['problemnumber'] ." updated\n"; LOGInfo("importFromXML: Problem " . $param['problemnumber'] ." updated"); } else { - echo "$serv - error to update $table ". $param['problemnumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['problemnumber'] . "\n"; LOGError("importFromXML: error to update $table " . $param['problemnumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } if(isset($param['usersitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['usersitenumber']; 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']); + if(!isset($param['sitenumber']) || ($param['sitenumber'] != $site && ($param['sitenumber'] != $mainsite || $tomain))) { + $logstr .= "$serv - site mismatch should be [$site] and is [" . $param['sitenumber'] . "]\n"; + LOGError("importFromXML: site mismatch should be [$site] and is [" . $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"); - return false; - } - if(($ret=DBUpdateSite($param, $conn))) { + DBNewSite($contest, $conn, $param); + if(($ret=DBUpdateSite($param, $conn)) !== false) { if($ret==2) { - echo "$serv - Site " . $param["sitenumber"] . " updated\n"; + $logstr .= "$serv - Site " . $param["sitenumber"] . " updated\n"; LOGInfo("importFromXML: Site " . $param["sitenumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["sitenumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["sitenumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["sitenumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } if($tomain && $table == "sitetimetable") { if(!DBUpdateSiteTime($contest, $param, $firsttimetime, $conn)) { - echo "$serv - error to update $table \n"; + $logstr .= "$serv - error to update $table \n"; LOGError("importFromXML: error to update $table"); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } else { LOGInfo("importFromXML: SiteTime updated"); } @@ -553,60 +593,60 @@ 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"; + $logstr .= "$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"; + $logstr .= "$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"); - return false; + return array(false, $logstr); } } if($table == "tasktable") { if(($ret=DBNewTask ($param, $conn))) { if($ret==2) { - echo "$serv - Task " . $param['tasknumber']."/".$param['sitenumber']." updated\n"; + $logstr .= "$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"; + $logstr .= "$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"); - return false; + return array(false, $logstr); } } if($table == "clartable") { if(($ret=DBNewClar ($param, $conn))) { if($ret==2) { - echo "$serv - Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated\n"; + $logstr .= "$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"; + $logstr .= "$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"); - return false; + return array(false, $logstr); } } if($table == "runtable") { - if(($ret=DBNewRun ($param, $conn))) { + if(($ret=DBNewRun ($param, $conn, $tomain))) { if($ret==2) { - echo "$serv - Run " . $param['runnumber'] ."/".$param['sitenumber']." updated\n"; + $logstr .= "$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"; + $logstr .= "$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"); - return false; + return array(false, $logstr); } } } @@ -615,30 +655,68 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { } if($conn != null) DBExec($conn,"commit work","importFromXML(commit)"); - return true; + return array(true, $logstr); } -function genSQLs($contest, $site, $updatetime) { +function genSQLs($contest, $site, $updatetime, $mainsite=1) { $sql = array(); $sql['contesttable']="select contestnumber, contestname, conteststartdate, contestduration, contestlastmileanswer," . "contestlastmilescore, contestpenalty, contestmaxfilesize, contestmainsite, contestkeys " . "from contesttable where contestnumber=$contest"; // and updatetime >= $updatetime"; - $sql['sitetable']="select * from sitetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; - $sql['answertable']="select * from answertable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; - $sql['langtable']="select * from langtable where contestnumber=$contest and updatetime >= $updatetime"; - $sql['problemtable']="select * from problemtable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['sitetable']="select " . + "contestnumber, " . + "sitenumber, " . + "siteip, " . + "sitename, " . + "siteactive, " . + "sitepermitlogins, " . + "sitelastmileanswer, " . + "sitelastmilescore, " . + "siteduration, " . + "siteautoend, " . + "sitejudging, " . + "sitetasking, " . + "siteglobalscore, " . + "sitescorelevel, " . + "sitemaxtask, " . + "sitechiefname, " . + "siteautojudge, " . + "sitemaxruntime, " . + "sitemaxjudgewaittime, " . + "updatetime " . + " from sitetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; + if($site != $mainsite) { + $sql['answertable']="select * from answertable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['langtable']="select * from langtable where contestnumber=$contest and updatetime >= $updatetime"; + $sql['problemtable']="select " . + "contestnumber, " . + "problemnumber, " . + "problemname, " . + "problemfullname, " . + "problembasefilename, " . + "probleminputfilename, " . + "probleminputfile, " . + "probleminputfilehash, " . + "fake, " . + //"problemcolorname, " . + //"problemcolor, " . + "updatetime" . + " from problemtable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$mainsite and updatetime >= $updatetime"; + } else + $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$site and updatetime >= $updatetime"; $sql['sitetimetable']="select * from sitetimetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; - $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$site and updatetime >= $updatetime"; - $sql['clartable']="select * from clartable where contestnumber=$contest and clarsitenumber=$site and updatetime >= $updatetime"; + $sql['clartable']="select * from clartable where contestnumber=$contest and (clarsitenumber=$site or clarsitenumber=$mainsite) and updatetime >= $updatetime"; $sql['runtable']="select * from runtable where contestnumber=$contest and runsitenumber=$site and updatetime >= $updatetime"; $sql['tasktable']="select * from tasktable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; return $sql; } -function generateSiteXML($contest,$site,$updatetime) { - $sql = genSQLs($contest, $site, $updatetime); +function generateSiteXML($contest,$site,$updatetime, $mainsite=1) { + $sql = genSQLs($contest, $site, $updatetime, $mainsite); $c = DBConnect(); $str = "<XML>\n"; + $logstr = ''; if ($c==null) return null; DBExec($c, "begin work"); foreach($sql as $kk => $vv) { @@ -646,13 +724,15 @@ function generateSiteXML($contest,$site,$updatetime) { if (!is_array($meta)) return null; $r = DBExec ($c, $vv, "generateSiteXML($kk)"); $n = DBnLines ($r); + if($n > 0) + $logstr .= "$kk has $n records to update\n"; for($i=0; $i<$n; $i++) { $atual = DBRow($r,$i); $str .= "<" . $kk . ">\n"; foreach($atual as $key => $val) { if($meta[$key]['type'] == 'oid' && $val != '') { if (($lo = DB_lo_open ($c, $val, "r")) !== false) { - $str .= " <" . $key . ">" . base64_encode("base64:" . base64_encode(DB_lo_read($contest,$lo))) . "</" . $key . ">\n"; + $str .= " <" . $key . ">" . base64_encode("base64:" . base64_encode(DB_lo_read($contest,$lo,-1,$c))) . "</" . $key . ">\n"; DB_lo_close($lo); } else { LOGError("large object ($key,$val) not readable"); @@ -667,6 +747,6 @@ function generateSiteXML($contest,$site,$updatetime) { $str .= "</XML>\n"; DBExec($c,"commit work","generateSiteXML(commit)"); LOGInfo("xml data generated for contest $contest site $site at time $updatetime"); - return $str; + return array($str,$logstr); } diff --git a/src/filedownload.php b/src/filedownload.php index 92de694..6b56ca9 100644 --- a/src/filedownload.php +++ b/src/filedownload.php @@ -74,7 +74,7 @@ if ($_GET["oid"]>=0) { header ("Content-Disposition: attachment; filename=" . basename($fname)); ob_end_flush(); - if (DB_lo_read_tobrowser ($_SESSION["usertable"]["contestnumber"],$lo) === false) { + if (DB_lo_read_tobrowser ($_SESSION["usertable"]["contestnumber"],$lo,$c) === false) { echo "<html><head><title>Download Page</title>"; DBExec($c, "rollback work"); LOGError ("Unable to download file (" . basename($fname) . ")"); diff --git a/src/filewindow.php b/src/filewindow.php index 594e483..64bd1ec 100644 --- a/src/filewindow.php +++ b/src/filewindow.php @@ -79,7 +79,7 @@ if ($_GET["oid"]>=0) { echo $msg ."\n\n\n"; } // echo "<pre>\n"; - if (DB_lo_read_tobrowser ($_SESSION["usertable"]["contestnumber"],$lo) === false) { + if (DB_lo_read_tobrowser ($_SESSION["usertable"]["contestnumber"],$lo,$c) === false) { header ("Content-type: text/html"); echo "<html><head><title>View Page</title>"; DBExec($c, "rollback work"); diff --git a/src/fproblem.php b/src/fproblem.php index a66f62c..c14a61b 100644 --- a/src/fproblem.php +++ b/src/fproblem.php @@ -457,6 +457,8 @@ function DBGetProblems($contest,$showanyway=false) { if ($b["currenttime"] < 0 && !$showanyway) return array(); + if(($c = DBContestInfo($contest)) == null) return array(); + if (time() < $c['conteststartdate'] && !$showanyway) return array(); $c = DBConnect(); $sql = "select distinct p.problemnumber as number, p.problemname as problem, " . diff --git a/src/frun.php b/src/frun.php index 20fb616..d920e74 100644 --- a/src/frun.php +++ b/src/frun.php @@ -289,18 +289,21 @@ function DBRunGiveUp($number,$site,$contest,$usernumber,$usersite) { "newstatus=$newstatus", 3); return true; } -function DBRunDelete($number,$site,$contest,$user,$usersite) { - $c = DBConnect(); - DBExec($c, "begin work", "DBRunDelete(transaction)"); +function DBRunDelete($number,$site,$contest,$user,$usersite,$cc=null) { + if($cc == null) { + $c = DBConnect(); + DBExec($c, "begin work", "DBRunDelete(transaction)"); + } else $c = $cc; $sql = "select * from runtable as r where r.contestnumber=$contest and " . "r.runsitenumber=$site and r.runnumber=$number"; $r = DBExec ($c, $sql . " for update", "DBRunDelete(get run for update)"); $n = DBnlines($r); if ($n != 1) { - DBExec($c, "rollback work", "DBRunDelete(rollback)"); - LogLevel("Unable to delete a run. ". - "(run=$number, site=$site, contest=$contest)",1); - return false; + if($cc == null) + DBExec($c, "rollback work", "DBRunDelete(rollback)"); + LogLevel("Unable to delete a run. ". + "(run=$number, site=$site, contest=$contest)",1); + return false; } $temp = DBRow($r, 0); @@ -320,8 +323,8 @@ function DBRunDelete($number,$site,$contest,$user,$usersite) { ": " . $p[0]["fullname"]), "", "", "t", $p[0]["color"], $p[0]["colorname"], $c); } } - - DBExec($c, "commit work", "DBRunDelete(commit)"); + if($cc == null) + DBExec($c, "commit work", "DBRunDelete(commit)"); LOGLevel("Run deleted (run=$number, site=$site, contest=$contest, user=$user(site=$usersite)).", 3); return true; } @@ -585,7 +588,7 @@ function DBOpenRunsSNS($contest,$site,$st,$order='run') { "r.runproblem=p.problemnumber and l.contestnumber=r.contestnumber and r.usernumber=u.usernumber and r.runsitenumber=u.usersitenumber and " . "l.langnumber=r.runlangnumber and a.answernumber=r.runanswer and " . "a.contestnumber=r.contestnumber"; - if ($site != "x") { + if (strpos($site,"x")===false) { $str = explode(",", $site); $sql .= " and (r.runsitenumber=-1"; for ($i=0;$i<count($str);$i++) { @@ -641,7 +644,7 @@ function DBOpenRunsSNS($contest,$site,$st,$order='run') { $a[$i] = DBRow($r,$i); return $a; } -function DBNewRun($param,$c=null) { +function DBNewRun($param,$c=null,$allowinsert=true) { 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['runsitenumber']) && !isset($param['site'])) $param['site']=$param['runsitenumber']; @@ -757,9 +760,20 @@ function DBNewRun($param,$c=null) { $oid1 = $lr['autostdout']; if(isset($lr['autostderr'])) $oid2 = $lr['autostderr']; + } else { + if(!$allowinsert) { + if($cw) + DBExec($c, "rollback work", "DBNewRun(rollback-noinsert)"); + return -1; + } } $runinc = $runnumber - 1; } else { + if(!$allowinsert) { + if($cw) + DBExec($c, "rollback work", "DBNewRun(rollback-noinsert)"); + return -1; + } $runnumber = $a["nextrun"] + 1; DBExec($c, "update sitetable set sitenextrun=$runnumber" . " where sitenumber=$site and contestnumber=$contest and sitenextrun<$runnumber", "DBNewRun(update site)"); @@ -913,8 +927,8 @@ function DBNewRun($param,$c=null) { "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(isset($oldoid1) && is_numeric($oldoid1)) DB_lo_unlink($c,$oldoid1); + if(isset($oldoid2) && is_numeric($oldoid2)) DB_lo_unlink($c,$oldoid2); } if($cw) DBExec($c, "commit work", "DBNewRun(commit-update)"); } diff --git a/src/fscore.php b/src/fscore.php index 2c57695..ec03091 100644 --- a/src/fscore.php +++ b/src/fscore.php @@ -265,7 +265,7 @@ function DBRecentNews($contest, $site, $verifylastmile, $minutes=3) { "u.usernumber as usernumber, p.problemnumber as problemnumber, p.problemname, (r.rundatediffans>$ta) as fut, min(r.rundatediff) as time from " . "runtable as r, answertable as a, problemtable as p, usertable as u where r.runanswer=a.answernumber and " . "p.contestnumber=$contest and a.contestnumber=$contest and r.usernumber = u.usernumber and u.usertype='team' and " . - "p.problemnumber=r.runproblem and r.contestnumber=$contest and r.runsitenumber=$site and u.userenabled='t' and " . + "p.problemnumber=r.runproblem and r.contestnumber=$contest and r.runsitenumber=$site and u.userenabled='t' and (not r.runstatus ~ 'deleted') and " . "r.rundatediff>=$taa and r.rundatediff<=$tf and r.rundatediff<=$ta and u.contestnumber=$contest and u.usersitenumber=$site and " . "((a.yes='t' and r.rundatediffans<=$ta) or (r.rundatediffans>$ta)) " . "group by a.yes,p.problemcolor,p.problemcolorname,p.problemname,u.userfullname,u.usernumber,p.problemnumber,fut order by time", "DBRecentNews(get runs)"); diff --git a/src/ftask.php b/src/ftask.php index c54503a..643554e 100644 --- a/src/ftask.php +++ b/src/ftask.php @@ -15,7 +15,6 @@ // 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 13/aug/2017 by cassio@ime.usp.br function DBDropTaskTable() { $c = DBConnect(); $r = DBExec($c, "drop table \"tasktable\"", "DBDropTaskTable(drop table)"); @@ -226,7 +225,7 @@ function DBOpenTasksSNS($contest,$site,$st,$order='task',$adm=false) { "usertable as u " . "where t.contestnumber=$contest and u.contestnumber=t.contestnumber and ". "u.usernumber=t.usernumber and u.usersitenumber=t.sitenumber"; - if ($site != "x") { + if (strpos($site,"x")===false) { $str = explode(",", $site); $sql .= " and (t.sitenumber=-1"; for ($i=0;$i<count($str);$i++) { diff --git a/src/globals.php b/src/globals.php index 1d449c1..fbbecce 100755 --- a/src/globals.php +++ b/src/globals.php @@ -146,6 +146,7 @@ function revertupdatebocafile($dirboca, $t) { return $ok; } function cleardir($dir,$cddir=true,$secure=true,$removedir=true) { + if(file_exists($dir)) { if(is_dir($dir)) { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; @@ -166,6 +167,7 @@ function cleardir($dir,$cddir=true,$secure=true,$removedir=true) { file_put_contents($dir,str_repeat('XXXXXXXXXX',10000)); @unlink($dir); } + } } // gen random alphanum string @@ -318,12 +320,13 @@ function ValidSession() { // $_SESSION["usertable"]["usersession"] != session_id()) return(FALSE); // } else { if($_SESSION["usertable"]["usersession"] != session_id()) return(FALSE); - // } - if($_SESSION["usertable"]["usermultilogin"] == 't') return(TRUE); - + // } $tmp = DBUserInfo($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"]); + if($tmp['usersession']=='') return(FALSE); + if($_SESSION["usertable"]["usermultilogin"] == 't') return(TRUE); + if ($tmp["userip"] != $gip) return(FALSE); //cassiopc: they may create a problem here too... return(TRUE); } diff --git a/src/judge/runeditchief.php b/src/judge/runeditchief.php index c538dca..04395ba 100644 --- a/src/judge/runeditchief.php +++ b/src/judge/runeditchief.php @@ -132,9 +132,11 @@ for ($i=0;$i<count($b);$i++) { echo $b[$i]["inputfilename"] . "</a>"; echo " <a href=\"#\" class=menu style=\"font-weight:bold\" onClick=\"window.open('../filewindow.php?". filedownload($b[$i]["inputoid"], $b[$i]["inputfilename"]) ."', 'View$i - INPUT','width=680,height=600,scrollbars=yes,resizable=yes')\">view</a> "; - - echo "<b>Sol:</b><a href=\"../filedownload.php?". filedownload($b[$i]["soloid"], $b[$i]["solfilename"]) . "\">"; - echo $b[$i]["solfilename"] . "</a>"; + + if(isset($b[$i]["soloid"])) { + echo "<b>Sol:</b><a href=\"../filedownload.php?". filedownload($b[$i]["soloid"], $b[$i]["solfilename"]) . "\">"; + echo $b[$i]["solfilename"] . "</a>"; + } echo " <a href=\"#\" class=menu style=\"font-weight:bold\" onClick=\"window.open('../filewindow.php?". filedownload($b[$i]["soloid"], $b[$i]["solfilename"]) ."', 'View$i - CORRECT OUTPUT','width=680,height=600,scrollbars=yes,resizable=yes')\">view</a>"; } diff --git a/src/optionlower.php b/src/optionlower.php index b3f6055..9be827b 100644 --- a/src/optionlower.php +++ b/src/optionlower.php @@ -21,7 +21,7 @@ // todos os usuarios require_once("globals.php"); -if(!ValidSession()) { +if(!ValidSession()) { // || $_SESSION["usertable"]["usertype"] == 'team') { InvalidSession("optionlower.php"); ForceLoad("index.php"); } @@ -32,16 +32,16 @@ if (isset($_GET["username"]) && isset($_GET["userfullname"]) && isset($_GET["use $username = myhtmlspecialchars($_GET["username"]); $userfullname = myhtmlspecialchars($_GET["userfullname"]); $userdesc = myhtmlspecialchars($_GET["userdesc"]); - $passwordo = myhtmlspecialchars($_GET["passwordo"]); - $passwordn = myhtmlspecialchars($_GET["passwordn"]); + $passwordo = $_GET["passwordo"]; + $passwordn = $_GET["passwordn"]; DBUserUpdate($_SESSION["usertable"]["contestnumber"], - $_SESSION["usertable"]["usersitenumber"], - $_SESSION["usertable"]["usernumber"], - $_SESSION["usertable"]["username"], // $username, but users should not change their names - $userfullname, - $userdesc, - $passwordo, - $passwordn); + $_SESSION["usertable"]["usersitenumber"], + $_SESSION["usertable"]["usernumber"], + $_SESSION["usertable"]["username"], // $username, but users should not change their names + $userfullname, + $userdesc, + $passwordo, + $passwordn); ForceLoad("option.php"); } @@ -56,18 +56,19 @@ $a = DBUserInfo($_SESSION["usertable"]["contestnumber"], <script language="JavaScript"> function computeHASH() { - var username, userdesc, userfull, passHASHo, passHASHn1, passHASHn2; + var username, userdesc, userfull, passHASHo, passHASHn; if (document.form1.passwordn1.value != document.form1.passwordn2.value) return; + if (document.form1.passwordn1.value == document.form1.passwordo.value) return; username = document.form1.username.value; userdesc = document.form1.userdesc.value; userfull = document.form1.userfull.value; - passMDo = js_myhash(js_myhash(document.form1.passwordo.value)+'<?php echo session_id(); ?>'); - passMDn = bighexsoma(js_myhash(document.form1.passwordn2.value),js_myhash(document.form1.passwordo.value)); + passHASHo = js_myhash(js_myhash(document.form1.passwordo.value)+'<?php echo session_id(); ?>'); + passHASHn = bighexsoma(js_myhash(document.form1.passwordn2.value),js_myhash(document.form1.passwordo.value)); document.form1.passwordo.value = ' '; document.form1.passwordn1.value = ' '; document.form1.passwordn2.value = ' '; - document.location='option.php?username='+username+'&userdesc='+userdesc+'&userfullname='+userfull+'&passwordo='+passMDo+'&passwordn='+passMDn; + document.location='option.php?username='+username+'&userdesc='+userdesc+'&userfullname='+userfull+'&passwordo='+passHASHo+'&passwordn='+passHASHn; } </script> diff --git a/src/private/autojudging.php b/src/private/autojudging.php index 2a8b1ed..e44aaeb 100755 --- a/src/private/autojudging.php +++ b/src/private/autojudging.php @@ -1,7 +1,7 @@ <?php //////////////////////////////////////////////////////////////////////////////// //BOCA Online Contest Administrator -// Copyright (C) 2003-2013 by BOCA Development Team (bocasystem@gmail.com) +// Copyright (C) 2003-2017 by BOCA Development Team (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 @@ -15,7 +15,6 @@ // 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 29/aug/2017 by cassio@ime.usp.br $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; @@ -157,6 +156,8 @@ while(42) { DBExec($c, "commit", "Autojudging(exportcommit)"); continue; } + cleardir($dir . $ds . "problemdatalocal"); + cleardir($dir . $ds . "problemdata"); if(is_readable($cache . $ds . $run["inputoid"] . "." . $run["inputname"])) { DBExec($c, "commit", "Autojudging(exportcommit)"); echo "Getting problem package file from local cache: " . $cache . $ds . $run["inputoid"] . "." . $run["inputname"] . "\n"; @@ -164,6 +165,25 @@ while(42) { file_put_contents($dir . $ds . $run["inputname"], decryptData($s,$key)); $basename=$basenames[$run['inputoid']. "." . $run["inputname"]]; } else { + $flocal = '/root/icpc-latam-packages/' . trim($run["problemname"]) . ".zip"; //cassiopc: HARDCODED FOR ICPC 2017 + if(!is_readable($flocal)) $flocal = '/root/icpc-latam-packages/' . trim($run["problemname"]) . ".ZIP"; + if(!is_readable($flocal)) $flocal = ''; + if($flocal != '') { + echo "Getting problem package file from local version: " . $flocal . "\n"; + $zip = new ZipArchive; + if ($zip->open($flocal) === true) { + $zip->extractTo($dir . $ds . "problemdatalocal"); + $zip->close(); + } else { + DBExec($c, "rollback work", "Autojudging(zipfailed)"); + echo "Failed to unzip the package file -- please check the problem package (maybe it is encrypted?)\n"; + DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (1)"); + cleardir($dir . $ds . "problemdata"); + continue; + } + } + + @unlink($dir . $ds . $run["inputname"]); echo "Downloading problem package file from db into: " . $dir . $ds . $run["inputname"] . "\n"; if(DB_lo_export($contest,$c, $run["inputoid"], $dir . $ds . $run["inputname"]) === false) { DBExec($c, "rollback work", "Autojudging(rollback-input)"); @@ -176,7 +196,7 @@ while(42) { @chmod($dir . $ds . $run["inputname"], 0600); @chown($dir . $ds . $run["inputname"],"root"); - echo "Problem package downloaded -- running init scripts to obtain limits and other information\n"; + echo "Problem package obtained -- running init scripts to obtain limits and other information\n"; $zip = new ZipArchive; if ($zip->open($dir . $ds . $run["inputname"]) === true) { $zip->extractTo($dir . $ds . "problemdata"); @@ -187,12 +207,15 @@ while(42) { cleardir($dir . $ds . "problemdata"); continue; } - if(($info=@parse_ini_file($dir . $ds . "problemdata" . $ds . "description" . $ds . 'problem.info'))===false) { - echo "Problem content missing (description/problem.info) -- please check the problem package\n"; - DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (2)"); - cleardir($dir . $ds . "problemdata"); - continue; - } + if(($info=@parse_ini_file($dir . $ds . "problemdatalocal" . $ds . "description" . $ds . 'problem.info'))===false) { + if(($info=@parse_ini_file($dir . $ds . "problemdata" . $ds . "description" . $ds . 'problem.info'))===false) { + echo "Problem content missing (description/problem.info) -- please check the problem package\n"; + DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (2)"); + cleardir($dir . $ds . "problemdata"); + cleardir($dir . $ds . "problemdatalocal"); + continue; + } + } else echo "Problem info obtained from local package file\n"; if(isset($info['descfile'])) $descfile=trim(sanitizeFilename($info['descfile'])); $basename=trim(sanitizeFilename($info['basename'])); @@ -201,6 +224,7 @@ while(42) { echo "Problem content missing (description/problem.info) -- please check the problem package\n"; DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (3)"); cleardir($dir . $ds . "problemdata"); + cleardir($dir . $ds . "problemdatalocal"); continue; } $basenames[$run['inputoid']. "." . $run["inputname"]]=$basename; @@ -208,11 +232,18 @@ while(42) { echo "Problem content missing (limits) -- please check the problem package\n"; DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (4)"); cleardir($dir . $ds . "problemdata"); + cleardir($dir . $ds . "problemdatalocal"); continue; } - chdir($dir . $ds . "problemdata" . $ds . "limits"); + $pd = 'problemdata'; + if(is_dir($dir . $ds . "problemdatalocal" . $ds . "limits")) { + echo "Obtaining limits from local package file\n"; + $pd = 'problemdatalocal'; + } + chdir($dir . $ds . $pd . $ds . "limits"); $limits[$basename]=array(); - foreach(glob($dir . $ds . "problemdata" . $ds . "limits" .$ds . '*') as $file) { + $cont=false; + foreach(glob($dir . $ds . $pd . $ds . "limits" .$ds . '*') as $file) { chmod($file,0700); $ex = escapeshellcmd($file); $ex .= " >stdout 2>stderr"; @@ -223,38 +254,50 @@ while(42) { if($retval != 0) { echo "Error running script -- please check the problem package\n"; DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: problem package file is invalid (5)"); - cleardir($dir . $ds . "problemdata"); - continue; + $cont=true; + break; } $limits[$basename][basename($file)] = file('stdout',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } - $cont=false; - foreach(glob($dir . $ds . "problemdata" . $ds . "tests" .$ds . '*') as $file) { - chdir($dir . $ds . "problemdata" . $ds . "tests"); - chmod($file,0700); - $ex = escapeshellcmd($file); - $ex .= " >stdout 2>stderr"; - @unlink('stdout'); - @unlink('stderr'); - echo "Executing TEST SCRIPT " . $ex . " at " . getcwd() . "\n"; - if(system($ex, $retval)===false) $retval=-1; - if($retval != 0) { - echo "Error running test script -- please check the problem package or your installation\n"; - echo "=====stderr======\n"; - echo file_get_contents('stderr'); - echo "\n=====stdout======\n"; - echo file_get_contents('stdout'); - echo "\n===========\n"; - DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: internal test script failed (" . $file . ")"); - $cont=true; - break; + if(!$cont) { + $pd = 'problemdata'; + if(is_dir($dir . $ds . "problemdatalocal" . $ds . "tests")) { + echo "Running test scripts from local package file\n"; + $pd = 'problemdatalocal'; } + foreach(glob($dir . $ds . $pd . $ds . "tests" .$ds . '*') as $file) { + chdir($dir . $ds . $pd . $ds . "tests"); + chmod($file,0700); + $ex = escapeshellcmd($file); + $ex .= " >stdout 2>stderr"; + @unlink('stdout'); + @unlink('stderr'); + echo "Executing TEST SCRIPT " . $ex . " at " . getcwd() . "\n"; + if(system($ex, $retval)===false) $retval=-1; + if($retval != 0) { + echo "Error running test script -- please check the problem package or your installation\n"; + echo "=====stderr======\n"; + echo file_get_contents('stderr'); + echo "\n=====stdout======\n"; + echo file_get_contents('stdout'); + echo "\n===========\n"; + DBGiveUpRunAutojudging($contest, $site, $number, $ip, "error: internal test script failed (" . $file . ")"); + $cont=true; + break; + } + } + } + if(is_dir($dir . $ds . "problemdatalocal" . $ds . "output")) { + echo "Using scripts and inputs/outputs from local package file\n"; + @copy($flocal, $dir . $ds . $run["inputname"]); } + $s = file_get_contents($dir . $ds . $run["inputname"]); cleardir($dir . $ds . "problemdata"); - if($cont) + cleardir($dir . $ds . "problemdatalocal"); + if($cont) { + echo "Aborting judging because of issues in the package\n"; continue; - - $s = file_get_contents($dir . $ds . $run["inputname"]); + } file_put_contents($cache . $ds . $run["inputoid"] . "." . $run["inputname"], encryptData($s,$key)); } diff --git a/src/private/conf.php b/src/private/conf.php index 71956c0..c35fb6a 100644 --- a/src/private/conf.php +++ b/src/private/conf.php @@ -20,7 +20,7 @@ function globalconf() { $conf["dbencoding"]="UTF8"; $conf["dbclientenc"]="UTF8"; - $conf['doenc']=FALSE; + $conf['doenc']=false; $conf["dblocal"]="false"; // use unix socket to connect? $conf["dbhost"]="localhost"; diff --git a/src/private/score.sep b/src/private/score.sep index b4798d9..7863dde 100644 --- a/src/private/score.sep +++ b/src/private/score.sep @@ -17,3 +17,4 @@ Peru 108 PuertoRico 123 RepDominicana 121 Venezuela 103 +TEST 99 diff --git a/src/site/getsite.php b/src/site/getsite.php index 08235a0..c29581c 100644 --- a/src/site/getsite.php +++ b/src/site/getsite.php @@ -33,20 +33,24 @@ if($ct["contestlocalsite"]==$ct["contestmainsite"]) { $u = DBUserInfo($_SESSION["usertable"]["contestnumber"], $_SESSION["usertable"]["usersitenumber"], $_SESSION["usertable"]["usernumber"],null,false); if(isset($_POST['xml'])) { // $fp=fopen('/tmp/aaa',"w"); fwrite($fp,$_POST['xml']); fclose($fp); - $s = decryptData(rawurldecode($_POST['xml']),$u["userpassword"],'xml from local not ok'); + $s = decryptData($_POST['xml'],$u["userpassword"],'xml from local not ok'); // $fp=fopen('/tmp/aaa1',"w"); fwrite($fp,$s); fclose($fp); if(strtoupper(substr($s,0,5)) != "<XML>") { echo "<!-- <ERROR8> ".session_id() . " -->\n"; + echo "<!-- <NOTOK> -->"; } else { - if(importFromXML($s,$_SESSION["usertable"]["contestnumber"],$fromsite,true)) - echo "<!-- <OK> -->\n"; + $resp = importFromXML($s,$_SESSION["usertable"]["contestnumber"],$fromsite,true,0,-1); + echo $resp[1]; + if($resp[0]) + echo "<!-- <OK> -->"; else - echo "<!-- <NOTOK> -->\n"; + echo "<!-- <NOTOK> -->"; } } if(isset($_POST['updatetime']) && is_numeric($_POST['updatetime'])) { - $xml = generateSiteXML($_SESSION["usertable"]["contestnumber"],$fromsite,$_POST['updatetime']); - echo encryptData($xml,$u["userpassword"]); + $xml = generateSiteXML($_SESSION["usertable"]["contestnumber"],$fromsite,$_POST['updatetime'],$ct["contestmainsite"]); + echo "<!-- " . encryptData($xml[0],$u["userpassword"],false) . " -->"; + // echo "MAIN\n" . $xml[1]; } } else { echo "<!-- <ERROR3> ".session_id() . " -->\n"; diff --git a/src/staff/header.php b/src/staff/header.php index 21f93f9..10b0338 100644 --- a/src/staff/header.php +++ b/src/staff/header.php @@ -69,11 +69,11 @@ echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" href=score.php>Score</a></td>\n"; echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" href=run.php>Runs</a></td>\n"; -echo " <td align=center width=\"20%\"><a href=\"#\" class=menu style=\"font-weight:bold\" onClick=\"window.open('report/stat.php', ". - "'Problem Statistics','width=800,height=600,scrollbars=yes,toolbar=yes,menubar=yes,". - "resizable=yes')\">Statistics</a></td>\n"; +//echo " <td align=center width=\"20%\"><a href=\"#\" class=menu style=\"font-weight:bold\" onClick=\"window.open('report/stat.php', ". +// "'Problem Statistics','width=800,height=600,scrollbars=yes,toolbar=yes,menubar=yes,". +// "resizable=yes')\">Statistics</a></td>\n"; -echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" href=option.php>Options</a></td>\n"; +//echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" href=option.php>Options</a></td>\n"; echo " <td align=center width=\"20%\"><a class=menu style=\"font-weight:bold\" href=../index.php>Logout</a></td>\n"; echo " </tr>\n"; echo "</table>\n"; diff --git a/src/system/header.php b/src/system/header.php index 75d0fca..ab5a522 100644 --- a/src/system/header.php +++ b/src/system/header.php @@ -55,7 +55,7 @@ echo "</table>\n"; echo "<table border=0 width=\"100%\" align=center>\n"; echo " <tr>\n"; echo " <td align=center><a class=menu style=\"font-weight:bold\" href=contest.php>Contest</a></td>\n"; -echo " <td align=center><a class=menu style=\"font-weight:bold\" href=importxml.php>Import</a></td>\n"; +//echo " <td align=center><a class=menu style=\"font-weight:bold\" href=importxml.php>Import</a></td>\n"; echo " <td align=center><a class=menu style=\"font-weight:bold\" href=option.php>Options</a></td>\n"; echo " <td align=center><a class=menu style=\"font-weight:bold\" href=../index.php>Logout</a></td>\n"; echo " </tr>\n"; diff --git a/src/team/run.php b/src/team/run.php index 61d3a84..077b76c 100644 --- a/src/team/run.php +++ b/src/team/run.php @@ -15,7 +15,6 @@ // 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 12/aug/2017 by cassio@ime.usp.br require('header.php'); $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; @@ -290,7 +289,7 @@ $runtmp = $_SESSION["locr"] . $ds . "private" . $ds . "runtmp" . $ds . "run-cont "-site". $_SESSION["usertable"]["usersitenumber"] . "-user" . $_SESSION["usertable"]["usernumber"] . ".php"; $redo = TRUE; if(!isset($_SESSION['forceredo']) || $_SESSION['forceredo']==false) { - $actualdelay = 30; + $actualdelay = 15; if(file_exists($runtmp)) { if(isset($strtmp) || (($strtmp = file_get_contents($runtmp,FALSE,NULL,-1,1000000)) !== FALSE)) { list($d) = sscanf($strtmp,"%*s %d"); diff --git a/src/version b/src/version index 07c98a8..e466e5e 100644 --- a/src/version +++ b/src/version @@ -1 +1 @@ -boca-1.5.12 +boca-1.5.13 diff --git a/src/versionnum.php b/src/versionnum.php index 560983d..a833695 100644 --- a/src/versionnum.php +++ b/src/versionnum.php @@ -1,5 +1,5 @@ <?php -$BOCAVERSION='boca-1.5.12'; +$BOCAVERSION='boca-1.5.13'; $YEAR='2017'; ?> |