X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/959f97d8ecd5c1668103a3e41c795486b944bc68..a01a150d87a096c70b6ec80332b7ce89c943eefe:/wp-admin/includes/class-wp-filesystem-direct.php?ds=sidebyside diff --git a/wp-admin/includes/class-wp-filesystem-direct.php b/wp-admin/includes/class-wp-filesystem-direct.php index 45972a38..538a683e 100644 --- a/wp-admin/includes/class-wp-filesystem-direct.php +++ b/wp-admin/includes/class-wp-filesystem-direct.php @@ -1,190 +1,214 @@ method = 'direct'; $this->errors = new WP_Error(); - $this->permission = umask(); } - function connect(){ + /** + * connect filesystem. + * + * @return bool Returns true on success or false on failure (always true for WP_Filesystem_Direct). + */ + 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 $file string Name of the file to read. + * @return string|bool The function returns the read data or false on failure. + */ + function get_contents($file) { return @file_get_contents($file); } - function get_contents_array($file){ + /** + * Reads entire file into an array + * + * @param $file string Path to the file. + * @return array|bool the file contents in an array or false on failure. + */ + 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 $file string Remote path to the file where to write the data. + * @param $contents string The data to write. + * @param $mode int (optional) The file permissions as octal number, usually 0644. + * @return bool False upon failure. + */ + function put_contents($file, $contents, $mode = false ) { + if ( ! ($fp = @fopen($file, 'w')) ) return false; - @fwrite($fp,$contents); + @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. + */ + function cwd() { return @getcwd(); } - function chdir($dir){ + /** + * Change directory + * + * @param $dir string The new current directory. + * @return bool Returns true on success or false on failure. + */ + function chdir($dir) { return @chdir($dir); } - function chgrp($file,$group,$recursive=false){ - if( ! $this->exists($file) ) + /** + * Changes file group + * + * @param $file string Path to the file. + * @param $group mixed A group name or number. + * @param $recursive bool (optional) If set True changes file group recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + 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); + 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); + /** + * Changes filesystem permissions + * + * @param $file string Path to the file. + * @param $mode int (optional) The permissions as octal number, usually 0644 for files, 0755 for dirs. + * @param $recursive bool (optional) If set True changes file group recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + 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 $file string Path to the file. + * @param $owner mixed A user name or number. + * @param $recursive bool (optional) If set True changes file owner recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + 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); + 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 $file string Path to the file. + * @return string Username of the user. + */ + 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; - } - 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){ + /** + * Gets file permissions + * + * FIXME does not handle errors in fileperms() + * + * @param $file string Path to the file. + * @return string Mode of the file (last 4 digits). + */ + function getchmod($file) { + return substr(decoct(@fileperms($file)),3); + } + 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) ) + function copy($source, $destination, $overwrite = false) { + if ( ! $overwrite && $this->exists($destination) ) return false; - return copy($source,$destination); + + return copy($source, $destination); } - function move($source,$destination,$overwrite=false){ - //Possible to use rename()? - if( $this->copy($source,$destination,$overwrite) && $this->exists($destination) ){ + 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,12 +216,14 @@ class WP_Filesystem_Direct{ } } - function delete($file, $recursive=false){ - $file = str_replace('\\','/',$file); //for win32, occasional problems deleteing files otherwise + function delete($file, $recursive = 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 deleteing files otherwise - if( $this->is_file($file) ) + if ( $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 @@ -205,103 +231,106 @@ class WP_Filesystem_Direct{ $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) ) //false if no files, So check first. + foreach ($filelist as $filename => $fileinfo) + if ( ! $this->delete($file . $filename, $recursive) ) $retval = false; - if( ! @rmdir($file) ) - return false; + if ( file_exists($file) && ! @rmdir($file) ) + $retval = false; return $retval; } - function exists($file){ + function exists($file) { return @file_exists($file); } - function is_file($file){ + function is_file($file) { return @is_file($file); } - function is_dir($path){ + function is_dir($path) { return @is_dir($path); } - function is_readable($file){ + function is_readable($file) { return @is_readable($file); } - function is_writable($file){ + function is_writable($file) { return @is_writable($file); } - function atime($file){ + function atime($file) { return @fileatime($file); } - function mtime($file){ + function mtime($file) { return @filemtime($file); } - function size($file){ + function size($file) { return @filesize($file); } - function touch($file, $time = 0, $atime = 0){ - if($time == 0) + 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; + 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) ) + $path = '/'; - if( !@mkdir($path,$chmod) ) + if ( ! $chmod ) + $chmod = FS_CHMOD_DIR; + + 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); + 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); + 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 +344,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 +357,5 @@ class WP_Filesystem_Direct{ unset($dir); return $ret; } - - function __destruct(){ - return; - } } ?>