aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/admin/misc.php44
-rwxr-xr-xsrc/globals.php87
2 files changed, 108 insertions, 23 deletions
diff --git a/src/admin/misc.php b/src/admin/misc.php
index 3e4a4d8..8000841 100644
--- a/src/admin/misc.php
+++ b/src/admin/misc.php
@@ -39,7 +39,9 @@ require 'header.php';
<input type="submit" name="Submit1" value="Transfer" onClick="conf()"> &nbsp;
<input type="submit" name="Submit2" value="Transfer all" onClick="conf()"> &nbsp;
<input type="submit" name="Submit3" value="Transfer scores"> &nbsp;
- <input type="submit" name="Submit4" value="Update BOCA" onClick="conf2()">
+ <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()">
</center>
</form>
<?php
@@ -60,8 +62,44 @@ if (isset($_POST["Submit2"]) && $_POST["Submit2"] == "Transfer all") {
if (isset($_POST["Submit3"]) && $_POST["Submit3"] == "Transfer scores") {
$doscore=true;
}
-if (isset($_POST["Submit4"]) && $_POST["Submit4"] == "Update BOCA") {
- echo "<pre>Not implemented</pre>\n";
+if (isset($_POST["Submit4"]) && $_POST["Submit4"] == "Clear cache") {
+ if(fixbocadir(dirname(__DIR__)))
+ echo "<pre>Done</pre>\n";
+ else echo "<pre>Error (likely permission/ownership issues)</pre>\n";
+}
+if (isset($_POST["Submit4"]) && $_POST["Submit5"] == "Full clear") {
+ if(fixbocadir(dirname(__DIR__),true))
+ echo "<pre>Done</pre>\n";
+ else echo "<pre>Error (likely permission/ownership issues)</pre>\n";
+}
+if (isset($_POST["Submit4"]) && $_POST["Submit6"] == "Update BOCA") {
+ require('..' . $ds . 'versionnum.php');
+ $curv = split('.',$BOCAVERSION);
+ $dir = dirname(__DIR__);
+ fixbocadir($dir);
+ $tmpfname = tempnam(sys_get_temp_dir());
+ if(($str = @file_get_contents('http://www.bombonera.org/updateboca.zip')) !== false) {
+ @file_put_contents($tmpfname, $str);
+ $t = mytime();
+ $zip = new ZipArchive;
+ if ($zip->open($tmpfname) === true) {
+ $zip->extractTo($dir . $ds . "private" . $ds . "newboca." . $t);
+ $zip->close();
+ require($dir . $ds . "private" . $ds . "newboca." . $t . $ds . 'versionnum.php');
+ $newv = split('.',$BOCAVERSION);
+ if($curv[0] != $newv[0] || $curv[1] != $newv[1])
+ echo "<pre>Cannot updated because of major version difference</pre>";
+ else {
+ if(updatebocafile($dir, $dir . $ds . "private" . $ds . "newboca." . $t, $t) === false)
+ echo "<pre>Error updating BOCA</pre>\n";
+ else {
+ echo "<pre>Updated to " . $BOCAVERSION . "\n</pre>\n";
+ }
+ }
+ } else {
+ echo "<pre>Downloaded file corrupted</pre>";
+ }
+ } else echo "<pre>Download error</pre>";
}
$privatedir = $_SESSION['locr'] . $ds . "private";
$remotedir = $_SESSION['locr'] . $ds . "private" . $ds . "remotescores";
diff --git a/src/globals.php b/src/globals.php
index 4c387fc..851b135 100755
--- a/src/globals.php
+++ b/src/globals.php
@@ -40,8 +40,69 @@ function filedownload($oid,$fname,$msg='') {
if($msg != '') $str .= "&msg=" . rawurlencode($msg);
return $str;
}
+function dirrec($dir, $func, $dirPermissions, $filePermissions, $avoid=array()) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $dp = opendir($dir);
+ while($file = readdir($dp)) {
+ if (($file == ".") || ($file == "..") || $file in_array($avoid))
+ continue;
+ $fullPath = $dir . $ds . $file;
+ if(is_dir($fullPath)) {
+ $func($fullPath, $dirPermissions);
+ dirrec($fullPath, $func, $dirPermissions, $filePermissions);
+ } else {
+ $func($fullPath, $filePermissions);
+ }
+ }
+ closedir($dp);
+}
-function cleardir($dir,$cddir=true,$secure=false) {
+function fixbocadir($dir,$full=false) {
+ if(is_dir($dir)) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $u = posix_getpwuid(fileowner($dir));
+ $un = $u['name'];
+ $ug = $u['gid'];
+ if(@file_put_contents($dir . $ds . 'private' . $ds . '.htaccess', "Deny from all\n") === false) return false;
+ if(@touch($dir . $ds . 'private' . $ds . 'remotescores' . $ds . 'otherservers') === false) return false;
+ if($full)
+ $d = array('problemtmp','runtmp','scoretmp','remotescores','remotescoresfull','comp','logexternal','runslog');
+ else
+ $d = array('problemtmp','runtmp','scoretmp');
+ foreach($d as $a) cleardir($a,true,true,false);
+ dirrec($dir, chown, $un, $un);
+ dirrec($dir, chgrp, $ug, $ug);
+ dirrec($dir, chmod, "0755", "0644", array('private'));
+ dirrec($dir . $ds . 'private', chmod, "0750", "0640");
+ return true;
+ } else {
+ return false;
+ }
+}
+function updatebocafile($dirboca, $dirz, $t) {
+ $ok = true;
+ if(is_dir($dirz)) {
+ $ds = DIRECTORY_SEPARATOR;
+ if($ds=="") $ds = "/";
+ $d = @opendir($dirz);
+ while (($file = @readdir($d)) !== false) {
+ if($file != '.' && $file != '..')
+ if(updatebocafile($dirboca . $ds . $file, $dirz . $ds . $file, $t) === false) $ok=false;
+ }
+ @closedir($d);
+ @cleardir($dirz);
+ } else {
+ if(is_file($dirboca)) {
+ copy($dirboca, $dirboca . '.' . $t . '.old');
+ chmod($dirboca . '.' . $t . '.old', "0400");
+ }
+ if(rename($dirz, $dirboca) === false) $ok=false;
+ }
+ return $ok;
+}
+function cleardir($dir,$cddir=true,$secure=true,$removedir=true) {
if(is_dir($dir)) {
$ds = DIRECTORY_SEPARATOR;
if($ds=="") $ds = "/";
@@ -51,26 +112,12 @@ function cleardir($dir,$cddir=true,$secure=false) {
}
$d = @opendir($dir);
while (($file = @readdir($d)) !== false) {
- if(!is_dir($dir . $ds . $file)) {
- if($secure)
- file_put_contents($dir . $ds . $file,str_repeat('XXXXXXXXXX',10000));
- @unlink($dir . $ds . $file);
- }
- else {
- if($file != '.' && $file != '..') {
- $cdir1 = $dir . $ds . $file;
- $d1 = @opendir($cdir1);
- while (($file1 = @readdir($d1)) !== false)
- if(!is_dir($cdir1 . $ds . $file1)) {
- if($secure)
- file_put_contents($cdir1 . $ds . $file1,str_repeat('XXXXXXXXXX',10000));
- @unlink($cdir1 . $ds . $file1);
- }
- @rmdir($cdir1);
- }
- }
+ if($file != '.' && $file != '..')
+ cleardir($dir . $ds . $file, false, $secure, true);
}
- @rmdir($dir);
+ @closedir($d);
+ if($removedir)
+ @rmdir($dir);
} else {
if($secure)
file_put_contents($dir,str_repeat('XXXXXXXXXX',10000));