Browse Source
Make AppConfig part of the public API
Make AppConfig part of the public API
Signed-off-by: Joas Schilling <coding@schilljs.com>pull/1452/head
No known key found for this signature in database
GPG Key ID: E166FD8976B3BAC8
13 changed files with 374 additions and 141 deletions
-
17apps/provisioning_api/appinfo/routes.php
-
158apps/provisioning_api/lib/Controller/AppConfigController.php
-
70core/ajax/appconfig.php
-
94core/js/config.js
-
1core/js/core.json
-
3core/js/js.js
-
113core/js/public/appconfig.js
-
3core/routes.php
-
1core/shipped.json
-
1lib/private/legacy/template.php
-
31settings/js/admin.js
-
14tests/lib/App/ManagerTest.php
-
9tests/lib/AppTest.php
@ -0,0 +1,158 @@ |
|||
<?php |
|||
/** |
|||
* @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program 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 program. If not, see <http://www.gnu.org/licenses/>. |
|||
* |
|||
*/ |
|||
|
|||
namespace OCA\Provisioning_API\Controller; |
|||
|
|||
|
|||
use OCP\AppFramework\Http; |
|||
use OCP\AppFramework\Http\DataResponse; |
|||
use OCP\AppFramework\OCSController; |
|||
use OCP\IAppConfig; |
|||
use OCP\IConfig; |
|||
use OCP\IRequest; |
|||
|
|||
class AppConfigController extends OCSController { |
|||
|
|||
/** @var IAppConfig */ |
|||
protected $config; |
|||
|
|||
/** @var IConfig */ |
|||
protected $appConfig; |
|||
|
|||
/** |
|||
* @param string $appName |
|||
* @param IRequest $request |
|||
* @param IConfig $config |
|||
* @param IAppConfig $appConfig |
|||
*/ |
|||
public function __construct($appName, |
|||
IRequest $request, |
|||
IConfig $config, |
|||
IAppConfig $appConfig) { |
|||
parent::__construct($appName, $request); |
|||
$this->config = $config; |
|||
$this->appConfig = $appConfig; |
|||
} |
|||
|
|||
/** |
|||
* @return DataResponse |
|||
*/ |
|||
public function getApps() { |
|||
return new DataResponse([ |
|||
'data' => $this->appConfig->getApps(), |
|||
]); |
|||
} |
|||
|
|||
/** |
|||
* @param string $app |
|||
* @return DataResponse |
|||
*/ |
|||
public function getKeys($app) { |
|||
try { |
|||
$this->verifyAppId($app); |
|||
} catch (\InvalidArgumentException $e) { |
|||
return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_FORBIDDEN); |
|||
} |
|||
return new DataResponse([ |
|||
'data' => $this->config->getAppKeys($app), |
|||
]); |
|||
} |
|||
|
|||
/** |
|||
* @param string $app |
|||
* @param string $key |
|||
* @param string $defaultValue |
|||
* @return DataResponse |
|||
*/ |
|||
public function getValue($app, $key, $defaultValue = '') { |
|||
try { |
|||
$this->verifyAppId($app); |
|||
} catch (\InvalidArgumentException $e) { |
|||
return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_FORBIDDEN); |
|||
} |
|||
return new DataResponse([ |
|||
'data' => $this->config->getAppValue($app, $key, $defaultValue), |
|||
]); |
|||
} |
|||
|
|||
/** |
|||
* @PasswordConfirmationRequired |
|||
* @param string $app |
|||
* @param string $key |
|||
* @param string $value |
|||
* @return DataResponse |
|||
*/ |
|||
public function setValue($app, $key, $value) { |
|||
try { |
|||
$this->verifyAppId($app); |
|||
$this->verifyConfigKey($app, $key); |
|||
} catch (\InvalidArgumentException $e) { |
|||
return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_FORBIDDEN); |
|||
} |
|||
|
|||
$this->config->setAppValue($app, $key, $value); |
|||
return new DataResponse(); |
|||
} |
|||
|
|||
/** |
|||
* @PasswordConfirmationRequired |
|||
* @param string $app |
|||
* @param string $key |
|||
* @return DataResponse |
|||
*/ |
|||
public function deleteKey($app, $key) { |
|||
try { |
|||
$this->verifyAppId($app); |
|||
$this->verifyConfigKey($app, $key); |
|||
} catch (\InvalidArgumentException $e) { |
|||
return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_FORBIDDEN); |
|||
} |
|||
|
|||
return new DataResponse([ |
|||
'data' => $this->config->deleteAppValue($app, $key), |
|||
]); |
|||
} |
|||
|
|||
/** |
|||
* @param string $app |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
protected function verifyAppId($app) { |
|||
if (\OC_App::cleanAppId($app) !== $app) { |
|||
throw new \InvalidArgumentException('Invalid app id given'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @param string $app |
|||
* @param string $key |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
protected function verifyConfigKey($app, $key) { |
|||
if (in_array($key, ['installed_version', 'enabled', 'types'])) { |
|||
throw new \InvalidArgumentException('The given key can not be set'); |
|||
} |
|||
|
|||
if ($app === 'core' && (strpos($key, 'public_') === 0 || strpos($key, 'remote_') === 0)) { |
|||
throw new \InvalidArgumentException('The given key can not be set'); |
|||
} |
|||
} |
|||
} |
|||
@ -1,70 +0,0 @@ |
|||
<?php |
|||
/** |
|||
* @copyright Copyright (c) 2016, ownCloud, Inc. |
|||
* |
|||
* @author Lukas Reschke <lukas@statuscode.ch> |
|||
* @author Morris Jobke <hey@morrisjobke.de> |
|||
* @author Robin Appelman <robin@icewind.nl> |
|||
* @author Thomas Müller <thomas.mueller@tmit.eu> |
|||
* |
|||
* @license AGPL-3.0 |
|||
* |
|||
* This code is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License, version 3, |
|||
* as published by the Free Software Foundation. |
|||
* |
|||
* This program 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, version 3, |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/> |
|||
* |
|||
*/ |
|||
|
|||
OC_Util::checkAdminUser(); |
|||
OCP\JSON::callCheck(); |
|||
|
|||
$action=isset($_POST['action'])?$_POST['action']:$_GET['action']; |
|||
|
|||
if(isset($_POST['app']) || isset($_GET['app'])) { |
|||
$app=OC_App::cleanAppId(isset($_POST['app'])? (string)$_POST['app']: (string)$_GET['app']); |
|||
} |
|||
|
|||
// An admin should not be able to add remote and public services
|
|||
// on its own. This should only be possible programmatically.
|
|||
// This change is due the fact that an admin may not be expected
|
|||
// to execute arbitrary code in every environment.
|
|||
if($app === 'core' && isset($_POST['key']) &&(substr((string)$_POST['key'],0,7) === 'remote_' || substr((string)$_POST['key'],0,7) === 'public_')) { |
|||
OC_JSON::error(array('data' => array('message' => 'Unexpected error!'))); |
|||
return; |
|||
} |
|||
|
|||
$result=false; |
|||
$appConfig = \OC::$server->getAppConfig(); |
|||
switch($action) { |
|||
case 'getValue': |
|||
$result=$appConfig->getValue($app, (string)$_GET['key'], (string)$_GET['defaultValue']); |
|||
break; |
|||
case 'setValue': |
|||
$result=$appConfig->setValue($app, (string)$_POST['key'], (string)$_POST['value']); |
|||
break; |
|||
case 'getApps': |
|||
$result=$appConfig->getApps(); |
|||
break; |
|||
case 'getKeys': |
|||
$result=$appConfig->getKeys($app); |
|||
break; |
|||
case 'hasKey': |
|||
$result=$appConfig->hasKey($app, (string)$_GET['key']); |
|||
break; |
|||
case 'deleteKey': |
|||
$result=$appConfig->deleteKey($app, (string)$_POST['key']); |
|||
break; |
|||
case 'deleteApp': |
|||
$result=$appConfig->deleteApp($app); |
|||
break; |
|||
} |
|||
OC_JSON::success(array('data'=>$result)); |
|||
|
|||
@ -1,58 +1,80 @@ |
|||
/** |
|||
* Copyright (c) 2011, Robin Appelman <icewind1991@gmail.com> |
|||
* This file is licensed under the Affero General Public License version 3 or later. |
|||
* See the COPYING-README file. |
|||
* @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/** |
|||
* @namespace |
|||
* @deprecated Use OCP.AppConfig instead |
|||
*/ |
|||
OC.AppConfig={ |
|||
url:OC.filePath('core','ajax','appconfig.php'), |
|||
getCall:function(action,data,callback){ |
|||
data.action=action; |
|||
$.getJSON(OC.AppConfig.url,data,function(result){ |
|||
if(result.status==='success'){ |
|||
if(callback){ |
|||
callback(result.data); |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
postCall:function(action,data,callback){ |
|||
data.action=action; |
|||
$.post(OC.AppConfig.url,data,function(result){ |
|||
if(result.status==='success'){ |
|||
if(callback){ |
|||
callback(result.data); |
|||
} |
|||
} |
|||
},'json'); |
|||
}, |
|||
/** |
|||
* @deprecated Use OCP.AppConfig.getValue() instead |
|||
*/ |
|||
getValue:function(app,key,defaultValue,callback){ |
|||
if(typeof defaultValue=='function'){ |
|||
callback=defaultValue; |
|||
defaultValue=null; |
|||
} |
|||
OC.AppConfig.getCall('getValue',{app:app,key:key,defaultValue:defaultValue},callback); |
|||
OCP.AppConfig.getValue(app, key, defaultValue, { |
|||
success: callback |
|||
}); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated Use OCP.AppConfig.setValue() instead |
|||
*/ |
|||
setValue:function(app,key,value){ |
|||
OC.AppConfig.postCall('setValue',{app:app,key:key,value:value}); |
|||
OCP.AppConfig.setValue(app, key, value); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated Use OCP.AppConfig.getApps() instead |
|||
*/ |
|||
getApps:function(callback){ |
|||
OC.AppConfig.getCall('getApps',{},callback); |
|||
OCP.AppConfig.getApps({ |
|||
success: callback |
|||
}); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated Use OCP.AppConfig.getKeys() instead |
|||
*/ |
|||
getKeys:function(app,callback){ |
|||
OC.AppConfig.getCall('getKeys',{app:app},callback); |
|||
OCP.AppConfig.getKeys(app, { |
|||
success: callback |
|||
}); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated |
|||
*/ |
|||
hasKey:function(app,key,callback){ |
|||
OC.AppConfig.getCall('hasKey',{app:app,key:key},callback); |
|||
console.error('OC.AppConfig.hasKey is not supported anymore. Use OCP.AppConfig.getValue instead.'); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated Use OCP.AppConfig.deleteKey() instead |
|||
*/ |
|||
deleteKey:function(app,key){ |
|||
OC.AppConfig.postCall('deleteKey',{app:app,key:key}); |
|||
OCP.AppConfig.deleteKey(app, key); |
|||
}, |
|||
|
|||
/** |
|||
* @deprecated |
|||
*/ |
|||
deleteApp:function(app){ |
|||
OC.AppConfig.postCall('deleteApp',{app:app}); |
|||
console.error('OC.AppConfig.deleteApp is not supported anymore.'); |
|||
} |
|||
}; |
|||
//TODO OC.Preferences
|
|||
@ -0,0 +1,113 @@ |
|||
/** |
|||
* @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program 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 program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/** |
|||
* @namespace |
|||
* @since 9.2.0 |
|||
*/ |
|||
OCP.AppConfig = { |
|||
/** |
|||
* @param {string} method |
|||
* @param {string} endpoint |
|||
* @param {Object} [options] |
|||
* @param {Object} [options.data] |
|||
* @param {function} [options.success] |
|||
* @param {function} [options.error] |
|||
* @internal |
|||
*/ |
|||
_call: function(method, endpoint, options) { |
|||
|
|||
$.ajax({ |
|||
type: method.toUpperCase(), |
|||
url: OC.linkToOCS('apps/provisioning_api/api/v1', 2) + 'config/apps' + endpoint, |
|||
data: options.data || {}, |
|||
success: options.success, |
|||
error: options.error |
|||
}) |
|||
}, |
|||
|
|||
/** |
|||
* @param {Object} [options] |
|||
* @param {function} [options.success] |
|||
* @since 9.2.0 |
|||
*/ |
|||
getApps: function(options) { |
|||
this._call('get', '', options); |
|||
}, |
|||
|
|||
/** |
|||
* @param {string} app |
|||
* @param {Object} [options] |
|||
* @param {function} [options.success] |
|||
* @param {function} [options.error] |
|||
* @since 9.2.0 |
|||
*/ |
|||
getKeys: function(app, options) { |
|||
this._call('get', '/' + app, options); |
|||
}, |
|||
|
|||
/** |
|||
* @param {string} app |
|||
* @param {string} key |
|||
* @param {string|function} defaultValue |
|||
* @param {Object} [options] |
|||
* @param {function} [options.success] |
|||
* @param {function} [options.error] |
|||
* @since 9.2.0 |
|||
*/ |
|||
getValue: function(app, key, defaultValue, options) { |
|||
options = options || {}; |
|||
options['data'] = { |
|||
defaultValue: defaultValue |
|||
}; |
|||
|
|||
this._call('get', '/' + app + '/' + key, options); |
|||
}, |
|||
|
|||
/** |
|||
* @param {string} app |
|||
* @param {string} key |
|||
* @param {string} value |
|||
* @param {Object} [options] |
|||
* @param {function} [options.success] |
|||
* @param {function} [options.error] |
|||
* @since 9.2.0 |
|||
*/ |
|||
setValue: function(app, key, value, options) { |
|||
options = options || {}; |
|||
options['data'] = { |
|||
value: value |
|||
}; |
|||
|
|||
this._call('post', '/' + app + '/' + key, options); |
|||
}, |
|||
|
|||
/** |
|||
* @param {string} app |
|||
* @param {string} key |
|||
* @param {Object} [options] |
|||
* @param {function} [options.success] |
|||
* @param {function} [options.error] |
|||
* @since 9.2.0 |
|||
*/ |
|||
deleteKey: function(app, key, options) { |
|||
this._call('delete', '/' + app + '/' + key, options); |
|||
} |
|||
}; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue