2008-09-05 07:47:08 +02:00
< ? php
/**
2013-09-22 06:44:10 +02:00
* WordPress Filesystem Class for implementing SSH2
2008-09-05 07:47:08 +02:00
*
2008-09-09 05:24:05 +02:00
* To use this class you must follow these steps for PHP 5.2 . 6 +
*
* @ contrib http :// kevin . vanzonneveld . net / techblog / article / make_ssh_connections_with_php / - Installation Notes
*
2009-06-23 23:54:53 +02:00
* Complie libssh2 ( Note : Only 0.14 is officaly working with PHP 5.2 . 6 + right now , But many users have found the latest versions work )
2008-09-09 05:24:05 +02:00
*
* cd / usr / src
* wget http :// surfnet . dl . sourceforge . net / sourceforge / libssh2 / libssh2 - 0.14 . tar . gz
* tar - zxvf libssh2 - 0.14 . tar . gz
* cd libssh2 - 0.14 /
* ./ configure
* make all install
*
2009-06-23 23:54:53 +02:00
* Note : Do not leave the directory yet !
2008-09-09 05:24:05 +02:00
*
* Enter : pecl install - f ssh2
*
* Copy the ssh . so file it creates to your PHP Module Directory .
* Open up your PHP . INI file and look for where extensions are placed .
* Add in your PHP . ini file : extension = ssh2 . so
*
* Restart Apache !
* Check phpinfo () streams to confirm that : ssh2 . shell , ssh2 . exec , ssh2 . tunnel , ssh2 . scp , ssh2 . sftp exist .
*
2009-06-23 23:54:53 +02:00
* Note : as of WordPress 2.8 , This utilises the PHP5 + function 'stream_get_contents'
2008-09-09 05:24:05 +02:00
*
2013-09-22 06:44:10 +02:00
* @ since 2.7 . 0
*
2008-09-05 07:47:08 +02:00
* @ package WordPress
* @ subpackage Filesystem
*/
class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
2008-09-09 05:24:05 +02:00
2015-09-10 03:21:24 +02:00
/**
* @ access public
*/
2014-05-19 02:18:14 +02:00
public $link = false ;
2015-09-10 03:21:24 +02:00
2015-01-16 23:44:25 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
2015-01-16 23:44:25 +01:00
* @ var resource
*/
public $sftp_link ;
2014-05-19 02:18:14 +02:00
public $keys = false ;
2008-09-05 07:47:08 +02:00
2015-05-29 22:17:26 +02:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
2015-05-29 22:17:26 +02:00
*
* @ param array $opt
*/
public function __construct ( $opt = '' ) {
2008-09-05 07:47:08 +02:00
$this -> method = 'ssh2' ;
$this -> errors = new WP_Error ();
2008-09-13 20:06:20 +02:00
//Check if possible to use ssh2 functions.
2008-09-05 07:47:08 +02:00
if ( ! extension_loaded ( 'ssh2' ) ) {
$this -> errors -> add ( 'no_ssh2_ext' , __ ( 'The ssh2 PHP extension is not available' ));
2015-01-10 07:13:22 +01:00
return ;
2008-09-05 07:47:08 +02:00
}
2009-06-23 23:54:53 +02:00
if ( ! function_exists ( 'stream_get_contents' ) ) {
$this -> errors -> add ( 'ssh2_php_requirement' , __ ( 'The ssh2 PHP extension is available, however, we require the PHP5 function <code>stream_get_contents()</code>' ));
2015-01-10 07:13:22 +01:00
return ;
2009-04-23 01:38:01 +02:00
}
2008-09-05 07:47:08 +02:00
// Set defaults:
if ( empty ( $opt [ 'port' ]) )
$this -> options [ 'port' ] = 22 ;
else
$this -> options [ 'port' ] = $opt [ 'port' ];
if ( empty ( $opt [ 'hostname' ]) )
$this -> errors -> add ( 'empty_hostname' , __ ( 'SSH2 hostname is required' ));
else
$this -> options [ 'hostname' ] = $opt [ 'hostname' ];
// Check if the options provided are OK.
2009-04-23 01:38:01 +02:00
if ( ! empty ( $opt [ 'public_key' ]) && ! empty ( $opt [ 'private_key' ]) ) {
2008-12-09 19:03:31 +01:00
$this -> options [ 'public_key' ] = $opt [ 'public_key' ];
2008-09-11 19:44:43 +02:00
$this -> options [ 'private_key' ] = $opt [ 'private_key' ];
2008-12-09 19:03:31 +01:00
2009-04-23 01:38:01 +02:00
$this -> options [ 'hostkey' ] = array ( 'hostkey' => 'ssh-rsa' );
2008-12-09 19:03:31 +01:00
$this -> keys = true ;
2009-04-23 01:38:01 +02:00
} elseif ( empty ( $opt [ 'username' ]) ) {
$this -> errors -> add ( 'empty_username' , __ ( 'SSH2 username is required' ));
2008-09-11 19:44:43 +02:00
}
2009-04-23 01:38:01 +02:00
if ( ! empty ( $opt [ 'username' ]) )
$this -> options [ 'username' ] = $opt [ 'username' ];
2008-09-11 19:44:43 +02:00
2008-09-13 20:06:20 +02:00
if ( empty ( $opt [ 'password' ]) ) {
2014-07-17 11:14:16 +02:00
// Password can be blank if we are using keys.
if ( ! $this -> keys )
2008-09-11 19:44:43 +02:00
$this -> errors -> add ( 'empty_password' , __ ( 'SSH2 password is required' ));
2008-09-13 20:06:20 +02:00
} else {
2008-09-05 07:47:08 +02:00
$this -> options [ 'password' ] = $opt [ 'password' ];
2008-09-13 20:06:20 +02:00
}
2008-09-05 07:47:08 +02:00
}
2015-05-29 22:17:26 +02:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
2015-05-29 22:17:26 +02:00
*
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function connect () {
2008-09-13 20:06:20 +02:00
if ( ! $this -> keys ) {
2008-12-09 19:03:31 +01:00
$this -> link = @ ssh2_connect ( $this -> options [ 'hostname' ], $this -> options [ 'port' ]);
2008-09-13 20:06:20 +02:00
} else {
2008-12-09 19:03:31 +01:00
$this -> link = @ ssh2_connect ( $this -> options [ 'hostname' ], $this -> options [ 'port' ], $this -> options [ 'hostkey' ]);
2008-09-13 20:06:20 +02:00
}
2008-12-09 19:03:31 +01:00
2008-09-05 07:47:08 +02:00
if ( ! $this -> link ) {
2015-11-18 18:18:40 +01:00
$this -> errors -> add ( 'connect' ,
/* translators: %s: hostname:port */
sprintf ( __ ( 'Failed to connect to SSH2 Server %s' ),
2015-11-18 18:22:27 +01:00
$this -> options [ 'hostname' ] . ':' . $this -> options [ 'port' ]
2015-11-18 18:18:40 +01:00
)
);
2008-09-05 07:47:08 +02:00
return false ;
}
2008-09-11 19:44:43 +02:00
if ( ! $this -> keys ) {
if ( ! @ ssh2_auth_password ( $this -> link , $this -> options [ 'username' ], $this -> options [ 'password' ]) ) {
2015-11-18 18:18:40 +01:00
$this -> errors -> add ( 'auth' ,
/* translators: %s: username */
sprintf ( __ ( 'Username/Password incorrect for %s' ),
$this -> options [ 'username' ]
)
);
2008-09-11 19:44:43 +02:00
return false ;
}
} else {
if ( ! @ ssh2_auth_pubkey_file ( $this -> link , $this -> options [ 'username' ], $this -> options [ 'public_key' ], $this -> options [ 'private_key' ], $this -> options [ 'password' ] ) ) {
2015-11-18 18:18:40 +01:00
$this -> errors -> add ( 'auth' ,
/* translators: %s: username */
sprintf ( __ ( 'Public and Private keys incorrect for %s' ),
$this -> options [ 'username' ]
)
);
2008-09-11 19:44:43 +02:00
return false ;
}
2008-09-05 07:47:08 +02:00
}
2015-10-01 07:43:25 +02:00
$this -> sftp_link = ssh2_sftp ( $this -> link );
if ( ! $this -> sftp_link ) {
2015-11-18 18:18:40 +01:00
$this -> errors -> add ( 'connect' ,
/* translators: %s: hostname:port */
sprintf ( __ ( 'Failed to initialize a SFTP subsystem session with the SSH2 Server %s' ),
$this -> options [ 'hostname' ] . ':' . $this -> options [ 'port' ]
)
);
2015-10-01 07:43:25 +02:00
return false ;
}
2008-09-09 05:24:05 +02:00
2008-09-05 07:47:08 +02:00
return true ;
}
2008-09-09 05:24:05 +02:00
2015-10-01 07:40:25 +02:00
/**
* Gets the ssh2 . sftp PHP stream wrapper path to open for the given file .
*
* This method also works around a PHP bug where the root directory ( / ) cannot
* be opened by PHP functions , causing a false failure . In order to work around
* this , the path is converted to /./ which is semantically the same as /
* See https :// bugs . php . net / bug . php ? id = 64169 for more details .
*
* @ access public
*
2015-10-31 14:16:24 +01:00
* @ since 4.4 . 0
2015-10-01 07:40:25 +02:00
*
* @ param string $path The File / Directory path on the remote server to return
* @ return string The ssh2 . sftp :// wrapped path to use .
*/
public function sftp_path ( $path ) {
if ( '/' === $path ) {
$path = '/./' ;
}
return 'ssh2.sftp://' . $this -> sftp_link . '/' . ltrim ( $path , '/' );
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $command
* @ param bool $returnbool
2014-12-20 21:40:23 +01:00
* @ return bool | string
2014-12-01 01:13:22 +01:00
*/
2015-05-29 22:17:26 +02:00
public function run_command ( $command , $returnbool = false ) {
2009-04-23 01:38:01 +02:00
if ( ! $this -> link )
return false ;
if ( ! ( $stream = ssh2_exec ( $this -> link , $command )) ) {
2015-11-18 18:18:40 +01:00
$this -> errors -> add ( 'command' ,
/* translators: %s: command */
sprintf ( __ ( 'Unable to perform command: %s' ),
$command
)
);
2008-09-09 05:24:05 +02:00
} else {
stream_set_blocking ( $stream , true );
2009-08-15 14:01:04 +02:00
stream_set_timeout ( $stream , FS_TIMEOUT );
2009-06-23 23:54:53 +02:00
$data = stream_get_contents ( $stream );
fclose ( $stream );
2009-04-23 01:38:01 +02:00
if ( $returnbool )
2009-06-23 23:54:53 +02:00
return ( $data === false ) ? false : '' != trim ( $data );
2009-04-23 01:38:01 +02:00
else
2008-09-09 05:24:05 +02:00
return $data ;
}
return false ;
2008-09-05 07:47:08 +02:00
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return string | false
*/
2014-05-19 02:18:14 +02:00
public function get_contents ( $file ) {
2015-10-01 07:40:25 +02:00
return file_get_contents ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return array
*/
2014-05-19 02:18:14 +02:00
public function get_contents_array ( $file ) {
2015-10-01 07:40:25 +02:00
return file ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2015-05-29 22:17:26 +02:00
* @ param string $file
* @ param string $contents
2014-12-01 03:17:21 +01:00
* @ param bool | int $mode
2014-12-01 01:13:22 +01:00
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function put_contents ( $file , $contents , $mode = false ) {
2015-10-01 07:40:25 +02:00
$ret = file_put_contents ( $this -> sftp_path ( $file ), $contents );
2010-01-14 10:23:53 +01:00
2013-09-09 04:43:08 +02:00
if ( $ret !== strlen ( $contents ) )
return false ;
2010-01-14 10:23:53 +01:00
$this -> chmod ( $file , $mode );
2013-09-09 04:43:08 +02:00
return true ;
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2015-05-29 22:17:26 +02:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
2015-05-29 22:17:26 +02:00
*
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function cwd () {
2015-06-12 08:31:28 +02:00
$cwd = ssh2_sftp_realpath ( $this -> sftp_link , '.' );
2015-03-09 05:32:27 +01:00
if ( $cwd ) {
$cwd = trailingslashit ( trim ( $cwd ) );
}
2008-09-05 07:47:08 +02:00
return $cwd ;
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $dir
2014-12-20 21:40:23 +01:00
* @ return bool | string
2014-12-01 01:13:22 +01:00
*/
2014-05-19 02:18:14 +02:00
public function chdir ( $dir ) {
2009-04-23 01:38:01 +02:00
return $this -> run_command ( 'cd ' . $dir , true );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
2014-12-01 03:17:21 +01:00
* @ param string $group
2015-05-29 22:17:26 +02:00
* @ param bool $recursive
*
* @ return bool
2014-12-01 01:13:22 +01:00
*/
2014-05-19 02:18:14 +02:00
public function chgrp ( $file , $group , $recursive = false ) {
2008-09-09 05:24:05 +02:00
if ( ! $this -> exists ( $file ) )
return false ;
if ( ! $recursive || ! $this -> is_dir ( $file ) )
2013-07-10 06:15:13 +02:00
return $this -> run_command ( sprintf ( 'chgrp %s %s' , escapeshellarg ( $group ), escapeshellarg ( $file )), true );
return $this -> run_command ( sprintf ( 'chgrp -R %s %s' , escapeshellarg ( $group ), escapeshellarg ( $file )), true );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
2015-05-29 22:17:26 +02:00
* @ param int $mode
* @ param bool $recursive
2014-12-20 21:40:23 +01:00
* @ return bool | string
2014-12-01 01:13:22 +01:00
*/
2014-05-19 02:18:14 +02:00
public function chmod ( $file , $mode = false , $recursive = false ) {
2008-09-05 07:47:08 +02:00
if ( ! $this -> exists ( $file ) )
return false ;
2009-08-16 10:34:53 +02:00
if ( ! $mode ) {
if ( $this -> is_file ( $file ) )
$mode = FS_CHMOD_FILE ;
elseif ( $this -> is_dir ( $file ) )
$mode = FS_CHMOD_DIR ;
else
2009-09-14 16:03:32 +02:00
return false ;
2009-08-16 10:34:53 +02:00
}
2008-09-09 05:24:05 +02:00
if ( ! $recursive || ! $this -> is_dir ( $file ) )
2009-04-23 01:38:01 +02:00
return $this -> run_command ( sprintf ( 'chmod %o %s' , $mode , escapeshellarg ( $file )), true );
return $this -> run_command ( sprintf ( 'chmod -R %o %s' , $mode , escapeshellarg ( $file )), true );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2013-09-22 06:44:10 +02:00
/**
* Change the ownership of a file / folder .
*
2015-09-10 03:21:24 +02:00
* @ access public
2013-09-22 06:44:10 +02:00
*
2014-12-01 03:17:21 +01:00
* @ param string $file Path to the file .
* @ param string | int $owner A user name or number .
* @ param bool $recursive Optional . If set True changes file owner recursivly . Defaults to False .
2014-12-01 01:13:22 +01:00
* @ return bool | string Returns true on success or false on failure .
2013-09-22 06:44:10 +02:00
*/
2014-05-19 02:18:14 +02:00
public function chown ( $file , $owner , $recursive = false ) {
2008-09-09 05:24:05 +02:00
if ( ! $this -> exists ( $file ) )
return false ;
if ( ! $recursive || ! $this -> is_dir ( $file ) )
2013-07-10 06:15:13 +02:00
return $this -> run_command ( sprintf ( 'chown %s %s' , escapeshellarg ( $owner ), escapeshellarg ( $file )), true );
return $this -> run_command ( sprintf ( 'chown -R %s %s' , escapeshellarg ( $owner ), escapeshellarg ( $file )), true );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return string | false
*/
2014-05-19 02:18:14 +02:00
public function owner ( $file ) {
2015-10-01 07:40:25 +02:00
$owneruid = @ fileowner ( $this -> sftp_path ( $file ) );
2009-04-23 01:38:01 +02:00
if ( ! $owneruid )
return false ;
if ( ! function_exists ( 'posix_getpwuid' ) )
return $owneruid ;
$ownerarray = posix_getpwuid ( $owneruid );
return $ownerarray [ 'name' ];
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return string
*/
2014-05-19 02:18:14 +02:00
public function getchmod ( $file ) {
2015-10-01 07:40:25 +02:00
return substr ( decoct ( @ fileperms ( $this -> sftp_path ( $file ) ) ), - 3 );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return string | false
*/
2014-05-19 02:18:14 +02:00
public function group ( $file ) {
2015-10-01 07:40:25 +02:00
$gid = @ filegroup ( $this -> sftp_path ( $file ) );
2009-04-23 01:38:01 +02:00
if ( ! $gid )
return false ;
if ( ! function_exists ( 'posix_getgrgid' ) )
return $gid ;
$grouparray = posix_getgrgid ( $gid );
return $grouparray [ 'name' ];
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2015-05-29 22:17:26 +02:00
* @ param string $source
* @ param string $destination
* @ param bool $overwrite
2014-12-01 01:13:22 +01:00
* @ param int | bool $mode
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function copy ( $source , $destination , $overwrite = false , $mode = false ) {
2010-01-18 21:34:48 +01:00
if ( ! $overwrite && $this -> exists ( $destination ) )
2008-09-05 07:47:08 +02:00
return false ;
$content = $this -> get_contents ( $source );
2010-01-18 21:34:48 +01:00
if ( false === $content )
2008-09-05 07:47:08 +02:00
return false ;
2011-03-22 01:04:15 +01:00
return $this -> put_contents ( $destination , $content , $mode );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $source
* @ param string $destination
2015-05-29 22:17:26 +02:00
* @ param bool $overwrite
2014-12-01 01:13:22 +01:00
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function move ( $source , $destination , $overwrite = false ) {
2014-10-20 09:46:19 +02:00
return @ ssh2_sftp_rename ( $this -> sftp_link , $source , $destination );
2008-09-05 07:47:08 +02:00
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2015-05-29 22:17:26 +02:00
* @ param string $file
* @ param bool $recursive
2014-12-01 01:13:22 +01:00
* @ param string | bool $type
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function delete ( $file , $recursive = false , $type = false ) {
2011-03-22 01:04:15 +01:00
if ( 'f' == $type || $this -> is_file ( $file ) )
2008-09-09 05:24:05 +02:00
return ssh2_sftp_unlink ( $this -> sftp_link , $file );
if ( ! $recursive )
return ssh2_sftp_rmdir ( $this -> sftp_link , $file );
2008-09-05 07:47:08 +02:00
$filelist = $this -> dirlist ( $file );
2008-09-09 05:24:05 +02:00
if ( is_array ( $filelist ) ) {
foreach ( $filelist as $filename => $fileinfo ) {
2011-03-22 01:04:15 +01:00
$this -> delete ( $file . '/' . $filename , $recursive , $fileinfo [ 'type' ]);
2008-09-09 05:24:05 +02:00
}
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
return ssh2_sftp_rmdir ( $this -> sftp_link , $file );
2008-09-05 07:47:08 +02:00
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function exists ( $file ) {
2015-10-01 07:40:25 +02:00
return file_exists ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function is_file ( $file ) {
2015-10-01 07:40:25 +02:00
return is_file ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $path
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function is_dir ( $path ) {
2015-10-01 07:40:25 +02:00
return is_dir ( $this -> sftp_path ( $path ) );
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function is_readable ( $file ) {
2015-10-01 07:40:25 +02:00
return is_readable ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function is_writable ( $file ) {
2015-08-21 13:43:25 +02:00
// PHP will base it's writable checks on system_user === file_owner, not ssh_user === file_owner
return true ;
2008-09-05 07:47:08 +02:00
}
2015-09-10 03:21:24 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return int
*/
2014-05-19 02:18:14 +02:00
public function atime ( $file ) {
2015-10-01 07:40:25 +02:00
return fileatime ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return int
*/
2014-05-19 02:18:14 +02:00
public function mtime ( $file ) {
2015-10-01 07:40:25 +02:00
return filemtime ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
* @ return int
*/
2014-05-19 02:18:14 +02:00
public function size ( $file ) {
2015-10-01 07:40:25 +02:00
return filesize ( $this -> sftp_path ( $file ) );
2008-09-05 07:47:08 +02:00
}
2008-09-09 05:24:05 +02:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $file
2015-05-29 22:17:26 +02:00
* @ param int $time
* @ param int $atime
2014-12-01 01:13:22 +01:00
*/
2014-05-19 02:18:14 +02:00
public function touch ( $file , $time = 0 , $atime = 0 ) {
2011-09-03 16:18:10 +02:00
//Not implemented.
2008-09-05 07:47:08 +02:00
}
2008-12-09 19:03:31 +01:00
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $path
2015-05-29 22:17:26 +02:00
* @ param mixed $chmod
* @ param mixed $chown
* @ param mixed $chgrp
2014-12-01 01:13:22 +01:00
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function mkdir ( $path , $chmod = false , $chown = false , $chgrp = false ) {
2008-09-13 20:06:20 +02:00
$path = untrailingslashit ( $path );
2011-10-13 12:43:38 +02:00
if ( empty ( $path ) )
return false ;
2009-08-16 10:34:53 +02:00
if ( ! $chmod )
$chmod = FS_CHMOD_DIR ;
2009-04-23 01:38:01 +02:00
if ( ! ssh2_sftp_mkdir ( $this -> sftp_link , $path , $chmod , true ) )
2008-09-05 07:47:08 +02:00
return false ;
2009-04-23 01:38:01 +02:00
if ( $chown )
2008-09-05 07:47:08 +02:00
$this -> chown ( $path , $chown );
2009-04-23 01:38:01 +02:00
if ( $chgrp )
2008-09-05 07:47:08 +02:00
$this -> chgrp ( $path , $chgrp );
return true ;
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $path
2015-05-29 22:17:26 +02:00
* @ param bool $recursive
2014-12-01 01:13:22 +01:00
* @ return bool
*/
2014-05-19 02:18:14 +02:00
public function rmdir ( $path , $recursive = false ) {
2008-09-09 05:24:05 +02:00
return $this -> delete ( $path , $recursive );
2008-09-05 07:47:08 +02:00
}
2014-12-01 01:13:22 +01:00
/**
2015-09-10 03:21:24 +02:00
* @ access public
*
2014-12-01 01:13:22 +01:00
* @ param string $path
2015-05-29 22:17:26 +02:00
* @ param bool $include_hidden
* @ param bool $recursive
2014-12-01 01:13:22 +01:00
* @ return bool | array
*/
2014-05-19 02:18:14 +02:00
public function dirlist ( $path , $include_hidden = true , $recursive = false ) {
2009-04-23 01:38:01 +02:00
if ( $this -> is_file ( $path ) ) {
2009-09-15 04:21:00 +02:00
$limit_file = basename ( $path );
2009-04-23 01:38:01 +02:00
$path = dirname ( $path );
2008-09-05 07:47:08 +02:00
} else {
2009-09-15 04:21:00 +02:00
$limit_file = false ;
2008-09-05 07:47:08 +02:00
}
2009-09-15 04:21:00 +02:00
2009-04-23 01:38:01 +02:00
if ( ! $this -> is_dir ( $path ) )
2008-09-05 07:47:08 +02:00
return false ;
2009-04-23 01:38:01 +02:00
$ret = array ();
2015-10-01 07:40:25 +02:00
$dir = @ dir ( $this -> sftp_path ( $path ) );
2009-09-15 04:21:00 +02:00
2009-04-23 01:38:01 +02:00
if ( ! $dir )
return false ;
2009-09-15 04:21:00 +02:00
2009-04-23 01:38:01 +02:00
while ( false !== ( $entry = $dir -> read ()) ) {
$struc = array ();
$struc [ 'name' ] = $entry ;
2008-09-09 05:24:05 +02:00
2009-04-23 01:38:01 +02:00
if ( '.' == $struc [ 'name' ] || '..' == $struc [ 'name' ] )
continue ; //Do not care about these folders.
2009-09-15 04:21:00 +02:00
if ( ! $include_hidden && '.' == $struc [ 'name' ][ 0 ] )
2008-09-05 07:47:08 +02:00
continue ;
2009-09-15 04:21:00 +02:00
if ( $limit_file && $struc [ 'name' ] != $limit_file )
2008-09-05 07:47:08 +02:00
continue ;
2009-04-23 01:38:01 +02:00
$struc [ 'perms' ] = $this -> gethchmod ( $path . '/' . $entry );
$struc [ 'permsn' ] = $this -> getnumchmodfromh ( $struc [ 'perms' ]);
$struc [ 'number' ] = false ;
$struc [ 'owner' ] = $this -> owner ( $path . '/' . $entry );
$struc [ 'group' ] = $this -> group ( $path . '/' . $entry );
$struc [ 'size' ] = $this -> size ( $path . '/' . $entry );
$struc [ 'lastmodunix' ] = $this -> mtime ( $path . '/' . $entry );
$struc [ 'lastmod' ] = date ( 'M j' , $struc [ 'lastmodunix' ]);
$struc [ 'time' ] = date ( 'h:i:s' , $struc [ 'lastmodunix' ]);
$struc [ 'type' ] = $this -> is_dir ( $path . '/' . $entry ) ? 'd' : 'f' ;
2008-09-05 07:47:08 +02:00
if ( 'd' == $struc [ 'type' ] ) {
2009-04-23 01:38:01 +02:00
if ( $recursive )
2009-09-15 04:21:00 +02:00
$struc [ 'files' ] = $this -> dirlist ( $path . '/' . $struc [ 'name' ], $include_hidden , $recursive );
2009-04-23 01:38:01 +02:00
else
$struc [ 'files' ] = array ();
2008-09-05 07:47:08 +02:00
}
2009-04-23 01:38:01 +02:00
$ret [ $struc [ 'name' ] ] = $struc ;
2008-09-05 07:47:08 +02:00
}
2009-04-23 01:38:01 +02:00
$dir -> close ();
unset ( $dir );
2008-09-05 07:47:08 +02:00
return $ret ;
}
2009-06-14 11:28:29 +02:00
}