diff options
author | icewind1991 <icewind1991@gmail.com> | 2013-07-11 18:21:08 -0700 |
---|---|---|
committer | icewind1991 <icewind1991@gmail.com> | 2013-07-11 18:21:08 -0700 |
commit | 3abe68176ff09ca579ff9e5f15872fb5cab8ff4d (patch) | |
tree | 705cd981b31256472256d11726423cc2e8c9126d | |
parent | 3fbf7ab189b96246cfcc3c6904d813f7eaa42c42 (diff) | |
parent | e7b882a4fcfbc5210d64372ba170efa825ebc237 (diff) | |
download | nextcloud-server-3abe68176ff09ca579ff9e5f15872fb5cab8ff4d.tar.gz nextcloud-server-3abe68176ff09ca579ff9e5f15872fb5cab8ff4d.zip |
Merge pull request #3270 from owncloud/convert-oc_config
Convert OC_Config to object so it can be used for DI
-rw-r--r-- | lib/config.php | 155 | ||||
-rw-r--r-- | lib/hintexception.php | 27 | ||||
-rw-r--r-- | lib/legacy/config.php | 103 | ||||
-rw-r--r-- | lib/public/config.php | 27 | ||||
-rw-r--r-- | lib/setup.php | 16 | ||||
-rw-r--r-- | tests/lib/config.php | 105 |
6 files changed, 328 insertions, 105 deletions
diff --git a/lib/config.php b/lib/config.php index 7dd596fcea5..00d9f5b4247 100644 --- a/lib/config.php +++ b/lib/config.php @@ -34,16 +34,34 @@ * */ +namespace OC; + /** * This class is responsible for reading and writing config.php, the very basic - * configuration file of owncloud. + * configuration file of ownCloud. */ -class OC_Config{ +class Config { // associative array key => value - private static $cache = array(); + protected $cache = array(); + + protected $configDir; + protected $configFilename; + + protected $debugMode; + + /** + * @param $configDir path to the config dir, needs to end with '/' + */ + public function __construct($configDir) { + $this->configDir = $configDir; + $this->configFilename = $this->configDir.'config.php'; + $this->readData(); + $this->setDebugMode(defined('DEBUG') && DEBUG); + } - // Is the cache filled? - private static $init = false; + public function setDebugMode($enable) { + $this->debugMode = $enable; + } /** * @brief Lists all available config keys @@ -52,10 +70,8 @@ class OC_Config{ * This function returns all keys saved in config.php. Please note that it * does not return the values. */ - public static function getKeys() { - self::readData(); - - return array_keys( self::$cache ); + public function getKeys() { + return array_keys($this->cache); } /** @@ -67,11 +83,9 @@ class OC_Config{ * This function gets the value from config.php. If it does not exist, * $default will be returned. */ - public static function getValue( $key, $default = null ) { - self::readData(); - - if( array_key_exists( $key, self::$cache )) { - return self::$cache[$key]; + public function getValue($key, $default = null) { + if (isset($this->cache[$key])) { + return $this->cache[$key]; } return $default; @@ -81,117 +95,90 @@ class OC_Config{ * @brief Sets a value * @param string $key key * @param string $value value - * @return bool * - * This function sets the value and writes the config.php. If the file can - * not be written, false will be returned. + * This function sets the value and writes the config.php. + * */ - public static function setValue( $key, $value ) { - self::readData(); - + public function setValue($key, $value) { // Add change - self::$cache[$key] = $value; + $this->cache[$key] = $value; // Write changes - self::writeData(); - return true; + $this->writeData(); } /** * @brief Removes a key from the config * @param string $key key - * @return bool * - * This function removes a key from the config.php. If owncloud has no - * write access to config.php, the function will return false. + * This function removes a key from the config.php. + * */ - public static function deleteKey( $key ) { - self::readData(); - - if( array_key_exists( $key, self::$cache )) { + public function deleteKey($key) { + if (isset($this->cache[$key])) { // Delete key from cache - unset( self::$cache[$key] ); + unset($this->cache[$key]); // Write changes - self::writeData(); + $this->writeData(); } - - return true; } /** * @brief Loads the config file - * @return bool * * Reads the config file and saves it to the cache */ - private static function readData() { - if( self::$init ) { - return true; + private function readData() { + // Default config + $configFiles = array($this->configFilename); + // Add all files in the config dir ending with config.php + $extra = glob($this->configDir.'*.config.php'); + if (is_array($extra)) { + natsort($extra); + $configFiles = array_merge($configFiles, $extra); } - - // read all file in config dir ending by config.php - $config_files = glob( OC::$SERVERROOT."/config/*.config.php"); - if (!is_array($config_files)) { - $config_files = array(); - } - - //Filter only regular files - $config_files = array_filter($config_files, 'is_file'); - - //Sort array naturally : - natsort($config_files); - - // Add default config - array_unshift($config_files,OC::$SERVERROOT."/config/config.php"); - - //Include file and merge config - foreach($config_files as $file){ - @include $file; - if( isset( $CONFIG ) && is_array( $CONFIG )) { - self::$cache = array_merge(self::$cache, $CONFIG); + // Include file and merge config + foreach ($configFiles as $file) { + if (!file_exists($file)) { + continue; + } + unset($CONFIG); + include $file; + if (isset($CONFIG) && is_array($CONFIG)) { + $this->cache = array_merge($this->cache, $CONFIG); } } - - // We cached everything - self::$init = true; - - return true; } /** * @brief Writes the config file - * @return bool * * Saves the config to the config file. * */ - public static function writeData() { + private function writeData() { // Create a php file ... - $defaults = new OC_Defaults; - $content = "<?php\n "; - if (defined('DEBUG') && DEBUG) { + $defaults = new \OC_Defaults; + $content = "<?php\n"; + if ($this->debugMode) { $content .= "define('DEBUG',true);\n"; } - $content .= "\$CONFIG = "; - $content .= var_export(self::$cache, true); + $content .= '$CONFIG = '; + $content .= var_export($this->cache, true); $content .= ";\n"; - $filename = OC::$SERVERROOT."/config/config.php"; // Write the file - $result=@file_put_contents( $filename, $content ); - if(!$result) { - $tmpl = new OC_Template( '', 'error', 'guest' ); - $tmpl->assign('errors', array(1=>array( - 'error'=>"Can't write into config directory 'config'", - 'hint'=>'This can usually be fixed by ' - .'<a href="' . $defaults->getDocBaseUrl() . '/server/5.0/admin_manual/installation/installation_source.html#set-the-directory-permissions" target="_blank">giving the webserver write access to the config directory</a>.'))); - $tmpl->printPage(); - exit; + $result = @file_put_contents($this->configFilename, $content); + if (!$result) { + $url = $defaults->getDocBaseUrl() . '/server/5.0/admin_manual/installation/installation_source.html#set-the-directory-permissions'; + throw new HintException( + "Can't write into config directory 'config'", + 'This can usually be fixed by ' + .'<a href="' . $url . '" target="_blank">giving the webserver write access to the config directory</a>.'); } // Prevent others not to read the config - @chmod($filename, 0640); - OC_Util::clearOpcodeCache(); - return true; + @chmod($this->configFilename, 0640); + \OC_Util::clearOpcodeCache(); } } diff --git a/lib/hintexception.php b/lib/hintexception.php new file mode 100644 index 00000000000..3934ae2a4c2 --- /dev/null +++ b/lib/hintexception.php @@ -0,0 +1,27 @@ +<?php +/** + * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC; + +class HintException extends \Exception { + + private $hint; + + public function __construct($message, $hint = '', $code = 0, Exception $previous = null) { + $this->hint = $hint; + parent::__construct($message, $code, $previous); + } + + public function __toString() { + return __CLASS__ . ": [{$this->code}]: {$this->message} ({$this->hint})\n"; + } + + public function getHint() { + return $this->hint; + } +} diff --git a/lib/legacy/config.php b/lib/legacy/config.php new file mode 100644 index 00000000000..5294a48ea44 --- /dev/null +++ b/lib/legacy/config.php @@ -0,0 +1,103 @@ +<?php +/** + * ownCloud + * + * @author Frank Karlitschek + * @author Jakob Sack + * @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/>. + * + */ +/* + * + * An example of config.php + * + * <?php + * $CONFIG = array( + * "database" => "mysql", + * "firstrun" => false, + * "pi" => 3.14 + * ); + * ?> + * + */ + +/** + * This class is responsible for reading and writing config.php, the very basic + * configuration file of ownCloud. + */ +OC_Config::$object = new \OC\Config(OC::$SERVERROOT.'/config/'); +class OC_Config { + + /** + * @var \OC\Config + */ + public static $object; + + /** + * @brief Lists all available config keys + * @return array with key names + * + * This function returns all keys saved in config.php. Please note that it + * does not return the values. + */ + public static function getKeys() { + return self::$object->getKeys(); + } + + /** + * @brief Gets a value from config.php + * @param string $key key + * @param string $default = null default value + * @return string the value or $default + * + * This function gets the value from config.php. If it does not exist, + * $default will be returned. + */ + public static function getValue($key, $default = null) { + return self::$object->getValue($key, $default); + } + + /** + * @brief Sets a value + * @param string $key key + * @param string $value value + * + * This function sets the value and writes the config.php. + * + */ + public static function setValue($key, $value) { + try { + self::$object->setValue($key, $value); + } catch (\OC\HintException $e) { + \OC_Template::printErrorPage($e->getMessage(), $e->getHint()); + } + } + + /** + * @brief Removes a key from the config + * @param string $key key + * + * This function removes a key from the config.php. + * + */ + public static function deleteKey($key) { + try { + self::$object->deleteKey($key); + } catch (\OC\HintException $e) { + \OC_Template::printErrorPage($e->getMessage(), $e->getHint()); + } + } +} diff --git a/lib/public/config.php b/lib/public/config.php index 8076d640b49..73476d7551d 100644 --- a/lib/public/config.php +++ b/lib/public/config.php @@ -49,7 +49,7 @@ class Config { * $default will be returned. */ public static function getSystemValue( $key, $default = null ) { - return(\OC_Config::getValue( $key, $default )); + return \OC_Config::getValue( $key, $default ); } /** @@ -62,7 +62,12 @@ class Config { * not be written, false will be returned. */ public static function setSystemValue( $key, $value ) { - return(\OC_Config::setValue( $key, $value )); + try { + \OC_Config::setValue( $key, $value ); + } catch (Exception $e) { + return false; + } + return true; } /** @@ -76,7 +81,7 @@ class Config { * not exist the default value will be returned */ public static function getAppValue( $app, $key, $default = null ) { - return(\OC_Appconfig::getValue( $app, $key, $default )); + return \OC_Appconfig::getValue( $app, $key, $default ); } /** @@ -89,7 +94,12 @@ class Config { * Sets a value. If the key did not exist before it will be created. */ public static function setAppValue( $app, $key, $value ) { - return(\OC_Appconfig::setValue( $app, $key, $value )); + try { + \OC_Appconfig::setValue( $app, $key, $value ); + } catch (Exception $e) { + return false; + } + return true; } /** @@ -104,7 +114,7 @@ class Config { * not exist the default value will be returned */ public static function getUserValue( $user, $app, $key, $default = null ) { - return(\OC_Preferences::getValue( $user, $app, $key, $default )); + return \OC_Preferences::getValue( $user, $app, $key, $default ); } /** @@ -119,6 +129,11 @@ class Config { * will be added automagically. */ public static function setUserValue( $user, $app, $key, $value ) { - return(\OC_Preferences::setValue( $user, $app, $key, $value )); + try { + \OC_Preferences::setValue( $user, $app, $key, $value ); + } catch (Exception $e) { + return false; + } + return true; } } diff --git a/lib/setup.php b/lib/setup.php index d8f4cbfbcbd..59f4cab75de 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -1,21 +1,7 @@ <?php -class DatabaseSetupException extends Exception +class DatabaseSetupException extends \OC\HintException { - private $hint; - - public function __construct($message, $hint = '', $code = 0, Exception $previous = null) { - $this->hint = $hint; - parent::__construct($message, $code, $previous); - } - - public function __toString() { - return __CLASS__ . ": [{$this->code}]: {$this->message} ({$this->hint})\n"; - } - - public function getHint() { - return $this->hint; - } } class OC_Setup { diff --git a/tests/lib/config.php b/tests/lib/config.php new file mode 100644 index 00000000000..87ee2807c2d --- /dev/null +++ b/tests/lib/config.php @@ -0,0 +1,105 @@ +<?php +/** + * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class Test_Config extends PHPUnit_Framework_TestCase { + const CONFIG_FILE = 'static://config.php'; + const CONFIG_DIR = 'static://'; + const TESTCONTENT = '<?php $CONFIG=array("foo"=>"bar");'; + + /** + * @var \OC\Config + */ + private $config; + + function setUp() { + file_put_contents(self::CONFIG_FILE, self::TESTCONTENT); + $this->config = new OC\Config(self::CONFIG_DIR); + } + + public function testReadData() { + $config = new OC\Config('/non-existing'); + $this->assertAttributeEquals(array(), 'cache', $config); + + $this->assertAttributeEquals(array('foo' => 'bar'), 'cache', $this->config); + } + + public function testGetKeys() { + $this->assertEquals(array('foo'), $this->config->getKeys()); + } + + public function testGetValue() { + $this->assertEquals('bar', $this->config->getValue('foo')); + $this->assertEquals(null, $this->config->getValue('bar')); + $this->assertEquals('moo', $this->config->getValue('bar', 'moo')); + } + + public function testSetValue() { + $this->config->setDebugMode(false); + $this->config->setValue('foo', 'moo'); + $this->assertAttributeEquals(array('foo' => 'moo'), 'cache', $this->config); + $content = file_get_contents(self::CONFIG_FILE); + $this->assertEquals(<<<EOL +<?php +\$CONFIG = array ( + 'foo' => 'moo', +); + +EOL + , $content); + $this->config->setValue('bar', 'red'); + $this->assertAttributeEquals(array('foo' => 'moo', 'bar' => 'red'), 'cache', $this->config); + $content = file_get_contents(self::CONFIG_FILE); + $this->assertEquals(<<<EOL +<?php +\$CONFIG = array ( + 'foo' => 'moo', + 'bar' => 'red', +); + +EOL + , $content); + } + + public function testDeleteKey() { + $this->config->setDebugMode(false); + $this->config->deleteKey('foo'); + $this->assertAttributeEquals(array(), 'cache', $this->config); + $content = file_get_contents(self::CONFIG_FILE); + $this->assertEquals(<<<EOL +<?php +\$CONFIG = array ( +); + +EOL + , $content); + } + + public function testSavingDebugMode() { + $this->config->setDebugMode(true); + $this->config->deleteKey('foo'); // change something so we save to the config file + $this->assertAttributeEquals(array(), 'cache', $this->config); + $this->assertAttributeEquals(true, 'debugMode', $this->config); + $content = file_get_contents(self::CONFIG_FILE); + $this->assertEquals(<<<EOL +<?php +define('DEBUG',true); +\$CONFIG = array ( +); + +EOL + , $content); + } + + /** + * @expectedException \OC\HintException + */ + public function testWriteData() { + $config = new OC\Config('/non-writable'); + $config->setValue('foo', 'bar'); + } +} |