mirror of
https://github.com/xevidos/codiad.git
synced 2024-12-22 13:52:16 +01:00
6b9918acde
* Added initial archive management * Added new Permissions system * Added new file upload systems * Recoded most of Filemanager componant * Removed long IDs from database tables * Updated commonly used settings to default
308 lines
No EOL
6.1 KiB
PHP
308 lines
No EOL
6.1 KiB
PHP
<?php
|
|
|
|
class Archive {
|
|
|
|
const COMMANDS = array(
|
|
|
|
"zip" => array(
|
|
"compress" => array(
|
|
"windows" => "",
|
|
"linux" => "zip -r9 %output% %input%",
|
|
),
|
|
"decompress" => array(
|
|
"windows" => "",
|
|
"linux" => "unzip %input%",
|
|
),
|
|
),
|
|
);
|
|
|
|
const EXTENSIONS = array(
|
|
|
|
"zip" => "zip",
|
|
);
|
|
|
|
const INVALID_FILES = array(
|
|
".",
|
|
"..",
|
|
".DS_Store"
|
|
);
|
|
|
|
const MIME_TYPE_EXTENSIONS = array(
|
|
|
|
"application/zip" => "zip",
|
|
);
|
|
|
|
const SUPPORTED_TYPES = array(
|
|
|
|
//"gz",
|
|
//"rar",
|
|
//"tar",
|
|
//"tar.gz",
|
|
"zip",
|
|
);
|
|
|
|
public static $instance = null;
|
|
public $manager = null;
|
|
|
|
|
|
function __construct() {
|
|
|
|
|
|
}
|
|
|
|
public static function get_instance() {
|
|
|
|
if ( null == self::$instance ) {
|
|
|
|
self::$instance = new self;
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
public static function get_system() {
|
|
|
|
$system = "unknown";
|
|
|
|
if( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' ) {
|
|
|
|
$system = "windows";
|
|
} else {
|
|
|
|
$system = "linux";
|
|
}
|
|
return $system;
|
|
}
|
|
|
|
public static function compress( $path, $output = "default", $type = "default" ) {
|
|
|
|
$response = array();
|
|
|
|
if( $type == "default" ) {
|
|
|
|
$type = self:: get_supported_type();
|
|
}
|
|
|
|
if( $output == "default" ) {
|
|
|
|
$output = dirname( $path ) . "/" . basename( $path ) . ".$type";
|
|
$path_parts = pathinfo( $output );
|
|
$existing = $output;
|
|
$i = 1;
|
|
|
|
do {
|
|
|
|
if( is_dir( $existing ) ) {
|
|
|
|
$existing = rtrim( $output, "/" ) . " $i/";
|
|
} elseif( is_file( $existing ) ) {
|
|
|
|
if( isset( $path_parts["extension"] ) ) {
|
|
|
|
$existing = str_replace( ".{$path_parts["extension"]}", " {$i}.{$path_parts["extension"]}", $output );
|
|
} else {
|
|
|
|
$existing = $output . " $i";
|
|
}
|
|
}
|
|
$i++;
|
|
} while( is_file( $existing ) || is_dir( $existing ) );
|
|
|
|
$output = $existing;
|
|
}
|
|
|
|
$supported = self::supports( $type );
|
|
$archive = self::get_instance();
|
|
|
|
if( $supported["status"] === "success" ) {
|
|
|
|
if( extension_loaded( self::EXTENSIONS["{$type}"] ) ) {
|
|
|
|
$response = call_user_func( array( $archive, "{$type}_c" ), $path, $output );
|
|
} else {
|
|
|
|
//$response = $archive->execute( $type, "compress", $path, dirname( $path ) );
|
|
}
|
|
} else {
|
|
|
|
$response = $supported;
|
|
}
|
|
return $response;
|
|
}
|
|
|
|
public static function decompress( $file, $output = "default" ) {
|
|
|
|
$response = array();
|
|
$path_info = pathinfo( $file );
|
|
$type = isset( $path_info["extension"] ) ? $path_info["extension"] : null;
|
|
$supported = self::supports( $type );
|
|
$archive = self::get_instance();
|
|
|
|
if( $output == "default" ) {
|
|
|
|
$output = $path_info["dirname"] . "/" . $path_info["filename"];
|
|
}
|
|
|
|
if( $supported["status"] === "success" ) {
|
|
|
|
if( extension_loaded( self::EXTENSIONS["{$type}"] ) ) {
|
|
|
|
$response = call_user_func( array( $archive, "{$type}_d" ), $file, $output );
|
|
} else {
|
|
|
|
$response = $archive->execute( $type, "decompress" );
|
|
}
|
|
|
|
if( $response === true ) {
|
|
|
|
$response = array(
|
|
"status" => "success",
|
|
"message" => null,
|
|
);
|
|
}
|
|
} else {
|
|
|
|
$response = $supported;
|
|
}
|
|
return $response;
|
|
}
|
|
|
|
public static function get_supported_type() {
|
|
|
|
//zip is usually the most used format supported by the most OS's,
|
|
//we check that first then check the rest of the types.
|
|
|
|
$supported_type = null;
|
|
$types = self::SUPPORTED_TYPES;
|
|
$zip_id = array_search( "zip", $types );
|
|
unset( $types[$zip_id] );
|
|
array_unshift( $types, "zip" );
|
|
|
|
foreach( $types as $id => $type ) {
|
|
|
|
if( self::supports( $type ) ) {
|
|
|
|
$supported_type = $type;
|
|
break;
|
|
}
|
|
}
|
|
return $supported_type;
|
|
}
|
|
|
|
public static function supports( $type ) {
|
|
|
|
$response = array();
|
|
$type = strtolower( $type );
|
|
|
|
if( in_array( $type, self::SUPPORTED_TYPES ) ) {
|
|
|
|
$system = self::get_system();
|
|
$supported = false;
|
|
$extension = self::EXTENSIONS["{$type}"];
|
|
|
|
if( extension_loaded( $extension ) ) {
|
|
|
|
$type_supported = true;
|
|
} elseif( isset( self::COMMANDS["{$type}"] ) && isset( self::COMMANDS["{$type}"]["compress"][$system] ) ) {
|
|
|
|
$type_supported = true;
|
|
}
|
|
|
|
if( $type_supported ) {
|
|
|
|
$response["status"] = "success";
|
|
$response["message"] = "Type is supported";
|
|
} else {
|
|
|
|
$response["status"] = "error";
|
|
$response["message"] = "The extension or program required to use this type of file does not seem to be installed.";
|
|
}
|
|
} else {
|
|
|
|
$response["status"] = "error";
|
|
$response["message"] = "The filetype supplied is not currently supported by Codiad's archive management system.";
|
|
}
|
|
return $response;
|
|
}
|
|
|
|
function zip_c( $path, $output, &$archive = null ) {
|
|
|
|
if( $archive == null ) {
|
|
|
|
$path = rtrim( $path, '/' );
|
|
//$output = rtrim( $output, '/' ) . '/';
|
|
$archive = new ZipArchive();
|
|
|
|
if( file_exists( $output ) ) {
|
|
|
|
$result = $archive->open( $output, ZIPARCHIVE::OVERWRITE );
|
|
} else {
|
|
|
|
$result = $archive->open( $output, ZIPARCHIVE::CREATE );
|
|
}
|
|
|
|
if( $result !== true ) {
|
|
|
|
return false;
|
|
}
|
|
|
|
if( is_file( $path ) ) {
|
|
|
|
$archive->addFile( $path, basename( $path ) );
|
|
$archive->close();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
$i = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) );
|
|
|
|
foreach( $i as $file ) {
|
|
|
|
$file_name = $file->getBasename();
|
|
$file_path = $file->getPathname();
|
|
$relative_path = str_replace( $path, "", $file_path );
|
|
$relative_path = ltrim( $relative_path, '/' );
|
|
|
|
if( in_array( $file_name, self::INVALID_FILES ) ) {
|
|
|
|
continue;
|
|
}
|
|
|
|
if( is_file( $file_path ) ) {
|
|
|
|
$archive->addFile( $file_path, $relative_path );
|
|
} else {
|
|
|
|
$archive->addEmptyDir( $relative_path );
|
|
$this->zip_c( $file_path, $output, $archive );
|
|
}
|
|
}
|
|
$archive->close();
|
|
|
|
return true;
|
|
}
|
|
|
|
function zip_d( $path, $output ) {
|
|
|
|
if( ! is_dir( $output ) ) {
|
|
|
|
mkdir( $output );
|
|
}
|
|
|
|
$status = false;
|
|
$output = rtrim( $output, '/' ) . '/';
|
|
$archive = new ZipArchive();
|
|
$open = $archive->open( $path );
|
|
|
|
if ( $open === true ) {
|
|
|
|
$archive->extractTo( $output );
|
|
$archive->close();
|
|
$status = true;
|
|
}
|
|
return $status;
|
|
}
|
|
}
|
|
|
|
|
|
?>
|