HEX
Server: Apache/2
System: Linux server1c 2.6.32-042stab145.3 #1 SMP Thu Jun 11 14:05:04 MSK 2020 x86_64
User: jandjware (1008)
PHP: 8.2.23
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: /home/jandjware/public_html/images/unziper.php
<?php
/**
 * The Unzipper extracts .zip or .rar archives and .gz files on webservers.
 * It also supports creating Zip archives.
 *
 * @author Andreas Tasch, at[tec], attec.at
 * @license GNU GPL v3
 * @version 0.1.0
*/
@set_time_limit(600);

define('VERSION', '0.1.0');
$timestart = microtime(TRUE);
$GLOBALS['status'] = array();
$unzipper = new Unzipper;

//Unzip Archive
if(isset($_POST['dounzip'])){
 //check if an archive was selected for unzipping
 $archive = isset($_POST['zipfile']) ? strip_tags($_POST['zipfile']) :'';
 $destination = isset($_POST['extpath']) ? strip_tags($_POST['extpath']) :'';
 $unzipper->prepareExtraction($archive, $destination);
}

//Create zip archive
if(isset($_POST['dozip'])){
 $zippath = !empty($_POST['zippath']) ? strip_tags($_POST['zippath']) :'.';
 // Resulting zipfile e.g. zipper--2016-07-23--11-55.zip
 $zipfile = 'zipper-'. date('Y-m-d--H-i') .'.zip';
 Zipper::zipDir($zippath, $zipfile);
}

$timeend = microtime(TRUE);
$time = $timeend - $timestart;

/**
 * Class Unzipper
 */
class Unzipper {
 public $localdir ='.';
 public $zipfiles = array();
 public function __construct(){
 //read directory and pick .zip and .gz files
 if($dh = opendir($this->localdir)){
 while (($file = readdir($dh)) !== FALSE){
 if(pathinfo($file, PATHINFO_EXTENSION)==='zip' || pathinfo($file, PATHINFO_EXTENSION)==='gz' || pathinfo($file, PATHINFO_EXTENSION)==='rar') $this->zipfiles[] = $file;
 }
 closedir($dh);
 if(!empty($this->zipfiles)) $GLOBALS['status'] = array('info'=>'.zip or .gz or .rar files found, ready for extraction');
 else $GLOBALS['status'] = array('info'=>'No .zip or .gz or rar files found. So only zipping functionality available.');
 }
 }

 // Prepare and check zipfile for extraction
 public function prepareExtraction($archive, $destination){
 // Determine paths.
 if(empty($destination)) $extpath = $this->localdir;
 else {
 $extpath = $this->localdir .'/'. $destination;
 // todo move this to extraction function
 if(!is_dir($extpath)) mkdir($extpath);
 }
 //allow only local existing archives to extract
 if(in_array($archive, $this->zipfiles)) self::extract($archive, $extpath);
 }

 //Checks file extension and calls suitable extractor functions
 public static function extract($archive, $destination){
 $ext = pathinfo($archive, PATHINFO_EXTENSION);
 switch($ext){
 case 'zip':
 self::extractZipArchive($archive, $destination);
 break;
 case 'gz':
 self::extractGzipFile($archive, $destination);
 break;
 case 'rar':
 self::extractRarArchive($archive, $destination);
 break;
 }
 }

 //Decompress/extract a zip archive using ZipArchive
 public static function extractZipArchive($archive, $destination){
 // Check if webserver supports unzipping.
 if(!class_exists('ZipArchive')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP version does not support unzip functionality.');
 return;
 }
 $zip = new ZipArchive;
 // Check if archive is readable.
 if($zip->open($archive)===TRUE){
 // Check if destination is writable
 if(is_writeable($destination .'/')){
 $zip->extractTo($destination);
 $zip->close();
 $GLOBALS['status'] = array('success'=>'Files unzipped successfully');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Directory not writeable by webserver.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Cannot read .zip archive.');
 }

 // Decompress a .gz File
 public static function extractGzipFile($archive, $destination){
 // Check if zlib is enabled
 if(!function_exists('gzopen')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP has no zlib support enabled.');
 return;
 }
 $filename = pathinfo($archive, PATHINFO_FILENAME);
 $gzipped = gzopen($archive, 'rb');
 $file = fopen($filename, 'w');
 while($string = gzread($gzipped, 4096)) fwrite($file, $string, strlen($string));
 gzclose($gzipped);
 fclose($file);
 // Check if file was extracted.
 if(file_exists($destination .'/'. $filename)) $GLOBALS['status'] = array('success'=>'File unzipped successfully.');
 else $GLOBALS['status'] = array('error'=>'Error unzipping file.');
 }

 //Decompress/extract a Rar archive using RarArchive
 public static function extractRarArchive($archive, $destination){
 // Check if webserver supports unzipping.
 if(!class_exists('RarArchive')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP version does not support .rar archive functionality. <a class="info" href="http://php.net/manual/en/rar.installation.php" target="_blank">How to install RarArchive</a>');
 return;
 }
 // Check if archive is readable.
 if($rar = RarArchive::open($archive)){
 // Check if destination is writable
 if(is_writeable($destination .'/')){
 $entries = $rar->getEntries();
 foreach ($entries as $entry){
 $entry->extract($destination);
 }
 $rar->close();
 $GLOBALS['status'] = array('success'=>'Files extracted successfully.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Directory not writeable by webserver.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Cannot read .rar archive.');
 }
}

/**
 * Class Zipper
 *
 * Copied and slightly modified from http://at2.php.net/manual/en/class.ziparchive.php#110719
 * @author umbalaconmeogia
 */
class Zipper {
 /**
 * Add files and sub-directories in a folder to zip file.
 *
 * @param string $folder
 * Path to folder that should be zipped.
 *
 * @param ZipArchive $zipFile
 * Zipfile where files end up.
 *
 * @param int $exclusiveLength
 * Number of text to be exclusived from the file path.
 */
 private static function folderToZip($folder, &$zipFile, $exclusiveLength){
 $handle = opendir($folder);
 while(FALSE !== $f = readdir($handle)){
 // Check for local/parent path or zipping file itself and skip.
 if($f !='.' && $f != '..' && $f != basename(__FILE__)){
 $filePath = $folder .'/'. $f;
 // Remove prefix from file path before add to zip.
 $localPath = substr($filePath, $exclusiveLength);
 if(is_file($filePath)) $zipFile->addFile($filePath, $localPath);
 else if(is_dir($filePath)){
 // Add sub-directory.
 $zipFile->addEmptyDir($localPath);
 self::folderToZip($filePath, $zipFile, $exclusiveLength);
 }
 }
 }
 closedir($handle);
 }
 /**
 * Zip a folder (including itself).
 * Usage:
 * Zipper::zipDir('path/to/sourceDir', 'path/to/out.zip');
 *
 * @param string $sourcePath
 * Relative path of directory to be zipped.
 *
 * @param string $outZipPath
 * Relative path of the resulting output zip file.
 */
 public static function zipDir($sourcePath, $outZipPath){
 $pathInfo = pathinfo($sourcePath);
 $parentPath = $pathInfo['dirname'];
 $dirName = $pathInfo['basename'];
 $z = new ZipArchive();
 $z->open($outZipPath, ZipArchive::CREATE);
 $z->addEmptyDir($dirName);
 if($sourcePath == $dirName) self::folderToZip($sourcePath, $z, 0);
 else self::folderToZip($sourcePath, $z, strlen($parentPath.'/'));

 $z->close();
 $GLOBALS['status'] = array('success'=>'Successfully created archive '. $outZipPath);
 }
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>File Unzipper, Unrar + Zipper</title>
<style>
<!--
body {
font-family: Arial, sans-serif;
line-height: 150%;
}
label {
display: block;
margin-top: 20px;
}
fieldset {
border: 0;
background-color: #EEE;
margin: 10px 0 10px 0;
}
.select {
padding: 5px;
font-size: 110%;
}
.status {
margin: 0;
margin-bottom: 20px;
padding: 10px;
font-size: 80%;
background: #EEE;
border: 1px dotted #DDD;
}
.status--ERROR {
background-color: red;
color: white;
font-size: 120%;
}
.status--SUCCESS {
background-color: green;
font-weight: bold;
color: white;
font-size: 120%
}
.small {
font-size: 0.7rem;
font-weight: normal;
}
.version {
font-size: 80%;
}
.form-field {
border: 1px solid #AAA;
padding: 8px;
width: 280px;
}
.info {
margin-top: 0;
font-size: 80%;
color: #777;
}
.submit {
background-color: #378de5;
border: 0;
color: #ffffff;
font-size: 15px;
padding: 10px 24px;
margin: 20px 0 20px 0;
text-decoration: none;
}
.submit:hover {
background-color: #2c6db2;
cursor: pointer;
}
-->
</style>
</head>
<body>
<p class="status status--<?php echo strtoupper(key($GLOBALS['status'])); ?>">
 Status: <?php echo reset($GLOBALS['status']); ?><br/>
 <span class="small">Processing Time: <?php echo $time; ?> seconds</span>
</p>
<form action="" method="POST">
 <fieldset>
 <h1>Archive Unzipper</h1>
 <label for="zipfile">Select .zip or .rar archive or .gz file you want to extract:</label>
 <select name="zipfile" size="1" class="select">
<?php
foreach($unzipper->zipfiles as $zip) echo "<option>$zip</option>";
?>
 </select>
 <label for="extpath">Extraction path (optional):</label>
 <input type="text" name="extpath" class="form-field" />
 <p class="info">Enter extraction path without leading or trailing slashes (e.g. "mypath"). If left empty current directory will be used.</p>
 <input type="submit" name="dounzip" class="submit" value="Unzip Archive"/>
 </fieldset>
 <fieldset>
 <h1>Archive Zipper</h1>
 <label for="zippath">Path that should be zipped (optional):</label>
 <input type="text" name="zippath" class="form-field" />
 <p class="info">Enter path to be zipped without leading or trailing slashes (e.g. "zippath"). If left empty current directory will be used.</p>
 <input type="submit" name="dozip" class="submit" value="Zip Archive"/>
 </fieldset>
</form>
<p class="version">Unzipper version: <?php echo VERSION; ?></p>
</body>
</html>