summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/command/base.php42
-rw-r--r--core/command/config/app/deleteconfig.php81
-rw-r--r--core/command/config/app/getconfig.php93
-rw-r--r--core/command/config/app/setconfig.php89
-rw-r--r--core/command/config/import.php195
-rw-r--r--core/command/config/listconfigs.php141
-rw-r--r--core/command/config/system/deleteconfig.php75
-rw-r--r--core/command/config/system/getconfig.php87
-rw-r--r--core/command/config/system/setconfig.php82
-rw-r--r--core/js/update.js28
-rw-r--r--core/register_command.php39
11 files changed, 925 insertions, 27 deletions
diff --git a/core/command/base.php b/core/command/base.php
index f84dcb1aeaf..7e61c0cb9ab 100644
--- a/core/command/base.php
+++ b/core/command/base.php
@@ -43,8 +43,9 @@ class Base extends Command {
* @param InputInterface $input
* @param OutputInterface $output
* @param array $items
+ * @param string $prefix
*/
- protected function writeArrayInOutputFormat(InputInterface $input, OutputInterface $output, $items) {
+ protected function writeArrayInOutputFormat(InputInterface $input, OutputInterface $output, $items, $prefix = ' - ') {
switch ($input->getOption('output')) {
case 'json':
$output->writeln(json_encode($items));
@@ -54,28 +55,57 @@ class Base extends Command {
break;
default:
foreach ($items as $key => $item) {
+ if (is_array($item)) {
+ $output->writeln($prefix . $key . ':');
+ $this->writeArrayInOutputFormat($input, $output, $item, ' ' . $prefix);
+ continue;
+ }
if (!is_int($key)) {
$value = $this->valueToString($item);
if (!is_null($value)) {
- $output->writeln(' - ' . $key . ': ' . $value);
+ $output->writeln($prefix . $key . ': ' . $value);
} else {
- $output->writeln(' - ' . $key);
+ $output->writeln($prefix . $key);
}
} else {
- $output->writeln(' - ' . $this->valueToString($item));
+ $output->writeln($prefix . $this->valueToString($item));
}
}
break;
}
}
- protected function valueToString($value) {
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ * @param mixed $item
+ */
+ protected function writeMixedInOutputFormat(InputInterface $input, OutputInterface $output, $item) {
+ if (is_array($item)) {
+ $this->writeArrayInOutputFormat($input, $output, $item, '');
+ return;
+ }
+
+ switch ($input->getOption('output')) {
+ case 'json':
+ $output->writeln(json_encode($item));
+ break;
+ case 'json_pretty':
+ $output->writeln(json_encode($item, JSON_PRETTY_PRINT));
+ break;
+ default:
+ $output->writeln($this->valueToString($item, false));
+ break;
+ }
+ }
+
+ protected function valueToString($value, $returnNull = true) {
if ($value === false) {
return 'false';
} else if ($value === true) {
return 'true';
} else if ($value === null) {
- null;
+ return ($returnNull) ? null : 'null';
} else {
return $value;
}
diff --git a/core/command/config/app/deleteconfig.php b/core/command/config/app/deleteconfig.php
new file mode 100644
index 00000000000..0031142358e
--- /dev/null
+++ b/core/command/config/app/deleteconfig.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\App;
+
+use OC\Core\Command\Base;
+use OCP\IConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class DeleteConfig extends Base {
+ /** * @var IConfig */
+ protected $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ parent::__construct();
+ $this->config = $config;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:app:delete')
+ ->setDescription('Delete an app config value')
+ ->addArgument(
+ 'app',
+ InputArgument::REQUIRED,
+ 'Name of the app'
+ )
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to delete'
+ )
+ ->addOption(
+ 'error-if-not-exists',
+ null,
+ InputOption::VALUE_NONE,
+ 'Checks whether the config exists before deleting it'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $appName = $input->getArgument('app');
+ $configName = $input->getArgument('name');
+
+ if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->config->getAppKeys($appName))) {
+ $output->writeln('<error>Config ' . $configName . ' could not be deleted because it did not exist</error>');
+ return 1;
+ }
+
+ $this->config->deleteAppValue($appName, $configName);
+ $output->writeln('<info>System config value ' . $configName . ' deleted</info>');
+ return 0;
+ }
+}
diff --git a/core/command/config/app/getconfig.php b/core/command/config/app/getconfig.php
new file mode 100644
index 00000000000..186ed46999f
--- /dev/null
+++ b/core/command/config/app/getconfig.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\App;
+
+use OC\Core\Command\Base;
+use OCP\IConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class GetConfig extends Base {
+ /** * @var IConfig */
+ protected $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ parent::__construct();
+ $this->config = $config;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:app:get')
+ ->setDescription('Get an app config value')
+ ->addArgument(
+ 'app',
+ InputArgument::REQUIRED,
+ 'Name of the app'
+ )
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to get'
+ )
+ ->addOption(
+ 'default-value',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'If no default value is set and the config does not exist, the command will exit with 1'
+ )
+ ;
+ }
+
+ /**
+ * Executes the current command.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ * @return null|int null or 0 if everything went fine, or an error code
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $appName = $input->getArgument('app');
+ $configName = $input->getArgument('name');
+ $defaultValue = $input->getOption('default-value');
+
+ if (!in_array($configName, $this->config->getAppKeys($appName)) && !$input->hasParameterOption('--default-value')) {
+ return 1;
+ }
+
+ if (!in_array($configName, $this->config->getAppKeys($appName))) {
+ $configValue = $defaultValue;
+ } else {
+ $configValue = $this->config->getAppValue($appName, $configName);
+ }
+
+ $this->writeMixedInOutputFormat($input, $output, $configValue);
+ return 0;
+ }
+}
diff --git a/core/command/config/app/setconfig.php b/core/command/config/app/setconfig.php
new file mode 100644
index 00000000000..91775094fdd
--- /dev/null
+++ b/core/command/config/app/setconfig.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\App;
+
+use OC\Core\Command\Base;
+use OCP\IConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SetConfig extends Base {
+ /** * @var IConfig */
+ protected $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ parent::__construct();
+ $this->config = $config;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:app:set')
+ ->setDescription('Set an app config value')
+ ->addArgument(
+ 'app',
+ InputArgument::REQUIRED,
+ 'Name of the app'
+ )
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to set'
+ )
+ ->addOption(
+ 'value',
+ null,
+ InputOption::VALUE_REQUIRED,
+ 'The new value of the config'
+ )
+ ->addOption(
+ 'update-only',
+ null,
+ InputOption::VALUE_NONE,
+ 'Only updates the value, if it is not set before, it is not being added'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $appName = $input->getArgument('app');
+ $configName = $input->getArgument('name');
+
+ if (!in_array($configName, $this->config->getAppKeys($appName)) && $input->hasParameterOption('--update-only')) {
+ $output->writeln('<comment>Value not updated, as it has not been set before.</comment>');
+ return 1;
+ }
+
+ $configValue = $input->getOption('value');
+ $this->config->setAppValue($appName, $configName, $configValue);
+
+ $output->writeln('<info>Config value ' . $configName . ' for app ' . $appName . ' set to ' . $configValue . '</info>');
+ return 0;
+ }
+}
diff --git a/core/command/config/import.php b/core/command/config/import.php
new file mode 100644
index 00000000000..c53fd7255f9
--- /dev/null
+++ b/core/command/config/import.php
@@ -0,0 +1,195 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config;
+
+use OCP\IConfig;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Import extends Command {
+ protected $validRootKeys = ['system', 'apps'];
+
+ /** @var IConfig */
+ protected $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ parent::__construct();
+ $this->config = $config;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('config:import')
+ ->setDescription('Import a list of configs')
+ ->addArgument(
+ 'file',
+ InputArgument::OPTIONAL,
+ 'File with the json array to import'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $importFile = $input->getArgument('file');
+ if ($importFile !== null) {
+ $content = $this->getArrayFromFile($importFile);
+ } else {
+ $content = $this->getArrayFromStdin();
+ }
+
+ try {
+ $configs = $this->validateFileContent($content);
+ } catch (\UnexpectedValueException $e) {
+ $output->writeln('<error>' . $e->getMessage(). '</error>');
+ return;
+ }
+
+ if (!empty($configs['system'])) {
+ $this->config->setSystemValues($configs['system']);
+ }
+
+ if (!empty($configs['apps'])) {
+ foreach ($configs['apps'] as $app => $appConfigs) {
+ foreach ($appConfigs as $key => $value) {
+ if ($value === null) {
+ $this->config->deleteAppValue($app, $key);
+ } else {
+ $this->config->setAppValue($app, $key, $value);
+ }
+ }
+ }
+ }
+
+ $output->writeln('<info>Config successfully imported from: ' . $importFile . '</info>');
+ }
+
+ /**
+ * Get the content from stdin ("config:import < file.json")
+ *
+ * @return string
+ */
+ protected function getArrayFromStdin() {
+ // Read from stdin. stream_set_blocking is used to prevent blocking
+ // when nothing is passed via stdin.
+ stream_set_blocking(STDIN, 0);
+ $content = file_get_contents('php://stdin');
+ stream_set_blocking(STDIN, 1);
+ return $content;
+ }
+
+ /**
+ * Get the content of the specified file ("config:import file.json")
+ *
+ * @param string $importFile
+ * @return string
+ */
+ protected function getArrayFromFile($importFile) {
+ $content = file_get_contents($importFile);
+ return $content;
+ }
+
+ /**
+ * @param string $content
+ * @return array
+ * @throws \UnexpectedValueException when the array is invalid
+ */
+ protected function validateFileContent($content) {
+ $decodedContent = json_decode($content, true);
+ if (!is_array($decodedContent) || empty($decodedContent)) {
+ throw new \UnexpectedValueException('The file must contain a valid json array');
+ }
+
+ $this->validateArray($decodedContent);
+
+ return $decodedContent;
+ }
+
+ /**
+ * Validates that the array only contains `system` and `apps`
+ *
+ * @param array $array
+ */
+ protected function validateArray($array) {
+ $arrayKeys = array_keys($array);
+ $additionalKeys = array_diff($arrayKeys, $this->validRootKeys);
+ $commonKeys = array_intersect($arrayKeys, $this->validRootKeys);
+ if (!empty($additionalKeys)) {
+ throw new \UnexpectedValueException('Found invalid entries in root: ' . implode(', ', $additionalKeys));
+ }
+ if (empty($commonKeys)) {
+ throw new \UnexpectedValueException('At least one key of the following is expected: ' . implode(', ', $this->validRootKeys));
+ }
+
+ if (isset($array['system'])) {
+ if (is_array($array['system'])) {
+ foreach ($array['system'] as $name => $value) {
+ $this->checkTypeRecursively($value, $name);
+ }
+ } else {
+ throw new \UnexpectedValueException('The system config array is not an array');
+ }
+ }
+
+ if (isset($array['apps'])) {
+ if (is_array($array['apps'])) {
+ $this->validateAppsArray($array['apps']);
+ } else {
+ throw new \UnexpectedValueException('The apps config array is not an array');
+ }
+ }
+ }
+
+ /**
+ * @param mixed $configValue
+ * @param string $configName
+ */
+ protected function checkTypeRecursively($configValue, $configName) {
+ if (!is_array($configValue) && !is_bool($configValue) && !is_int($configValue) && !is_string($configValue) && !is_null($configValue)) {
+ throw new \UnexpectedValueException('Invalid system config value for "' . $configName . '". Only arrays, bools, integers, strings and null (delete) are allowed.');
+ }
+ if (is_array($configValue)) {
+ foreach ($configValue as $key => $value) {
+ $this->checkTypeRecursively($value, $configName);
+ }
+ }
+ }
+
+ /**
+ * Validates that app configs are only integers and strings
+ *
+ * @param array $array
+ */
+ protected function validateAppsArray($array) {
+ foreach ($array as $app => $configs) {
+ foreach ($configs as $name => $value) {
+ if (!is_int($value) && !is_string($value) && !is_null($value)) {
+ throw new \UnexpectedValueException('Invalid app config value for "' . $app . '":"' . $name . '". Only integers, strings and null (delete) are allowed.');
+ }
+ }
+ }
+ }
+}
diff --git a/core/command/config/listconfigs.php b/core/command/config/listconfigs.php
new file mode 100644
index 00000000000..be3073e54d9
--- /dev/null
+++ b/core/command/config/listconfigs.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config;
+
+use OC\Core\Command\Base;
+use OC\SystemConfig;
+use OCP\IAppConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ListConfigs extends Base {
+ /** @var array */
+ protected $sensitiveValues = [
+ 'dbpassword',
+ 'dbuser',
+ 'mail_smtpname',
+ 'mail_smtppassword',
+ 'passwordsalt',
+ 'secret',
+ ];
+
+ /** * @var SystemConfig */
+ protected $systemConfig;
+
+ /** @var IAppConfig */
+ protected $appConfig;
+
+ /**
+ * @param SystemConfig $systemConfig
+ * @param IAppConfig $appConfig
+ */
+ public function __construct(SystemConfig $systemConfig, IAppConfig $appConfig) {
+ parent::__construct();
+ $this->systemConfig = $systemConfig;
+ $this->appConfig = $appConfig;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:list')
+ ->setDescription('List all configs')
+ ->addArgument(
+ 'app',
+ InputArgument::OPTIONAL,
+ 'Name of the app ("system" to get the config.php values, "all" for all apps and system)',
+ 'all'
+ )
+ ->addOption(
+ 'private',
+ null,
+ InputOption::VALUE_NONE,
+ 'Use this option when you want to include sensitive configs like passwords, salts, ...'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $app = $input->getArgument('app');
+ $noSensitiveValues = !$input->getOption('private');
+
+ if ($noSensitiveValues && !$input->hasParameterOption('--output')) {
+ // If you post this publicly we prefer the json format
+ $input->setOption('output', 'json_pretty');
+ }
+
+ switch ($app) {
+ case 'system':
+ $configs = [
+ 'system' => $this->getSystemConfigs($noSensitiveValues),
+ ];
+ break;
+
+ case 'all':
+ $apps = $this->appConfig->getApps();
+ $configs = [
+ 'system' => $this->getSystemConfigs($noSensitiveValues),
+ 'apps' => [],
+ ];
+ foreach ($apps as $appName) {
+ $configs['apps'][$appName] = $this->appConfig->getValues($appName, false);
+ }
+ break;
+
+ default:
+ $configs = [
+ 'apps' => [
+ $app => $this->appConfig->getValues($app, false),
+ ],
+ ];
+ }
+
+ $this->writeArrayInOutputFormat($input, $output, $configs);
+ }
+
+ /**
+ * Get the system configs
+ *
+ * @param bool $noSensitiveValues
+ * @return array
+ */
+ protected function getSystemConfigs($noSensitiveValues) {
+ $keys = $this->systemConfig->getKeys();
+
+ $configs = [];
+ foreach ($keys as $key) {
+ if ($noSensitiveValues && in_array($key, $this->sensitiveValues)) {
+ continue;
+ }
+
+ $value = $this->systemConfig->getValue($key, serialize(null));
+ if ($value !== 'N;') {
+ $configs[$key] = $value;
+ }
+ }
+
+ return $configs;
+ }
+}
diff --git a/core/command/config/system/deleteconfig.php b/core/command/config/system/deleteconfig.php
new file mode 100644
index 00000000000..49bc2bc8c03
--- /dev/null
+++ b/core/command/config/system/deleteconfig.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\System;
+
+use OC\Core\Command\Base;
+use OC\SystemConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class DeleteConfig extends Base {
+ /** * @var SystemConfig */
+ protected $systemConfig;
+
+ /**
+ * @param SystemConfig $systemConfig
+ */
+ public function __construct(SystemConfig $systemConfig) {
+ parent::__construct();
+ $this->systemConfig = $systemConfig;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:system:delete')
+ ->setDescription('Delete a system config value')
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to delete'
+ )
+ ->addOption(
+ 'error-if-not-exists',
+ null,
+ InputOption::VALUE_NONE,
+ 'Checks whether the config exists before deleting it'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $configName = $input->getArgument('name');
+
+ if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) {
+ $output->writeln('<error>Config ' . $configName . ' could not be deleted because it did not exist</error>');
+ return 1;
+ }
+
+ $this->systemConfig->deleteValue($configName);
+ $output->writeln('<info>System config value ' . $configName . ' deleted</info>');
+ return 0;
+ }
+}
diff --git a/core/command/config/system/getconfig.php b/core/command/config/system/getconfig.php
new file mode 100644
index 00000000000..d53de18a0bb
--- /dev/null
+++ b/core/command/config/system/getconfig.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\System;
+
+use OC\Core\Command\Base;
+use OC\SystemConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class GetConfig extends Base {
+ /** * @var SystemConfig */
+ protected $systemConfig;
+
+ /**
+ * @param SystemConfig $systemConfig
+ */
+ public function __construct(SystemConfig $systemConfig) {
+ parent::__construct();
+ $this->systemConfig = $systemConfig;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:system:get')
+ ->setDescription('Get a system config value')
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to get'
+ )
+ ->addOption(
+ 'default-value',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'If no default value is set and the config does not exist, the command will exit with 1'
+ )
+ ;
+ }
+
+ /**
+ * Executes the current command.
+ *
+ * @param InputInterface $input An InputInterface instance
+ * @param OutputInterface $output An OutputInterface instance
+ * @return null|int null or 0 if everything went fine, or an error code
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $configName = $input->getArgument('name');
+ $defaultValue = $input->getOption('default-value');
+
+ if (!in_array($configName, $this->systemConfig->getKeys()) && !$input->hasParameterOption('--default-value')) {
+ return 1;
+ }
+
+ if (!in_array($configName, $this->systemConfig->getKeys())) {
+ $configValue = $defaultValue;
+ } else {
+ $configValue = $this->systemConfig->getValue($configName);
+ }
+
+ $this->writeMixedInOutputFormat($input, $output, $configValue);
+ return 0;
+ }
+}
diff --git a/core/command/config/system/setconfig.php b/core/command/config/system/setconfig.php
new file mode 100644
index 00000000000..cb2f9fe616f
--- /dev/null
+++ b/core/command/config/system/setconfig.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @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/>
+ *
+ */
+
+namespace OC\Core\Command\Config\System;
+
+use OC\Core\Command\Base;
+use OC\SystemConfig;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SetConfig extends Base {
+ /** * @var SystemConfig */
+ protected $systemConfig;
+
+ /**
+ * @param SystemConfig $systemConfig
+ */
+ public function __construct(SystemConfig $systemConfig) {
+ parent::__construct();
+ $this->systemConfig = $systemConfig;
+ }
+
+ protected function configure() {
+ parent::configure();
+
+ $this
+ ->setName('config:system:set')
+ ->setDescription('Set a system config value')
+ ->addArgument(
+ 'name',
+ InputArgument::REQUIRED,
+ 'Name of the config to set'
+ )
+ ->addOption(
+ 'value',
+ null,
+ InputOption::VALUE_REQUIRED,
+ 'The new value of the config'
+ )
+ ->addOption(
+ 'update-only',
+ null,
+ InputOption::VALUE_NONE,
+ 'Only updates the value, if it is not set before, it is not being added'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $configName = $input->getArgument('name');
+
+ if (!in_array($configName, $this->systemConfig->getKeys()) && $input->hasParameterOption('--update-only')) {
+ $output->writeln('<comment>Value not updated, as it has not been set before.</comment>');
+ return 1;
+ }
+ $configValue = $input->getOption('value');
+
+ $this->systemConfig->setValue($configName, $configValue);
+ $output->writeln('<info>System config value ' . $configName . ' set to ' . $configValue . '</info>');
+ return 0;
+ }
+}
diff --git a/core/js/update.js b/core/js/update.js
index 60f04832935..fd3c7a56bd6 100644
--- a/core/js/update.js
+++ b/core/js/update.js
@@ -22,6 +22,8 @@
return;
}
+ var hasWarnings = false;
+
this.$el = $el;
this._started = true;
@@ -40,6 +42,7 @@
});
updateEventSource.listen('notice', function(message) {
$('<span>').addClass('error').append(message).append('<br />').appendTo($el);
+ hasWarnings = true;
});
updateEventSource.listen('error', function(message) {
$('<span>').addClass('error').append(message).append('<br />').appendTo($el);
@@ -57,14 +60,23 @@
.appendTo($el);
});
updateEventSource.listen('done', function() {
- // FIXME: use product name
- $('<span>').addClass('bold')
- .append('<br />')
- .append(t('core', 'The update was successful. Redirecting you to ownCloud now.'))
- .appendTo($el);
- setTimeout(function () {
- OC.redirect(OC.webroot);
- }, 3000);
+ if (hasWarnings) {
+ $('<span>').addClass('bold')
+ .append('<br />')
+ .append(t('core', 'The update was successful. There were warnings.'))
+ .appendTo($el);
+ var message = t('core', 'Please reload the page.');
+ $('<span>').append('<br />').append(message).append('<br />').appendTo($el);
+ } else {
+ // FIXME: use product name
+ $('<span>').addClass('bold')
+ .append('<br />')
+ .append(t('core', 'The update was successful. Redirecting you to ownCloud now.'))
+ .appendTo($el);
+ setTimeout(function () {
+ OC.redirect(OC.webroot);
+ }, 3000);
+ }
});
},
diff --git a/core/register_command.php b/core/register_command.php
index 13010b93a93..8815eca6b6b 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -32,31 +32,44 @@ $application->add(new OC\Core\Command\App\CheckCode());
$application->add(new OC\Core\Command\L10n\CreateJs());
if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
- $repair = new \OC\Repair(\OC\Repair::getRepairSteps());
-
- $application->add(new OC\Core\Command\Db\GenerateChangeScript());
- $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory()));
- $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig()));
- $application->add(new OC\Core\Command\Maintenance\SingleUser());
- $application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\App\Disable());
$application->add(new OC\Core\Command\App\Enable());
$application->add(new OC\Core\Command\App\ListApps());
- $application->add(new OC\Core\Command\Maintenance\Repair($repair, \OC::$server->getConfig()));
- $application->add(new OC\Core\Command\User\Add(\OC::$server->getUserManager(), \OC::$server->getGroupManager()));
- $application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager()));
- $application->add(new OC\Core\Command\User\LastSeen(\OC::$server->getUserManager()));
- $application->add(new OC\Core\Command\User\Report(\OC::$server->getUserManager()));
- $application->add(new OC\Core\Command\User\ResetPassword(\OC::$server->getUserManager()));
+
$application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\WebCron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\Ajax(\OC::$server->getConfig()));
+
+ $application->add(new OC\Core\Command\Config\App\DeleteConfig(\OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Config\App\GetConfig(\OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Config\App\SetConfig(\OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Config\Import(\OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Config\ListConfigs(\OC::$server->getSystemConfig(), \OC::$server->getAppConfig()));
+ $application->add(new OC\Core\Command\Config\System\DeleteConfig(\OC::$server->getSystemConfig()));
+ $application->add(new OC\Core\Command\Config\System\GetConfig(\OC::$server->getSystemConfig()));
+ $application->add(new OC\Core\Command\Config\System\SetConfig(\OC::$server->getSystemConfig()));
+
+ $application->add(new OC\Core\Command\Db\GenerateChangeScript());
+ $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory()));
+
$application->add(new OC\Core\Command\Encryption\Disable(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Encryption\Enable(\OC::$server->getConfig(), \OC::$server->getEncryptionManager()));
$application->add(new OC\Core\Command\Encryption\ListModules(\OC::$server->getEncryptionManager()));
$application->add(new OC\Core\Command\Encryption\SetDefaultModule(\OC::$server->getEncryptionManager()));
$application->add(new OC\Core\Command\Encryption\Status(\OC::$server->getEncryptionManager()));
+
$application->add(new OC\Core\Command\Maintenance\MimeTypesJS());
+ $application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair(\OC\Repair::getRepairSteps()), \OC::$server->getConfig()));
+ $application->add(new OC\Core\Command\Maintenance\SingleUser());
+
+ $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig()));
+
+ $application->add(new OC\Core\Command\User\Add(\OC::$server->getUserManager(), \OC::$server->getGroupManager()));
+ $application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager()));
+ $application->add(new OC\Core\Command\User\LastSeen(\OC::$server->getUserManager()));
+ $application->add(new OC\Core\Command\User\Report(\OC::$server->getUserManager()));
+ $application->add(new OC\Core\Command\User\ResetPassword(\OC::$server->getUserManager()));
} else {
$application->add(new OC\Core\Command\Maintenance\Install(\OC::$server->getConfig()));
}