diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-admin/includes/class-wp-filesystem-ftpsockets.php --- a/wp/wp-admin/includes/class-wp-filesystem-ftpsockets.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-admin/includes/class-wp-filesystem-ftpsockets.php Tue Dec 15 13:49:49 2020 +0100 @@ -33,9 +33,10 @@ $this->errors = new WP_Error(); // Check if possible to use ftp functions. - if ( ! @include_once( ABSPATH . 'wp-admin/includes/class-ftp.php' ) ) { + if ( ! include_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) { return; } + $this->ftp = new ftp(); if ( empty( $opt['port'] ) ) { @@ -81,42 +82,46 @@ if ( ! $this->ftp->SetServer( $this->options['hostname'], $this->options['port'] ) ) { $this->errors->add( 'connect', - /* translators: %s: hostname:port */ sprintf( + /* translators: %s: hostname:port */ __( 'Failed to connect to FTP Server %s' ), $this->options['hostname'] . ':' . $this->options['port'] ) ); + return false; } if ( ! $this->ftp->connect() ) { $this->errors->add( 'connect', - /* translators: %s: hostname:port */ sprintf( + /* translators: %s: hostname:port */ __( 'Failed to connect to FTP Server %s' ), $this->options['hostname'] . ':' . $this->options['port'] ) ); + return false; } if ( ! $this->ftp->login( $this->options['username'], $this->options['password'] ) ) { $this->errors->add( 'auth', - /* translators: %s: username */ sprintf( + /* translators: %s: Username. */ __( 'Username/Password incorrect for %s' ), $this->options['username'] ) ); + return false; } $this->ftp->SetType( FTP_BINARY ); $this->ftp->Passive( true ); $this->ftp->setTimeout( FS_TIMEOUT ); + return true; } @@ -134,10 +139,11 @@ return false; } - $temp = wp_tempnam( $file ); + $tempfile = wp_tempnam( $file ); + $temphandle = fopen( $tempfile, 'w+' ); - if ( ! $temphandle = fopen( $temp, 'w+' ) ) { - unlink( $temp ); + if ( ! $temphandle ) { + unlink( $tempfile ); return false; } @@ -145,16 +151,16 @@ if ( ! $this->ftp->fget( $temphandle, $file ) ) { fclose( $temphandle ); - unlink( $temp ); + unlink( $tempfile ); reset_mbstring_encoding(); - return ''; // Blank document, File does exist, It's just blank. + return ''; // Blank document. File does exist, it's just blank. } reset_mbstring_encoding(); - fseek( $temphandle, 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( $temphandle ) ) { @@ -162,7 +168,8 @@ } fclose( $temphandle ); - unlink( $temp ); + unlink( $tempfile ); + return $contents; } @@ -190,33 +197,36 @@ * @return bool True on success, false on failure. */ public function put_contents( $file, $contents, $mode = false ) { - $temp = wp_tempnam( $file ); - if ( ! $temphandle = @fopen( $temp, 'w+' ) ) { - unlink( $temp ); + $tempfile = wp_tempnam( $file ); + $temphandle = @fopen( $tempfile, 'w+' ); + + if ( ! $temphandle ) { + unlink( $tempfile ); return false; } - // The FTP class uses string functions internally during file download/upload + // The FTP class uses string functions internally during file download/upload. mbstring_binary_safe_encoding(); $bytes_written = fwrite( $temphandle, $contents ); - if ( false === $bytes_written || $bytes_written != strlen( $contents ) ) { + + if ( false === $bytes_written || strlen( $contents ) != $bytes_written ) { fclose( $temphandle ); - unlink( $temp ); + unlink( $tempfile ); reset_mbstring_encoding(); return false; } - fseek( $temphandle, 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. $ret = $this->ftp->fput( $file, $temphandle ); reset_mbstring_encoding(); fclose( $temphandle ); - unlink( $temp ); + unlink( $tempfile ); $this->chmod( $file, $mode ); @@ -232,9 +242,11 @@ */ public function cwd() { $cwd = $this->ftp->pwd(); + if ( $cwd ) { $cwd = trailingslashit( $cwd ); } + return $cwd; } @@ -258,7 +270,7 @@ * @param string $file Path to the file. * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, * 0755 for directories. Default false. - * @param bool $recursive Optional. If set to true, changes file group recursively. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. * Default false. * @return bool True on success, false on failure. */ @@ -276,12 +288,13 @@ // chmod any sub-objects if recursive. if ( $recursive && $this->is_dir( $file ) ) { $filelist = $this->dirlist( $file ); + foreach ( (array) $filelist as $filename => $filemeta ) { $this->chmod( $file . '/' . $filename, $mode, $recursive ); } } - // chmod the file or directory + // chmod the file or directory. return $this->ftp->chmod( $file, $mode ); } @@ -295,6 +308,7 @@ */ public function owner( $file ) { $dir = $this->dirlist( $file ); + return $dir[ $file ]['owner']; } @@ -308,6 +322,7 @@ */ public function getchmod( $file ) { $dir = $this->dirlist( $file ); + return $dir[ $file ]['permsn']; } @@ -321,6 +336,7 @@ */ public function group( $file ) { $dir = $this->dirlist( $file ); + return $dir[ $file ]['group']; } @@ -343,6 +359,7 @@ } $content = $this->get_contents( $source ); + if ( false === $content ) { return false; } @@ -371,7 +388,7 @@ * @since 2.5.0 * * @param string $file Path to the file or directory. - * @param bool $recursive Optional. If set to true, changes file group recursively. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. * Default false. * @param string|false $type Type of resource. 'f' for file, 'd' for directory. * Default false. @@ -381,9 +398,11 @@ if ( empty( $file ) ) { return false; } - if ( 'f' == $type || $this->is_file( $file ) ) { + + if ( 'f' === $type || $this->is_file( $file ) ) { return $this->ftp->delete( $file ); } + if ( ! $recursive ) { return $this->ftp->rmdir( $file ); } @@ -406,7 +425,7 @@ return true; // File is an empty directory. } - return ! empty( $list ); //empty list = no file, so invert. + return ! empty( $list ); // Empty list = no file, so invert. // Return $this->ftp->is_exists($file); has issues with ABOR+426 responses on the ncFTPd server. } @@ -422,9 +441,11 @@ if ( $this->is_dir( $file ) ) { return false; } + if ( $this->exists( $file ) ) { return true; } + return false; } @@ -438,10 +459,12 @@ */ public function is_dir( $path ) { $cwd = $this->cwd(); + if ( $this->chdir( $path ) ) { $this->chdir( $cwd ); return true; } + return false; } @@ -539,6 +562,7 @@ */ public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { $path = untrailingslashit( $path ); + if ( empty( $path ) ) { return false; } @@ -546,10 +570,13 @@ if ( ! $this->ftp->mkdir( $path ) ) { return false; } + if ( ! $chmod ) { $chmod = FS_CHMOD_DIR; } + $this->chmod( $path, $chmod ); + return true; } @@ -603,6 +630,7 @@ mbstring_binary_safe_encoding(); $list = $this->ftp->dirlist( $path ); + if ( empty( $list ) && ! $this->exists( $path ) ) { reset_mbstring_encoding(); @@ -611,13 +639,14 @@ } $ret = array(); + foreach ( $list as $struc ) { - if ( '.' == $struc['name'] || '..' == $struc['name'] ) { + if ( '.' === $struc['name'] || '..' === $struc['name'] ) { continue; } - if ( ! $include_hidden && '.' == $struc['name'][0] ) { + if ( ! $include_hidden && '.' === $struc['name'][0] ) { continue; } @@ -625,7 +654,7 @@ continue; } - if ( 'd' == $struc['type'] ) { + if ( 'd' === $struc['type'] ) { if ( $recursive ) { $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive ); } else { @@ -633,12 +662,12 @@ } } - // Replace symlinks formatted as "source -> target" with just the source name + // Replace symlinks formatted as "source -> target" with just the source name. if ( $struc['islink'] ) { $struc['name'] = preg_replace( '/(\s*->\s*.*)$/', '', $struc['name'] ); } - // Add the Octal representation of the file permissions + // Add the octal representation of the file permissions. $struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] ); $ret[ $struc['name'] ] = $struc;