Merge branch 'master' into fixing-998-master

Conflicts:
	lib/helper.php
This commit is contained in:
Thomas Mueller 2013-01-06 12:18:21 +01:00
commit 7ebfcab49b
27 changed files with 1043 additions and 558 deletions

View File

@ -115,6 +115,9 @@ $CONFIG = array(
*/ */
// "datadirectory" => "", // "datadirectory" => "",
/* Enable maintenance mode to disable ownCloud */
"maintenance" => false,
"apps_paths" => array( "apps_paths" => array(
/* Set an array of path for your apps directories /* Set an array of path for your apps directories

67
core/ajax/update.php Normal file
View File

@ -0,0 +1,67 @@
<?php
set_time_limit(0);
$RUNTIME_NOAPPS = true;
require_once '../../lib/base.php';
if (OC::checkUpgrade(false)) {
$updateEventSource = new OC_EventSource();
$watcher = new UpdateWatcher($updateEventSource);
OC_Hook::connect('update', 'success', $watcher, 'success');
OC_Hook::connect('update', 'error', $watcher, 'error');
OC_Hook::connect('update', 'error', $watcher, 'failure');
$watcher->success('Turned on maintenance mode');
try {
$result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml');
$watcher->success('Updated database');
} catch (Exception $exception) {
$watcher->failure($exception->getMessage());
}
$minimizerCSS = new OC_Minimizer_CSS();
$minimizerCSS->clearCache();
$minimizerJS = new OC_Minimizer_JS();
$minimizerJS->clearCache();
OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
OC_App::checkAppsRequirements();
// load all apps to also upgrade enabled apps
OC_App::loadApps();
OC_Config::setValue('maintenance', false);
$watcher->success('Turned off maintenance mode');
$watcher->done();
}
class UpdateWatcher {
/**
* @var \OC_EventSource $eventSource;
*/
private $eventSource;
public function __construct($eventSource) {
$this->eventSource = $eventSource;
}
public function success($message) {
OC_Util::obEnd();
$this->eventSource->send('success', $message);
ob_start();
}
public function error($message) {
OC_Util::obEnd();
$this->eventSource->send('error', $message);
ob_start();
}
public function failure($message) {
OC_Util::obEnd();
$this->eventSource->send('failure', $message);
$this->eventSource->close();
die();
}
public function done() {
OC_Util::obEnd();
$this->eventSource->send('done', '');
$this->eventSource->close();
}
}

View File

@ -214,7 +214,8 @@ div.jp-play-bar, div.jp-seek-bar { padding:0; }
.pager { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; } .pager { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; }
.pager li { display:inline-block; } .pager li { display:inline-block; }
li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color:#FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } li.update, li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; cursor:default; }
.error { color:#FF3B3B; }
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow:hidden; text-overflow:ellipsis; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow:hidden; text-overflow:ellipsis; }
.hint { background-image:url('../img/actions/info.png'); background-repeat:no-repeat; color:#777777; padding-left:25px; background-position:0 0.3em;} .hint { background-image:url('../img/actions/info.png'); background-repeat:no-repeat; color:#777777; padding-left:25px; background-position:0 0.3em;}
.separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; } .separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; }

31
core/templates/update.php Normal file
View File

@ -0,0 +1,31 @@
<ul>
<li class='update'>
<?php echo $l->t('Updating ownCloud to version %s, this may take a while.', array($_['version'])); ?><br /><br />
</li>
</ul>
<script>
$(document).ready(function () {
OC.EventSource.requesttoken = oc_requesttoken;
var updateEventSource = new OC.EventSource(OC.webroot+'/core/ajax/update.php');
updateEventSource.listen('success', function(message) {
$('<span>').append(message).append('<br />').appendTo($('.update'));
});
updateEventSource.listen('error', function(message) {
$('<span>').addClass('error').append(message).append('<br />').appendTo($('.update'));
});
updateEventSource.listen('failure', function(message) {
$('<span>').addClass('error').append(message).append('<br />').appendTo($('.update'));
$('<span>')
.addClass('error bold')
.append('<br />')
.append(t('core', 'The update was unsuccessful. Please report this issue to the <a href="https://github.com/owncloud/core/issues" target="_blank">ownCloud community</a>.'))
.appendTo($('.update'));
});
updateEventSource.listen('done', function(message) {
$('<span>').addClass('bold').append('<br />').append(t('core', 'The update was successful. Redirecting you to ownCloud now.')).appendTo($('.update'));
setTimeout(function () {
window.location.href = OC.webroot;
}, 3000);
});
});
</script>

200
lib/api.php Normal file
View File

@ -0,0 +1,200 @@
<?php
/**
* ownCloud
*
* @author Tom Needham
* @author Michael Gapczynski
* @author Bart Visscher
* @copyright 2012 Tom Needham tom@owncloud.com
* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
* @copyright 2012 Bart Visscher bartv@thisnet.nl
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
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
*/
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
*/
public static function register($method, $url, $action, $app,
$authLevel = OC_API::USER_AUTH,
$defaults = array(),
$requirements = array()) {
$name = strtolower($method).$url;
$name = str_replace(array('/', '{', '}'), '_', $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);
}
/**
* handles an api call
* @param array $parameters
*/
public static function call($parameters) {
// Prepare the request variables
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'])) {
$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) {
$level = $action['authlevel'];
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) {
return false;
} else {
$subAdmin = OC_SubAdmin::isSubAdmin($user);
$admin = OC_Group::inGroup($user, 'admin');
if($subAdmin || $admin) {
return true;
} else {
return false;
}
}
break;
case OC_API::ADMIN_AUTH:
// Check for admin
$user = self::loginUser();
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;
}
/**
* 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);
}
}
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);
}
}
}
}

18
lib/app.php Executable file → Normal file
View File

@ -138,6 +138,20 @@ class OC_App{
OC_Appconfig::setValue($app, 'types', $appTypes); OC_Appconfig::setValue($app, 'types', $appTypes);
} }
/**
* check if app is shipped
* @param string $appid the id of the app to check
* @return bool
*/
public static function isShipped($appid){
$info = self::getAppInfo($appid);
if(isset($info['shipped']) && $info['shipped']=='true'){
return true;
} else {
return false;
}
}
/** /**
* get all enabled apps * get all enabled apps
*/ */
@ -634,12 +648,15 @@ class OC_App{
if ($currentVersion) { if ($currentVersion) {
$installedVersion = $versions[$app]; $installedVersion = $versions[$app];
if (version_compare($currentVersion, $installedVersion, '>')) { if (version_compare($currentVersion, $installedVersion, '>')) {
$info = self::getAppInfo($app);
OC_Log::write($app, 'starting app upgrade from '.$installedVersion.' to '.$currentVersion, OC_Log::DEBUG); OC_Log::write($app, 'starting app upgrade from '.$installedVersion.' to '.$currentVersion, OC_Log::DEBUG);
try { try {
OC_App::updateApp($app); OC_App::updateApp($app);
OC_Hook::emit('update', 'success', 'Updated '.$info['name'].' app');
} }
catch (Exception $e) { catch (Exception $e) {
echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"'; echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"';
OC_Hook::emit('update', 'failure', 'Failed to update '.$info['name'].' app: '.$e->getMessage());
die; die;
} }
OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app)); OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app));
@ -664,6 +681,7 @@ class OC_App{
if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) { if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) {
OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is not compatible with this version of ownCloud', OC_Log::ERROR); OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is not compatible with this version of ownCloud', OC_Log::ERROR);
OC_App::disable( $app ); OC_App::disable( $app );
OC_Hook::emit('update', 'success', 'Disabled '.$info['name'].' app because it is not compatible');
} }
} }
} }

View File

@ -193,6 +193,15 @@ class OC
); );
} }
public static function checkConfig() {
if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
$tmpl = new OC_Template('', 'error', 'guest');
$tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud")));
$tmpl->printPage();
exit();
}
}
public static function checkInstalled() public static function checkInstalled()
{ {
// Redirect to installer if not installed // Redirect to installer if not installed
@ -219,43 +228,35 @@ class OC
} }
} }
public static function checkUpgrade() public static function checkMaintenanceMode() {
{ // Allow ajax update script to execute without being stopped
if (OC_Config::getValue('installed', false)) { if (OC_Config::getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') {
$installedVersion = OC_Config::getValue('version', '0.0.0'); $tmpl = new OC_Template('', 'error', 'guest');
$currentVersion = implode('.', OC_Util::getVersion()); $tmpl->assign('errors', array(1 => array('error' => 'ownCloud is in maintenance mode')));
if (version_compare($currentVersion, $installedVersion, '>')) { $tmpl->printPage();
// Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions exit();
if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { }
if (!OC_Util::ishtaccessworking()) { }
if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) {
OC_Setup::protectDataDirectory(); public static function checkUpgrade($showTemplate = true) {
} if (OC_Config::getValue('installed', false)) {
} $installedVersion = OC_Config::getValue('version', '0.0.0');
} $currentVersion = implode('.', OC_Util::getVersion());
OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); if (version_compare($currentVersion, $installedVersion, '>')) {
$result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml'); if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
if (!$result) { OC_Config::setValue('maintenance', true);
echo 'Error while upgrading the database'; OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG);
die(); $tmpl = new OC_Template('', 'update', 'guest');
} $tmpl->assign('version', OC_Util::getVersionString());
if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) { $tmpl->printPage();
$tmpl = new OC_Template('', 'error', 'guest'); exit();
$tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); } else {
$tmpl->printPage(); return true;
exit; }
} }
$minimizerCSS = new OC_Minimizer_CSS(); return false;
$minimizerCSS->clearCache(); }
$minimizerJS = new OC_Minimizer_JS(); }
$minimizerJS->clearCache();
OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
OC_App::checkAppsRequirements();
// load all apps to also upgrade enabled apps
OC_App::loadApps();
}
}
}
public static function initTemplateEngine() public static function initTemplateEngine()
{ {
@ -273,12 +274,6 @@ class OC
OC_Util::addScript('search', 'result'); OC_Util::addScript('search', 'result');
OC_Util::addScript('router'); OC_Util::addScript('router');
if (OC_Config::getValue('installed', false)) {
if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
OC_Util::addScript('backgroundjobs');
}
}
OC_Util::addStyle("styles"); OC_Util::addStyle("styles");
OC_Util::addStyle("multiselect"); OC_Util::addStyle("multiselect");
OC_Util::addStyle("jquery-ui-1.8.16.custom"); OC_Util::addStyle("jquery-ui-1.8.16.custom");
@ -403,11 +398,13 @@ class OC
stream_wrapper_register('static', 'OC_StaticStreamWrapper'); stream_wrapper_register('static', 'OC_StaticStreamWrapper');
stream_wrapper_register('close', 'OC_CloseStreamWrapper'); stream_wrapper_register('close', 'OC_CloseStreamWrapper');
self::checkConfig();
self::checkInstalled(); self::checkInstalled();
self::checkSSL(); self::checkSSL();
self::initSession(); self::initSession();
self::initTemplateEngine(); self::initTemplateEngine();
self::checkUpgrade(); self::checkMaintenanceMode();
self::checkUpgrade();
$errors = OC_Util::checkServer(); $errors = OC_Util::checkServer();
if (count($errors) > 0) { if (count($errors) > 0) {
@ -482,6 +479,11 @@ class OC
if (OC_Util::issetlocaleworking() == false) { if (OC_Util::issetlocaleworking() == false) {
OC_Log::write('core', 'setting locate to en_US.UTF-8 failed. Support is probably not installed on your system', OC_Log::ERROR); OC_Log::write('core', 'setting locate to en_US.UTF-8 failed. Support is probably not installed on your system', OC_Log::ERROR);
} }
if (OC_Config::getValue('installed', false)) {
if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
OC_Util::addScript('backgroundjobs');
}
}
} }
/** /**

View File

@ -495,8 +495,9 @@ class OC_DB {
if (PEAR::isError($previousSchema)) { if (PEAR::isError($previousSchema)) {
$error = $previousSchema->getMessage(); $error = $previousSchema->getMessage();
$detail = $previousSchema->getDebugInfo(); $detail = $previousSchema->getDebugInfo();
OC_Log::write('core', 'Failed to get existing database structure for upgrading ('.$error.', '.$detail.')', OC_Log::FATAL); $message = 'Failed to get existing database structure for updating ('.$error.', '.$detail.')';
return false; OC_Log::write('core', $message, OC_Log::FATAL);
throw new Exception($message);
} }
// Make changes and save them to an in-memory file // Make changes and save them to an in-memory file
@ -523,8 +524,9 @@ class OC_DB {
if (PEAR::isError($op)) { if (PEAR::isError($op)) {
$error = $op->getMessage(); $error = $op->getMessage();
$detail = $op->getDebugInfo(); $detail = $op->getDebugInfo();
OC_Log::write('core', 'Failed to update database structure ('.$error.', '.$detail.')', OC_Log::FATAL); $message = 'Failed to update database structure ('.$error.', '.$detail.')';
return false; OC_Log::write('core', $message, OC_Log::FATAL);
throw new Exception($message);
} }
return true; return true;
} }

View File

@ -21,7 +21,7 @@
*/ */
/** /**
* Provde a common interface to all different storage options * Provide a common interface to all different storage options
*/ */
abstract class OC_Filestorage{ abstract class OC_Filestorage{
abstract public function __construct($parameters); abstract public function __construct($parameters);

View File

@ -29,7 +29,15 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return is_file($this->datadir.$path); return is_file($this->datadir.$path);
} }
public function stat($path) { public function stat($path) {
return stat($this->datadir.$path); $fullPath = $this->datadir . $path;
$statResult = stat($fullPath);
if ($statResult['size'] < 0) {
$size = self::getFileSizeFromOS($fullPath);
$statResult['size'] = $size;
$statResult[7] = $size;
}
return $statResult;
} }
public function filetype($path) { public function filetype($path) {
$filetype=filetype($this->datadir.$path); $filetype=filetype($this->datadir.$path);
@ -42,7 +50,13 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
if($this->is_dir($path)) { if($this->is_dir($path)) {
return 0; return 0;
}else{ }else{
return filesize($this->datadir.$path); $fullPath = $this->datadir . $path;
$fileSize = filesize($fullPath);
if ($fileSize < 0) {
return self::getFileSizeFromOS($fullPath);
}
return $fileSize;
} }
} }
public function isReadable($path) { public function isReadable($path) {
@ -156,6 +170,30 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
return $return; return $return;
} }
private static function getFileSizeFromOS($fullPath) {
$name = strtolower(php_uname('s'));
// Windows OS: we use COM to access the filesystem
if (strpos($name, 'win') !== false) {
if (class_exists('COM')) {
$fsobj = new COM("Scripting.FileSystemObject");
$f = $fsobj->GetFile($fullPath);
return $f->Size;
}
} else if (strpos($name, 'bsd') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -f %z ' . escapeshellarg($fullPath));
}
} else if (strpos($name, 'linux') !== false) {
if (\OC_Helper::is_function_enabled('exec')) {
return (float)exec('stat -c %s ' . escapeshellarg($fullPath));
}
} else {
OC_Log::write('core', 'Unable to determine file size of "'.$fullPath.'". Unknown OS: '.$name, OC_Log::ERROR);
}
return 0;
}
public function hash($path, $type, $raw=false) { public function hash($path, $type, $raw=false) {
return hash_file($type, $this->datadir.$path, $raw); return hash_file($type, $this->datadir.$path, $raw);
} }
@ -190,6 +228,7 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{
/** /**
* check if a file or folder has been updated since $time * check if a file or folder has been updated since $time
* @param string $path
* @param int $time * @param int $time
* @return bool * @return bool
*/ */

View File

@ -31,8 +31,9 @@ class OC_Helper {
/** /**
* @brief Creates an url using a defined route * @brief Creates an url using a defined route
* @param $route * @param $route
* @param $parameters * @param array $parameters
* @param $args array with param=>value, will be appended to the returned url * @return
* @internal param array $args with param=>value, will be appended to the returned url
* @returns the url * @returns the url
* *
* Returns a url to the given app and file. * Returns a url to the given app and file.
@ -128,6 +129,7 @@ class OC_Helper {
/** /**
* @brief Creates an absolute url for remote use * @brief Creates an absolute url for remote use
* @param string $service id * @param string $service id
* @param bool $add_slash
* @return string the url * @return string the url
* *
* Returns a absolute url to the given service. * Returns a absolute url to the given service.
@ -139,6 +141,7 @@ class OC_Helper {
/** /**
* @brief Creates an absolute url for public use * @brief Creates an absolute url for public use
* @param string $service id * @param string $service id
* @param bool $add_slash
* @return string the url * @return string the url
* *
* Returns a absolute url to the given service. * Returns a absolute url to the given service.
@ -450,12 +453,14 @@ class OC_Helper {
} }
/** /**
* detect if a given program is found in the search PATH * detect if a given program is found in the search PATH
* *
* @param string $program name * @param $name
* @param string $optional search path, defaults to $PATH * @param bool $path
* @return bool true if executable program found in path * @internal param string $program name
*/ * @internal param string $optional search path, defaults to $PATH
* @return bool true if executable program found in path
*/
public static function canExecute($name, $path = false) { public static function canExecute($name, $path = false) {
// path defaults to PATH from environment if not set // path defaults to PATH from environment if not set
if ($path === false) { if ($path === false) {
@ -676,16 +681,16 @@ class OC_Helper {
} }
/** /**
* @brief replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement. * @brief replaces a copy of string delimited by the start and (optionally) length parameters with the string given in replacement.
* *
* @param string $input The input string. .Opposite to the PHP build-in function does not accept an array. * @param $string
* @param string $replacement The replacement string. * @param string $replacement The replacement string.
* @param int $start If start is positive, the replacing will begin at the start'th offset into string. If start is negative, the replacing will begin at the start'th character from the end of string. * @param int $start If start is positive, the replacing will begin at the start'th offset into string. If start is negative, the replacing will begin at the start'th character from the end of string.
* @param int $length Length of the part to be replaced * @param int $length Length of the part to be replaced
* @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8 * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8
* @return string * @internal param string $input The input string. .Opposite to the PHP build-in function does not accept an array.
* * @return string
*/ */
public static function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = 'UTF-8') { public static function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = 'UTF-8') {
$start = intval($start); $start = intval($start);
$length = intval($length); $length = intval($length);
@ -759,6 +764,26 @@ class OC_Helper {
return $str; return $str;
} }
/**
* Checks if a function is available
* @param string $function_name
* @return bool
*/
public static function is_function_enabled($function_name) {
if (!function_exists($function_name)) {
return false;
}
$disabled = explode(', ', ini_get('disable_functions'));
if (in_array($function_name, $disabled)) {
return false;
}
$disabled = explode(', ', ini_get('suhosin.executor.func.blacklist'));
if (in_array($function_name, $disabled)) {
return false;
}
return true;
}
/** /**
* Calculate the disc space * Calculate the disc space
*/ */

View File

@ -73,14 +73,7 @@ class OC_OCS {
} }
} }
/** public static function notFound() {
main function to handle the REST request
**/
public static function handle() {
// overwrite the 404 error page returncode
header("HTTP/1.0 200 OK");
if($_SERVER['REQUEST_METHOD'] == 'GET') { if($_SERVER['REQUEST_METHOD'] == 'GET') {
$method='get'; $method='get';
}elseif($_SERVER['REQUEST_METHOD'] == 'PUT') { }elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
@ -94,169 +87,10 @@ class OC_OCS {
} }
$format = self::readData($method, 'format', 'text', ''); $format = self::readData($method, 'format', 'text', '');
$txt='Invalid query, please check the syntax. API specifications are here: http://www.freedesktop.org/wiki/Specifications/open-collaboration-services. DEBUG OUTPUT:'."\n";
$txt.=OC_OCS::getDebugOutput();
echo(OC_OCS::generateXml($format,'failed',999,$txt));
$router = new OC_Router();
$router->useCollection('root');
// CONFIG
$router->create('config', '/config.{format}')
->defaults(array('format' => $format))
->action('OC_OCS', 'apiConfig')
->requirements(array('format'=>'xml|json'));
// PERSON
$router->create('person_check', '/person/check.{format}')
->post()
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$login = OC_OCS::readData('post', 'login', 'text');
$passwd = OC_OCS::readData('post', 'password', 'text');
OC_OCS::personCheck($format, $login, $passwd);
})
->requirements(array('format'=>'xml|json'));
// ACTIVITY
// activityget - GET ACTIVITY page,pagesize als urlparameter
$router->create('activity_get', '/activity.{format}')
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$page = OC_OCS::readData('get', 'page', 'int', 0);
$pagesize = OC_OCS::readData('get', 'pagesize', 'int', 10);
if($pagesize<1 or $pagesize>100) $pagesize=10;
OC_OCS::activityGet($format, $page, $pagesize);
})
->requirements(array('format'=>'xml|json'));
// activityput - POST ACTIVITY
$router->create('activity_put', '/activity.{format}')
->post()
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$message = OC_OCS::readData('post', 'message', 'text');
OC_OCS::activityPut($format, $message);
})
->requirements(array('format'=>'xml|json'));
// PRIVATEDATA
// get - GET DATA
$router->create('privatedata_get',
'/privatedata/getattribute/{app}/{key}.{format}')
->defaults(array('app' => '', 'key' => '', 'format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$app = addslashes(strip_tags($parameters['app']));
$key = addslashes(strip_tags($parameters['key']));
OC_OCS::privateDataGet($format, $app, $key);
})
->requirements(array('format'=>'xml|json'));
// set - POST DATA
$router->create('privatedata_set',
'/privatedata/setattribute/{app}/{key}.{format}')
->post()
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$app = addslashes(strip_tags($parameters['app']));
$key = addslashes(strip_tags($parameters['key']));
$value=OC_OCS::readData('post', 'value', 'text');
OC_OCS::privateDataSet($format, $app, $key, $value);
})
->requirements(array('format'=>'xml|json'));
// delete - POST DATA
$router->create('privatedata_delete',
'/privatedata/deleteattribute/{app}/{key}.{format}')
->post()
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$app = addslashes(strip_tags($parameters['app']));
$key = addslashes(strip_tags($parameters['key']));
OC_OCS::privateDataDelete($format, $app, $key);
})
->requirements(array('format'=>'xml|json'));
// CLOUD
// systemWebApps
$router->create('system_webapps',
'/cloud/system/webapps.{format}')
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
OC_OCS::systemwebapps($format);
})
->requirements(array('format'=>'xml|json'));
// quotaget
$router->create('quota_get',
'/cloud/user/{user}.{format}')
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$user = $parameters['user'];
OC_OCS::quotaGet($format, $user);
})
->requirements(array('format'=>'xml|json'));
// quotaset
$router->create('quota_set',
'/cloud/user/{user}.{format}')
->post()
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$user = $parameters['user'];
$quota = self::readData('post', 'quota', 'int');
OC_OCS::quotaSet($format, $user, $quota);
})
->requirements(array('format'=>'xml|json'));
// keygetpublic
$router->create('keygetpublic',
'/cloud/user/{user}/publickey.{format}')
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$user = $parameters['user'];
OC_OCS::publicKeyGet($format, $user);
})
->requirements(array('format'=>'xml|json'));
// keygetprivate
$router->create('keygetpublic',
'/cloud/user/{user}/privatekey.{format}')
->defaults(array('format' => $format))
->action(function ($parameters) {
$format = $parameters['format'];
$user = $parameters['user'];
OC_OCS::privateKeyGet($format, $user);
})
->requirements(array('format'=>'xml|json'));
// add more calls here
// please document all the call in the draft spec
// http://www.freedesktop.org/wiki/Specifications/open-collaboration-services-1.7#CLOUD
// TODO:
// users
// groups
// bookmarks
// sharing
// versioning
// news (rss)
try {
$router->match($_SERVER['PATH_INFO']);
} catch (ResourceNotFoundException $e) {
$txt='Invalid query, please check the syntax. '
.'API specifications are here: '
.'http://www.freedesktop.org/wiki/Specifications/open-collaboration-services.'
.'DEBUG OUTPUT:'."\n";
$txt.=OC_OCS::getdebugoutput();
echo(OC_OCS::generatexml($format, 'failed', 999, $txt));
} catch (MethodNotAllowedException $e) {
OC_Response::setStatus(405);
}
exit();
} }
/** /**
@ -273,44 +107,6 @@ class OC_OCS {
return($txt); return($txt);
} }
/**
* checks if the user is authenticated
* checks the IP whitlist, apikeys and login/password combination
* if $forceuser is true and the authentication failed it returns an 401 http response.
* if $forceuser is false and authentification fails it returns an empty username string
* @param bool $forceuser
* @return username string
*/
private static function checkPassword($forceuser=true) {
//valid user account ?
if(isset($_SERVER['PHP_AUTH_USER'])) $authuser=$_SERVER['PHP_AUTH_USER']; else $authuser='';
if(isset($_SERVER['PHP_AUTH_PW'])) $authpw=$_SERVER['PHP_AUTH_PW']; else $authpw='';
if(empty($authuser)) {
if($forceuser) {
header('WWW-Authenticate: Basic realm="your valid user account or api key"');
header('HTTP/1.0 401 Unauthorized');
exit;
}else{
$identifieduser='';
}
}else{
if(!OC_User::login($authuser, $authpw)) {
if($forceuser) {
header('WWW-Authenticate: Basic realm="your valid user account or api key"');
header('HTTP/1.0 401 Unauthorized');
exit;
}else{
$identifieduser='';
}
}else{
$identifieduser=$authuser;
}
}
return($identifieduser);
}
/** /**
* generates the xml or json response for the API call from an multidimenional data array. * generates the xml or json response for the API call from an multidimenional data array.
@ -431,130 +227,6 @@ class OC_OCS {
} }
} }
/**
* return the config data of this server
* @param string $format
* @return string xml/json
*/
public static function apiConfig($parameters) {
$format = $parameters['format'];
$user=OC_OCS::checkpassword(false);
$url=substr(OCP\Util::getServerHost().$_SERVER['SCRIPT_NAME'], 0, -11).'';
$xml['version']='1.7';
$xml['website']='ownCloud';
$xml['host']=OCP\Util::getServerHost();
$xml['contact']='';
$xml['ssl']='false';
echo(OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'config', '', 1));
}
/**
* check if the provided login/apikey/password is valid
* @param string $format
* @param string $login
* @param string $passwd
* @return string xml/json
*/
private static function personCheck($format, $login, $passwd) {
if($login<>'') {
if(OC_User::login($login, $passwd)) {
$xml['person']['personid']=$login;
echo(OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'person', 'check', 2));
}else{
echo(OC_OCS::generatexml($format, 'failed', 102, 'login not valid'));
}
}else{
echo(OC_OCS::generatexml($format, 'failed', 101, 'please specify all mandatory fields'));
}
}
// ACTIVITY API #############################################
/**
* get my activities
* @param string $format
* @param string $page
* @param string $pagesize
* @return string xml/json
*/
private static function activityGet($format, $page, $pagesize) {
$user=OC_OCS::checkpassword();
//TODO
$txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'activity', 'full', 2, $totalcount, $pagesize);
echo($txt);
}
/**
* submit a activity
* @param string $format
* @param string $message
* @return string xml/json
*/
private static function activityPut($format, $message) {
// not implemented in ownCloud
$user=OC_OCS::checkpassword();
echo(OC_OCS::generatexml($format, 'ok', 100, ''));
}
// PRIVATEDATA API #############################################
/**
* get private data and create the xml for ocs
* @param string $format
* @param string $app
* @param string $key
* @return string xml/json
*/
private static function privateDataGet($format, $app="", $key="") {
$user=OC_OCS::checkpassword();
$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'];
}
$txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'privatedata', 'full', 2, count($xml), 0);//TODO: replace 'privatedata' with 'attribute' once a new libattice has been released that works with it
echo($txt);
}
/**
* set private data referenced by $key to $value and generate the xml for ocs
* @param string $format
* @param string $app
* @param string $key
* @param string $value
* @return string xml/json
*/
private static function privateDataSet($format, $app, $key, $value) {
$user=OC_OCS::checkpassword();
if(OC_OCS::setData($user, $app, $key, $value)) {
echo(OC_OCS::generatexml($format, 'ok', 100, ''));
}
}
/**
* delete private data referenced by $key and generate the xml for ocs
* @param string $format
* @param string $app
* @param string $key
* @return string xml/json
*/
private static function privateDataDelete($format, $app, $key) {
if($key=="" or $app=="") {
return; //key and app are NOT optional here
}
$user=OC_OCS::checkpassword();
if(OC_OCS::deleteData($user, $app, $key)) {
echo(OC_OCS::generatexml($format, 'ok', 100, ''));
}
}
/** /**
* get private data * get private data
* @param string $user * @param string $user
@ -586,156 +258,4 @@ class OC_OCS {
return $result; return $result;
} }
/**
* set private data referenced by $key to $value
* @param string $user
* @param string $app
* @param string $key
* @param string $value
* @return bool
*/
public static function setData($user, $app, $key, $value) {
return OC_Preferences::setValue($user, $app, $key, $value);
}
/**
* delete private data referenced by $key
* @param string $user
* @param string $app
* @param string $key
* @return string xml/json
*/
public static function deleteData($user, $app, $key) {
return OC_Preferences::deleteKey($user, $app, $key);
}
// CLOUD API #############################################
/**
* get a list of installed web apps
* @param string $format
* @return string xml/json
*/
private static function systemWebApps($format) {
$login=OC_OCS::checkpassword();
$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;
}
}
$txt=OC_OCS::generatexml($format, 'ok', 100, '', $values, 'cloud', '', 2, 0, 0);
echo($txt);
}
/**
* get the quota of a user
* @param string $format
* @param string $user
* @return string xml/json
*/
private static function quotaGet($format, $user) {
$login=OC_OCS::checkpassword();
if(OC_Group::inGroup($login, 'admin') or ($login==$user)) {
if(OC_User::userExists($user)) {
// calculate the disc space
$user_dir = '/'.$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;
$xml=array();
$xml['quota']=$total;
$xml['free']=$free;
$xml['used']=$used;
$xml['relative']=$relative;
$txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'cloud', '', 1, 0, 0);
echo($txt);
}else{
echo self::generateXml('', 'fail', 300, 'User does not exist');
}
}else{
echo self::generateXml('', 'fail', 300, 'You don´t have permission to access this ressource.');
}
}
/**
* set the quota of a user
* @param string $format
* @param string $user
* @param string $quota
* @return string xml/json
*/
private static function quotaSet($format, $user, $quota) {
$login=OC_OCS::checkpassword();
if(OC_Group::inGroup($login, 'admin')) {
// todo
// not yet implemented
// add logic here
error_log('OCS call: user:'.$user.' quota:'.$quota);
$xml=array();
$txt=OC_OCS::generatexml($format, 'ok', 100, '', $xml, 'cloud', '', 1, 0, 0);
echo($txt);
}else{
echo self::generateXml('', 'fail', 300, 'You don´t have permission to access this ressource.');
}
}
/**
* get the public key of a user
* @param string $format
* @param string $user
* @return string xml/json
*/
private static function publicKeyGet($format, $user) {
$login=OC_OCS::checkpassword();
if(OC_User::userExists($user)) {
// calculate the disc space
$txt='this is the public key of '.$user;
echo($txt);
}else{
echo self::generateXml('', 'fail', 300, 'User does not exist');
}
}
/**
* get the private key of a user
* @param string $format
* @param string $user
* @return string xml/json
*/
private static function privateKeyGet($format, $user) {
$login=OC_OCS::checkpassword();
if(OC_Group::inGroup($login, 'admin') or ($login==$user)) {
if(OC_User::userExists($user)) {
// calculate the disc space
$txt='this is the private key of '.$user;
echo($txt);
}else{
echo self::generateXml('', 'fail', 300, 'User does not exist');
}
}else{
echo self::generateXml('', 'fail', 300, 'You don´t have permission to access this ressource.');
}
}
} }

28
lib/ocs/activity.php Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @copyright 2012 Frank Karlitschek frank@owncloud.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Activity {
public static function activityGet($parameters){
// TODO
}
}

98
lib/ocs/cloud.php Normal file
View File

@ -0,0 +1,98 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @author Tom Needham
* @copyright 2012 Frank Karlitschek frank@owncloud.org
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Cloud {
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;
}
}
return new OC_OCS_Result($values);
}
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'])) {
// calculate the disc space
$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;
return new OC_OCS_Result($xml);
} else {
return new OC_OCS_Result(null, 300);
}
} else {
return new OC_OCS_Result(null, 300);
}
}
public static function getUserPublickey($parameters) {
if(OC_User::userExists($parameters['user'])) {
// calculate the disc space
// TODO
return new OC_OCS_Result(array());
} else {
return new OC_OCS_Result(null, 300);
}
}
public static function getUserPrivatekey($parameters) {
$user = OC_User::getUser();
if(OC_Group::inGroup($user, 'admin') or ($user==$parameters['user'])) {
if(OC_User::userExists($user)) {
// calculate the disc space
$txt = 'this is the private key of '.$parameters['user'];
echo($txt);
} else {
return new OC_OCS_Result(null, 300, 'User does not exist');
}
} else {
return new OC_OCS_Result('null', 300, 'You don´t have permission to access this ressource.');
}
}
}

36
lib/ocs/config.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @author Tom Needham
* @copyright 2012 Frank Karlitschek frank@owncloud.org
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Config {
public static function apiConfig($parameters) {
$xml['version'] = '1.7';
$xml['website'] = 'ownCloud';
$xml['host'] = OCP\Util::getServerHost();
$xml['contact'] = '';
$xml['ssl'] = 'false';
return new OC_OCS_Result($xml);
}
}

42
lib/ocs/person.php Normal file
View File

@ -0,0 +1,42 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @author Tom Needham
* @copyright 2012 Frank Karlitschek frank@owncloud.org
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Person {
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)) {
$xml['person']['personid'] = $login;
return new OC_OCS_Result($xml);
} else {
return new OC_OCS_Result(null, 102);
}
} else {
return new OC_OCS_Result(null, 101);
}
}
}

66
lib/ocs/privatedata.php Normal file
View File

@ -0,0 +1,66 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @author Tom Needham
* @copyright 2012 Frank Karlitschek frank@owncloud.org
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Privatedata {
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) {
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)){
return new OC_OCS_Result(null, 100);
}
}
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==="") {
return new OC_OCS_Result(null, 101); //key and app are NOT optional here
}
if(OC_Preferences::deleteKey($user, $app, $key)) {
return new OC_OCS_Result(null, 100);
}
}
}

75
lib/ocs/result.php Normal file
View File

@ -0,0 +1,75 @@
<?php
/**
* ownCloud
*
* @author Tom Needham
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_OCS_Result{
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) {
$this->data = $data;
$this->statusCode = $code;
$this->message = $message;
}
/**
* optionally set the total number of items available
* @param $items int
*/
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;
}
/**
* returns the data associated with the api result
* @return array
*/
public function getResult() {
$return = array();
$return['meta'] = array();
$return['meta']['status'] = ($this->statusCode === 100) ? 'ok' : 'failure';
$return['meta']['statuscode'] = $this->statusCode;
$return['meta']['message'] = $this->message;
if(isset($this->items)) {
$return['meta']['totalitems'] = $this->items;
}
if(isset($this->perPage)) {
$return['meta']['itemsperpage'] = $this->perPage;
}
$return['data'] = $this->data;
// Return the result data.
return $return;
}
}

44
lib/public/api.php Normal file
View File

@ -0,0 +1,44 @@
<?php
/**
* ownCloud
*
* @author Tom Needham
* @copyright 2012 Tom Needham tom@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
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);
}
}

View File

@ -58,6 +58,23 @@ class OC_Router {
* loads the api routes * loads the api routes
*/ */
public function loadRoutes() { public function loadRoutes() {
// TODO cache
$this->root = $this->getCollection('root');
foreach(OC_APP::getEnabledApps() as $app){
$file = OC_App::getAppPath($app).'/appinfo/routes.php';
if(file_exists($file)){
$this->useCollection($app);
require_once($file);
$collection = $this->getCollection($app);
$this->root->addCollection($collection, '/apps/'.$app);
}
}
// include ocs routes
require_once(OC::$SERVERROOT.'/ocs/routes.php');
$collection = $this->getCollection('ocs');
$this->root->addCollection($collection, '/ocs');
foreach($this->getRoutingFiles() as $app => $file) { foreach($this->getRoutingFiles() as $app => $file) {
$this->useCollection($app); $this->useCollection($app);
require_once $file; require_once $file;
@ -67,6 +84,7 @@ class OC_Router {
$this->useCollection('root'); $this->useCollection('root');
require_once 'settings/routes.php'; require_once 'settings/routes.php';
require_once 'core/routes.php'; require_once 'core/routes.php';
} }
protected function getCollection($name) { protected function getCollection($name) {

20
ocs/routes.php Normal file
View File

@ -0,0 +1,20 @@
<?php
/**
* Copyright (c) 2012, Tom Needham <tom@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*/
// Config
OC_API::register('get', '/config', array('OC_OCS_Config', 'apiConfig'), 'ocs', OC_API::GUEST_AUTH);
// Person
OC_API::register('post', '/person/check', array('OC_OCS_Person', 'check'), 'ocs', OC_API::GUEST_AUTH);
// Activity
OC_API::register('get', '/activity', array('OC_OCS_Activity', 'activityGet'), 'ocs', OC_API::USER_AUTH);
// Privatedata
OC_API::register('get', '/privatedata/getattribute', array('OC_OCS_Privatedata', 'get'), 'ocs', OC_API::USER_AUTH, array('app' => '', 'key' => ''));
OC_API::register('get', '/privatedata/getattribute/{app}', array('OC_OCS_Privatedata', 'get'), 'ocs', OC_API::USER_AUTH, array('key' => ''));
OC_API::register('get', '/privatedata/getattribute/{app}/{key}', array('OC_OCS_Privatedata', 'get'), 'ocs', OC_API::USER_AUTH);
OC_API::register('post', '/privatedata/setattribute/{app}/{key}', array('OC_OCS_Privatedata', 'set'), 'ocs', OC_API::USER_AUTH);
OC_API::register('post', '/privatedata/deleteattribute/{app}/{key}', array('OC_OCS_Privatedata', 'delete'), 'ocs', OC_API::USER_AUTH);
?>

View File

@ -21,6 +21,15 @@
* *
*/ */
require_once '../lib/base.php'; require_once('../lib/base.php');
@ob_clean(); use Symfony\Component\Routing\Exception\ResourceNotFoundException;
OC_OCS::handle(); use Symfony\Component\Routing\Exception\MethodNotAllowedException;
try {
OC::getRouter()->match('/ocs'.$_SERVER['PATH_INFO']);
} catch (ResourceNotFoundException $e) {
OC_OCS::notFound();
} catch (MethodNotAllowedException $e) {
OC_Response::setStatus(405);
}

4
settings/css/oauth.css Normal file
View File

@ -0,0 +1,4 @@
.guest-container{ width:35%; margin: 2em auto 0 auto; }
#oauth-request a.button{ float: right; }
#oauth-request ul li{ list-style: disc; }
#oauth-request ul { margin-left: 2em; margin-top: 1em; }

98
settings/oauth.php Normal file
View File

@ -0,0 +1,98 @@
<?php
/**
* Copyright (c) 2012, Tom Needham <tom@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*/
require_once('../lib/base.php');
// Logic
$operation = isset($_GET['operation']) ? $_GET['operation'] : '';
$server = OC_OAuth_server::init();
switch($operation){
case 'register':
// Here external apps can register with an ownCloud
if(empty($_GET['name']) || empty($_GET['url'])){
// Invalid request
echo 401;
} else {
$callbacksuccess = empty($_GET['callback_success']) ? null : $_GET['callback_success'];
$callbackfail = empty($_GET['callback_fail']) ? null : $_GET['callback_fail'];
$consumer = OC_OAuth_Server::register_consumer($_GET['name'], $_GET['url'], $callbacksuccess, $callbackfail);
echo 'Registered consumer successfully! </br></br>Key: ' . $consumer->key . '</br>Secret: ' . $consumer->secret;
}
break;
case 'request_token':
try {
$request = OAuthRequest::from_request();
$token = $server->get_request_token($request);
echo $token;
} catch (OAuthException $exception) {
OC_Log::write('OC_OAuth_Server', $exception->getMessage(), OC_LOG::ERROR);
echo $exception->getMessage();
}
break;
case 'authorise';
OC_API::checkLoggedIn();
// Example
$consumer = array(
'name' => 'Firefox Bookmark Sync',
'scopes' => array('ookmarks'),
);
// Check that the scopes are real and installed
$apps = OC_App::getEnabledApps();
$notfound = array();
foreach($consumer['scopes'] as $requiredapp){
// App scopes are in this format: app_$appname
$requiredapp = end(explode('_', $requiredapp));
if(!in_array($requiredapp, $apps)){
$notfound[] = $requiredapp;
}
}
if(!empty($notfound)){
// We need more apps :( Show error
if(count($notfound)==1){
$message = 'requires that you have an extra app installed on your ownCloud. Please contact your ownCloud administrator and ask them to install the app below.';
} else {
$message = 'requires that you have some extra apps installed on your ownCloud. Please contract your ownCloud administrator and ask them to install the apps below.';
}
$t = new OC_Template('settings', 'oauth-required-apps', 'guest');
OC_Util::addStyle('settings', 'oauth');
$t->assign('requiredapps', $notfound);
$t->assign('consumer', $consumer);
$t->assign('message', $message);
$t->printPage();
} else {
$t = new OC_Template('settings', 'oauth', 'guest');
OC_Util::addStyle('settings', 'oauth');
$t->assign('consumer', $consumer);
$t->printPage();
}
break;
case 'access_token';
try {
$request = OAuthRequest::from_request();
$token = $server->fetch_access_token($request);
echo $token;
} catch (OAuthException $exception) {
OC_Log::write('OC_OAuth_Server', $exception->getMessage(), OC_LOG::ERROR);
echo $exception->getMessage();
}
break;
default:
// Something went wrong, we need an operation!
OC_Response::setStatus(400);
break;
}

View File

@ -0,0 +1,19 @@
<?php
/**
* Copyright (c) 2012, Tom Needham <tom@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*/
?>
<div id="oauth-request" class="guest-container">
<p><strong><?php echo $_['consumer']['name'].'</strong> '.$_['message']; ?></p>
<ul>
<?php
// Foreach requested scope
foreach($_['requiredapps'] as $requiredapp){
echo '<li>'.$requiredapp.'</li>';
}
?>
</ul>
<a href="<?php echo OC::$WEBROOT; ?>" id="back-home" class="button">Back to ownCloud</a>
</div>

View File

@ -0,0 +1,20 @@
<?php
/**
* Copyright (c) 2012, Tom Needham <tom@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*/
?>
<div id="oauth-request" class="guest-container">
<p><strong><?php echo $_['consumer']['name']; ?></strong> is requesting your permission to read, write, modify and delete data from the following apps:</p>
<ul>
<?php
// Foreach requested scope
foreach($_['consumer']['scopes'] as $app){
echo '<li>'.$app.'</li>';
}
?>
</ul>
<a href="#" class="button">Allow</a>
<a href="#" class="button">Disallow</a>
</div>