From d1d186cd354e48e4c27c71b7730e9e0eb4b48055 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 30 May 2008 16:14:05 +0000 Subject: [PATCH] WP_Filesystem updates from DD32. See #7059 git-svn-id: http://svn.automattic.com/wordpress/trunk@8018 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../includes/class-wp-filesystem-base.php | 158 ++++++++++++++++++ .../includes/class-wp-filesystem-direct.php | 11 +- .../class-wp-filesystem-ftpsockets.php | 140 ++++------------ 3 files changed, 201 insertions(+), 108 deletions(-) create mode 100644 wp-admin/includes/class-wp-filesystem-base.php diff --git a/wp-admin/includes/class-wp-filesystem-base.php b/wp-admin/includes/class-wp-filesystem-base.php new file mode 100644 index 000000000..7bb621718 --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-base.php @@ -0,0 +1,158 @@ +method, 'ftp') !== false ) + return FTP_BASE; + return $this->find_folder(ABSPATH); + } + function wp_content_dir() { + if ( defined('FTP_CONTENT_DIR') && strpos($this->method, 'ftp') !== false ) + return FTP_CONTENT_DIR; + return $this->find_folder(WP_CONTENT_DIR); + } + function wp_plugins_dir() { + if ( defined('FTP_PLUGIN_DIR') && strpos($this->method, 'ftp') !== false ) + return FTP_PLUGIN_DIR; + return $this->find_folder(WP_PLUGIN_DIR); + } + function wp_themes_dir() { + return $this->wp_content_dir() . '/themes'; + } + //Back compat: use abspath() or wp_*_dir + function find_base_dir($base = '.', $echo = false) { + $this->verbose = $echo; + return $this->abspath(); + } + //Back compat: use ::abspath() or ::wp_*_dir + function get_base_dir($base = '.', $echo = false) { + $this->verbose = $echo; + return $this->abspath(); + } + + function find_folder($folder) { + $folder = str_replace('\\', '/', $folder); //Windows Sanitiation + if ( isset($this->cache[ $folder ] ) ) + return $this->cache[ $folder ]; + + if ( $this->exists($folder) ) { //Folder exists at that absolute path. + $this->cache[ $folder ] = $folder; + return $folder; + } + if( $return = $this->search_for_folder($folder) ) + $this->cache[ $folder ] = $return; + return $return; + } + + // Assumes $folder is windows sanitized; + // Assumes that the drive letter is safe to be stripped off, Should not be a problem for windows servers. + function search_for_folder($folder, $base = '.', $loop = false ) { + if ( empty( $base ) || '.' == $base ) + $base = trailingslashit($this->cwd()); + + $folder = preg_replace('|^([a-z]{1}):|i', '', $folder); //Strip out windows driveletter if its there. + + $folder_parts = explode('/', $folder); + $last_path = $folder_parts[ count($folder_parts) - 1 ]; + + $files = $this->dirlist( $base ); + + foreach ( $folder_parts as $key ) { + if ( $key == $last_path ) + continue; //We want this to be caught by the next code block. + + //Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder, + // If its found, change into it and follow through looking for it. + // If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on. + // If it reaches the end, and still cant find it, it'll return false for the entire function. + if( isset($files[ $key ]) ){ + //Lets try that folder: + $newdir = trailingslashit(path_join($base, $key)); + if( $this->verbose ) + printf( __('Changing to %s') . '
', $newdir ); + if( $ret = $this->search_for_folder( $folder, $newdir, $loop) ) + return $ret; + } + } + + //Only check this as a last resort, to prevent locating the incorrect install. All above proceeedures will fail quickly if this is the right branch to take. + if(isset( $files[ $last_path ] ) ) { + if( $this->verbose ) + printf( __('Found %s') . '
', $base . $last_path ); + return $base . $last_path; + } + if( $loop ) + return false;//Prevent tihs function looping again. + //As an extra last resort, Change back to / if the folder wasnt found. This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... mainly dedicated setups. + return $this->search_for_folder($folder, '/', true); + + } + + //Common Helper functions. + function gethchmod($file){ + //From the PHP.net page for ...? + $perms = $this->getchmod($file); + if (($perms & 0xC000) == 0xC000) // Socket + $info = 's'; + elseif (($perms & 0xA000) == 0xA000) // Symbolic Link + $info = 'l'; + elseif (($perms & 0x8000) == 0x8000) // Regular + $info = '-'; + elseif (($perms & 0x6000) == 0x6000) // Block special + $info = 'b'; + elseif (($perms & 0x4000) == 0x4000) // Directory + $info = 'd'; + elseif (($perms & 0x2000) == 0x2000) // Character special + $info = 'c'; + elseif (($perms & 0x1000) == 0x1000)// FIFO pipe + $info = 'p'; + else // Unknown + $info = 'u'; + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x' ) : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x' ) : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x' ) : + (($perms & 0x0200) ? 'T' : '-')); + return $info; + } + function getnumchmodfromh($mode) { + $realmode = ""; + $legal = array("", "w", "r", "x", "-"); + $attarray = preg_split("//", $mode); + + for($i=0; $i < count($attarray); $i++) + if($key = array_search($attarray[$i], $legal)) + $realmode .= $legal[$key]; + + $mode = str_pad($realmode, 9, '-'); + $trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1'); + $mode = strtr($mode,$trans); + + $newmode = ''; + $newmode .= $mode[0] + $mode[1] + $mode[2]; + $newmode .= $mode[3] + $mode[4] + $mode[5]; + $newmode .= $mode[6] + $mode[7] + $mode[8]; + return $newmode; + } +} +?> \ No newline at end of file diff --git a/wp-admin/includes/class-wp-filesystem-direct.php b/wp-admin/includes/class-wp-filesystem-direct.php index 47f52c35a..77a758266 100644 --- a/wp-admin/includes/class-wp-filesystem-direct.php +++ b/wp-admin/includes/class-wp-filesystem-direct.php @@ -4,6 +4,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base { var $permission = null; var $errors = array(); function WP_Filesystem_Direct($arg) { + $this->method = 'direct'; $this->errors = new WP_Error(); $this->permission = umask(); } @@ -19,10 +20,10 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base { function get_contents_array($file) { return @file($file); } - function put_contents($file,$contents,$mode=false,$type='') { - if ( ! ($fp = @fopen($file,'w' . $type)) ) + function put_contents($file, $contents, $mode = false, $type = '') { + if ( ! ($fp = @fopen($file, 'w' . $type)) ) return false; - @fwrite($fp,$contents); + @fwrite($fp, $contents); @fclose($fp); $this->chmod($file,$mode); return true; @@ -33,7 +34,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base { function chdir($dir) { return @chdir($dir); } - function chgrp($file,$group,$recursive=false) { + function chgrp($file, $group, $recursive = false) { if( ! $this->exists($file) ) return false; if( ! $recursive ) @@ -48,7 +49,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base { return true; } - function chmod($file,$mode=false,$recursive=false) { + function chmod($file, $mode = false, $recursive = false) { if( ! $mode ) $mode = $this->permission; if( ! $this->exists($file) ) diff --git a/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/wp-admin/includes/class-wp-filesystem-ftpsockets.php index 6b29895b1..3b6cdcc8a 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpsockets.php +++ b/wp-admin/includes/class-wp-filesystem-ftpsockets.php @@ -1,5 +1,5 @@ permission = $perm; } - function get_contents($file,$type='',$resumepos=0){ + function get_contents($file, $type = '', $resumepos = 0){ if( ! $this->exists($file) ) return false; if( empty($type) ){ - $extension = substr(strrchr($file, "."), 1); + $extension = substr(strrchr($file, '.'), 1); $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII; } $this->ftp->SetType($type); - $temp = tmpfile(); - if ( ! $temp ) + $temp = wp_tempnam( $file ); + if ( ! $temphandle = fopen($temp, 'w+') ) return false; - if ( ! $this->ftp->fget($temp, $file) ) { - fclose($temp); + if ( ! $this->ftp->fget($temphandle, $file) ) { + fclose($temphandle); + unlink($temp); return ''; //Blank document, File does exist, Its just blank. } - fseek($temp, 0); //Skip back to the start of the file being written to + fseek($temphandle, 0); //Skip back to the start of the file being written to $contents = ''; - while ( !feof($temp) ) - $contents .= fread($temp, 8192); - fclose($temp); + while ( ! feof($temphandle) ) + $contents .= fread($temphandle, 8192); + fclose($temphandle); + unlink($temp); return $contents; } function get_contents_array($file){ - return explode("\n",$this->get_contents($file)); + return explode("\n", $this->get_contents($file) ); } - function put_contents($file,$contents,$type=''){ + function put_contents($file, $contents, $type = '' ) { if( empty($type) ){ - $extension = substr(strrchr($file, "."), 1); - $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII; + $extension = substr(strrchr($file, '.'), 1); + $type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII; } $this->ftp->SetType($type); - $temp = tmpfile(); - if ( ! $temp ) + $temp = wp_tempnam( $file ); + if ( ! $temphandle = fopen($temp, 'w+') ){ + unlink($temp); return false; - fwrite($temp,$contents); - fseek($temp, 0); //Skip back to the start of the file being written to - $ret = $this->ftp->fput($file, $temp); - fclose($temp); + } + fwrite($temphandle, $contents); + fseek($temphandle, 0); //Skip back to the start of the file being written to + $ret = $this->ftp->fput($file, $temphandle); + fclose($temphandle); + unlink($temp); return $ret; } - function cwd(){ + function cwd() { $cwd = $this->ftp->pwd(); if( $cwd ) $cwd = trailingslashit($cwd); return $cwd; } - function chdir($file){ + function chdir($file) { return $this->ftp->chdir($file); } - function chgrp($file,$group,$recursive=false){ + function chgrp($file, $group, $recursive = false ) { return false; } - function chmod($file,$mode=false,$recursive=false){ + function chmod($file, $mode = false, $recursive = false ){ if( ! $mode ) $mode = $this->permission; if( ! $mode ) return false; //if( ! $this->exists($file) ) // return false; - if( ! $recursive || ! $this->is_dir($file) ){ + if( ! $recursive || ! $this->is_dir($file) ) { return $this->ftp->chmod($file,$mode); } //Is a directory, and we want recursive $filelist = $this->dirlist($file); foreach($filelist as $filename){ - $this->chmod($file.'/'.$filename,$mode,$recursive); + $this->chmod($file . '/' . $filename, $mode, $recursive); } return true; } - function chown($file,$owner,$recursive=false){ + function chown($file, $owner, $recursive = false ) { return false; } - function owner($file){ + function owner($file) { $dir = $this->dirlist($file); return $dir[$file]['owner']; } - function getchmod($file){ + function getchmod($file) { $dir = $this->dirlist($file); return $dir[$file]['permsn']; } - function gethchmod($file){ - //From the PHP.net page for ...? - $perms = $this->getchmod($file); - if (($perms & 0xC000) == 0xC000) { - // Socket - $info = 's'; - } elseif (($perms & 0xA000) == 0xA000) { - // Symbolic Link - $info = 'l'; - } elseif (($perms & 0x8000) == 0x8000) { - // Regular - $info = '-'; - } elseif (($perms & 0x6000) == 0x6000) { - // Block special - $info = 'b'; - } elseif (($perms & 0x4000) == 0x4000) { - // Directory - $info = 'd'; - } elseif (($perms & 0x2000) == 0x2000) { - // Character special - $info = 'c'; - } elseif (($perms & 0x1000) == 0x1000) { - // FIFO pipe - $info = 'p'; - } else { - // Unknown - $info = 'u'; - } - - // Owner - $info .= (($perms & 0x0100) ? 'r' : '-'); - $info .= (($perms & 0x0080) ? 'w' : '-'); - $info .= (($perms & 0x0040) ? - (($perms & 0x0800) ? 's' : 'x' ) : - (($perms & 0x0800) ? 'S' : '-')); - - // Group - $info .= (($perms & 0x0020) ? 'r' : '-'); - $info .= (($perms & 0x0010) ? 'w' : '-'); - $info .= (($perms & 0x0008) ? - (($perms & 0x0400) ? 's' : 'x' ) : - (($perms & 0x0400) ? 'S' : '-')); - - // World - $info .= (($perms & 0x0004) ? 'r' : '-'); - $info .= (($perms & 0x0002) ? 'w' : '-'); - $info .= (($perms & 0x0001) ? - (($perms & 0x0200) ? 't' : 'x' ) : - (($perms & 0x0200) ? 'T' : '-')); - return $info; - } - - function getnumchmodfromh($mode) { - $realmode = ""; - $legal = array("","w","r","x","-"); - $attarray = preg_split("//",$mode); - for($i=0;$i'0','r'=>'4','w'=>'2','x'=>'1'); - $mode = strtr($mode,$trans); - $newmode = ''; - $newmode .= $mode[0]+$mode[1]+$mode[2]; - $newmode .= $mode[3]+$mode[4]+$mode[5]; - $newmode .= $mode[6]+$mode[7]+$mode[8]; - return $newmode; - } - - function group($file){ + function group($file) { $dir = $this->dirlist($file); return $dir[$file]['group']; } - function copy($source,$destination,$overwrite=false){ + function copy($source, $destination, $overwrite = false ) { if( ! $overwrite && $this->exists($destination) ) return false;