2007-05-28 02:04:33 +02:00
< ? php
2008-10-02 03:03:26 +02:00
/**
* File contains all the administration image manipulation functions .
*
* @ package WordPress
* @ subpackage Administration
*/
2007-05-28 02:04:33 +02:00
2008-10-02 03:03:26 +02:00
/** The descriptions for theme files. */
2008-08-23 11:49:52 +02:00
$wp_file_descriptions = array (
'index.php' => __ ( 'Main Index Template' ),
'style.css' => __ ( 'Stylesheet' ),
2008-10-02 03:03:26 +02:00
'rtl.css' => __ ( 'RTL Stylesheet' ),
'comments.php' => __ ( 'Comments' ),
'comments-popup.php' => __ ( 'Popup Comments' ),
'footer.php' => __ ( 'Footer' ),
'header.php' => __ ( 'Header' ),
2008-08-23 11:49:52 +02:00
'sidebar.php' => __ ( 'Sidebar' ),
'archive.php' => __ ( 'Archives' ),
'category.php' => __ ( 'Category Template' ),
'page.php' => __ ( 'Page Template' ),
'search.php' => __ ( 'Search Results' ),
'searchform.php' => __ ( 'Search Form' ),
'single.php' => __ ( 'Single Post' ),
'404.php' => __ ( '404 Template' ),
'link.php' => __ ( 'Links Template' ),
'functions.php' => __ ( 'Theme Functions' ),
'attachment.php' => __ ( 'Attachment Template' ),
'image.php' => __ ( 'Image Attachment Template' ),
'video.php' => __ ( 'Video Attachment Template' ),
'audio.php' => __ ( 'Audio Attachment Template' ),
'application.php' => __ ( 'Application Attachment Template' ),
'my-hacks.php' => __ ( 'my-hacks.php (legacy hacks support)' ),
'.htaccess' => __ ( '.htaccess (for rewrite rules )' ),
2007-05-28 02:04:33 +02:00
// Deprecated files
'wp-layout.css' => __ ( 'Stylesheet' ), 'wp-comments.php' => __ ( 'Comments Template' ), 'wp-comments-popup.php' => __ ( 'Popup Comments Template' ));
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $file
* @ return unknown
*/
2007-05-28 02:04:33 +02:00
function get_file_description ( $file ) {
global $wp_file_descriptions ;
if ( isset ( $wp_file_descriptions [ basename ( $file )] ) ) {
return $wp_file_descriptions [ basename ( $file )];
}
2008-08-23 11:49:52 +02:00
elseif ( file_exists ( WP_CONTENT_DIR . $file ) && is_file ( WP_CONTENT_DIR . $file ) ) {
$template_data = implode ( '' , file ( WP_CONTENT_DIR . $file ) );
if ( preg_match ( '|Template Name:(.*)$|mi' , $template_data , $name ))
return $name [ 1 ] . ' Page Template' ;
2007-05-28 02:04:33 +02:00
}
return basename ( $file );
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ return unknown
*/
2007-05-28 02:04:33 +02:00
function get_home_path () {
$home = get_option ( 'home' );
if ( $home != '' && $home != get_option ( 'siteurl' ) ) {
$home_path = parse_url ( $home );
$home_path = $home_path [ 'path' ];
$root = str_replace ( $_SERVER [ " PHP_SELF " ], '' , $_SERVER [ " SCRIPT_FILENAME " ] );
$home_path = trailingslashit ( $root . $home_path );
} else {
$home_path = ABSPATH ;
}
return $home_path ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $file
* @ return unknown
*/
2007-05-28 02:04:33 +02:00
function get_real_file_to_edit ( $file ) {
if ( 'index.php' == $file || '.htaccess' == $file ) {
2008-05-29 19:29:32 +02:00
$real_file = get_home_path () . $file ;
2007-05-28 02:04:33 +02:00
} else {
2008-06-05 18:39:20 +02:00
$real_file = WP_CONTENT_DIR . $file ;
2007-05-28 02:04:33 +02:00
}
return $real_file ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param string $folder Optional . Full path to folder
* @ param int $levels Optional . Levels of folders to follow , Default : 100 ( PHP Loop limit ) .
* @ return bool | array
*/
2008-06-16 20:35:48 +02:00
function list_files ( $folder = '' , $levels = 100 ) {
if ( empty ( $folder ) )
return false ;
if ( ! $levels )
return false ;
$files = array ();
if ( $dir = @ opendir ( $folder ) ) {
while (( $file = readdir ( $dir ) ) !== false ) {
if ( in_array ( $file , array ( '.' , '..' ) ) )
continue ;
if ( is_dir ( $folder . '/' . $file ) ) {
$files2 = list_files ( $folder . '/' . $file , $levels - 1 );
if ( $files2 )
$files = array_merge ( $files , $files2 );
else
$files [] = $folder . '/' . $file . '/' ;
} else {
$files [] = $folder . '/' . $file ;
}
}
}
@ closedir ( $dir );
return $files ;
}
2007-05-28 02:04:33 +02:00
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ return unknown
*/
2008-02-27 01:47:15 +01:00
function get_temp_dir () {
if ( defined ( 'WP_TEMP_DIR' ) )
return trailingslashit ( WP_TEMP_DIR );
2008-05-27 19:55:24 +02:00
$temp = WP_CONTENT_DIR . '/' ;
2008-02-27 01:47:15 +01:00
if ( is_dir ( $temp ) && is_writable ( $temp ) )
return $temp ;
if ( function_exists ( 'sys_get_temp_dir' ) )
return trailingslashit ( sys_get_temp_dir ());
return '/tmp/' ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $filename
* @ param unknown_type $dir
* @ return unknown
*/
2008-04-25 23:34:54 +02:00
function wp_tempnam ( $filename = '' , $dir = '' ){
if ( empty ( $dir ) )
$dir = get_temp_dir ();
$filename = basename ( $filename );
if ( empty ( $filename ) )
$filename = time ();
$filename = $dir . wp_unique_filename ( $dir , $filename );
touch ( $filename );
return $filename ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $file
* @ param unknown_type $allowed_files
* @ return unknown
*/
2007-05-28 02:04:33 +02:00
function validate_file_to_edit ( $file , $allowed_files = '' ) {
$file = stripslashes ( $file );
$code = validate_file ( $file , $allowed_files );
if ( ! $code )
return $file ;
switch ( $code ) {
case 1 :
wp_die ( __ ( 'Sorry, can’t edit files with ".." in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.' ));
case 2 :
wp_die ( __ ( 'Sorry, can’t call files with their real path.' ));
case 3 :
wp_die ( __ ( 'Sorry, that file cannot be edited.' ));
}
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param array $file Reference to a single element of $_FILES . Call the function once for each uploaded file .
* @ param array $overrides Optional . An associative array of names => values to override default variables with extract ( $overrides , EXTR_OVERWRITE ) .
* @ return array On success , returns an associative array of file attributes . On failure , returns $overrides [ 'upload_error_handler' ]( & $file , $message ) or array ( 'error' => $message ) .
*/
2007-05-28 02:04:33 +02:00
function wp_handle_upload ( & $file , $overrides = false ) {
// The default error handler.
if ( ! function_exists ( 'wp_handle_upload_error' ) ) {
function wp_handle_upload_error ( & $file , $message ) {
return array ( 'error' => $message );
}
}
// You may define your own function and pass the name in $overrides['upload_error_handler']
$upload_error_handler = 'wp_handle_upload_error' ;
// $_POST['action'] must be set and its value must equal $overrides['action'] or this:
$action = 'wp_handle_upload' ;
// 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 <code>upload_max_filesize</code> directive in <code>php.ini</code>. " ),
__ ( " The uploaded file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form. " ),
__ ( " The uploaded file was only partially uploaded. " ),
__ ( " No file was uploaded. " ),
__ ( " Missing a temporary folder. " ),
__ ( " Failed to write file to disk. " ));
// All tests are on by default. Most can be turned off by $override[{test_name}] = false;
$test_form = true ;
$test_size = true ;
// If you override this, you must provide $ext and $type!!!!
$test_type = true ;
2008-01-04 20:36:34 +01:00
$mimes = false ;
2007-05-28 02:04:33 +02:00
// Install user overrides. Did we mention that this voids your warranty?
if ( is_array ( $overrides ) )
extract ( $overrides , EXTR_OVERWRITE );
// A correct form post will pass this test.
if ( $test_form && ( ! isset ( $_POST [ 'action' ] ) || ( $_POST [ 'action' ] != $action ) ) )
return $upload_error_handler ( $file , __ ( 'Invalid form submission.' ));
// A successful upload will pass this test. It makes no sense to override this one.
if ( $file [ 'error' ] > 0 )
return $upload_error_handler ( $file , $upload_error_strings [ $file [ 'error' ]] );
// A non-empty file will pass this test.
if ( $test_size && ! ( $file [ 'size' ] > 0 ) )
return $upload_error_handler ( $file , __ ( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini.' ));
// A properly uploaded file will pass this test. There should be no reason to override this one.
if ( ! @ is_uploaded_file ( $file [ 'tmp_name' ] ) )
return $upload_error_handler ( $file , __ ( 'Specified file failed upload test.' ));
// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
if ( $test_type ) {
$wp_filetype = wp_check_filetype ( $file [ 'name' ], $mimes );
extract ( $wp_filetype );
if ( ( ! $type || ! $ext ) && ! current_user_can ( 'unfiltered_upload' ) )
return $upload_error_handler ( $file , __ ( 'File type does not meet security guidelines. Try another.' ));
2007-06-14 04:25:30 +02:00
2007-05-28 02:04:33 +02:00
if ( ! $ext )
2007-09-14 23:13:23 +02:00
$ext = ltrim ( strrchr ( $file [ 'name' ], '.' ), '.' );
2008-03-06 20:48:54 +01:00
if ( ! $type )
$type = $file [ 'type' ];
2007-05-28 02:04:33 +02:00
}
// A writable uploads dir will pass this test. Again, there's no point overriding this one.
if ( ! ( ( $uploads = wp_upload_dir () ) && false === $uploads [ 'error' ] ) )
return $upload_error_handler ( $file , $uploads [ 'error' ] );
2007-12-18 04:32:43 +01:00
$filename = wp_unique_filename ( $uploads [ 'path' ], $file [ 'name' ], $unique_filename_callback );
2007-05-28 02:04:33 +02:00
// Move the file to the uploads dir
$new_file = $uploads [ 'path' ] . " / $filename " ;
2008-04-14 18:01:59 +02:00
if ( false === @ move_uploaded_file ( $file [ 'tmp_name' ], $new_file ) ) {
return $upload_error_handler ( $file , sprintf ( __ ( 'The uploaded file could not be moved to %s.' ), $uploads [ 'path' ] ) );
}
2007-05-28 02:04:33 +02:00
// Set correct file permissions
$stat = stat ( dirname ( $new_file ));
$perms = $stat [ 'mode' ] & 0000666 ;
@ chmod ( $new_file , $perms );
// Compute the URL
$url = $uploads [ 'url' ] . " / $filename " ;
$return = apply_filters ( 'wp_handle_upload' , array ( 'file' => $new_file , 'url' => $url , 'type' => $type ) );
return $return ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* Pass this function an array similar to that of a $_FILES POST array .
*
* @ since unknown
*
* @ param unknown_type $file
* @ param unknown_type $overrides
* @ return unknown
*/
2008-06-04 18:13:55 +02:00
function wp_handle_sideload ( & $file , $overrides = false ) {
// The default error handler.
if ( ! function_exists ( 'wp_handle_upload_error' ) ) {
function wp_handle_upload_error ( & $file , $message ) {
return array ( 'error' => $message );
}
}
// You may define your own function and pass the name in $overrides['upload_error_handler']
$upload_error_handler = 'wp_handle_upload_error' ;
// $_POST['action'] must be set and its value must equal $overrides['action'] or this:
$action = 'wp_handle_sideload' ;
// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
$upload_error_strings = array ( false ,
__ ( " The file exceeds the <code>upload_max_filesize</code> directive in <code>php.ini</code>. " ),
__ ( " The file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form. " ),
__ ( " The file was only partially uploaded. " ),
__ ( " No file was sent. " ),
__ ( " Missing a temporary folder. " ),
__ ( " Failed to write file to disk. " ));
// All tests are on by default. Most can be turned off by $override[{test_name}] = false;
$test_form = true ;
$test_size = true ;
// If you override this, you must provide $ext and $type!!!!
$test_type = true ;
$mimes = false ;
// Install user overrides. Did we mention that this voids your warranty?
if ( is_array ( $overrides ) )
extract ( $overrides , EXTR_OVERWRITE );
// A correct form post will pass this test.
if ( $test_form && ( ! isset ( $_POST [ 'action' ] ) || ( $_POST [ 'action' ] != $action ) ) )
return $upload_error_handler ( $file , __ ( 'Invalid form submission.' ));
// A successful upload will pass this test. It makes no sense to override this one.
if ( $file [ 'error' ] > 0 )
return $upload_error_handler ( $file , $upload_error_strings [ $file [ 'error' ]] );
// A non-empty file will pass this test.
if ( $test_size && ! ( filesize ( $file [ 'tmp_name' ]) > 0 ) )
return $upload_error_handler ( $file , __ ( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini.' ));
// A properly uploaded file will pass this test. There should be no reason to override this one.
if ( ! @ is_file ( $file [ 'tmp_name' ] ) )
return $upload_error_handler ( $file , __ ( 'Specified file does not exist.' ));
// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
if ( $test_type ) {
$wp_filetype = wp_check_filetype ( $file [ 'name' ], $mimes );
extract ( $wp_filetype );
if ( ( ! $type || ! $ext ) && ! current_user_can ( 'unfiltered_upload' ) )
return $upload_error_handler ( $file , __ ( 'File type does not meet security guidelines. Try another.' ));
if ( ! $ext )
$ext = ltrim ( strrchr ( $file [ 'name' ], '.' ), '.' );
if ( ! $type )
$type = $file [ 'type' ];
}
// A writable uploads dir will pass this test. Again, there's no point overriding this one.
if ( ! ( ( $uploads = wp_upload_dir () ) && false === $uploads [ 'error' ] ) )
return $upload_error_handler ( $file , $uploads [ 'error' ] );
$filename = wp_unique_filename ( $uploads [ 'path' ], $file [ 'name' ], $unique_filename_callback );
2008-08-09 07:36:14 +02:00
2008-06-25 18:45:04 +02:00
// Strip the query strings.
$filename = str_replace ( '?' , '-' , $filename );
$filename = str_replace ( '&' , '-' , $filename );
2008-08-09 07:36:14 +02:00
2008-06-04 18:13:55 +02:00
// Move the file to the uploads dir
$new_file = $uploads [ 'path' ] . " / $filename " ;
if ( false === @ rename ( $file [ 'tmp_name' ], $new_file ) ) {
return $upload_error_handler ( $file , sprintf ( __ ( 'The uploaded file could not be moved to %s.' ), $uploads [ 'path' ] ) );
}
// Set correct file permissions
$stat = stat ( dirname ( $new_file ));
$perms = $stat [ 'mode' ] & 0000666 ;
@ chmod ( $new_file , $perms );
// Compute the URL
$url = $uploads [ 'url' ] . " / $filename " ;
$return = apply_filters ( 'wp_handle_upload' , array ( 'file' => $new_file , 'url' => $url , 'type' => $type ) );
return $return ;
}
2007-05-28 02:04:33 +02:00
2008-02-11 06:45:54 +01:00
/**
2008-10-02 03:03:26 +02:00
* Downloads a url to a local file using the Snoopy HTTP Class .
*
* @ since unknown
* @ todo Transition over to using the new HTTP Request API ( jacob ) .
*
* @ param string $url the URL of the file to download
* @ return mixed WP_Error on failure , string Filename on success .
*/
2008-02-11 06:45:54 +01:00
function download_url ( $url ) {
//WARNING: The file is not automatically deleted, The script must unlink() the file.
2008-10-15 18:35:35 +02:00
if ( ! $url )
2008-03-27 08:36:30 +01:00
return new WP_Error ( 'http_no_url' , __ ( 'Invalid URL Provided' ));
2008-02-11 06:45:54 +01:00
2008-04-25 23:34:54 +02:00
$tmpfname = wp_tempnam ( $url );
2008-10-15 18:35:35 +02:00
if ( ! $tmpfname )
2008-03-27 08:36:30 +01:00
return new WP_Error ( 'http_no_file' , __ ( 'Could not create Temporary file' ));
2008-02-11 06:45:54 +01:00
2008-03-19 03:46:27 +01:00
$handle = @ fopen ( $tmpfname , 'w' );
2008-10-15 18:35:35 +02:00
if ( ! $handle )
2008-03-27 08:36:30 +01:00
return new WP_Error ( 'http_no_file' , __ ( 'Could not create Temporary file' ));
2008-02-11 06:45:54 +01:00
2008-10-15 18:38:17 +02:00
$response = wp_remote_get ( $url , array ( 'timeout' => 30 ));
2008-03-02 21:17:30 +01:00
2008-10-15 18:35:35 +02:00
if ( is_wp_error ( $response ) ) {
fclose ( $handle );
unlink ( $tmpfname );
return $response ;
}
if ( $response [ 'response' ][ 'code' ] != '200' ){
2008-03-27 08:36:30 +01:00
fclose ( $handle );
unlink ( $tmpfname );
2008-10-14 01:41:03 +02:00
return new WP_Error ( 'http_404' , trim ( $response [ 'response' ][ 'message' ]));
2008-03-27 08:36:30 +01:00
}
2008-10-14 18:37:08 +02:00
2008-10-14 01:41:03 +02:00
fwrite ( $handle , $response [ 'body' ]);
2008-02-11 06:45:54 +01:00
fclose ( $handle );
return $tmpfname ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $file
* @ param unknown_type $to
* @ return unknown
*/
2008-02-11 06:45:54 +01:00
function unzip_file ( $file , $to ) {
global $wp_filesystem ;
if ( ! $wp_filesystem || ! is_object ( $wp_filesystem ) )
return new WP_Error ( 'fs_unavailable' , __ ( 'Could not access filesystem.' ));
2008-03-02 21:17:30 +01:00
2008-02-11 06:45:54 +01:00
$fs =& $wp_filesystem ;
require_once ( ABSPATH . 'wp-admin/includes/class-pclzip.php' );
$archive = new PclZip ( $file );
// Is the archive valid?
if ( false == ( $archive_files = $archive -> extract ( PCLZIP_OPT_EXTRACT_AS_STRING )) )
2008-03-11 17:37:44 +01:00
return new WP_Error ( 'incompatible_archive' , __ ( 'Incompatible archive' ), $archive -> errorInfo ( true ));
2008-02-11 06:45:54 +01:00
if ( 0 == count ( $archive_files ) )
return new WP_Error ( 'empty_archive' , __ ( 'Empty archive' ));
2008-11-05 18:07:45 +01:00
//Prepend another directory level if there are files in the root directory of the zip
foreach ( $archive_files as $archive_file ) {
if ( false === strpos ( $archive_file [ 'filename' ], '/' ) ) {
$to = trailingslashit ( $to ) . basename ( $file , '.zip' );
break ;
}
}
2008-09-13 20:06:20 +02:00
$path = explode ( '/' , untrailingslashit ( $to ));
2008-09-09 05:24:05 +02:00
for ( $i = count ( $path ); $i > 0 ; $i -- ) { //>0 = first element is empty allways for paths starting with '/'
$tmppath = implode ( '/' , array_slice ( $path , 0 , $i ) );
if ( $fs -> is_dir ( $tmppath ) ) { //Found the highest folder that exists, Create from here(ie +1)
for ( $i = $i + 1 ; $i <= count ( $path ); $i ++ ) {
$tmppath = implode ( '/' , array_slice ( $path , 0 , $i ) );
if ( ! $fs -> mkdir ( $tmppath , 0755 ) )
return new WP_Error ( 'mkdir_failed' , __ ( 'Could not create directory' ), $tmppath );
}
break ; //Exit main for loop
}
2008-02-11 06:45:54 +01:00
}
2008-09-09 05:24:05 +02:00
$to = trailingslashit ( $to );
2008-02-11 06:45:54 +01:00
foreach ( $archive_files as $file ) {
2008-09-13 20:06:20 +02:00
$path = $file [ 'folder' ] ? $file [ 'filename' ] : dirname ( $file [ 'filename' ]);
$path = explode ( '/' , $path );
for ( $i = count ( $path ); $i >= 0 ; $i -- ) { //>=0 as the first element contains data
if ( empty ( $path [ $i ]) )
continue ;
2008-09-09 05:24:05 +02:00
$tmppath = $to . implode ( '/' , array_slice ( $path , 0 , $i ) );
if ( $fs -> is_dir ( $tmppath ) ) { //Found the highest folder that exists, Create from here
2008-09-11 19:44:43 +02:00
for ( $i = $i + 1 ; $i <= count ( $path ); $i ++ ) { //< count() no file component please.
2008-09-09 05:24:05 +02:00
$tmppath = $to . implode ( '/' , array_slice ( $path , 0 , $i ) );
2008-09-13 20:06:20 +02:00
if ( ! $fs -> is_dir ( $tmppath ) && ! $fs -> mkdir ( $tmppath , 0755 ) )
2008-09-09 05:24:05 +02:00
return new WP_Error ( 'mkdir_failed' , __ ( 'Could not create directory' ), $tmppath );
}
break ; //Exit main for loop
}
2008-02-11 06:45:54 +01:00
}
// We've made sure the folders are there, so let's extract the file now:
2008-08-07 21:15:04 +02:00
if ( ! $file [ 'folder' ] ) {
2008-03-01 22:20:23 +01:00
if ( ! $fs -> put_contents ( $to . $file [ 'filename' ], $file [ 'content' ]) )
2008-05-29 19:29:32 +02:00
return new WP_Error ( 'copy_failed' , __ ( 'Could not copy file' ), $to . $file [ 'filename' ]);
2008-03-01 22:20:23 +01:00
$fs -> chmod ( $to . $file [ 'filename' ], 0644 );
2008-08-07 21:15:04 +02:00
}
2008-02-11 06:45:54 +01:00
}
2008-03-01 22:20:23 +01:00
return true ;
2008-02-11 06:45:54 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $from
* @ param unknown_type $to
* @ return unknown
*/
2008-02-11 06:45:54 +01:00
function copy_dir ( $from , $to ) {
global $wp_filesystem ;
$dirlist = $wp_filesystem -> dirlist ( $from );
$from = trailingslashit ( $from );
$to = trailingslashit ( $to );
foreach ( ( array ) $dirlist as $filename => $fileinfo ) {
2008-03-01 22:20:23 +01:00
if ( 'f' == $fileinfo [ 'type' ] ) {
2008-11-03 18:16:41 +01:00
if ( ! $wp_filesystem -> copy ( $from . $filename , $to . $filename , true ) ) {
// 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 ) )
return new WP_Error ( 'copy_failed' , __ ( 'Could not copy file' ), $to . $filename );
}
2008-03-01 22:20:23 +01:00
$wp_filesystem -> chmod ( $to . $filename , 0644 );
} elseif ( 'd' == $fileinfo [ 'type' ] ) {
2008-08-09 00:49:35 +02:00
if ( ! $wp_filesystem -> is_dir ( $to . $filename ) ) {
if ( ! $wp_filesystem -> mkdir ( $to . $filename , 0755 ) )
return new WP_Error ( 'mkdir_failed' , __ ( 'Could not create directory' ), $to . $filename );
}
2008-05-29 19:29:32 +02:00
$result = copy_dir ( $from . $filename , $to . $filename );
if ( is_wp_error ( $result ) )
return $result ;
2008-02-11 06:45:54 +01:00
}
}
}
2008-11-05 18:07:45 +01:00
/**
* Locates the lowest safe directory in a Plugin folder to copy to the plugins directory .
*
* Note : Desination directory will allways be unique .
*
* @ since 2.7 . 0
*
* @ param string $from the Working directory of the plugin files
* @ param string $to the proposed destination for the for the plugin files
* @ return array an array of the keys 'from' and 'to' for the actual copy .
*/
function update_pluginfiles_base_dir ( $from , $to ) {
$files = list_files ( $from );
//Remove non-php files
foreach ( ( array ) $files as $key => $file )
if ( ! preg_match ( '!.php$!i' , $file ) )
unset ( $files [ $key ]);
//remove non-plugin files
foreach ( ( array ) $files as $key => $file ) {
$details = get_plugin_data ( $file , false , false );
if ( empty ( $details [ 'Name' ]) )
unset ( $files [ $key ]);
}
if ( empty ( $files ) )
return false ;
//Left with paths to files which ARE plugins.
$min_num = 100 ; //assume no zips with deeper paths will come along
$min_file = '' ;
foreach ( ( array ) $files as $key => $file ) {
$this_num = substr_count ( $file , '/' );
if ( $this_num < $min_num ) {
$min_file = $file ;
$min_num = $this_num ;
}
}
unset ( $min_num );
$from = dirname ( $min_file );
//Ensure its a unique install folder, Upgrades delete the folder prior to this.
$to = dirname ( $to ) . '/' . wp_unique_filename ( dirname ( $to ), basename ( $to ));
return compact ( 'from' , 'to' );
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $args
* @ return unknown
*/
2008-04-25 23:34:54 +02:00
function WP_Filesystem ( $args = false ) {
2008-02-11 06:45:54 +01:00
global $wp_filesystem ;
2008-05-29 19:29:32 +02:00
require_once ( ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php' );
2008-09-05 07:35:58 +02:00
$method = get_filesystem_method ( $args );
2008-05-05 19:06:29 +02:00
2008-02-11 06:45:54 +01:00
if ( ! $method )
return false ;
2008-09-09 05:24:05 +02:00
$abstraction_file = apply_filters ( 'filesystem_method_file' , ABSPATH . 'wp-admin/includes/class-wp-filesystem-' . $method . '.php' , $method );
2008-05-05 19:06:29 +02:00
if ( ! file_exists ( $abstraction_file ) )
return ;
require_once ( $abstraction_file );
2008-02-11 06:45:54 +01:00
$method = " WP_Filesystem_ $method " ;
$wp_filesystem = new $method ( $args );
if ( $wp_filesystem -> errors -> get_error_code () )
return false ;
if ( ! $wp_filesystem -> connect () )
return false ; //There was an erorr connecting to the server.
return true ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $args
* @ return unknown
*/
2008-09-05 07:35:58 +02:00
function get_filesystem_method ( $args = array ()) {
2008-04-25 23:34:54 +02:00
$method = false ;
if ( function_exists ( 'getmyuid' ) && function_exists ( 'fileowner' ) ){
$temp_file = wp_tempnam ();
if ( getmyuid () == fileowner ( $temp_file ) )
$method = 'direct' ;
unlink ( $temp_file );
2008-02-11 06:45:54 +01:00
}
2008-09-09 05:24:05 +02:00
if ( ! $method && isset ( $args [ 'connection_type' ]) && 'ssh' == $args [ 'connection_type' ] && extension_loaded ( 'ssh2' ) ) $method = 'ssh2' ;
2008-04-25 23:34:54 +02:00
if ( ! $method && extension_loaded ( 'ftp' ) ) $method = 'ftpext' ;
if ( ! $method && ( extension_loaded ( 'sockets' ) || function_exists ( 'fsockopen' ) ) ) $method = 'ftpsockets' ; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread
return apply_filters ( 'filesystem_method' , $method );
2008-02-11 06:45:54 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $form_post
* @ param unknown_type $type
* @ param unknown_type $error
* @ return unknown
*/
2008-08-04 23:01:09 +02:00
function request_filesystem_credentials ( $form_post , $type = '' , $error = false ) {
$req_cred = apply_filters ( 'request_filesystem_credentials' , '' , $form_post , $type , $error );
if ( '' !== $req_cred )
return $req_cred ;
if ( empty ( $type ) )
$type = get_filesystem_method ();
if ( 'direct' == $type )
return true ;
2008-08-09 07:36:14 +02:00
2008-09-13 20:06:20 +02:00
$credentials = get_option ( 'ftp_credentials' , array ());
2008-08-04 23:01:09 +02:00
// If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option)
$credentials [ 'hostname' ] = defined ( 'FTP_HOST' ) ? FTP_HOST : ( ! empty ( $_POST [ 'hostname' ]) ? $_POST [ 'hostname' ] : $credentials [ 'hostname' ]);
$credentials [ 'username' ] = defined ( 'FTP_USER' ) ? FTP_USER : ( ! empty ( $_POST [ 'username' ]) ? $_POST [ 'username' ] : $credentials [ 'username' ]);
$credentials [ 'password' ] = defined ( 'FTP_PASS' ) ? FTP_PASS : ( ! empty ( $_POST [ 'password' ]) ? $_POST [ 'password' ] : $credentials [ 'password' ]);
2008-09-09 05:24:05 +02:00
2008-09-11 19:44:43 +02:00
// Check to see if we are setting the public/private keys for ssh
$credentials [ 'public_key' ] = defined ( 'FTP_PUBKEY' ) ? FTP_PUBKEY : ( ! empty ( $_POST [ 'public_key' ]) ? $_POST [ 'public_key' ] : $credentials [ 'public_key' ]);
$credentials [ 'private_key' ] = defined ( 'FTP_PRIKEY' ) ? FTP_PRIKEY : ( ! empty ( $_POST [ 'private_key' ]) ? $_POST [ 'private_key' ] : $credentials [ 'private_key' ]);
2008-09-09 05:24:05 +02:00
if ( strpos ( $credentials [ 'hostname' ], ':' ) )
list ( $credentials [ 'hostname' ], $credentials [ 'port' ] ) = explode ( ':' , $credentials [ 'hostname' ], 2 );
if ( defined ( 'FTP_SSH' ) || ( isset ( $_POST [ 'connection_type' ]) && 'ssh' == $_POST [ 'connection_type' ]) )
2008-09-05 07:35:58 +02:00
$credentials [ 'connection_type' ] = 'ssh' ;
2008-09-09 05:24:05 +02:00
else if ( defined ( 'FTP_SSL' ) || ( isset ( $_POST [ 'connection_type' ]) && 'ftps' == $_POST [ 'connection_type' ]) )
2008-09-05 07:35:58 +02:00
$credentials [ 'connection_type' ] = 'ftps' ;
2008-09-13 20:06:20 +02:00
else if ( ! isset ( $credentials [ 'connection_type' ]) || ( isset ( $_POST [ 'connection_type' ]) && 'ftp' == $_POST [ 'connection_type' ]) )
2008-09-05 07:35:58 +02:00
$credentials [ 'connection_type' ] = 'ftp' ;
2008-08-04 23:01:09 +02:00
if ( ! $error && ! empty ( $credentials [ 'password' ]) && ! empty ( $credentials [ 'username' ]) && ! empty ( $credentials [ 'hostname' ]) ) {
$stored_credentials = $credentials ;
2008-09-11 19:44:43 +02:00
unset ( $stored_credentials [ 'password' ], $stored_credentials [ 'private_key' ], $stored_credentials [ 'public_key' ]);
2008-08-04 23:01:09 +02:00
update_option ( 'ftp_credentials' , $stored_credentials );
return $credentials ;
}
$hostname = '' ;
$username = '' ;
$password = '' ;
2008-09-09 05:24:05 +02:00
$connection_type = '' ;
2008-08-04 23:01:09 +02:00
if ( ! empty ( $credentials ) )
extract ( $credentials , EXTR_OVERWRITE );
2008-09-05 07:35:58 +02:00
if ( $error ) {
$error_string = __ ( '<strong>Error:</strong> There was an error connecting to the server, Please verify the settings are correct.' );
if ( is_wp_error ( $error ) )
$error_string = $error -> get_error_message ();
echo '<div id="message" class="error"><p>' . $error_string . '</p></div>' ;
}
2008-08-04 23:01:09 +02:00
?>
2008-09-11 19:44:43 +02:00
< script type = " text/javascript " >
<!--
jQuery ( function ( $ ){
jQuery ( " #ssh " ) . click ( function () {
2008-09-13 20:06:20 +02:00
jQuery ( " #ssh_keys " ) . show ();
2008-09-11 19:44:43 +02:00
});
2008-09-13 20:06:20 +02:00
jQuery ( " #ftp, #ftps " ) . click ( function () {
jQuery ( " #ssh_keys " ) . hide ();
2008-09-11 19:44:43 +02:00
});
});
-->
</ script >
2008-08-04 23:01:09 +02:00
< form action = " <?php echo $form_post ?> " method = " post " >
< div class = " wrap " >
2008-09-13 20:06:20 +02:00
< h2 >< ? php _e ( 'Connection Information' ) ?> </h2>
< p >< ? php _e ( 'To perform the requested action, connection information is required.' ) ?> </p>
2008-08-04 23:01:09 +02:00
< table class = " form-table " >
< tr valign = " top " >
2008-09-05 07:35:58 +02:00
< th scope = " row " >< label for = " hostname " >< ? php _e ( 'Hostname' ) ?> </label></th>
2008-09-09 05:24:05 +02:00
< td >< input name = " hostname " type = " text " id = " hostname " value = " <?php echo attribute_escape( $hostname ); if ( !empty( $port ) ) echo " : $port " ; ?> " < ? php if ( defined ( 'FTP_HOST' ) ) echo ' disabled="disabled"' ?> size="40" /></td>
2008-08-04 23:01:09 +02:00
</ tr >
< tr valign = " top " >
2008-09-05 07:35:58 +02:00
< th scope = " row " >< label for = " username " >< ? php _e ( 'Username' ) ?> </label></th>
2008-08-04 23:01:09 +02:00
< td >< input name = " username " type = " text " id = " username " value = " <?php echo attribute_escape( $username ) ?> " < ? php if ( defined ( 'FTP_USER' ) ) echo ' disabled="disabled"' ?> size="40" /></td>
</ tr >
< tr valign = " top " >
2008-09-05 07:35:58 +02:00
< th scope = " row " >< label for = " password " >< ? php _e ( 'Password' ) ?> </label></th>
2008-08-04 23:01:09 +02:00
< td >< input name = " password " type = " password " id = " password " value = " " < ? php if ( defined ( 'FTP_PASS' ) ) echo ' disabled="disabled"' ?> size="40" /><?php if( defined('FTP_PASS') && !empty($password) ) echo '<em>'.__('(Password not shown)').'</em>'; ?></td>
</ tr >
2008-09-13 20:06:20 +02:00
< tr id = " ssh_keys " valign = " top " style = " <?php if ( 'ssh' != $connection_type ) echo 'display:none' ?> " >
2008-09-11 19:44:43 +02:00
< th scope = " row " >< label id = " keys " for = " keys " >< ? php _e ( 'Authentication Keys' ) ?> </label></th>
< td >< label for = " public_key " >< ? php _e ( 'Public Key:' ) ?> </label ><input name="public_key" type="text" id="public_key" value=""<?php if( defined('FTP_PUBKEY') ) echo ' disabled="disabled"' ?> size="40" /> <label for="private_key"><?php _e('Private Key:') ?></label> <input name="private_key" type="text" id="private_key" value=""<?php if( defined('FTP_PRIKEY') ) echo ' disabled="disabled"' ?> size="40" /><br/><div><?php _e('Enter the location on the server where the keys are located. If a passphrase is needed, enter that in the password field above.') ?></div></td>
</ tr >
2008-08-04 23:01:09 +02:00
< tr valign = " top " >
2008-09-05 07:35:58 +02:00
< th scope = " row " >< ? php _e ( 'Connection Type' ) ?> </th>
2008-08-04 23:01:09 +02:00
< td >
2008-09-05 07:35:58 +02:00
< fieldset >< legend class = " hidden " >< ? php _e ( 'Connection Type' ) ?> </legend>
2008-09-13 20:06:20 +02:00
< p >< label >< input id = " ftp " name = " connection_type " type = " radio " value = " ftp " < ? php checked ( 'ftp' , $connection_type ); if ( defined ( 'FTP_SSL' ) || defined ( 'FTP_SSH' ) ) echo ' disabled="disabled"' ; ?> /> <?php _e('FTP') ?></label><br />
< label >< input id = " ftps " name = " connection_type " type = " radio " value = " ftps " < ? php checked ( 'ftps' , $connection_type ); if ( defined ( 'FTP_SSH' ) || defined ( 'FTP_SSH' ) ) echo ' disabled="disabled"' ; ?> /> <?php _e('FTPS (SSL)') ?></label><br />
< ? php if ( extension_loaded ( 'ssh2' ) ) { ?> <label><input id="ssh" name="connection_type" type="radio" value="ssh" <?php checked('ssh', $connection_type); if ( defined('FTP_SSL') || defined('FTP_SSH') ) echo ' disabled="disabled"'; ?>/> <?php _e('SSH') ?></label><?php } ?></p>
2008-09-05 07:35:58 +02:00
</ fieldset >
2008-08-04 23:01:09 +02:00
</ td >
</ tr >
</ table >
2008-11-01 07:56:38 +01:00
< ? php if ( isset ( $_POST [ 'version' ] ) ) : ?>
< input type = " hidden " name = " version " value = " <?php echo attribute_escape( $_POST['version'] ) ?> " />
< ? php endif ; ?>
< ? php if ( isset ( $_POST [ 'locale' ] ) ) : ?>
< input type = " hidden " name = " locale " value = " <?php echo attribute_escape( $_POST['locale'] ) ?> " />
< ? php endif ; ?>
2008-08-04 23:01:09 +02:00
< p class = " submit " >
2008-11-01 07:56:38 +01:00
< input id = " upgrade " name = " upgrade " type = " submit " value = " <?php _e('Proceed'); ?> " />
2008-08-04 23:01:09 +02:00
</ p >
</ div >
</ form >
< ? php
return false ;
}
?>