2012-03-22 22:56:19 +04:00
< ? php
/**
* Copyright ( c ) 2012 Robin Appelman < icewind @ owncloud . com >
* This file is licensed under the Affero General Public License version 3 or
* later .
* See the COPYING - README file .
*/
2012-09-07 20:30:48 +04:00
namespace OC\Files\Storage ;
class FTP extends \OC\Files\Storage\StreamWrapper {
2012-03-22 22:56:19 +04:00
private $password ;
private $user ;
private $host ;
private $secure ;
private $root ;
private static $tempFiles = array ();
2012-08-29 10:42:49 +04:00
2013-03-08 21:15:20 +04:00
/**
* check if php - ftp is installed
*/
public static function checkDependencies () {
if ( function_exists ( 'ftp_login' )) {
return ( true );
} else {
$l = new \OC_L10N ( 'files_external' );
2013-05-30 19:37:47 +04:00
return $l -> t ( '<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it.' );
2013-03-08 21:15:20 +04:00
}
}
2012-09-07 17:22:01 +04:00
public function __construct ( $params ) {
2012-12-24 22:45:52 +04:00
if ( isset ( $params [ 'host' ]) && isset ( $params [ 'user' ]) && isset ( $params [ 'password' ])) {
$this -> host = $params [ 'host' ];
$this -> user = $params [ 'user' ];
$this -> password = $params [ 'password' ];
if ( isset ( $params [ 'secure' ])) {
if ( is_string ( $params [ 'secure' ])) {
$this -> secure = ( $params [ 'secure' ] === 'true' );
} else {
$this -> secure = ( bool ) $params [ 'secure' ];
}
2012-11-30 19:27:11 +04:00
} else {
2012-12-24 22:45:52 +04:00
$this -> secure = false ;
}
$this -> root = isset ( $params [ 'root' ]) ? $params [ 'root' ] : '/' ;
if ( ! $this -> root || $this -> root [ 0 ] != '/' ) {
$this -> root = '/' . $this -> root ;
}
2013-11-28 14:45:26 +04:00
if ( substr ( $this -> root , - 1 ) !== '/' ) {
$this -> root .= '/' ;
}
2012-11-30 19:27:11 +04:00
} else {
2013-02-12 05:27:05 +04:00
throw new \Exception ();
2012-07-27 20:32:03 +04:00
}
2012-12-24 22:45:52 +04:00
2012-03-22 22:56:19 +04:00
}
2012-10-12 01:06:57 +04:00
public function getId (){
return 'ftp::' . $this -> user . '@' . $this -> host . '/' . $this -> root ;
}
2012-03-22 22:56:19 +04:00
/**
* construct the ftp url
2012-10-12 01:17:59 +04:00
* @ param string $path
2012-03-22 22:56:19 +04:00
* @ return string
*/
2012-09-07 17:22:01 +04:00
public function constructUrl ( $path ) {
2012-03-22 22:56:19 +04:00
$url = 'ftp' ;
2012-11-30 19:27:11 +04:00
if ( $this -> secure ) {
2012-03-22 22:56:19 +04:00
$url .= 's' ;
}
$url .= '://' . $this -> user . ':' . $this -> password . '@' . $this -> host . $this -> root . $path ;
return $url ;
}
2013-11-29 15:58:57 +04:00
/**
* Unlinks file or directory
* @ param string @ path
*/
public function unlink ( $path ) {
if ( $this -> is_dir ( $path )) {
return $this -> rmdir ( $path );
}
else {
$url = $this -> constructUrl ( $path );
$result = unlink ( $url );
clearstatcache ( true , $url );
return $result ;
}
}
2012-09-07 17:22:01 +04:00
public function fopen ( $path , $mode ) {
switch ( $mode ) {
2012-03-22 22:56:19 +04:00
case 'r' :
case 'rb' :
case 'w' :
case 'wb' :
case 'a' :
case 'ab' :
//these are supported by the wrapper
$context = stream_context_create ( array ( 'ftp' => array ( 'overwrite' => true )));
2013-02-09 20:35:47 +04:00
return fopen ( $this -> constructUrl ( $path ), $mode , false , $context );
2012-03-22 22:56:19 +04:00
case 'r+' :
case 'w+' :
case 'wb+' :
case 'a+' :
case 'x' :
case 'x+' :
case 'c' :
case 'c+' :
//emulate these
2012-11-30 19:27:11 +04:00
if ( strrpos ( $path , '.' ) !== false ) {
2012-11-04 14:10:46 +04:00
$ext = substr ( $path , strrpos ( $path , '.' ));
2012-11-30 19:27:11 +04:00
} else {
2012-03-22 22:56:19 +04:00
$ext = '' ;
}
2013-02-12 14:00:38 +04:00
$tmpFile = \OCP\Files :: tmpFile ( $ext );
2013-01-28 18:34:15 +04:00
\OC\Files\Stream\Close :: registerCallback ( $tmpFile , array ( $this , 'writeBack' ));
2012-11-30 19:27:11 +04:00
if ( $this -> file_exists ( $path )) {
2012-11-02 22:53:02 +04:00
$this -> getFile ( $path , $tmpFile );
2012-03-22 22:56:19 +04:00
}
self :: $tempFiles [ $tmpFile ] = $path ;
2013-02-09 20:35:47 +04:00
return fopen ( 'close://' . $tmpFile , $mode );
2012-03-22 22:56:19 +04:00
}
2012-10-12 01:17:59 +04:00
return false ;
2012-03-22 22:56:19 +04:00
}
2012-09-07 17:22:01 +04:00
public function writeBack ( $tmpFile ) {
2012-11-30 19:27:11 +04:00
if ( isset ( self :: $tempFiles [ $tmpFile ])) {
2012-10-24 00:53:54 +04:00
$this -> uploadFile ( $tmpFile , self :: $tempFiles [ $tmpFile ]);
2012-03-22 22:56:19 +04:00
unlink ( $tmpFile );
}
}
}