2008-02-19 19:12:48 -05:00
< ? php
class WP_Filesystem_ftpsockets {
var $ftp = false ;
var $timeout = 5 ;
2008-02-26 00:23:05 -05:00
var $errors ;
2008-02-19 19:12:48 -05:00
var $options = array ();
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
var $wp_base = '' ;
var $permission = null ;
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
var $filetypes = array (
'php' => FTP_ASCII ,
'css' => FTP_ASCII ,
'txt' => FTP_ASCII ,
'js' => FTP_ASCII ,
'html' => FTP_ASCII ,
'htm' => FTP_ASCII ,
'xml' => FTP_ASCII ,
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
'jpg' => FTP_BINARY ,
'png' => FTP_BINARY ,
'gif' => FTP_BINARY ,
'bmp' => FTP_BINARY
);
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
function WP_Filesystem_ftpsockets ( $opt = '' ) {
2008-02-26 00:23:05 -05:00
$this -> errors = new WP_Error ();
2008-02-19 19:12:48 -05:00
//Check if possible to use ftp functions.
if ( ! @ include_once ABSPATH . 'wp-admin/includes/class-ftp.php' )
return false ;
2008-03-01 16:20:23 -05:00
$this -> ftp = new ftp ();
2008-02-11 03:46:11 -05:00
2008-02-19 19:12:48 -05:00
//Set defaults:
2008-02-11 03:46:11 -05:00
if ( empty ( $opt [ 'port' ]) )
$this -> options [ 'port' ] = 21 ;
else
$this -> options [ 'port' ] = $opt [ 'port' ];
if ( empty ( $opt [ 'hostname' ]) )
$this -> errors -> add ( 'empty_hostname' , __ ( 'FTP hostname is required' ));
else
$this -> options [ 'hostname' ] = $opt [ 'hostname' ];
if ( isset ( $opt [ 'base' ]) && ! empty ( $opt [ 'base' ]) )
$this -> wp_base = $opt [ 'base' ];
// Check if the options provided are OK.
if ( empty ( $opt [ 'username' ]) )
$this -> errors -> add ( 'empty_username' , __ ( 'FTP username is required' ));
else
$this -> options [ 'username' ] = $opt [ 'username' ];
if ( empty ( $opt [ 'password' ]) )
2008-03-02 15:17:30 -05:00
$this -> errors -> add ( 'empty_password' , __ ( 'FTP password is required' ));
2008-02-11 03:46:11 -05:00
else
$this -> options [ 'password' ] = $opt [ 'password' ];
2008-02-19 19:12:48 -05:00
}
2008-02-11 03:46:11 -05:00
2008-02-19 19:12:48 -05:00
function connect () {
if ( ! $this -> ftp )
return false ;
2008-03-01 16:20:23 -05:00
//$this->ftp->Verbose = true;
if ( ! $this -> ftp -> SetServer ( $this -> options [ 'hostname' ], $this -> options [ 'port' ]) ) {
$this -> errors -> add ( 'connect' , sprintf ( __ ( 'Failed to connect to FTP Server %1$s:%2$s' ), $this -> options [ 'hostname' ], $this -> options [ 'port' ]));
return false ;
}
if ( ! $this -> ftp -> connect () ) {
2008-02-11 03:46:11 -05:00
$this -> errors -> add ( 'connect' , sprintf ( __ ( 'Failed to connect to FTP Server %1$s:%2$s' ), $this -> options [ 'hostname' ], $this -> options [ 'port' ]));
2008-02-19 19:12:48 -05:00
return false ;
2008-02-11 03:46:11 -05:00
}
2008-02-19 19:12:48 -05:00
2008-02-11 03:46:11 -05:00
if ( ! $this -> ftp -> login ( $this -> options [ 'username' ], $this -> options [ 'password' ]) ) {
$this -> errors -> add ( 'auth' , sprintf ( __ ( 'Username/Password incorrect for %s' ), $this -> options [ 'username' ]));
2008-02-19 19:12:48 -05:00
return false ;
}
2008-03-01 16:20:23 -05:00
$this -> ftp -> SetType ( FTP_AUTOASCII );
$this -> ftp -> Passive ( true );
2008-02-19 19:12:48 -05:00
return true ;
}
function setDefaultPermissions ( $perm ) {
$this -> permission = $perm ;
}
function find_base_dir ( $base = '.' , $echo = false ) {
2008-03-16 05:50:35 -04:00
//Sanitize the Windows path formats, This allows easier conparison and aligns it to FTP output.
2008-03-06 01:06:13 -05:00
$abspath = str_replace ( '\\' , '/' , ABSPATH ); //windows: Straighten up the paths..
if ( strpos ( $abspath , ':' ) ){ //Windows, Strip out the driveletter
if ( preg_match ( " |. { 1} \ :(.+)|i " , $abspath , $mat ) )
$abspath = $mat [ 1 ];
}
2008-03-16 05:50:35 -04:00
//Set up the base directory (Which unless specified, is the current one)
2008-02-19 19:12:48 -05:00
if ( empty ( $base ) || '.' == $base ) $base = $this -> cwd ();
2008-03-16 05:50:35 -04:00
$base = trailingslashit ( $base );
2008-03-17 20:13:11 -04:00
2008-03-16 05:50:35 -04:00
//Can we see the Current directory as part of the ABSPATH?
$location = strpos ( $abspath , $base );
if ( false !== $location ){
$newbase = path_join ( $base , substr ( $abspath , $location + strlen ( $base )));
2008-03-17 20:13:11 -04:00
2008-03-16 05:50:35 -04:00
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.
2008-03-17 20:13:11 -04:00
if ( $echo ) printf ( __ ( 'Changing to %s' ) . '<br/>' , $newbase );
2008-03-16 05:50:35 -04:00
//Check to see if it exists in that folder.
2008-03-17 20:13:11 -04:00
if ( $this -> exists ( $newbase . 'wp-settings.php' ) ){
if ( $echo ) printf ( __ ( 'Found %s' ), $newbase . 'wp-settings.php<br/>' );
return $newbase ;
2008-03-16 05:50:35 -04:00
}
}
2008-02-19 19:12:48 -05:00
}
2008-03-16 05:50:35 -04:00
//Ok, Couldnt do a magic location from that particular folder level
//Get a list of the files in the current directory, See if we can locate where we are in the folder stucture.
$files = $this -> dirlist ( $base );
$arrPath = explode ( '/' , $abspath );
foreach ( $arrPath as $key ){
//Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder,
// If its found, change into it and follow through looking for it.
// If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on.
// If it reaches the end, and still cant find it, it'll return false for the entire function.
if ( isset ( $files [ $key ]) ){
//Lets try that folder:
$folder = path_join ( $base , $key );
if ( $echo ) printf ( __ ( 'Changing to %s' ) . '<br/>' , $folder );
$ret = $this -> find_base_dir ( $folder , $echo );
if ( $ret )
return $ret ;
2008-02-19 19:12:48 -05:00
}
}
2008-03-17 20:13:11 -04:00
//Only check this as a last resort, to prevent locating the incorrect install. All above proceeedures will fail quickly if this is the right branch to take.
if ( isset ( $files [ 'wp-settings.php' ]) ){
if ( $echo ) printf ( __ ( 'Found %s' ), $base . 'wp-settings.php<br/>' );
return $base ;
}
2008-03-16 05:50:35 -04:00
return false ;
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-03-04 12:10:17 -05:00
function get_base_dir ( $base = '.' , $echo = false ){
2008-03-16 05:50:35 -04:00
if ( defined ( 'FTP_BASE' ) )
$this -> wp_base = FTP_BASE ;
2008-02-19 19:12:48 -05:00
if ( empty ( $this -> wp_base ) )
2008-03-04 12:10:17 -05:00
$this -> wp_base = $this -> find_base_dir ( $base , $echo );
2008-02-19 19:12:48 -05:00
return $this -> wp_base ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function get_contents ( $file , $type = '' , $resumepos = 0 ){
2008-03-06 01:06:13 -05:00
if ( ! $this -> exists ( $file ) )
return false ;
2008-02-19 19:12:48 -05:00
if ( empty ( $type ) ){
2008-03-11 12:37:44 -04:00
$extension = substr ( strrchr ( $file , " . " ), 1 );
2008-02-19 19:12:48 -05:00
$type = isset ( $this -> filetypes [ $extension ]) ? $this -> filetypes [ $extension ] : FTP_AUTOASCII ;
}
$this -> ftp -> SetType ( $type );
2008-03-01 16:20:23 -05:00
$temp = tmpfile ();
if ( ! $this -> ftp -> fget ( $temp , $file ) ) {
fclose ( $temp );
2008-03-06 01:06:13 -05:00
return '' ; //Blank document, File does exist, Its just blank.
2008-03-01 16:20:23 -05:00
}
fseek ( $temp , 0 ); //Skip back to the start of the file being written to
$contents = '' ;
while ( ! feof ( $temp ) )
$contents .= fread ( $temp , 8192 );
fclose ( $temp );
return $contents ;
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function get_contents_array ( $file ){
return explode ( " \n " , $this -> get_contents ( $file ));
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function put_contents ( $file , $contents , $type = '' ){
if ( empty ( $type ) ){
2008-03-01 16:20:23 -05:00
$extension = substr ( strrchr ( $file , " . " ), 1 );
2008-02-19 19:12:48 -05:00
$type = isset ( $this -> filetypes [ $extension ]) ? $this -> filetypes [ $extension ] : FTP_ASCII ;
}
$this -> ftp -> SetType ( $type );
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
$temp = tmpfile ();
fwrite ( $temp , $contents );
fseek ( $temp , 0 ); //Skip back to the start of the file being written to
2008-03-01 16:20:23 -05:00
$ret = $this -> ftp -> fput ( $file , $temp );
2008-02-19 19:12:48 -05:00
fclose ( $temp );
return $ret ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function cwd (){
2008-03-16 05:49:10 -04:00
$cwd = $this -> ftp -> pwd ();
if ( $cwd )
$cwd = trailingslashit ( $cwd );
return $cwd ;
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-03-06 13:14:58 -05:00
function chdir ( $file ){
return $this -> ftp -> chdir ( $file );
}
2008-02-19 19:12:48 -05:00
function chgrp ( $file , $group , $recursive = false ){
return false ;
}
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
function chmod ( $file , $mode = false , $recursive = false ){
if ( ! $mode )
$mode = $this -> permission ;
if ( ! $mode )
return false ;
//if( ! $this->exists($file) )
// return false;
if ( ! $recursive || ! $this -> is_dir ( $file ) ){
return $this -> ftp -> chmod ( $file , $mode );
}
//Is a directory, and we want recursive
$filelist = $this -> dirlist ( $file );
foreach ( $filelist as $filename ){
$this -> chmod ( $file . '/' . $filename , $mode , $recursive );
}
return true ;
}
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
function chown ( $file , $owner , $recursive = false ){
return false ;
}
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
function owner ( $file ){
$dir = $this -> dirlist ( $file );
return $dir [ $file ][ 'owner' ];
}
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
function getchmod ( $file ){
$dir = $this -> dirlist ( $file );
return $dir [ $file ][ 'permsn' ];
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
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' ;
}
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
// Owner
$info .= (( $perms & 0x0100 ) ? 'r' : '-' );
$info .= (( $perms & 0x0080 ) ? 'w' : '-' );
$info .= (( $perms & 0x0040 ) ?
(( $perms & 0x0800 ) ? 's' : 'x' ) :
(( $perms & 0x0800 ) ? 'S' : '-' ));
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
// Group
$info .= (( $perms & 0x0020 ) ? 'r' : '-' );
$info .= (( $perms & 0x0010 ) ? 'w' : '-' );
$info .= (( $perms & 0x0008 ) ?
(( $perms & 0x0400 ) ? 's' : 'x' ) :
(( $perms & 0x0400 ) ? 'S' : '-' ));
2008-03-02 15:17:30 -05:00
2008-02-19 19:12:48 -05:00
// World
$info .= (( $perms & 0x0004 ) ? 'r' : '-' );
$info .= (( $perms & 0x0002 ) ? 'w' : '-' );
$info .= (( $perms & 0x0001 ) ?
(( $perms & 0x0200 ) ? 't' : 'x' ) :
(( $perms & 0x0200 ) ? 'T' : '-' ));
return $info ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function getnumchmodfromh ( $mode ) {
$realmode = " " ;
$legal = array ( " " , " w " , " r " , " x " , " - " );
$attarray = preg_split ( " // " , $mode );
for ( $i = 0 ; $i < count ( $attarray ); $i ++ ){
if ( $key = array_search ( $attarray [ $i ], $legal )){
$realmode .= $legal [ $key ];
}
2008-02-11 03:46:11 -05:00
}
2008-02-19 19:12:48 -05:00
$mode = str_pad ( $realmode , 9 , '-' );
$trans = array ( '-' => '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 ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function group ( $file ){
$dir = $this -> dirlist ( $file );
return $dir [ $file ][ 'group' ];
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function copy ( $source , $destination , $overwrite = false ){
if ( ! $overwrite && $this -> exists ( $destination ) )
return false ;
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
$content = $this -> get_contents ( $source );
2008-03-06 01:06:13 -05:00
if ( false === $content )
2008-03-01 16:20:23 -05:00
return false ;
return $this -> put_contents ( $destination , $content );
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function move ( $source , $destination , $overwrite = false ){
return $this -> ftp -> rename ( $source , $destination );
2008-02-11 03:46:11 -05:00
}
2008-02-19 19:12:48 -05:00
function delete ( $file , $recursive = false ) {
if ( $this -> is_file ( $file ) )
return $this -> ftp -> delete ( $file );
if ( ! $recursive )
return $this -> ftp -> rmdir ( $file );
2008-03-01 16:20:23 -05:00
return $this -> ftp -> mdel ( $file );
2008-02-19 19:12:48 -05:00
}
function exists ( $file ){
return $this -> ftp -> is_exists ( $file );
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function is_file ( $file ){
2008-03-01 16:20:23 -05:00
return $this -> is_dir ( $file ) ? false : true ;
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function is_dir ( $path ){
2008-03-01 16:20:23 -05:00
$cwd = $this -> cwd ();
2008-03-06 13:14:58 -05:00
if ( $this -> chdir ( $path ) ) {
$this -> chdir ( $cwd );
2008-03-01 16:20:23 -05:00
return true ;
}
return false ;
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function is_readable ( $file ){
//Get dir list, Check if the file is writable by the current user??
return true ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function is_writable ( $file ){
//Get dir list, Check if the file is writable by the current user??
return true ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function atime ( $file ){
return false ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function mtime ( $file ){
return $this -> ftp -> mdtm ( $file );
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function size ( $file ){
return $this -> ftp -> filesize ( $file );
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function touch ( $file , $time = 0 , $atime = 0 ){
return false ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function mkdir ( $path , $chmod = false , $chown = false , $chgrp = false ){
if ( ! $this -> ftp -> mkdir ( $path ) )
return false ;
if ( $chmod )
2008-03-01 16:20:23 -05:00
$this -> chmod ( $path , $chmod );
2008-02-19 19:12:48 -05:00
if ( $chown )
2008-03-01 16:20:23 -05:00
$this -> chown ( $path , $chown );
2008-02-19 19:12:48 -05:00
if ( $chgrp )
2008-03-01 16:20:23 -05:00
$this -> chgrp ( $path , $chgrp );
2008-02-19 19:12:48 -05:00
return true ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function rmdir ( $path , $recursive = false ){
if ( ! $recursive )
2008-03-11 12:37:44 -04:00
return $this -> ftp -> rmdir ( $path );
2008-03-01 16:20:23 -05:00
return $this -> ftp -> mdel ( $path );
2008-02-19 19:12:48 -05:00
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function dirlist ( $path = '.' , $incdot = false , $recursive = false ){
if ( $this -> is_file ( $path ) ){
$limitFile = basename ( $path );
$path = dirname ( $path ) . '/' ;
} else {
$limitFile = false ;
}
2008-03-16 05:49:10 -04:00
2008-03-01 16:20:23 -05:00
$list = $this -> ftp -> dirlist ( $path );
2008-02-19 19:12:48 -05:00
if ( ! $list )
return false ;
if ( empty ( $list ) )
return array ();
$ret = array ();
2008-03-01 16:20:23 -05:00
foreach ( $list as $struc ) {
2008-03-02 15:17:30 -05:00
2008-03-01 16:20:23 -05:00
if ( 'd' == $struc [ 'type' ] ) {
2008-02-19 19:12:48 -05:00
$struc [ 'files' ] = array ();
2008-03-01 16:20:23 -05:00
if ( $incdot ){
2008-02-19 19:12:48 -05:00
//We're including the doted starts
if ( '.' != $struc [ 'name' ] && '..' != $struc [ 'name' ] ){ //Ok, It isnt a special folder
if ( $recursive )
$struc [ 'files' ] = $this -> dirlist ( $path . '/' . $struc [ 'name' ], $incdot , $recursive );
}
} else { //No dots
if ( $recursive )
$struc [ 'files' ] = $this -> dirlist ( $path . '/' . $struc [ 'name' ], $incdot , $recursive );
}
}
//File
$ret [ $struc [ 'name' ]] = $struc ;
}
return $ret ;
}
2008-03-01 16:20:23 -05:00
2008-02-19 19:12:48 -05:00
function __destruct (){
$this -> ftp -> quit ();
}
}
?>