]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-admin/includes/class-wp-filesystem-base.php
Wordpress 2.7.1
[autoinstalls/wordpress.git] / wp-admin / includes / class-wp-filesystem-base.php
index 820703e4db14299f2d96f5e85f9350e97cd20a42..eefdd1c28aaaf1d9c666c31e346022aa11510c41 100644 (file)
 <?php
-class WP_Filesystem_Base{
+/**
+ * Base WordPress Filesystem.
+ *
+ * @package WordPress
+ * @subpackage Filesystem
+ */
+
+/**
+ * Base WordPress Filesystem class for which Filesystem implementations extend
+ *
+ * @since 2.5
+ */
+class WP_Filesystem_Base {
+       /**
+        * Whether to display debug data for the connection or not.
+        *
+        * @since 2.5
+        * @access public
+        * @var bool
+        */
        var $verbose = false;
+       /**
+        * Cached list of local filepaths to maped remote filepaths.
+        *
+        * @since 2.7
+        * @access private
+        * @var array
+        */
        var $cache = array();
-       
+
+       /**
+        * The Access method of the current connection, Set automatically.
+        *
+        * @since 2.5
+        * @access public
+        * @var string
+        */
        var $method = '';
-       
+
+       /**
+        * Returns the path on the remote filesystem of ABSPATH
+        *
+        * @since 2.7
+        * @access public
+        * @return string The location of the remote path.
+        */
        function abspath() {
-               if ( defined('FTP_BASE') && strpos($this->method, 'ftp') !== false ) 
+               if ( defined('FTP_BASE') && strpos($this->method, 'ftp') !== false )
                        return FTP_BASE;
-               return $this->find_folder(ABSPATH);
+               $folder = $this->find_folder(ABSPATH);
+               //Perhaps the FTP folder is rooted at the WordPress install, Check for wp-includes folder in root, Could have some false positives, but rare.
+               if ( ! $folder && $this->is_dir('/wp-includes') )
+                       $folder = '/';
+               return $folder;
        }
+       /**
+        * Returns the path on the remote filesystem of WP_CONTENT_DIR
+        *
+        * @since 2.7
+        * @access public
+        * @return string The location of the remote path.
+        */
        function wp_content_dir() {
-               if ( defined('FTP_CONTENT_DIR') && strpos($this->method, 'ftp') !== false ) 
+               if ( defined('FTP_CONTENT_DIR') && strpos($this->method, 'ftp') !== false )
                        return FTP_CONTENT_DIR;
                return $this->find_folder(WP_CONTENT_DIR);
        }
+       /**
+        * Returns the path on the remote filesystem of WP_PLUGIN_DIR
+        *
+        * @since 2.7
+        * @access public
+        *
+        * @return string The location of the remote path.
+        */
        function wp_plugins_dir() {
-               if ( defined('FTP_PLUGIN_DIR') && strpos($this->method, 'ftp') !== false ) 
+               if ( defined('FTP_PLUGIN_DIR') && strpos($this->method, 'ftp') !== false )
                        return FTP_PLUGIN_DIR;
                return $this->find_folder(WP_PLUGIN_DIR);
        }
+       /**
+        * Returns the path on the remote filesystem of the Themes Directory
+        *
+        * @since 2.7
+        * @access public
+        *
+        * @return string The location of the remote path.
+        */
        function wp_themes_dir() {
                return $this->wp_content_dir() . '/themes';
        }
-       //Back compat: use abspath() or wp_*_dir
+
+       /**
+        * Locates a folder on the remote filesystem.
+        *
+        * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead.
+        *
+        * @since 2.5
+        * @deprecated 2.7
+        * @access public
+        *
+        * @param string $base The folder to start searching from
+        * @param bool $echo True to display debug information
+        * @return string The location of the remote path.
+        */
        function find_base_dir($base = '.', $echo = false) {
+               _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );
                $this->verbose = $echo;
                return $this->abspath();
        }
-       //Back compat: use ::abspath() or ::wp_*_dir
+       /**
+        * Locates a folder on the remote filesystem.
+        *
+        * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead.
+        *
+        * @since 2.5
+        * @deprecated 2.7
+        * @access public
+        *
+        * @param string $base The folder to start searching from
+        * @param bool $echo True to display debug information
+        * @return string The location of the remote path.
+        */
        function get_base_dir($base = '.', $echo = false) {
+               _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );
                $this->verbose = $echo;
                return $this->abspath();
        }
-       
+
+       /**
+        * Locates a folder on the remote filesystem.
+        *
+        * Assumes that on Windows systems, Stripping off the Drive letter is OK
+        * Sanitizes \\ to / in windows filepaths.
+        *
+        * @since 2.7
+        * @access public
+        *
+        * @param string $folder the folder to locate
+        * @return string The location of the remote path.
+        */
        function find_folder($folder) {
-               $folder = str_replace('\\', '/', $folder); //Windows Sanitiation
+
+               $folder = preg_replace('|^([a-z]{1}):|i', '', $folder); //Strip out windows driveletter if its there.
+               $folder = str_replace('\\', '/', $folder); //Windows path sanitiation
+
                if ( isset($this->cache[ $folder ] ) )
                        return $this->cache[ $folder ];
 
@@ -47,26 +156,37 @@ class WP_Filesystem_Base{
                        $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.
+
+       /**
+        * Locates a folder on the remote filesystem.
+        *
+        * Expects Windows sanitized path
+        *
+        * @since 2.7
+        * @access private
+        *
+        * @param string $folder the folder to locate
+        * @param string $base the folder to start searching from
+        * @param bool $loop if the function has recursed, Internal use only
+        * @return string The location of the remote path.
+        */
        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 = untrailingslashit($folder);
+
                $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. 
+                       //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 ]) ){
@@ -78,7 +198,7 @@ class WP_Filesystem_Base{
                                        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 )
@@ -88,13 +208,23 @@ class WP_Filesystem_Base{
                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); 
-               
+               return $this->search_for_folder($folder, '/', true);
+
        }
-       
-       //Common Helper functions.
+
+       /**
+        * Returns the *nix style file permissions for a file
+        *
+        * From the PHP documentation page for fileperms()
+        *
+        * @link http://docs.php.net/fileperms
+        * @since 2.5
+        * @access public
+        *
+        * @param string $file string filename
+        * @return int octal representation of permissions
+        */
        function gethchmod($file){
-               //From the PHP.net page for ...?
                $perms = $this->getchmod($file);
                if (($perms & 0xC000) == 0xC000) // Socket
                        $info = 's';
@@ -135,24 +265,52 @@ class WP_Filesystem_Base{
                                        (($perms & 0x0200) ? 'T' : '-'));
                return $info;
        }
+
+       /**
+        * Converts *nix style file permissions to a octal number.
+        *
+        * Converts '-rw-r--r--' to 0644
+        * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod()
+        *
+        * @link http://docs.php.net/manual/en/function.chmod.php#49614
+        * @since 2.5
+        * @access public
+        *
+        * @param string $mode string *nix style file permission
+        * @return int octal representation
+        */
        function getnumchmodfromh($mode) {
-               $realmode = "";
-               $legal =  array("", "w", "r", "x", "-");
-               $attarray = preg_split("//", $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;
        }
+
+       /**
+        * Determines if the string provided contains binary characters.
+        *
+        * @since 2.7
+        * @access private
+        *
+        * @param string $text String to test against
+        * @return bool true if string is binary, false otherwise
+        */
+       function is_binary( $text ) {
+               return (bool) preg_match('|[^\x20-\x7E]|', $text); //chr(32)..chr(127)
+       }
 }
+
 ?>