[ Index ]

PHP Cross Reference of Wordpress 2.7.1

title

Body

[close]

/wp-admin/includes/ -> class-wp-filesystem-base.php (source)

   1  <?php
   2  /**
   3   * Base WordPress Filesystem.
   4   *
   5   * @package WordPress
   6   * @subpackage Filesystem
   7   */
   8  
   9  /**
  10   * Base WordPress Filesystem class for which Filesystem implementations extend
  11   *
  12   * @since 2.5
  13   */
  14  class WP_Filesystem_Base {
  15      /**
  16       * Whether to display debug data for the connection or not.
  17       *
  18       * @since 2.5
  19       * @access public
  20       * @var bool
  21       */
  22      var $verbose = false;
  23      /**
  24       * Cached list of local filepaths to maped remote filepaths.
  25       *
  26       * @since 2.7
  27       * @access private
  28       * @var array
  29       */
  30      var $cache = array();
  31  
  32      /**
  33       * The Access method of the current connection, Set automatically.
  34       *
  35       * @since 2.5
  36       * @access public
  37       * @var string
  38       */
  39      var $method = '';
  40  
  41      /**
  42       * Returns the path on the remote filesystem of ABSPATH
  43       *
  44       * @since 2.7
  45       * @access public
  46       * @return string The location of the remote path.
  47       */
  48  	function abspath() {
  49          if ( defined('FTP_BASE') && strpos($this->method, 'ftp') !== false )
  50              return FTP_BASE;
  51          $folder = $this->find_folder(ABSPATH);
  52          //Perhaps the FTP folder is rooted at the WordPress install, Check for wp-includes folder in root, Could have some false positives, but rare.
  53          if ( ! $folder && $this->is_dir('/wp-includes') )
  54              $folder = '/';
  55          return $folder;
  56      }
  57      /**
  58       * Returns the path on the remote filesystem of WP_CONTENT_DIR
  59       *
  60       * @since 2.7
  61       * @access public
  62       * @return string The location of the remote path.
  63       */
  64  	function wp_content_dir() {
  65          if ( defined('FTP_CONTENT_DIR') && strpos($this->method, 'ftp') !== false )
  66              return FTP_CONTENT_DIR;
  67          return $this->find_folder(WP_CONTENT_DIR);
  68      }
  69      /**
  70       * Returns the path on the remote filesystem of WP_PLUGIN_DIR
  71       *
  72       * @since 2.7
  73       * @access public
  74       *
  75       * @return string The location of the remote path.
  76       */
  77  	function wp_plugins_dir() {
  78          if ( defined('FTP_PLUGIN_DIR') && strpos($this->method, 'ftp') !== false )
  79              return FTP_PLUGIN_DIR;
  80          return $this->find_folder(WP_PLUGIN_DIR);
  81      }
  82      /**
  83       * Returns the path on the remote filesystem of the Themes Directory
  84       *
  85       * @since 2.7
  86       * @access public
  87       *
  88       * @return string The location of the remote path.
  89       */
  90  	function wp_themes_dir() {
  91          return $this->wp_content_dir() . '/themes';
  92      }
  93  
  94      /**
  95       * Locates a folder on the remote filesystem.
  96       *
  97       * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead.
  98       *
  99       * @since 2.5
 100       * @deprecated 2.7
 101       * @access public
 102       *
 103       * @param string $base The folder to start searching from
 104       * @param bool $echo True to display debug information
 105       * @return string The location of the remote path.
 106       */
 107  	function find_base_dir($base = '.', $echo = false) {
 108          _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );
 109          $this->verbose = $echo;
 110          return $this->abspath();
 111      }
 112      /**
 113       * Locates a folder on the remote filesystem.
 114       *
 115       * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead.
 116       *
 117       * @since 2.5
 118       * @deprecated 2.7
 119       * @access public
 120       *
 121       * @param string $base The folder to start searching from
 122       * @param bool $echo True to display debug information
 123       * @return string The location of the remote path.
 124       */
 125  	function get_base_dir($base = '.', $echo = false) {
 126          _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );
 127          $this->verbose = $echo;
 128          return $this->abspath();
 129      }
 130  
 131      /**
 132       * Locates a folder on the remote filesystem.
 133       *
 134       * Assumes that on Windows systems, Stripping off the Drive letter is OK
 135       * Sanitizes \\ to / in windows filepaths.
 136       *
 137       * @since 2.7
 138       * @access public
 139       *
 140       * @param string $folder the folder to locate
 141       * @return string The location of the remote path.
 142       */
 143  	function find_folder($folder) {
 144  
 145          $folder = preg_replace('|^([a-z]{1}):|i', '', $folder); //Strip out windows driveletter if its there.
 146          $folder = str_replace('\\', '/', $folder); //Windows path sanitiation
 147  
 148          if ( isset($this->cache[ $folder ] ) )
 149              return $this->cache[ $folder ];
 150  
 151          if ( $this->exists($folder) ) { //Folder exists at that absolute path.
 152              $this->cache[ $folder ] = $folder;
 153              return $folder;
 154          }
 155          if( $return = $this->search_for_folder($folder) )
 156              $this->cache[ $folder ] = $return;
 157          return $return;
 158      }
 159  
 160      /**
 161       * Locates a folder on the remote filesystem.
 162       *
 163       * Expects Windows sanitized path
 164       *
 165       * @since 2.7
 166       * @access private
 167       *
 168       * @param string $folder the folder to locate
 169       * @param string $base the folder to start searching from
 170       * @param bool $loop if the function has recursed, Internal use only
 171       * @return string The location of the remote path.
 172       */
 173  	function search_for_folder($folder, $base = '.', $loop = false ) {
 174          if ( empty( $base ) || '.' == $base )
 175              $base = trailingslashit($this->cwd());
 176  
 177          $folder = untrailingslashit($folder);
 178  
 179          $folder_parts = explode('/', $folder);
 180          $last_path = $folder_parts[ count($folder_parts) - 1 ];
 181  
 182          $files = $this->dirlist( $base );
 183  
 184          foreach ( $folder_parts as $key ) {
 185              if ( $key == $last_path )
 186                  continue; //We want this to be caught by the next code block.
 187  
 188              //Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder,
 189              // If its found, change into it and follow through looking for it.
 190              // If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on.
 191              // If it reaches the end, and still cant find it, it'll return false for the entire function.
 192              if( isset($files[ $key ]) ){
 193                  //Lets try that folder:
 194                  $newdir = trailingslashit(path_join($base, $key));
 195                  if( $this->verbose )
 196                      printf( __('Changing to %s') . '<br/>', $newdir );
 197                  if( $ret = $this->search_for_folder( $folder, $newdir, $loop) )
 198                      return $ret;
 199              }
 200          }
 201  
 202          //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.
 203          if(isset( $files[ $last_path ] ) ) {
 204              if( $this->verbose )
 205                  printf( __('Found %s') . '<br/>',  $base . $last_path );
 206              return $base . $last_path;
 207          }
 208          if( $loop )
 209              return false;//Prevent tihs function looping again.
 210          //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.
 211          return $this->search_for_folder($folder, '/', true);
 212  
 213      }
 214  
 215      /**
 216       * Returns the *nix style file permissions for a file
 217       *
 218       * From the PHP documentation page for fileperms()
 219       *
 220       * @link http://docs.php.net/fileperms
 221       * @since 2.5
 222       * @access public
 223       *
 224       * @param string $file string filename
 225       * @return int octal representation of permissions
 226       */
 227  	function gethchmod($file){
 228          $perms = $this->getchmod($file);
 229          if (($perms & 0xC000) == 0xC000) // Socket
 230              $info = 's';
 231          elseif (($perms & 0xA000) == 0xA000) // Symbolic Link
 232              $info = 'l';
 233          elseif (($perms & 0x8000) == 0x8000) // Regular
 234              $info = '-';
 235          elseif (($perms & 0x6000) == 0x6000) // Block special
 236              $info = 'b';
 237          elseif (($perms & 0x4000) == 0x4000) // Directory
 238              $info = 'd';
 239          elseif (($perms & 0x2000) == 0x2000) // Character special
 240              $info = 'c';
 241          elseif (($perms & 0x1000) == 0x1000)// FIFO pipe
 242              $info = 'p';
 243          else // Unknown
 244              $info = 'u';
 245  
 246          // Owner
 247          $info .= (($perms & 0x0100) ? 'r' : '-');
 248          $info .= (($perms & 0x0080) ? 'w' : '-');
 249          $info .= (($perms & 0x0040) ?
 250                      (($perms & 0x0800) ? 's' : 'x' ) :
 251                      (($perms & 0x0800) ? 'S' : '-'));
 252  
 253          // Group
 254          $info .= (($perms & 0x0020) ? 'r' : '-');
 255          $info .= (($perms & 0x0010) ? 'w' : '-');
 256          $info .= (($perms & 0x0008) ?
 257                      (($perms & 0x0400) ? 's' : 'x' ) :
 258                      (($perms & 0x0400) ? 'S' : '-'));
 259  
 260          // World
 261          $info .= (($perms & 0x0004) ? 'r' : '-');
 262          $info .= (($perms & 0x0002) ? 'w' : '-');
 263          $info .= (($perms & 0x0001) ?
 264                      (($perms & 0x0200) ? 't' : 'x' ) :
 265                      (($perms & 0x0200) ? 'T' : '-'));
 266          return $info;
 267      }
 268  
 269      /**
 270       * Converts *nix style file permissions to a octal number.
 271       *
 272       * Converts '-rw-r--r--' to 0644
 273       * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod()
 274        *
 275       * @link http://docs.php.net/manual/en/function.chmod.php#49614
 276       * @since 2.5
 277       * @access public
 278       *
 279       * @param string $mode string *nix style file permission
 280       * @return int octal representation
 281       */
 282  	function getnumchmodfromh($mode) {
 283          $realmode = '';
 284          $legal =  array('', 'w', 'r', 'x', '-');
 285          $attarray = preg_split('//', $mode);
 286  
 287          for($i=0; $i < count($attarray); $i++)
 288             if($key = array_search($attarray[$i], $legal))
 289                 $realmode .= $legal[$key];
 290  
 291          $mode = str_pad($realmode, 9, '-');
 292          $trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1');
 293          $mode = strtr($mode,$trans);
 294  
 295          $newmode = '';
 296          $newmode .= $mode[0] + $mode[1] + $mode[2];
 297          $newmode .= $mode[3] + $mode[4] + $mode[5];
 298          $newmode .= $mode[6] + $mode[7] + $mode[8];
 299          return $newmode;
 300      }
 301  
 302      /**
 303       * Determines if the string provided contains binary characters.
 304       *
 305       * @since 2.7
 306       * @access private
 307       *
 308       * @param string $text String to test against
 309       * @return bool true if string is binary, false otherwise
 310       */
 311  	function is_binary( $text ) {
 312          return (bool) preg_match('|[^\x20-\x7E]|', $text); //chr(32)..chr(127)
 313      }
 314  }
 315  
 316  ?>


Generated: Mon Mar 23 16:23:02 2009 Cross-referenced by PHPXref 0.7