Signed-off-by: Joas Schilling <coding@schilljs.com>pull/1452/head
parent
50b6ee67cb
commit
0b1fb180a5
@ -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)); |
||||
|
||||
@ -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); |
||||
} |
||||
}; |
||||
Loading…
Reference in new issue