X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/b137f4ce021b4022c56f452c2eafa7abfcef0a7c..38ca813a0e312e2768e5b9519f0415cd0aa84781:/wp-admin/includes/file.php diff --git a/wp-admin/includes/file.php b/wp-admin/includes/file.php index 20d13616..04bb4039 100644 --- a/wp-admin/includes/file.php +++ b/wp-admin/includes/file.php @@ -80,9 +80,9 @@ function get_home_path() { $home = get_option( 'home' ); $siteurl = get_option( 'siteurl' ); if ( $home != '' && $home != $siteurl ) { - $wp_path_rel_to_home = str_replace($home, '', $siteurl); /* $siteurl - $home */ - $pos = strpos($_SERVER["SCRIPT_FILENAME"], $wp_path_rel_to_home); - $home_path = substr($_SERVER["SCRIPT_FILENAME"], 0, $pos); + $wp_path_rel_to_home = str_replace($home, '', $siteurl); /* $siteurl - $home */ + $pos = strpos($_SERVER["SCRIPT_FILENAME"], $wp_path_rel_to_home); + $home_path = substr($_SERVER["SCRIPT_FILENAME"], 0, $pos); $home_path = trailingslashit( $home_path ); } else { $home_path = ABSPATH; @@ -152,42 +152,6 @@ function list_files( $folder = '', $levels = 100 ) { return $files; } -/** - * Determines a writable directory for temporary files. - * Function's preference is to WP_CONTENT_DIR followed by the return value of sys_get_temp_dir(), before finally defaulting to /tmp/ - * - * In the event that this function does not find a writable location, It may be overridden by the WP_TEMP_DIR constant in your wp-config.php file. - * - * @since 2.5.0 - * - * @return string Writable temporary directory - */ -function get_temp_dir() { - static $temp; - if ( defined('WP_TEMP_DIR') ) - return trailingslashit(WP_TEMP_DIR); - - if ( $temp ) - return trailingslashit($temp); - - $temp = WP_CONTENT_DIR . '/'; - if ( is_dir($temp) && @is_writable($temp) ) - return $temp; - - if ( function_exists('sys_get_temp_dir') ) { - $temp = sys_get_temp_dir(); - if ( @is_writable($temp) ) - return trailingslashit($temp); - } - - $temp = ini_get('upload_tmp_dir'); - if ( is_dir($temp) && @is_writable($temp) ) - return trailingslashit($temp); - - $temp = '/tmp/'; - return $temp; -} - /** * Returns a filename of a Temporary unique file. * Please note that the calling function must unlink() this itself. @@ -288,8 +252,8 @@ function wp_handle_upload( &$file, $overrides = false, $time = null ) { // Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error']. $upload_error_strings = array( false, - __( "The uploaded file exceeds the upload_max_filesize directive in php.ini." ), - __( "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." ), + __( "The uploaded file exceeds the upload_max_filesize directive in php.ini." ), + __( "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." ), __( "The uploaded file was only partially uploaded." ), __( "No file was uploaded." ), '', @@ -519,27 +483,18 @@ function download_url( $url, $timeout = 300 ) { if ( ! $tmpfname ) return new WP_Error('http_no_file', __('Could not create Temporary file.')); - $handle = @fopen($tmpfname, 'wb'); - if ( ! $handle ) - return new WP_Error('http_no_file', __('Could not create Temporary file.')); - - $response = wp_remote_get($url, array('timeout' => $timeout)); + $response = wp_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname ) ); - if ( is_wp_error($response) ) { - fclose($handle); - unlink($tmpfname); + if ( is_wp_error( $response ) ) { + unlink( $tmpfname ); return $response; } - if ( $response['response']['code'] != '200' ){ - fclose($handle); - unlink($tmpfname); - return new WP_Error('http_404', trim($response['response']['message'])); + if ( 200 != wp_remote_retrieve_response_code( $response ) ){ + unlink( $tmpfname ); + return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) ); } - fwrite($handle, $response['body']); - fclose($handle); - return $tmpfname; } @@ -563,7 +518,7 @@ function unzip_file($file, $to) { return new WP_Error('fs_unavailable', __('Could not access filesystem.')); // Unzip can use a lot of memory, but not this much hopefully - @ini_set('memory_limit', '256M'); + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); $needed_dirs = array(); $to = trailingslashit($to); @@ -697,12 +652,23 @@ function _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) { function _unzip_file_pclzip($file, $to, $needed_dirs = array()) { global $wp_filesystem; + // See #15789 - PclZip uses string functions on binary data, If it's overloaded with Multibyte safe functions the results are incorrect. + if ( ini_get('mbstring.func_overload') && function_exists('mb_internal_encoding') ) { + $previous_encoding = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + } + require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php'); $archive = new PclZip($file); + $archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING); + + if ( isset($previous_encoding) ) + mb_internal_encoding($previous_encoding); + // Is the archive valid? - if ( false == ($archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING)) ) + if ( !is_array($archive_files) ) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), $archive->errorInfo(true)); if ( 0 == count($archive_files) ) @@ -761,9 +727,10 @@ function _unzip_file_pclzip($file, $to, $needed_dirs = array()) { * * @param string $from source directory * @param string $to destination directory + * @param array $skip_list a list of files/folders to skip copying * @return mixed WP_Error on failure, True on success. */ -function copy_dir($from, $to) { +function copy_dir($from, $to, $skip_list = array() ) { global $wp_filesystem; $dirlist = $wp_filesystem->dirlist($from); @@ -771,21 +738,31 @@ function copy_dir($from, $to) { $from = trailingslashit($from); $to = trailingslashit($to); + $skip_regex = ''; + foreach ( (array)$skip_list as $key => $skip_file ) + $skip_regex .= preg_quote($skip_file, '!') . '|'; + + if ( !empty($skip_regex) ) + $skip_regex = '!(' . rtrim($skip_regex, '|') . ')$!i'; + foreach ( (array) $dirlist as $filename => $fileinfo ) { + if ( !empty($skip_regex) ) + if ( preg_match($skip_regex, $from . $filename) ) + continue; + if ( 'f' == $fileinfo['type'] ) { - if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) ) { + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) { // If copy failed, chmod file to 0644 and try again. $wp_filesystem->chmod($to . $filename, 0644); - if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) ) + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) return new WP_Error('copy_failed', __('Could not copy file.'), $to . $filename); } - $wp_filesystem->chmod($to . $filename, FS_CHMOD_FILE); } elseif ( 'd' == $fileinfo['type'] ) { if ( !$wp_filesystem->is_dir($to . $filename) ) { if ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) ) return new WP_Error('mkdir_failed', __('Could not create directory.'), $to . $filename); } - $result = copy_dir($from . $filename, $to . $filename); + $result = copy_dir($from . $filename, $to . $filename, $skip_list); if ( is_wp_error($result) ) return $result; }