]> source.dussan.org Git - nextcloud-server.git/commitdiff
ftp storage backend
authorRobin Appelman <icewind@owncloud.com>
Thu, 22 Mar 2012 18:56:19 +0000 (19:56 +0100)
committerRobin Appelman <icewind@owncloud.com>
Thu, 22 Mar 2012 18:56:19 +0000 (19:56 +0100)
apps/files_remote/appinfo/app.php [new file with mode: 0644]
apps/files_remote/appinfo/info.xml [new file with mode: 0644]
apps/files_remote/lib/ftp.php [new file with mode: 0644]
apps/files_remote/tests/config.php [new file with mode: 0644]
apps/files_remote/tests/ftp.php [new file with mode: 0644]

diff --git a/apps/files_remote/appinfo/app.php b/apps/files_remote/appinfo/app.php
new file mode 100644 (file)
index 0000000..f94e813
--- /dev/null
@@ -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';
diff --git a/apps/files_remote/appinfo/info.xml b/apps/files_remote/appinfo/info.xml
new file mode 100644 (file)
index 0000000..0720b60
--- /dev/null
@@ -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>
diff --git a/apps/files_remote/lib/ftp.php b/apps/files_remote/lib/ftp.php
new file mode 100644 (file)
index 0000000..802446b
--- /dev/null
@@ -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));
+       }
+}
diff --git a/apps/files_remote/tests/config.php b/apps/files_remote/tests/config.php
new file mode 100644 (file)
index 0000000..5410578
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+return array(
+       'ftp'=>array(
+               'host'=>'localhost',
+               'user'=>'test',
+               'password'=>'test',
+               'root'=>'/test',
+       )
+);
diff --git a/apps/files_remote/tests/ftp.php b/apps/files_remote/tests/ftp.php
new file mode 100644 (file)
index 0000000..2d5405c
--- /dev/null
@@ -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(''));
+       }
+}
+
+?>
\ No newline at end of file