From aea57cb508ccd1f7b543922eb3222f737c73e5ad Mon Sep 17 00:00:00 2001 From: Cassio de Campos Date: Sat, 21 Oct 2017 18:12:01 +0100 Subject: update of boca --- src/admin/misc.php | 44 +++++++++++++++++++++++++-- src/globals.php | 87 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 108 insertions(+), 23 deletions(-) (limited to 'src') 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';       - + + + Not implemented\n"; +if (isset($_POST["Submit4"]) && $_POST["Submit4"] == "Clear cache") { + if(fixbocadir(dirname(__DIR__))) + echo "
Done
\n"; + else echo "
Error (likely permission/ownership issues)
\n"; +} +if (isset($_POST["Submit4"]) && $_POST["Submit5"] == "Full clear") { + if(fixbocadir(dirname(__DIR__),true)) + echo "
Done
\n"; + else echo "
Error (likely permission/ownership issues)
\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 "
Cannot updated because of major version difference
"; + else { + if(updatebocafile($dir, $dir . $ds . "private" . $ds . "newboca." . $t, $t) === false) + echo "
Error updating BOCA
\n"; + else { + echo "
Updated to " . $BOCAVERSION . "\n
\n"; + } + } + } else { + echo "
Downloaded file corrupted
"; + } + } else echo "
Download error
"; } $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)); -- cgit v1.2.3