5 changed files with 213 additions and 0 deletions
-
9apps/files_remote/appinfo/app.php
-
10apps/files_remote/appinfo/info.xml
-
157apps/files_remote/lib/ftp.php
-
9apps/files_remote/tests/config.php
-
28apps/files_remote/tests/ftp.php
@ -0,0 +1,9 @@ |
|||
<?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. |
|||
*/ |
|||
|
|||
OC::$CLASSPATH['OC_Filestorage_FTP']='apps/files_remote/lib/ftp.php'; |
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0"?> |
|||
<info> |
|||
<id>files_remote</id> |
|||
<name>Remote storage support</name> |
|||
<description>Mount remote storage sources</description> |
|||
<version>0.1</version> |
|||
<licence>AGPL</licence> |
|||
<author>Robin Appelman</author> |
|||
<require>3</require> |
|||
</info> |
|||
@ -0,0 +1,157 @@ |
|||
<?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. |
|||
*/ |
|||
|
|||
class OC_FileStorage_FTP extends OC_Filestorage_Common{ |
|||
private $password; |
|||
private $user; |
|||
private $host; |
|||
private $secure; |
|||
private $root; |
|||
|
|||
private static $tempFiles=array(); |
|||
|
|||
public function __construct($params){ |
|||
$this->host=$params['host']; |
|||
$this->user=$params['user']; |
|||
$this->password=$params['password']; |
|||
$this->secure=isset($params['secure'])?(bool)$params['secure']:false; |
|||
$this->root=isset($params['root'])?$params['root']:'/'; |
|||
if(substr($this->root,0,1)!='/'){ |
|||
$this->root='/'.$this->root; |
|||
} |
|||
|
|||
//create the root folder if necesary
|
|||
mkdir($this->constructUrl('')); |
|||
} |
|||
|
|||
/** |
|||
* construct the ftp url |
|||
* @param string path |
|||
* @return string |
|||
*/ |
|||
public function constructUrl($path){ |
|||
$url='ftp'; |
|||
if($this->secure){ |
|||
$url.='s'; |
|||
} |
|||
$url.='://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path; |
|||
return $url; |
|||
} |
|||
|
|||
public function mkdir($path){ |
|||
return mkdir($this->constructUrl($path)); |
|||
} |
|||
|
|||
public function rmdir($path){ |
|||
if($this->file_exists($path)){ |
|||
$succes=rmdir($this->constructUrl($path)); |
|||
clearstatcache(); |
|||
return $succes; |
|||
}else{ |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
public function opendir($path){ |
|||
return opendir($this->constructUrl($path)); |
|||
} |
|||
|
|||
public function filetype($path){ |
|||
return filetype($this->constructUrl($path)); |
|||
} |
|||
|
|||
public function is_readable($path){ |
|||
return true;//not properly supported
|
|||
} |
|||
|
|||
public function is_writable($path){ |
|||
return true;//not properly supported
|
|||
} |
|||
|
|||
public function file_exists($path){ |
|||
return file_exists($this->constructUrl($path)); |
|||
} |
|||
|
|||
public function unlink($path){ |
|||
$succes=unlink($this->constructUrl($path)); |
|||
clearstatcache(); |
|||
return $succes; |
|||
} |
|||
|
|||
public function fopen($path,$mode){ |
|||
switch($mode){ |
|||
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))); |
|||
return fopen($this->constructUrl($path),$mode,false,$context); |
|||
case 'r+': |
|||
case 'w+': |
|||
case 'wb+': |
|||
case 'a+': |
|||
case 'x': |
|||
case 'x+': |
|||
case 'c': |
|||
case 'c+': |
|||
//emulate these
|
|||
if(strrpos($path,'.')!==false){ |
|||
$ext=substr($path,strrpos($path,'.')); |
|||
}else{ |
|||
$ext=''; |
|||
} |
|||
$tmpFile=OC_Helper::tmpFile($ext); |
|||
OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack'); |
|||
if($this->file_exists($path)){ |
|||
$this->getFile($path,$tmpFile); |
|||
} |
|||
self::$tempFiles[$tmpFile]=$path; |
|||
return fopen('close://'.$tmpFile,$mode); |
|||
} |
|||
} |
|||
|
|||
public function writeBack($tmpFile){ |
|||
if(isset(self::$tempFiles[$tmpFile])){ |
|||
$this->uploadFile($tmpFile,self::$tempFiles[$tmpFile]); |
|||
unlink($tmpFile); |
|||
} |
|||
} |
|||
|
|||
public function free_space($path){ |
|||
return 0; |
|||
} |
|||
|
|||
public function touch($path,$mtime=null){ |
|||
if(is_null($mtime)){ |
|||
$fh=$this->fopen($path,'a'); |
|||
fwrite($fh,''); |
|||
fclose($fh); |
|||
}else{ |
|||
return false;//not supported
|
|||
} |
|||
} |
|||
|
|||
public function getFile($path,$target){ |
|||
return copy($this->constructUrl($path),$target); |
|||
} |
|||
|
|||
public function uploadFile($path,$target){ |
|||
return copy($path,$this->constructUrl($target)); |
|||
} |
|||
|
|||
public function rename($path1,$path2){ |
|||
return rename($this->constructUrl($path1),$this->constructUrl($path2)); |
|||
} |
|||
|
|||
public function stat($path){ |
|||
return stat($this->constructUrl($path)); |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
<?php |
|||
return array( |
|||
'ftp'=>array( |
|||
'host'=>'localhost', |
|||
'user'=>'test', |
|||
'password'=>'test', |
|||
'root'=>'/test', |
|||
) |
|||
); |
|||
@ -0,0 +1,28 @@ |
|||
<?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. |
|||
*/ |
|||
|
|||
class Test_Filestorage_FTP extends Test_FileStorage { |
|||
/** |
|||
* @var string tmpDir |
|||
*/ |
|||
private $config; |
|||
private $id; |
|||
|
|||
public function setUp(){ |
|||
$id=uniqid(); |
|||
$this->config=include('apps/files_remote/tests/config.php'); |
|||
$this->config['ftp']['root'].='/'.$id;//make sure we have an new empty folder to work in
|
|||
$this->instance=new OC_Filestorage_FTP($this->config['ftp']); |
|||
} |
|||
|
|||
public function tearDown(){ |
|||
OC_Helper::rmdirr($this->instance->constructUrl('')); |
|||
} |
|||
} |
|||
|
|||
?>
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue