From e0347b7fa6d92d606f88aee5c60ad89f3c45ef84 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 2 May 2010 18:07:36 +0200 Subject: [PATCH] initial work on making connections between seperate owncloud installations possible --- files/api.php | 52 +++++++++----- inc/lib_base.php | 1 + inc/lib_connect.php | 163 ++++++++++++++++++++++++++++++++++++++++++++ inc/lib_files.php | 2 +- 4 files changed, 201 insertions(+), 17 deletions(-) create mode 100644 inc/lib_connect.php diff --git a/files/api.php b/files/api.php index b27228d967..12bc49dd7f 100755 --- a/files/api.php +++ b/files/api.php @@ -30,23 +30,43 @@ if(!isset($_POST['action']) and isset($_GET['action'])){ foreach($arguments as &$argument){ $argument=stripslashes($argument); } +global $CONFIG_DATADIRECTORY; ob_clean(); -switch($arguments['action']){ - case 'delete': - OC_FILES::delete($arguments['dir'],$arguments['file']); - break; - case 'rename': - OC_FILES::move($arguments['dir'],$arguments['file'],$arguments['dir'],$arguments['newname']); - break; - case 'new': - OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']); - break; - case 'move': - OC_FILES::move($arguments['sourcedir'],$arguments['source'],$arguments['targetdir'],$arguments['target']); - break; - case 'get': - OC_FILES::get($arguments['dir'],$arguments['file']); - break; +if($arguments['action']){ + switch($arguments['action']){ + case 'delete': + OC_FILES::delete($arguments['dir'],$arguments['file']); + break; + case 'rename': + OC_FILES::move($arguments['dir'],$arguments['file'],$arguments['dir'],$arguments['newname']); + break; + case 'new': + OC_FILES::newfile($arguments['dir'],$arguments['name'],$arguments['type']); + break; + case 'move': + OC_FILES::move($arguments['sourcedir'],$arguments['source'],$arguments['targetdir'],$arguments['target']); + break; + case 'get': + OC_FILES::get($arguments['dir'],$arguments['file']); + break; + case 'getfiles': + echo json_encode(OC_FILES::getdirectorycontent($CONFIG_DATADIRECTORY.'/'.$arguments['dir'])); + break; + case 'login': + if(OC_USER::login($arguments['username'],$arguments['password'])){ + echo 'true'; + }else{ + echo 'false'; + } + break; + case 'checklogin': + if(OC_USER::isLoggedIn()){ + echo 'true'; + }else{ + echo 'false'; + } + break; + } } ?> \ No newline at end of file diff --git a/inc/lib_base.php b/inc/lib_base.php index f5aad407b7..b1ca850abc 100755 --- a/inc/lib_base.php +++ b/inc/lib_base.php @@ -70,6 +70,7 @@ oc_require_once('lib_log.php'); oc_require_once('lib_config.php'); oc_require_once('lib_user.php'); oc_require_once('lib_ocs.php'); +oc_require_once('lib_connect.php'); if(!is_dir($CONFIG_DATADIRECTORY_ROOT)){ diff --git a/inc/lib_connect.php b/inc/lib_connect.php new file mode 100644 index 0000000000..ddf03eb6e7 --- /dev/null +++ b/inc/lib_connect.php @@ -0,0 +1,163 @@ +. +* +*/ + +/** + * Class for connecting multiply ownCloud installations + * + */ +class OC_CONNECT{ + static private $clouds=array(); + + static function connect($path,$user,$password){ + $cloud=new OC_REMOTE_CLOUD($path,$user,$password); + if($cloud->connected){ + self::$clouds[$path]=$cloud; + return $cloud; + }else{ + return false; + } + } +} + + +/** + * Class for connection to a remote owncloud installation + * + */ +class OC_REMOTE_CLOUD{ + private $path; + private $connected=false; + private $cookiefile=false; + + /** + * make an api call to the remote cloud + * @param string $action + * @param array parameters + * @param bool assoc when set to true, the result will be parsed as associative array + * + */ + private function apiCall($action,$parameters=false,$assoc=false){ + if(!$this->cookiefile){ + $this->cookiefile=sys_get_temp_dir().'/remoteCloudCookie'.uniqid(); + } + $url=$this->path.='/files/api.php'; + $fields_string="action=$action&"; + if(is_array($parameters)){ + foreach($parameters as $key=>$value){ + $fields_string.=$key.'='.$value.'&'; + } + rtrim($fields_string,'&'); + } + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,$url); + curl_setopt($ch,CURLOPT_POST,count($parameters)); + curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); + curl_setopt($ch, CURLOPT_COOKIEFILE,$this->cookiefile); + curl_setopt($ch, CURLOPT_COOKIEJAR,$this->cookiefile); + curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); + $result=trim(curl_exec($ch)); + $info=curl_getinfo($ch); + $httpCode=$info['http_code']; + if($httpCode==200 or $httpCode==0){ + return json_decode($result,$assoc); + }else{ + return false; + } + } + + public function __construct($path,$user,$password){ + $this->path=$path; + $this->connected=$this->apiCall('login',array('username'=>$user,'password'=>$password)); + } + + /** + * check if we are stull logged in on the remote cloud + * + */ + public function isLoggedIn(){ + if(!$this->connected){ + return false; + } + return $this->apiCall('checklogin'); + } + + public function __get($name){ + switch($name){ + case 'connected': + return $this->connected; + } + } + + /** + * disconnect from the remote cloud + * + */ + public function disconnect(){ + $this->connected=false; + if(is_file($this->cookiefile)){ + unlink($this->cookiefile); + } + $this->cookiefile=false; + } + + /** + * get the files inside a directory of the remote cloud + * @param string $dir + */ + public function getFiles($dir){ + if(!$this->connected){ + return false; + } + return $this->apiCall('getfiles',array('dir'=>$dir),true); + } +} + +function OC_CONNECT_TEST($path,$user,$password){ + echo 'connecting...'; + $remote=OC_CONNECT::connect($path,$user,$password); + if($remote->connected){ + echo 'done
'; + if($remote->isLoggedIn()){ + echo 'logged in, session working
'; + echo 'trying to get remote files...'; + $files=$remote->getFiles(''); + if($files){ + echo count($files).' files found:
'; + foreach($files as $file){ + echo "{$file['type']} {$file['name']}: {$file['size']} bytes
"; + } + }else{ + echo 'fail
'; + } + }else{ + echo 'no longer logged in, session fail
'; + } + }else{ + echo 'fail
'; + } + $remote->disconnect(); + die(); +} + + +?> diff --git a/inc/lib_files.php b/inc/lib_files.php index 9bd349bfd0..9f085ee0a4 100755 --- a/inc/lib_files.php +++ b/inc/lib_files.php @@ -201,7 +201,7 @@ class OC_FILES { * @param string file path * @return string guessed mime type */ - function getMimeType($fspath){ + static function getMimeType($fspath){ if (@is_dir($fspath)) { // directories are easy return "httpd/unix-directory";