From: Tom Needham Date: Mon, 31 Dec 2012 15:47:15 +0000 (+0000) Subject: Merge branch 'master' into ocs_api X-Git-Tag: v5.0.0alpha1~260^2~4 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6eb194b70284d527a182756f2c7a21f3d7dc1fe8;p=nextcloud-server.git Merge branch 'master' into ocs_api Conflicts: l10n/templates/core.pot l10n/templates/files.pot l10n/templates/files_encryption.pot l10n/templates/files_external.pot l10n/templates/files_sharing.pot l10n/templates/files_versions.pot l10n/templates/lib.pot l10n/templates/settings.pot l10n/templates/user_ldap.pot l10n/templates/user_webdavauth.pot --- 6eb194b70284d527a182756f2c7a21f3d7dc1fe8 diff --cc lib/api.php index 6c6c351b292,00000000000..cb67e0c2a89 mode 100644,000000..100644 --- a/lib/api.php +++ b/lib/api.php @@@ -1,202 -1,0 +1,200 @@@ +. +* +*/ + +class OC_API { + + /** + * API authentication levels + */ + const GUEST_AUTH = 0; + const USER_AUTH = 1; + const SUBADMIN_AUTH = 2; + const ADMIN_AUTH = 3; + + private static $server; + + /** + * initialises the OAuth store and server + */ + private static function init() { + self::$server = new OC_OAuth_Server(new OC_OAuth_Store()); + } + + /** - * api actions - */ ++ * api actions ++ */ + protected static $actions = array(); + + /** - * registers an api call - * @param string $method the http method - * @param string $url the url to match - * @param callable $action the function to run - * @param string $app the id of the app registering the call - * @param int $authlevel the level of authentication required for the call - * @param array $defaults - * @param array $requirements - */ ++ * registers an api call ++ * @param string $method the http method ++ * @param string $url the url to match ++ * @param callable $action the function to run ++ * @param string $app the id of the app registering the call ++ * @param int $authLevel the level of authentication required for the call ++ * @param array $defaults ++ * @param array $requirements ++ */ + public static function register($method, $url, $action, $app, - $authlevel = OC_API::USER_AUTH, ++ $authLevel = OC_API::USER_AUTH, + $defaults = array(), - $requirements = array()){ ++ $requirements = array()) { + $name = strtolower($method).$url; + $name = str_replace(array('/', '{', '}'), '_', $name); - if(!isset(self::$actions[$name])){ ++ if(!isset(self::$actions[$name])) { + OC::getRouter()->useCollection('ocs'); + OC::getRouter()->create($name, $url) + ->method($method) + ->action('OC_API', 'call'); + self::$actions[$name] = array(); + } - self::$actions[$name] = array('app' => $app, 'action' => $action, 'authlevel' => $authlevel); ++ self::$actions[$name] = array('app' => $app, 'action' => $action, 'authlevel' => $authLevel); + } + + /** - * handles an api call - * @param array $parameters - */ - public static function call($parameters){ ++ * handles an api call ++ * @param array $parameters ++ */ ++ public static function call($parameters) { + // Prepare the request variables - if($_SERVER['REQUEST_METHOD'] == 'PUT'){ ++ if($_SERVER['REQUEST_METHOD'] == 'PUT') { + parse_str(file_get_contents("php://input"), $parameters['_put']); + } else if($_SERVER['REQUEST_METHOD'] == 'DELETE'){ + parse_str(file_get_contents("php://input"), $parameters['_delete']); + } + $name = $parameters['_route']; + // Check authentication and availability - if(self::isAuthorised(self::$actions[$name])){ - if(is_callable(self::$actions[$name]['action'])){ ++ if(self::isAuthorised(self::$actions[$name])) { ++ if(is_callable(self::$actions[$name]['action'])) { + $response = call_user_func(self::$actions[$name]['action'], $parameters); + } else { + $response = new OC_OCS_Result(null, 998, 'Api method not found'); + } + } else { + $response = new OC_OCS_Result(null, 997, 'Unauthorised'); + } + // Send the response + $formats = array('json', 'xml'); + $format = !empty($_GET['format']) && in_array($_GET['format'], $formats) ? $_GET['format'] : 'xml'; + self::respond($response, $format); + // logout the user to be stateless + OC_User::logout(); + } + + /** + * authenticate the api call + * @param array $action the action details as supplied to OC_API::register() + * @return bool + */ - private static function isAuthorised($action){ ++ private static function isAuthorised($action) { + $level = $action['authlevel']; - switch($level){ ++ switch($level) { + case OC_API::GUEST_AUTH: + // Anyone can access + return true; + break; + case OC_API::USER_AUTH: + // User required + return self::loginUser(); + break; + case OC_API::SUBADMIN_AUTH: + // Check for subadmin + $user = self::loginUser(); - if(!$user){ ++ if(!$user) { + return false; + } else { - $subadmin = OC_SubAdmin::isSubAdmin($user); ++ $subAdmin = OC_SubAdmin::isSubAdmin($user); + $admin = OC_Group::inGroup($user, 'admin'); - if($subadmin || $admin){ ++ if($subAdmin || $admin) { + return true; + } else { + return false; + } + } + break; + case OC_API::ADMIN_AUTH: + // Check for admin + $user = self::loginUser(); - if(!$user){ ++ if(!$user) { + return false; + } else { + return OC_Group::inGroup($user, 'admin'); + } + break; + default: + // oops looks like invalid level supplied + return false; + break; + } + } + + /** + * http basic auth + * @return string|false (username, or false on failure) + */ - private static function loginUser(){ - $authuser = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : ''; - $authpw = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; - return OC_User::login($authuser, $authpw) ? $authuser : false; ++ private static function loginUser(){ ++ $authUser = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : ''; ++ $authPw = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; ++ return OC_User::login($authUser, $authPw) ? $authUser : false; + } + + /** - * respond to a call - * @param int|array $result the result from the api method - * @param string $format the format xml|json - */ - private static function respond($result, $format='xml'){ ++ * respond to a call ++ * @param int|array $result the result from the api method ++ * @param string $format the format xml|json ++ */ ++ private static function respond($result, $format='xml') { + $response = array('ocs' => $result->getResult()); + if ($format == 'json') { + OC_JSON::encodedPrint($response); + } else if ($format == 'xml') { + header('Content-type: text/xml; charset=UTF-8'); + $writer = new XMLWriter(); + $writer->openMemory(); + $writer->setIndent( true ); + $writer->startDocument(); + self::toXML($response, $writer); + $writer->endDocument(); + echo $writer->outputMemory(true); - } else { - var_dump($format, $response); + } + } + - private static function toXML($array, $writer){ ++ private static function toXML($array, $writer) { + foreach($array as $k => $v) { + if (is_numeric($k)) { + $k = 'element'; + } + if (is_array($v)) { + $writer->startElement($k); + self::toXML($v, $writer); + $writer->endElement(); + } else { + $writer->writeElement($k, $v); + } + } + } + +} diff --cc lib/ocs/activity.php index 07b571665ec,00000000000..c30e21018d3 mode 100644,000000..100644 --- a/lib/ocs/activity.php +++ b/lib/ocs/activity.php @@@ -1,8 -1,0 +1,28 @@@ +. ++* ++*/ + +class OC_OCS_Activity { + + public static function activityGet($parameters){ + // TODO + } +} diff --cc lib/ocs/cloud.php index b5cfbc295e8,00000000000..21095ec91e9 mode 100644,000000..100644 --- a/lib/ocs/cloud.php +++ b/lib/ocs/cloud.php @@@ -1,76 -1,0 +1,98 @@@ +. ++* ++*/ + +class OC_OCS_Cloud { + - public static function getSystemWebApps($parameters){ ++ public static function getSystemWebApps($parameters) { + OC_Util::checkLoggedIn(); + $apps = OC_App::getEnabledApps(); + $values = array(); + foreach($apps as $app) { + $info = OC_App::getAppInfo($app); + if(isset($info['standalone'])) { - $newvalue = array('name'=>$info['name'],'url'=>OC_Helper::linkToAbsolute($app,''),'icon'=>''); - $values[] = $newvalue; ++ $newValue = array('name'=>$info['name'],'url'=>OC_Helper::linkToAbsolute($app,''),'icon'=>''); ++ $values[] = $newValue; + } + } + return new OC_OCS_Result($values); + } + - public static function getUserQuota($parameters){ ++ public static function getUserQuota($parameters) { + $user = OC_User::getUser(); + if(OC_Group::inGroup($user, 'admin') or ($user==$parameters['user'])) { + - if(OC_User::userExists($parameters['user'])){ ++ if(OC_User::userExists($parameters['user'])) { + // calculate the disc space - $user_dir = '/'.$parameters['user'].'/files'; - OC_Filesystem::init($user_dir); - $rootInfo=OC_FileCache::get(''); - $sharedInfo=OC_FileCache::get('/Shared'); - $used=$rootInfo['size']-$sharedInfo['size']; - $free=OC_Filesystem::free_space(); - $total=$free+$used; - if($total==0) $total=1; // prevent division by zero - $relative=round(($used/$total)*10000)/100; ++ $userDir = '/'.$parameters['user'].'/files'; ++ OC_Filesystem::init($useDir); ++ $rootInfo = OC_FileCache::get(''); ++ $sharedInfo = OC_FileCache::get('/Shared'); ++ $used = $rootInfo['size'] - $sharedInfo['size']; ++ $free = OC_Filesystem::free_space(); ++ $total = $free + $used; ++ if($total===0) $total = 1; // prevent division by zero ++ $relative = round(($used/$total)*10000)/100; + - $xml=array(); - $xml['quota']=$total; - $xml['free']=$free; - $xml['used']=$used; - $xml['relative']=$relative; ++ $xml = array(); ++ $xml['quota'] = $total; ++ $xml['free'] = $free; ++ $xml['used'] = $used; ++ $xml['relative'] = $relative; + + return new OC_OCS_Result($xml); - }else{ ++ } else { + return new OC_OCS_Result(null, 300); + } - }else{ ++ } else { + return new OC_OCS_Result(null, 300); + } + } + - public static function getUserPublickey($parameters){ ++ public static function getUserPublickey($parameters) { + - if(OC_User::userExists($parameters['user'])){ ++ if(OC_User::userExists($parameters['user'])) { + // calculate the disc space + // TODO + return new OC_OCS_Result(array()); - }else{ ++ } else { + return new OC_OCS_Result(null, 300); + } + } + - public static function getUserPrivatekey($parameters){ ++ public static function getUserPrivatekey($parameters) { + $user = OC_User::getUser(); + if(OC_Group::inGroup($user, 'admin') or ($user==$parameters['user'])) { + - if(OC_User::userExists($user)){ ++ if(OC_User::userExists($user)) { + // calculate the disc space - $txt='this is the private key of '.$parameters['user']; ++ $txt = 'this is the private key of '.$parameters['user']; + echo($txt); - }else{ ++ } else { + return new OC_OCS_Result(null, 300, 'User does not exist'); + } - }else{ ++ } else { + return new OC_OCS_Result('null', 300, 'You don´t have permission to access this ressource.'); + } + } +} diff --cc lib/ocs/person.php index b5f07d88ae1,00000000000..169cc8211db mode 100644,000000..100644 --- a/lib/ocs/person.php +++ b/lib/ocs/person.php @@@ -1,20 -1,0 +1,42 @@@ +. ++* ++*/ + +class OC_OCS_Person { + - public static function check($parameters){ ++ public static function check($parameters) { + $login = isset($_POST['login']) ? $_POST['login'] : false; + $password = isset($_POST['password']) ? $_POST['password'] : false; - if($login && $password){ - if(OC_User::checkPassword($login,$password)){ ++ if($login && $password) { ++ if(OC_User::checkPassword($login, $password)) { + $xml['person']['personid'] = $login; + return new OC_OCS_Result($xml); - }else{ ++ } else { + return new OC_OCS_Result(null, 102); + } - }else{ ++ } else { + return new OC_OCS_Result(null, 101); + } + } + +} diff --cc lib/ocs/privatedata.php index 09d636bd733,00000000000..e01ed5e8b07 mode 100644,000000..100644 --- a/lib/ocs/privatedata.php +++ b/lib/ocs/privatedata.php @@@ -1,44 -1,0 +1,66 @@@ +. ++* ++*/ + +class OC_OCS_Privatedata { + - public static function get($parameters){ ++ public static function get($parameters) { + OC_Util::checkLoggedIn(); + $user = OC_User::getUser(); + $app = addslashes(strip_tags($parameters['app'])); + $key = addslashes(strip_tags($parameters['key'])); + $result = OC_OCS::getData($user,$app,$key); + $xml = array(); + foreach($result as $i=>$log) { + $xml[$i]['key']=$log['key']; + $xml[$i]['app']=$log['app']; + $xml[$i]['value']=$log['value']; + } + return new OC_OCS_Result($xml); + //TODO: replace 'privatedata' with 'attribute' once a new libattice has been released that works with it + } + - public static function set($parameters){ ++ public static function set($parameters) { + OC_Util::checkLoggedIn(); + $user = OC_User::getUser(); + $app = addslashes(strip_tags($parameters['app'])); + $key = addslashes(strip_tags($parameters['key'])); + $value = OC_OCS::readData('post', 'value', 'text'); - if(OC_Preferences::setValue($user,$app,$key,$value)){ ++ if(OC_Preferences::setValue($user, $app, $key, $value)){ + return new OC_OCS_Result(null, 100); + } + } + - public static function delete($parameters){ ++ public static function delete($parameters) { + OC_Util::checkLoggedIn(); + $user = OC_User::getUser(); + $app = addslashes(strip_tags($parameters['app'])); + $key = addslashes(strip_tags($parameters['key'])); - if($key=="" or $app==""){ ++ if($key==="" or $app==="") { + return new OC_OCS_Result(null, 101); //key and app are NOT optional here + } - if(OC_Preferences::deleteKey($user,$app,$key)){ ++ if(OC_Preferences::deleteKey($user, $app, $key)) { + return new OC_OCS_Result(null, 100); + } + } +} diff --cc lib/ocs/result.php index 4531da5ae0d,00000000000..b08d911f785 mode 100644,000000..100644 --- a/lib/ocs/result.php +++ b/lib/ocs/result.php @@@ -1,55 -1,0 +1,75 @@@ +. ++* ++*/ + +class OC_OCS_Result{ + - private $data, $message, $statuscode, $items, $perpage; ++ private $data, $message, $statusCode, $items, $perPage; + + /** + * create the OCS_Result object + * @param $data mixed the data to return + */ - public function __construct($data=null, $code=100, $message=null){ ++ public function __construct($data=null, $code=100, $message=null) { + $this->data = $data; - $this->statuscode = $code; ++ $this->statusCode = $code; + $this->message = $message; + } + + /** + * optionally set the total number of items available + * @param $items int + */ - public function setTotalItems(int $items){ ++ public function setTotalItems(int $items) { + $this->items = $items; + } + + /** + * optionally set the the number of items per page + * @param $items int + */ - public function setItemsPerPage(int $items){ - $this->perpage = $items; ++ public function setItemsPerPage(int $items) { ++ $this->perPage = $items; + } + + /** + * returns the data associated with the api result + * @return array + */ - public function getResult(){ ++ public function getResult() { + $return = array(); + $return['meta'] = array(); - $return['meta']['status'] = ($this->statuscode === 100) ? 'ok' : 'failure'; - $return['meta']['statuscode'] = $this->statuscode; ++ $return['meta']['status'] = ($this->statusCode === 100) ? 'ok' : 'failure'; ++ $return['meta']['statuscode'] = $this->statusCode; + $return['meta']['message'] = $this->message; - if(isset($this->items)){ ++ if(isset($this->items)) { + $return['meta']['totalitems'] = $this->items; + } - if(isset($this->perpage)){ - $return['meta']['itemsperpage'] = $this->perpage; ++ if(isset($this->perPage)) { ++ $return['meta']['itemsperpage'] = $this->perPage; + } + $return['data'] = $this->data; + // Return the result data. + return $return; + } + + +} diff --cc lib/public/api.php index 9d6d1153e6c,00000000000..a85daa1935c mode 100644,000000..100644 --- a/lib/public/api.php +++ b/lib/public/api.php @@@ -1,44 -1,0 +1,44 @@@ +. +* +*/ + +namespace OCP; + +/** + * This class provides functions to manage apps in ownCloud + */ +class API { + + /** - * registers an api call - * @param string $method the http method - * @param string $url the url to match - * @param callable $action the function to run - * @param string $app the id of the app registering the call - * @param int $authlevel the level of authentication required for the call (See OC_API constants) - * @param array $defaults - * @param array $requirements - */ - public static function register($method, $url, $action, $app, $authlevel = OC_API::USER_AUTH, $defaults = array(), $requirements = array()){ - \OC_API::register($method, $url, $action, $app, $authlevel, $defaults, $requirements); ++ * registers an api call ++ * @param string $method the http method ++ * @param string $url the url to match ++ * @param callable $action the function to run ++ * @param string $app the id of the app registering the call ++ * @param int $authLevel the level of authentication required for the call (See OC_API constants) ++ * @param array $defaults ++ * @param array $requirements ++ */ ++ public static function register($method, $url, $action, $app, $authLevel = OC_API::USER_AUTH, $defaults = array(), $requirements = array()){ ++ \OC_API::register($method, $url, $action, $app, $authLevel, $defaults, $requirements); + } + +}