268 lines
9.9 KiB
PHP
Executable File
268 lines
9.9 KiB
PHP
Executable File
<?php
|
|
// ensure this file is being included by a parent file
|
|
if( !defined( '_JEXEC' ) && !defined( '_VALID_MOS' ) ) die( 'Restricted access' );
|
|
/**
|
|
* @version $Id: archive.php 248 2016-02-26 18:29:50Z soeren $
|
|
* @package eXtplorer
|
|
* @copyright soeren 2007-2015
|
|
* @author The eXtplorer project (http://extplorer.net)
|
|
* @author The The QuiX project (http://quixplorer.sourceforge.net)
|
|
* @license
|
|
* @version $Id: archive.php 248 2016-02-26 18:29:50Z soeren $
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.1 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms
|
|
* of the GNU General Public License Version 2 or later (the "GPL"), in
|
|
* which case the provisions of the GPL are applicable instead of
|
|
* those above. If you wish to allow use of your version of this file only
|
|
* under the terms of the GPL and not to allow others to use
|
|
* your version of this file under the MPL, indicate your decision by
|
|
* deleting the provisions above and replace them with the notice and
|
|
* other provisions required by the GPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file
|
|
* under either the MPL or the GPL."
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Zip & TarGzip Functions
|
|
*
|
|
*/
|
|
class ext_Archive extends ext_Action {
|
|
|
|
function execAction( $dir, $item="" ) {
|
|
|
|
if(($GLOBALS["permissions"]&01)!=01) {
|
|
ext_Result::sendResult('archive', false, $GLOBALS["error_msg"]["accessfunc"]);
|
|
}
|
|
if(!$GLOBALS["zip"] && !$GLOBALS["tgz"]) {
|
|
ext_Result::sendResult('archive', false, $GLOBALS["error_msg"]["miscnofunc"]);
|
|
}
|
|
|
|
// CSRF Security Check
|
|
if( !ext_checkToken($GLOBALS['__POST']["token"]) ) {
|
|
ext_Result::sendResult('tokencheck', false, 'Request failed: Security Token not valid.');
|
|
}
|
|
$allowed_types = array( 'zip', 'tgz', 'tbz', 'tar' );
|
|
|
|
// If we have something to archive, let's do it now
|
|
if(extGetParam($_POST, 'confirm' ) == 'true' ) {
|
|
$saveToDir = utf8_decode($GLOBALS['__POST']['saveToDir']);
|
|
if( !file_exists( get_abs_dir($saveToDir ) )) {
|
|
ext_Result::sendResult('archive', false, ext_Lang::err('archive_dir_notexists'));
|
|
}
|
|
if( !is_writable( get_abs_dir($saveToDir ) )) {
|
|
ext_Result::sendResult('archive', false, ext_Lang::err('archive_dir_unwritable'));
|
|
}
|
|
require_once( _EXT_PATH .'/libraries/Archive/archive.php' );
|
|
|
|
if( !in_array(strtolower( $GLOBALS['__POST']["type"] ), $allowed_types )) {
|
|
ext_Result::sendResult('archive', false, ext_Lang::err('extract_unknowntype').': '.htmlspecialchars($GLOBALS['__POST']["type"]));
|
|
|
|
}
|
|
// This controls how many files are processed per Step (it's split up into steps to prevent time-outs)
|
|
$files_per_step = 2000;
|
|
|
|
$cnt=count($GLOBALS['__POST']["selitems"]);
|
|
$abs_dir= get_abs_dir($dir);
|
|
$name=basename(stripslashes($GLOBALS['__POST']["name"]));
|
|
if($name=="") {
|
|
ext_Result::sendResult('archive', false, $GLOBALS["error_msg"]["miscnoname"]);
|
|
}
|
|
|
|
$startfrom = extGetParam( $_REQUEST, 'startfrom', 0 );
|
|
|
|
$dir_contents_cache_name = 'ext_'.md5(implode(null, $GLOBALS['__POST']["selitems"]));
|
|
$dir_contents_cache_file = _EXT_FTPTMP_PATH.'/'.$dir_contents_cache_name.'.txt';
|
|
|
|
$archive_name = get_abs_item($saveToDir,$name);
|
|
$fileinfo = pathinfo( $archive_name );
|
|
|
|
if( empty( $fileinfo['extension'] )) {
|
|
$archive_name .= ".".$GLOBALS['__POST']["type"];
|
|
$fileinfo['extension'] = $GLOBALS['__POST']["type"];
|
|
|
|
foreach( $allowed_types as $ext ) {
|
|
if( $GLOBALS['__POST']["type"] == $ext && @$fileinfo['extension'] != $ext ) {
|
|
$archive_name .= ".".$ext;
|
|
}
|
|
}
|
|
}
|
|
if( $startfrom == 0 ) {
|
|
for($i=0;$i<$cnt;$i++) {
|
|
|
|
$selitem=basename(stripslashes($GLOBALS['__POST']["selitems"][$i]));
|
|
if( $selitem == 'ext_root') {
|
|
$selitem = '';
|
|
}
|
|
if( is_dir( utf8_decode($abs_dir ."/". $selitem ))) {
|
|
$items = extReadDirectory(utf8_decode($abs_dir ."/". $selitem), '.', true, true );
|
|
foreach ( $items as $item ) {
|
|
if( is_dir( $item ) || !is_readable( $item ) || $item == $archive_name ) continue;
|
|
$v_list[] = str_replace('\\', '/', $item );
|
|
}
|
|
}
|
|
else {
|
|
$v_list[] = utf8_decode(str_replace('\\', '/', $abs_dir ."/". $selitem ));
|
|
}
|
|
}
|
|
if( count($v_list) > $files_per_step ) {
|
|
if( file_put_contents($dir_contents_cache_file, implode("\n", $v_list )) == false ) {
|
|
ext_Result::sendResult('archive', false, 'Failed to create a temporary list of the directory contents' );
|
|
}
|
|
}
|
|
} else {
|
|
$file_list_string = file_get_contents($dir_contents_cache_file);
|
|
if( empty( $file_list_string )) {
|
|
ext_Result::sendResult('archive', false, 'Failed to retrieve the temporary list of the directory contents' );
|
|
}
|
|
$v_list = explode("\n", $file_list_string );
|
|
}
|
|
$cnt_filelist = count( $v_list );
|
|
// Now we go to the right range of files and "slice" the array
|
|
$v_list = array_slice( $v_list, $startfrom, $files_per_step-1 );
|
|
|
|
$remove_path = $GLOBALS["home_dir"];
|
|
if( $dir ) {
|
|
$remove_path .= $dir;
|
|
}
|
|
$remove_path = str_replace( '\\', '/', realpath($remove_path) ).'/';
|
|
$debug = 'Starting from: '.$startfrom."\n";
|
|
$debug .= 'Files to process: '.$cnt_filelist."\n";
|
|
$debug .= implode( "\n", $v_list );
|
|
//file_put_contents( 'log.txt', $debug, FILE_APPEND );
|
|
|
|
// Do some setup stuff
|
|
ini_set('memory_limit', '128M');
|
|
@set_time_limit( 0 );
|
|
//error_reporting( E_ERROR | E_PARSE );
|
|
$result = extArchive::create( $archive_name, $v_list, $GLOBALS['__POST']["type"], '', $remove_path );
|
|
|
|
if( PEAR::isError( $result ) ) {
|
|
ext_Result::sendResult('archive', false, $name.': '.ext_Lang::err('archive_creation_failed').' ('.$result->getMessage().$archive_name.')' );
|
|
}
|
|
$classname = class_exists('ext_Json') ? 'ext_Json' : 'Services_JSON';
|
|
$json = new $classname();
|
|
if( $cnt_filelist > $startfrom+$files_per_step ) {
|
|
|
|
$response = Array( 'startfrom' => $startfrom + $files_per_step,
|
|
'totalitems' => $cnt_filelist,
|
|
'success' => true,
|
|
'action' => 'archive',
|
|
'token' => ext_getToken(),
|
|
'message' => sprintf( ext_Lang::msg('processed_x_files'), $startfrom + $files_per_step, $cnt_filelist )
|
|
);
|
|
}
|
|
else {
|
|
@unlink($dir_contents_cache_file);
|
|
if( $GLOBALS['__POST']["type"] == 'tgz' || $GLOBALS['__POST']["type"] == 'tbz') {
|
|
chmod( $archive_name, 0644 );
|
|
}
|
|
$response = Array( 'action' => 'archive',
|
|
'success' => true,
|
|
'token' => ext_getToken(),
|
|
'message' => ext_Lang::msg('archive_created'),
|
|
'newlocation' => ext_make_link( 'download', $dir, basename($archive_name) )
|
|
);
|
|
|
|
}
|
|
|
|
echo $json->encode( $response );
|
|
ext_exit();
|
|
}
|
|
$default_archive_type = 'zip';
|
|
?>
|
|
{
|
|
"xtype": "form",
|
|
"id": "simpleform",
|
|
"height": "200",
|
|
"width": "350",
|
|
"labelWidth": 125,
|
|
"url":"<?php echo basename( $GLOBALS['script_name']) ?>",
|
|
"dialogtitle": "<?php echo $GLOBALS["messages"]["actarchive"] ?>",
|
|
"frame": true,
|
|
"items": [{
|
|
"xtype": "textfield",
|
|
"fieldLabel": "<?php echo ext_Lang::msg('archive_name', true ) ?>",
|
|
"name": "name",
|
|
"value": "<?php echo htmlspecialchars($GLOBALS['item'], ENT_QUOTES) . '.'. $default_archive_type ?>",
|
|
"width": "200"
|
|
},
|
|
{
|
|
"xtype": "combo",
|
|
"fieldLabel": "<?php echo ext_Lang::msg('typeheader', true ) ?>",
|
|
"store": [
|
|
['zip', 'Zip (<?php echo ext_Lang::msg('normal_compression', true ) ?>)'],
|
|
['tgz', 'Tar/Gz (<?php echo ext_Lang::msg('good_compression', true ) ?>)'],
|
|
<?php
|
|
if(extension_loaded("bz2")) {
|
|
echo "['tbz', 'Tar/Bzip2 (".ext_Lang::msg('best_compression', true ).")'],";
|
|
}
|
|
?>
|
|
['tar', 'Tar (<?php echo ext_Lang::msg('no_compression', true ) ?>)']
|
|
],
|
|
"displayField":"typename",
|
|
"valueField": "type",
|
|
"name": "type",
|
|
"value": "<?php echo $default_archive_type ?>",
|
|
"triggerAction": "all",
|
|
"hiddenName": "type",
|
|
"disableKeyFilter": "true",
|
|
"editable": "false",
|
|
"mode": "local",
|
|
"allowBlank": "false",
|
|
"selectOnFocus":"true",
|
|
"width": "200",
|
|
"listeners": { "select": {
|
|
fn: function(o, record ) {
|
|
form = Ext.getCmp("simpleform").getForm();
|
|
var nameField = form.findField("name").getValue();
|
|
if( nameField.indexOf( '.' ) > 0 ) {
|
|
form.findField('name').setValue( nameField.substring( 0, nameField.indexOf('.')+1 ) + o.getValue() );
|
|
} else {
|
|
form.findField('name').setValue( nameField + '.'+ o.getValue());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}, {
|
|
"xtype": "textfield",
|
|
"fieldLabel": "<?php echo ext_Lang::msg('archive_saveToDir', true ) ?>",
|
|
"name": "saveToDir",
|
|
"value": "<?php echo str_replace("'", "\'", $dir ) ?>",
|
|
"width": "200"
|
|
},{
|
|
"xtype": "checkbox",
|
|
"fieldLabel": "<?php echo ext_Lang::msg('downlink', true ) ?>?",
|
|
"name": "download",
|
|
"checked": "true"
|
|
}
|
|
],
|
|
"buttons": [{
|
|
"text": "<?php echo ext_Lang::msg( 'btncreate', true ) ?>",
|
|
"type": "submit",
|
|
"handler": function() {
|
|
Ext.ux.OnDemandLoad.load( "<?php echo $GLOBALS['script_name'] ?>?option=com_extplorer&action=include_javascript&file=archive.js",
|
|
function(options) { submitArchiveForm(0) } );
|
|
}
|
|
},{
|
|
"text": "<?php echo ext_Lang::msg( 'btncancel', true ) ?>",
|
|
"handler": function() { Ext.getCmp("dialog").destroy() }
|
|
}]
|
|
}
|
|
|
|
<?php
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
?>
|