X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/177fd6fefd2e3d5a0ea6591c71d660cabdb3c1a4..5d244c8fd9a27c9f89dd08da2af6fbc67d4fce63:/wp-admin/includes/class-wp-filesystem-direct.php diff --git a/wp-admin/includes/class-wp-filesystem-direct.php b/wp-admin/includes/class-wp-filesystem-direct.php index 45972a38..1e4cb50a 100644 --- a/wp-admin/includes/class-wp-filesystem-direct.php +++ b/wp-admin/includes/class-wp-filesystem-direct.php @@ -1,190 +1,254 @@ method = 'direct'; $this->errors = new WP_Error(); - $this->permission = umask(); - } - function connect(){ - return true; - } - function setDefaultPermissions($perm){ - $this->permission = $perm; } - function find_base_dir($base = '.', $echo = false){ - return str_replace('\\','/',ABSPATH); - } - function get_base_dir($base = '.', $echo = false){ - return $this->find_base_dir($base, $echo); - } - function get_contents($file){ + + /** + * Reads entire file into a string + * + * @param string $file Name of the file to read. + * @return string|bool The function returns the read data or false on failure. + */ + public function get_contents($file) { return @file_get_contents($file); } - function get_contents_array($file){ + + /** + * Reads entire file into an array + * + * @param string $file Path to the file. + * @return array|bool the file contents in an array or false on failure. + */ + public function get_contents_array($file) { return @file($file); } - function put_contents($file,$contents,$mode=false,$type=''){ - if ( ! ($fp = @fopen($file,'w'.$type)) ) + + /** + * Write a string to a file + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool False upon failure, true otherwise. + */ + public function put_contents( $file, $contents, $mode = false ) { + $fp = @fopen( $file, 'wb' ); + if ( ! $fp ) + return false; + + mbstring_binary_safe_encoding(); + + $data_length = strlen( $contents ); + + $bytes_written = fwrite( $fp, $contents ); + + reset_mbstring_encoding(); + + fclose( $fp ); + + if ( $data_length !== $bytes_written ) return false; - @fwrite($fp,$contents); - @fclose($fp); - $this->chmod($file,$mode); + + $this->chmod( $file, $mode ); + return true; } - function cwd(){ + + /** + * Gets the current working directory + * + * @return string|bool the current working directory on success, or false on failure. + */ + public function cwd() { return @getcwd(); } - function chdir($dir){ + + /** + * Change directory + * + * @param string $dir The new current directory. + * @return bool Returns true on success or false on failure. + */ + public function chdir($dir) { return @chdir($dir); } - function chgrp($file,$group,$recursive=false){ - if( ! $this->exists($file) ) + + /** + * Changes file group + * + * @param string $file Path to the file. + * @param mixed $group A group name or number. + * @param bool $recursive Optional. If set True changes file group recursively. Default false. + * @return bool Returns true on success or false on failure. + */ + public function chgrp($file, $group, $recursive = false) { + if ( ! $this->exists($file) ) return false; - if( ! $recursive ) - return @chgrp($file,$group); - if( ! $this->is_dir($file) ) - return @chgrp($file,$group); - //Is a directory, and we want recursive + if ( ! $recursive ) + return @chgrp($file, $group); + if ( ! $this->is_dir($file) ) + return @chgrp($file, $group); + // Is a directory, and we want recursive $file = trailingslashit($file); $filelist = $this->dirlist($file); - foreach($filelist as $filename) + foreach ($filelist as $filename) $this->chgrp($file . $filename, $group, $recursive); return true; } - function chmod($file,$mode=false,$recursive=false){ - if( ! $mode ) - $mode = $this->permission; - if( ! $this->exists($file) ) - return false; - if( ! $recursive ) - return @chmod($file,$mode); - if( ! $this->is_dir($file) ) - return @chmod($file,$mode); - //Is a directory, and we want recursive + + /** + * Changes filesystem permissions + * + * @param string $file Path to the file. + * @param int $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @param bool $recursive Optional. If set True changes file group recursively. Default false. + * @return bool Returns true on success or false on failure. + */ + public function chmod($file, $mode = false, $recursive = false) { + if ( ! $mode ) { + if ( $this->is_file($file) ) + $mode = FS_CHMOD_FILE; + elseif ( $this->is_dir($file) ) + $mode = FS_CHMOD_DIR; + else + return false; + } + + if ( ! $recursive || ! $this->is_dir($file) ) + return @chmod($file, $mode); + // Is a directory, and we want recursive $file = trailingslashit($file); $filelist = $this->dirlist($file); - foreach($filelist as $filename) + foreach ( (array)$filelist as $filename => $filemeta) $this->chmod($file . $filename, $mode, $recursive); return true; } - function chown($file,$owner,$recursive=false){ - if( ! $this->exists($file) ) + + /** + * Changes file owner + * + * @param string $file Path to the file. + * @param mixed $owner A user name or number. + * @param bool $recursive Optional. If set True changes file owner recursively. + * Default false. + * @return bool Returns true on success or false on failure. + */ + public function chown($file, $owner, $recursive = false) { + if ( ! $this->exists($file) ) return false; - if( ! $recursive ) - return @chown($file,$owner); - if( ! $this->is_dir($file) ) - return @chown($file,$owner); - //Is a directory, and we want recursive + if ( ! $recursive ) + return @chown($file, $owner); + if ( ! $this->is_dir($file) ) + return @chown($file, $owner); + // Is a directory, and we want recursive $filelist = $this->dirlist($file); - foreach($filelist as $filename){ - $this->chown($file.'/'.$filename,$owner,$recursive); + foreach ($filelist as $filename) { + $this->chown($file . '/' . $filename, $owner, $recursive); } return true; } - function owner($file){ + + /** + * Gets file owner + * + * @param string $file Path to the file. + * @return string|bool Username of the user or false on error. + */ + public function owner($file) { $owneruid = @fileowner($file); - if( ! $owneruid ) + if ( ! $owneruid ) return false; - if( !function_exists('posix_getpwuid') ) + if ( ! function_exists('posix_getpwuid') ) return $owneruid; $ownerarray = posix_getpwuid($owneruid); return $ownerarray['name']; } - function getchmod($file){ - return @fileperms($file); - } - 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; + /** + * Gets file permissions + * + * FIXME does not handle errors in fileperms() + * + * @param string $file Path to the file. + * @return string Mode of the file (last 3 digits). + */ + public function getchmod($file) { + return substr( decoct( @fileperms( $file ) ), -3 ); } - 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){ + + /** + * @param string $file + * @return string|false + */ + public function group($file) { $gid = @filegroup($file); - if( ! $gid ) + if ( ! $gid ) return false; - if( !function_exists('posix_getgrgid') ) + if ( ! function_exists('posix_getgrgid') ) return $gid; $grouparray = posix_getgrgid($gid); return $grouparray['name']; } - function copy($source,$destination,$overwrite=false){ - if( ! $overwrite && $this->exists($destination) ) + /** + * @param string $source + * @param string $destination + * @param bool $overwrite + * @param int $mode + * @return bool + */ + public function copy($source, $destination, $overwrite = false, $mode = false) { + if ( ! $overwrite && $this->exists($destination) ) return false; - return copy($source,$destination); + + $rtval = copy($source, $destination); + if ( $mode ) + $this->chmod($destination, $mode); + return $rtval; } - function move($source,$destination,$overwrite=false){ - //Possible to use rename()? - if( $this->copy($source,$destination,$overwrite) && $this->exists($destination) ){ + /** + * @param string $source + * @param string $destination + * @param bool $overwrite + * @return bool + */ + public function move($source, $destination, $overwrite = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + + // Try using rename first. if that fails (for example, source is read only) try copy. + if ( @rename($source, $destination) ) + return true; + + if ( $this->copy($source, $destination, $overwrite) && $this->exists($destination) ) { $this->delete($source); return true; } else { @@ -192,116 +256,184 @@ class WP_Filesystem_Direct{ } } - function delete($file, $recursive=false){ - $file = str_replace('\\','/',$file); //for win32, occasional problems deleteing files otherwise + /** + * @param string $file + * @param bool $recursive + * @param string $type + * @return bool + */ + public function delete($file, $recursive = false, $type = false) { + if ( empty( $file ) ) // Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem. + return false; + $file = str_replace( '\\', '/', $file ); // for win32, occasional problems deleting files otherwise - if( $this->is_file($file) ) + if ( 'f' == $type || $this->is_file($file) ) return @unlink($file); - if( !$recursive && $this->is_dir($file) ) + if ( ! $recursive && $this->is_dir($file) ) return @rmdir($file); - //At this point its a folder, and we're in recursive mode + // At this point it's a folder, and we're in recursive mode $file = trailingslashit($file); $filelist = $this->dirlist($file, true); $retval = true; - if( is_array($filelist) ) //false if no files, So check first. - foreach($filelist as $filename=>$fileinfo) - if( ! $this->delete($file . $filename, $recursive) ) + if ( is_array( $filelist ) ) { + foreach ( $filelist as $filename => $fileinfo ) { + if ( ! $this->delete($file . $filename, $recursive, $fileinfo['type']) ) $retval = false; + } + } + + if ( file_exists($file) && ! @rmdir($file) ) + $retval = false; - if( ! @rmdir($file) ) - return false; return $retval; } - - function exists($file){ + /** + * @param string $file + * @return bool + */ + public function exists($file) { return @file_exists($file); } - - function is_file($file){ + /** + * @param string $file + * @return bool + */ + public function is_file($file) { return @is_file($file); } - - function is_dir($path){ + /** + * @param string $path + * @return bool + */ + public function is_dir($path) { return @is_dir($path); } - function is_readable($file){ + /** + * @param string $file + * @return bool + */ + public function is_readable($file) { return @is_readable($file); } - function is_writable($file){ + /** + * @param string $file + * @return bool + */ + public function is_writable($file) { return @is_writable($file); } - function atime($file){ + /** + * @param string $file + * @return int + */ + public function atime($file) { return @fileatime($file); } - function mtime($file){ + /** + * @param string $file + * @return int + */ + public function mtime($file) { return @filemtime($file); } - function size($file){ + + /** + * @param string $file + * @return int + */ + public function size($file) { return @filesize($file); } - function touch($file, $time = 0, $atime = 0){ - if($time == 0) + /** + * @param string $file + * @param int $time + * @param int $atime + * @return bool + */ + public function touch($file, $time = 0, $atime = 0) { + if ($time == 0) $time = time(); - if($atime == 0) + if ($atime == 0) $atime = time(); - return @touch($file,$time,$atime); + return @touch($file, $time, $atime); } - function mkdir($path, $chmod = false, $chown = false, $chgrp = false){ - if( ! $chmod) - $chmod = $this->permission; + /** + * @param string $path + * @param mixed $chmod + * @param mixed $chown + * @param mixed $chgrp + * @return bool + */ + public function mkdir($path, $chmod = false, $chown = false, $chgrp = false) { + // Safe mode fails with a trailing slash under certain PHP versions. + $path = untrailingslashit($path); + if ( empty($path) ) + return false; + + if ( ! $chmod ) + $chmod = FS_CHMOD_DIR; - if( !@mkdir($path,$chmod) ) + if ( ! @mkdir($path) ) return false; - if( $chown ) - $this->chown($path,$chown); - if( $chgrp ) - $this->chgrp($path,$chgrp); + $this->chmod($path, $chmod); + if ( $chown ) + $this->chown($path, $chown); + if ( $chgrp ) + $this->chgrp($path, $chgrp); return true; } - function rmdir($path,$recursive=false){ - //Currently unused and untested, Use delete() instead. - if( ! $recursive ) - return @rmdir($path); - //recursive: - $filelist = $this->dirlist($path); - foreach($filelist as $filename=>$det){ - if ( '/' == substr($filename,-1,1) ) - $this->rmdir($path.'/'.$filename,$recursive); - @rmdir($filename); - } - return @rmdir($path); + /** + * @param string $path + * @param bool $recursive + * @return type + */ + public function rmdir($path, $recursive = false) { + return $this->delete($path, $recursive); } - function dirlist($path,$incdot=false,$recursive=false){ - if( $this->is_file($path) ){ - $limitFile = basename($path); + /** + * @param string $path + * @param bool $include_hidden + * @param bool $recursive + * @return bool|array + */ + public function dirlist($path, $include_hidden = true, $recursive = false) { + if ( $this->is_file($path) ) { + $limit_file = basename($path); $path = dirname($path); } else { - $limitFile = false; + $limit_file = false; } - if( ! $this->is_dir($path) ) + + if ( ! $this->is_dir($path) ) + return false; + + $dir = @dir($path); + if ( ! $dir ) return false; $ret = array(); - $dir = dir($path); - while (false !== ($entry = $dir->read())) { + + while (false !== ($entry = $dir->read()) ) { $struc = array(); - $struc['name'] = $entry; + $struc['name'] = $entry; - if( '.' == $struc['name'] || '..' == $struc['name'] ) - continue; //Do not care about these folders. - if( '.' == $struc['name'][0] && !$incdot) + if ( '.' == $struc['name'] || '..' == $struc['name'] ) continue; - if( $limitFile && $struc['name'] != $limitFile) + + if ( ! $include_hidden && '.' == $struc['name'][0] ) + continue; + + if ( $limit_file && $struc['name'] != $limit_file) continue; $struc['perms'] = $this->gethchmod($path.'/'.$entry); @@ -315,9 +447,9 @@ class WP_Filesystem_Direct{ $struc['time'] = date('h:i:s',$struc['lastmodunix']); $struc['type'] = $this->is_dir($path.'/'.$entry) ? 'd' : 'f'; - if ('d' == $struc['type'] ){ - if( $recursive ) - $struc['files'] = $this->dirlist($path.'/'.$struc['name'], $incdot, $recursive); + if ( 'd' == $struc['type'] ) { + if ( $recursive ) + $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); else $struc['files'] = array(); } @@ -328,9 +460,4 @@ class WP_Filesystem_Direct{ unset($dir); return $ret; } - - function __destruct(){ - return; - } } -?>