WordPress.org

Make WordPress Core

Ticket #6245: 6245.2.diff

File 6245.2.diff, 7.9 KB (added by DD32, 6 years ago)

needs-testing: New code for searching for wordpress install via ftp. Also introduces FTP_BASE constant to fit in with the other FTP_ constants

  • includes/class-wp-filesystem-ftpext.php

     
    8484                $this->permission = $perm; 
    8585        } 
    8686 
    87         function find_base_dir($base = '.',$echo = false){ 
     87        function find_base_dir($base = '.',$echo = false) { 
     88                //Sanitize the Windows path formats, This allows easier conparison and aligns it to FTP output. 
    8889                $abspath = str_replace('\\','/',ABSPATH); //windows: Straighten up the paths.. 
    8990                if( strpos($abspath, ':') ){ //Windows, Strip out the driveletter 
    9091                        if( preg_match("|.{1}\:(.+)|i", $abspath, $mat) ) 
    9192                                $abspath = $mat[1]; 
    9293                } 
    9394         
     95                //Set up the base directory (Which unless specified, is the current one) 
    9496                if( empty( $base ) || '.' == $base ) $base = $this->cwd(); 
    95                 if( empty( $base ) ) $base = '/'; 
    96                 if( '/' != substr($base, -1) ) $base .= '/'; 
    97  
    98                 if($echo) printf( __('Changing to %s') . '<br/>', $base ); 
    99                 if( false === $this->chdir($base) ) 
    100                         return false; 
    101  
    102                 if( $this->exists($base . 'wp-settings.php') ){ 
    103                         if($echo) printf( __('Found %s'), $base . 'wp-settings.php<br/>' ); 
    104                         $this->wp_base = $base; 
    105                         return $this->wp_base; 
     97                $base = trailingslashit($base); 
     98                 
     99                //Can we see the Current directory as part of the ABSPATH? 
     100                $location = strpos($abspath, $base); 
     101                if( false !== $location ){ 
     102                        $newbase = path_join($base, substr($abspath, $location + strlen($base))); 
     103                         
     104                        if($echo) printf( __('Changing to %s') . '<br/>', $newbase ); 
     105                        if( false !== $this->chdir($newbase) ){ //chdir sometimes returns null under certain circumstances, even when its changed correctly, FALSE will be returned if it doesnt change correctly. 
     106                                $base = $newbase; 
     107                                //Check to see if it exists in that folder. 
     108                                if( $wp_filesystem->exists($base . 'wp-settings.php') ){ 
     109                                        if($echo) printf( __('Found %s'),  $base . 'wp-settings.php<br/>' ); 
     110                                        $this->wp_base = $base; 
     111                                        return $this->wp_base; 
     112                                }        
     113                        } 
    106114                } 
    107  
    108                 if( strpos($abspath, $base) > 0) 
    109                         $arrPath = split('/',substr($abspath,strpos($abspath, $base))); 
    110                 else 
    111                         $arrPath = split('/',$abspath); 
    112  
    113                 for($i = 0; $i <= count($arrPath); $i++) 
    114                         if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); 
    115  
    116                 foreach($arrPath as $key=>$folder){ 
    117                         if( $this->is_dir($base . $folder) ){ 
    118                                 if($echo) echo sprintf( __('Found %s'),  $folder ) . ' ' . sprintf( __('Changing to %s') . '<br/>', $base . $folder . '/' ); 
    119                                 return $this->find_base_dir($base .  $folder . '/',$echo); 
     115         
     116                //Ok, Couldnt do a magic location from that particular folder level 
     117                 
     118                //Get a list of the files in the current directory, See if we can locate where we are in the folder stucture. 
     119                $files = $this->dirlist($base); 
     120                 
     121                $arrPath = explode('/', $abspath); 
     122                foreach($arrPath as $key){ 
     123                        //Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder,  
     124                        // If its found, change into it and follow through looking for it.  
     125                        // If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on. 
     126                        // If it reaches the end, and still cant find it, it'll return false for the entire function. 
     127                        if( isset($files[ $key ]) ){ 
     128                                //Lets try that folder: 
     129                                $folder = path_join($base, $key); 
     130                                if($echo) printf( __('Changing to %s') . '<br/>', $folder ); 
     131                                $ret = $this->find_base_dir( $folder, $echo); 
     132                                if( $ret ) 
     133                                        return $ret; 
    120134                        } 
    121135                } 
     136                return false; 
     137        } 
    122138 
    123                 if( $base == '/' ) 
    124                         return false; 
    125                 //If we get this far, somethings gone wrong, change to / and restart the process. 
    126                 return $this->find_base_dir('/',$echo); 
    127         } 
    128         function get_base_dir($base = '.', $echo=false){ 
     139        function get_base_dir($base = '.', $echo = false){ 
     140                if( defined('FTP_BASE') ) 
     141                        $this->wp_base = FTP_BASE; 
    129142                if( empty($this->wp_base) ) 
    130143                        $this->wp_base = $this->find_base_dir($base,$echo); 
    131144                return $this->wp_base;  
  • includes/class-wp-filesystem-ftpsockets.php

     
    8787        } 
    8888 
    8989        function find_base_dir($base = '.',$echo = false) { 
     90                //Sanitize the Windows path formats, This allows easier conparison and aligns it to FTP output. 
    9091                $abspath = str_replace('\\','/',ABSPATH); //windows: Straighten up the paths.. 
    9192                if( strpos($abspath, ':') ){ //Windows, Strip out the driveletter 
    9293                        if( preg_match("|.{1}\:(.+)|i", $abspath, $mat) ) 
    9394                                $abspath = $mat[1]; 
    9495                } 
    9596         
     97                //Set up the base directory (Which unless specified, is the current one) 
    9698                if( empty( $base ) || '.' == $base ) $base = $this->cwd(); 
    97                 if( empty( $base ) ) $base = '/'; 
    98                 if( '/' != substr($base, -1) ) $base .= '/'; 
    99  
    100                 if($echo) printf( __('Changing to %s') . '<br/>', $base ); 
    101                 if( false === $this->chdir($base) ) 
    102                         return false; 
    103  
    104                 if( $this->exists($base . 'wp-settings.php') ){ 
    105                         if($echo) printf( __('Found %s'), $base . 'wp-settings.php<br/>' ); 
    106                         $this->wp_base = $base; 
    107                         return $this->wp_base; 
     99                $base = trailingslashit($base); 
     100                 
     101                //Can we see the Current directory as part of the ABSPATH? 
     102                $location = strpos($abspath, $base); 
     103                if( false !== $location ){ 
     104                        $newbase = path_join($base, substr($abspath, $location + strlen($base))); 
     105                         
     106                        if($echo) printf( __('Changing to %s') . '<br/>', $newbase ); 
     107                        if( false !== $this->chdir($newbase) ){ //chdir sometimes returns null under certain circumstances, even when its changed correctly, FALSE will be returned if it doesnt change correctly. 
     108                                $base = $newbase; 
     109                                //Check to see if it exists in that folder. 
     110                                if( $wp_filesystem->exists($base . 'wp-settings.php') ){ 
     111                                        if($echo) printf( __('Found %s'),  $base . 'wp-settings.php<br/>' ); 
     112                                        $this->wp_base = $base; 
     113                                        return $this->wp_base; 
     114                                }        
     115                        } 
    108116                } 
    109  
    110                 if( strpos($abspath, $base) > 0) 
    111                         $arrPath = split('/',substr($abspath,strpos($abspath, $base))); 
    112                 else 
    113                         $arrPath = split('/',$abspath); 
    114  
    115                 for($i = 0; $i <= count($arrPath); $i++) 
    116                         if( $arrPath[ $i ] == '' ) unset( $arrPath[ $i ] ); 
    117  
    118                 foreach($arrPath as $key=>$folder){ 
    119                         if( $this->is_dir($base . $folder) ){ 
    120                                 if($echo) echo sprintf( __('Found %s'),  $folder ) . ' ' . sprintf( __('Changing to %s') . '<br/>', $base . $folder . '/' ); 
    121                                 return $this->find_base_dir($base .  $folder . '/',$echo); 
     117         
     118                //Ok, Couldnt do a magic location from that particular folder level 
     119                 
     120                //Get a list of the files in the current directory, See if we can locate where we are in the folder stucture. 
     121                $files = $this->dirlist($base); 
     122                 
     123                $arrPath = explode('/', $abspath); 
     124                foreach($arrPath as $key){ 
     125                        //Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder,  
     126                        // If its found, change into it and follow through looking for it.  
     127                        // If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on. 
     128                        // If it reaches the end, and still cant find it, it'll return false for the entire function. 
     129                        if( isset($files[ $key ]) ){ 
     130                                //Lets try that folder: 
     131                                $folder = path_join($base, $key); 
     132                                if($echo) printf( __('Changing to %s') . '<br/>', $folder ); 
     133                                $ret = $this->find_base_dir( $folder, $echo); 
     134                                if( $ret ) 
     135                                        return $ret; 
    122136                        } 
    123137                } 
    124  
    125                 if( $base == '/' ) 
    126                         return false; 
    127                 //If we get this far, somethings gone wrong, change to / and restart the process. 
    128                 return $this->find_base_dir('/',$echo); 
     138                return false; 
    129139        } 
    130140 
    131141        function get_base_dir($base = '.', $echo = false){ 
     142                if( defined('FTP_BASE') ) 
     143                        $this->wp_base = FTP_BASE; 
    132144                if( empty($this->wp_base) ) 
    133145                        $this->wp_base = $this->find_base_dir($base, $echo); 
    134146                return $this->wp_base;