WordPress.org

Make WordPress Core

Ticket #34976: 34976.2.diff

File 34976.2.diff, 2.1 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, conditionally including -a if it's a hidden file
     340                $file_list = @ftp_nlist( $this->link, ( $hidden ? '-a ' : '' ) . $path );
    339341                if ( $file_list ) {
    340342                        $file_list = array_map( 'basename', $file_list );
     343                        if ( in_array( $filename, $file_list ) ) {
     344                                return true;
     345                        }
    341346                }
    342347
    343                 return $file_list && in_array( $filename, $file_list );
     348                // For hidden files, perform a few extra checks for compat.
     349                if ( $hidden ) {
     350                        // Try LIST -a
     351                        $file_list = @ftp_rawlist( $this->link, '-a ' . $file );
     352                        if ( empty( $file_list ) && $this->is_dir( $file ) ) {
     353                                // File is an empty directory.
     354                                return true;
     355                        }
     356                        // Empty list = no file, so invert.
     357                        if ( ! empty( $file_list ) ) {
     358                                return true;
     359                        }
     360
     361                        // Try NLIST without -a, some servers will return hidden files this way which don't get caught by LIST -a
     362                        $file_list = @ftp_nlist( $this->link, $path );
     363                        if ( $file_list ) {
     364                                $file_list = array_map( 'basename', $file_list );
     365                                if ( in_array( $filename, $file_list ) ) {
     366                                        return true;
     367                                }
     368                        }
     369                }
     370
     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         *