WordPress.org

Make WordPress Core

Ticket #34976: 34976.diff

File 34976.diff, 2.0 KB (added by dd32, 4 years ago)
  • src/wp-admin/includes/class-wp-filesystem-ftpext.php

    class WP_Filesystem_FTPext extends WP_Fi 
    322322                if ( !empty($filelist) )
    323323                        foreach ( $filelist as $delete_file )
    324324                                $this->delete( trailingslashit($file) . $delete_file['name'], $recursive, $delete_file['type'] );
    325325                return @ftp_rmdir($this->link, $file);
    326326        }
    327327
    328328        /**
    329329         * @access public
    330330         *
    331331         * @param string $file
    332332         * @return bool
    333333         */
    334334        public function exists( $file ) {
    335335                $path = dirname( $file );
    336336                $filename = basename( $file );
     337                $hidden = ( '.' === substr( $filename, 0, 1 ) );
    337338
    338                 $file_list = @ftp_nlist( $this->link, '-a ' . $path );
     339                // Attempt an NLST, relying upon the server to show hidden files if needed
     340                $file_list = @ftp_nlist( $this->link, $path );
    339341                if ( $file_list ) {
    340342                        $file_list = array_map( 'basename', $file_list );
     343                        if ( in_array( $filename, $file_list ) ) {
     344                                return true;
     345                        }
     346                }
     347
     348                // If it's a hidden file, attempt both NLST and LIST with -a for compat.
     349                if ( $hidden ) {
     350                        // Try NLIST with `-a`
     351                        $file_list = @ftp_nlist( $this->link, '-a ' . $path );
     352                        if ( $file_list ) {
     353                                $file_list = array_map( 'basename', $file_list );
     354                                if ( in_array( $filename, $file_list ) ) {
     355                                        return true;
     356                                }
     357                        }
     358
     359                        // Try LIST -a
     360                        $file_list = @ftp_rawlist( $this->link, '-a ' . $file );
     361
     362                        if ( empty( $file_list ) && $this->is_dir( $file ) ) {
     363                                // File is an empty directory.
     364                                return true;
     365                        }
     366
     367                        // Empty list = no file, so invert.
     368                        return !empty( $file_list );
    341369                }
    342370
    343                 return $file_list && in_array( $filename, $file_list );
     371                return false;
    344372        }
    345373
    346374        /**
    347375         * @access public
    348376         *
    349377         * @param string $file
    350378         * @return bool
    351379         */
    352380        public function is_file($file) {
    353381                return $this->exists($file) && !$this->is_dir($file);
    354382        }
    355383
    356384        /**
    357385         * @access public
    358386         *