From 50c2a819a0c5ae50571d36a3e2dec4e8267fd13b Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 27 Nov 2014 16:40:12 +0100 Subject: Extract interaction with config.php into SystemConfig * introduce SystemConfig to avoid DI circle (used by database connection which is itself needed by AllConfig that itself contains the methods to access the config.php which then would need the database connection - did you get it? ;)) * use DI container and use that method in legacy code paths (for easier refactoring later) * create and use getSystemConfig instead of query() in DI container --- tests/lib/user/user.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index 6aa7243a75a..85ade9ccaf1 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -228,10 +228,19 @@ class User extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $allConfig = new AllConfig(); + $allConfig = $this->getMockBuilder('\OC\AllConfig') + ->disableOriginalConstructor() + ->getMock(); + $allConfig->expects($this->any()) + ->method('getUserValue') + ->will($this->returnValue(true)); + $allConfig->expects($this->any()) + ->method('getSystemValue') + ->with($this->equalTo('datadirectory')) + ->will($this->returnValue('arbitrary/path')); $user = new \OC\User\User('foo', $backend, null, $allConfig); - $this->assertEquals(\OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/foo', $user->getHome()); + $this->assertEquals('arbitrary/path/foo', $user->getHome()); } public function testCanChangePassword() { -- cgit v1.2.3 From a9e411e076ddbb5525ad44db4cad9efe2efd0fd2 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 27 Nov 2014 18:19:14 +0100 Subject: migrate \OC\AllConfig to \OCP\IConfig --- lib/private/httphelper.php | 8 +++++--- lib/private/user/manager.php | 7 ++++--- lib/private/user/user.php | 7 ++++--- tests/lib/app/infoparser.php | 2 +- tests/lib/httphelper.php | 4 ++-- tests/lib/user/user.php | 3 +-- 6 files changed, 17 insertions(+), 14 deletions(-) (limited to 'tests') diff --git a/lib/private/httphelper.php b/lib/private/httphelper.php index dfc1bcf47cd..846825dee8d 100644 --- a/lib/private/httphelper.php +++ b/lib/private/httphelper.php @@ -8,16 +8,18 @@ namespace OC; +use \OCP\IConfig; + class HTTPHelper { const USER_AGENT = 'ownCloud Server Crawler'; - /** @var \OC\AllConfig */ + /** @var \OCP\IConfig */ private $config; /** - * @param \OC\AllConfig $config + * @param \OCP\IConfig $config */ - public function __construct(AllConfig $config) { + public function __construct(IConfig $config) { $this->config = $config; } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 2403f45aa2f..4fa3711e3b8 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -11,6 +11,7 @@ namespace OC\User; use OC\Hooks\PublicEmitter; use OCP\IUserManager; +use OCP\IConfig; /** * Class Manager @@ -37,14 +38,14 @@ class Manager extends PublicEmitter implements IUserManager { private $cachedUsers = array(); /** - * @var \OC\AllConfig $config + * @var \OCP\IConfig $config */ private $config; /** - * @param \OC\AllConfig $config + * @param \OCP\IConfig $config */ - public function __construct($config = null) { + public function __construct(IConfig $config = null) { $this->config = $config; $cachedUsers = &$this->cachedUsers; $this->listen('\OC\User', 'postDelete', function ($user) use (&$cachedUsers) { diff --git a/lib/private/user/user.php b/lib/private/user/user.php index ad85337f628..fb66f893c61 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -11,6 +11,7 @@ namespace OC\User; use OC\Hooks\Emitter; use OCP\IUser; +use OCP\IConfig; class User implements IUser { /** @@ -49,7 +50,7 @@ class User implements IUser { private $lastLogin; /** - * @var \OC\AllConfig $config + * @var \OCP\IConfig $config */ private $config; @@ -57,9 +58,9 @@ class User implements IUser { * @param string $uid * @param \OC_User_Interface $backend * @param \OC\Hooks\Emitter $emitter - * @param \OC\AllConfig $config + * @param \OCP\IConfig $config */ - public function __construct($uid, $backend, $emitter = null, $config = null) { + public function __construct($uid, $backend, $emitter = null, IConfig $config = null) { $this->uid = $uid; $this->backend = $backend; $this->emitter = $emitter; diff --git a/tests/lib/app/infoparser.php b/tests/lib/app/infoparser.php index 13c0b51e117..e291b616e8b 100644 --- a/tests/lib/app/infoparser.php +++ b/tests/lib/app/infoparser.php @@ -19,7 +19,7 @@ class InfoParser extends \PHPUnit_Framework_TestCase { private $parser; public function setUp() { - $config = $this->getMockBuilder('\OC\AllConfig') + $config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); $httpHelper = $this->getMockBuilder('\OC\HTTPHelper') ->setConstructorArgs(array($config)) diff --git a/tests/lib/httphelper.php b/tests/lib/httphelper.php index eb58508f158..1cc4232ab4b 100644 --- a/tests/lib/httphelper.php +++ b/tests/lib/httphelper.php @@ -8,7 +8,7 @@ class TestHTTPHelper extends \Test\TestCase { - /** @var \OC\AllConfig*/ + /** @var \OCP\IConfig*/ private $config; /** @var \OC\HTTPHelper */ private $httpHelperMock; @@ -16,7 +16,7 @@ class TestHTTPHelper extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->config = $this->getMockBuilder('\OC\AllConfig') + $this->config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor()->getMock(); $this->httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper') ->setConstructorArgs(array($this->config)) diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index 85ade9ccaf1..a940d6eb627 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -9,7 +9,6 @@ namespace Test\User; -use OC\AllConfig; use OC\Hooks\PublicEmitter; class User extends \Test\TestCase { @@ -228,7 +227,7 @@ class User extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $allConfig = $this->getMockBuilder('\OC\AllConfig') + $allConfig = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor() ->getMock(); $allConfig->expects($this->any()) -- cgit v1.2.3 From f0b10324caf1637d8ad5a9ed94dfed084f65407d Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Wed, 19 Nov 2014 12:18:32 +0100 Subject: Refactoring of OC_Preferences to AllConfig * keep old static methods - mapped to new ones and deprecated * removed deleteApp, getUsers, getApps because they are unused * make AllConfig unit tests more robust against not cleaned up environments --- lib/private/allconfig.php | 204 +++++++++++++++++++++- lib/private/legacy/preferences.php | 62 ++----- lib/private/preferences.php | 233 +++---------------------- lib/private/server.php | 3 +- lib/public/iconfig.php | 28 ++- tests/lib/allconfig.php | 334 ++++++++++++++++++++++++++++++++++++ tests/lib/preferences-singleton.php | 176 ------------------- tests/lib/preferences.php | 241 -------------------------- 8 files changed, 600 insertions(+), 681 deletions(-) create mode 100644 tests/lib/allconfig.php delete mode 100644 tests/lib/preferences-singleton.php delete mode 100644 tests/lib/preferences.php (limited to 'tests') diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 173aac6ad65..17872fd4f69 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -8,6 +8,7 @@ */ namespace OC; +use OCP\IDBConnection; /** * Class to combine all the configuration options ownCloud offers @@ -16,11 +17,37 @@ class AllConfig implements \OCP\IConfig { /** @var SystemConfig */ private $systemConfig; + /** @var IDBConnection */ + private $connection; + + /** + * 3 dimensional array with the following structure: + * [ $userId => + * [ $appId => + * [ $key => $value ] + * ] + * ] + * + * database table: preferences + * + * methods that use this: + * - setUserValue + * - getUserValue + * - getUserKeys + * - deleteUserValue + * - deleteAllUserValues + * - deleteAppFromAllUsers + * + * @var array $userCache + */ + private $userCache = array(); + /** * @param SystemConfig $systemConfig */ - function __construct(SystemConfig $systemConfig) { + function __construct(SystemConfig $systemConfig, IDBConnection $connection) { $this->systemConfig = $systemConfig; + $this->connection = $connection; } /** @@ -115,11 +142,40 @@ class AllConfig implements \OCP\IConfig { * @param string $value the value that you want to store */ public function setUserValue($userId, $appName, $key, $value) { - \OC_Preferences::setValue($userId, $appName, $key, $value); + // Check if the key does exist + $sql = 'SELECT `configvalue` FROM `*PREFIX*preferences` '. + 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; + $result = $this->connection->executeQuery($sql, array($userId, $appName, $key)); + $oldValue = $result->fetchColumn(); + $exists = $oldValue !== false; + + if($oldValue === strval($value)) { + // no changes + return; + } + + if (!$exists) { + $sql = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'. + 'VALUES (?, ?, ?, ?)'; + } else { + $sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '. + 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; + + } + $data = array($value, $userId, $appName, $key); + $affectedRows = $this->connection->executeUpdate($sql, $data); + + // only add to the cache if we already loaded data for the user + if ($affectedRows > 0 && isset($this->userCache[$userId])) { + if (!isset($this->userCache[$userId][$appName])) { + $this->userCache[$userId][$appName] = array(); + } + $this->userCache[$userId][$appName][$key] = $value; + } } /** - * Shortcut for getting a user defined value + * Getting a user defined value * * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we stored the value under @@ -128,7 +184,12 @@ class AllConfig implements \OCP\IConfig { * @return string */ public function getUserValue($userId, $appName, $key, $default = '') { - return \OC_Preferences::getValue($userId, $appName, $key, $default); + $data = $this->getUserValues($userId); + if (isset($data[$appName]) and isset($data[$appName][$key])) { + return $data[$appName][$key]; + } else { + return $default; + } } /** @@ -139,7 +200,12 @@ class AllConfig implements \OCP\IConfig { * @return string[] */ public function getUserKeys($userId, $appName) { - return \OC_Preferences::getKeys($userId, $appName); + $data = $this->getUserValues($userId); + if (isset($data[$appName])) { + return array_keys($data[$appName]); + } else { + return array(); + } } /** @@ -150,7 +216,13 @@ class AllConfig implements \OCP\IConfig { * @param string $key the key under which the value is being stored */ public function deleteUserValue($userId, $appName, $key) { - \OC_Preferences::deleteKey($userId, $appName, $key); + $sql = 'DELETE FROM `*PREFIX*preferences` '. + 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; + $this->connection->executeUpdate($sql, array($userId, $appName, $key)); + + if (isset($this->userCache[$userId]) and isset($this->userCache[$userId][$appName])) { + unset($this->userCache[$userId][$appName][$key]); + } } /** @@ -159,6 +231,124 @@ class AllConfig implements \OCP\IConfig { * @param string $userId the userId of the user that we want to remove all values from */ public function deleteAllUserValues($userId) { - \OC_Preferences::deleteUser($userId); + $sql = 'DELETE FROM `*PREFIX*preferences` '. + 'WHERE `userid` = ?'; + $this->connection->executeUpdate($sql, array($userId)); + + unset($this->userCache[$userId]); + } + + /** + * Delete all user related values of one app + * + * @param string $appName the appName of the app that we want to remove all values from + */ + public function deleteAppFromAllUsers($appName) { + $sql = 'DELETE FROM `*PREFIX*preferences` '. + 'WHERE `appid` = ?'; + $this->connection->executeUpdate($sql, array($appName)); + + foreach ($this->userCache as &$userCache) { + unset($userCache[$appName]); + } + } + + /** + * Returns all user configs sorted by app of one user + * + * @param string $userId the user ID to get the app configs from + * @return array[] - 2 dimensional array with the following structure: + * [ $appId => + * [ $key => $value ] + * ] + */ + private function getUserValues($userId) { + if (isset($this->userCache[$userId])) { + return $this->userCache[$userId]; + } + $data = array(); + $query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; + $result = $this->connection->executeQuery($query, array($userId)); + while ($row = $result->fetch()) { + $appId = $row['appid']; + if (!isset($data[$appId])) { + $data[$appId] = array(); + } + $data[$appId][$row['configkey']] = $row['configvalue']; + } + $this->userCache[$userId] = $data; + return $data; + } + + /** + * Fetches a mapped list of userId -> value, for a specified app and key and a list of user IDs. + * + * @param $appName app to get the value for + * @param $key the key to get the value for + * @param $userIds the user IDs to fetch the values for + * @return array Mapped values: userId => value + */ + public function getUserValueForUsers($appName, $key, $userIds) { + if (empty($userIds) || !is_array($userIds)) { + return array(); + } + + $chunkedUsers = array_chunk($userIds, 50, true); + $placeholders50 = implode(',', array_fill(0, 50, '?')); + + $userValues = array(); + foreach ($chunkedUsers as $chunk) { + $queryParams = $chunk; + // create [$app, $key, $chunkedUsers] + array_unshift($queryParams, $key); + array_unshift($queryParams, $appName); + + $placeholders = (sizeof($chunk) == 50) ? $placeholders50 : implode(',', array_fill(0, sizeof($chunk), '?')); + + $query = 'SELECT `userid`, `configvalue` ' . + 'FROM `*PREFIX*preferences` ' . + 'WHERE `appid` = ? AND `configkey` = ? ' . + 'AND `userid` IN (' . $placeholders . ')'; + $result = $this->connection->executeQuery($query, $queryParams); + + while ($row = $result->fetch()) { + $userValues[$row['userid']] = $row['configvalue']; + } + } + + return $userValues; + + } + + /** + * Determines the users that have the given value set for a specific app-key-pair + * + * @param string $appName the app to get the user for + * @param string $key the key to get the user for + * @param string $value the value to get the user for + * @return array of user IDs + */ + public function getUsersForUserValue($appName, $key, $value) { + // TODO - FIXME + $this->fixDIInit(); + + $sql = 'SELECT `userid` FROM `*PREFIX*preferences` ' . + 'WHERE `appid` = ? AND `configkey` = ? '; + + if($this->getSystemValue('dbtype', 'sqlite') === 'oci') { + //oracle hack: need to explicitly cast CLOB to CHAR for comparison + $sql .= 'AND to_char(`configvalue`) = ?'; + } else { + $sql .= 'AND `configvalue` = ?'; + } + + $result = $this->connection->executeQuery($sql, array($appName, $key, $value)); + + $userIDs = array(); + while ($row = $result->fetch()) { + $userIDs[] = $row['userid']; + } + + return $userIDs; } } diff --git a/lib/private/legacy/preferences.php b/lib/private/legacy/preferences.php index 4b68b0e69aa..28af124db32 100644 --- a/lib/private/legacy/preferences.php +++ b/lib/private/legacy/preferences.php @@ -21,47 +21,23 @@ * */ -OC_Preferences::$object = new \OC\Preferences(OC_DB::getConnection()); /** * This class provides an easy way for storing user preferences. - * @deprecated use \OC\Preferences instead + * @deprecated use \OCP\IConfig methods instead */ class OC_Preferences{ - public static $object; - /** - * Get all users using the preferences - * @return array an array of user ids - * - * This function returns a list of all users that have at least one entry - * in the preferences table. - */ - public static function getUsers() { - return self::$object->getUsers(); - } - - /** - * Get all apps of a user - * @param string $user user - * @return integer[] with app ids - * - * This function returns a list of all apps of the user that have at least - * one entry in the preferences table. - */ - public static function getApps( $user ) { - return self::$object->getApps( $user ); - } - /** * Get the available keys for an app * @param string $user user * @param string $app the app we are looking for * @return array an array of key names + * @deprecated use getUserKeys of \OCP\IConfig instead * * This function gets all keys of an app of an user. Please note that the * values are not returned. */ public static function getKeys( $user, $app ) { - return self::$object->getKeys( $user, $app ); + return \OC::$server->getConfig()->getUserKeys($user, $app); } /** @@ -71,12 +47,13 @@ class OC_Preferences{ * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated use getUserValue of \OCP\IConfig instead * * This function gets a value from the preferences table. If the key does * not exist the default value will be returned */ public static function getValue( $user, $app, $key, $default = null ) { - return self::$object->getValue( $user, $app, $key, $default ); + return \OC::$server->getConfig()->getUserValue($user, $app, $key, $default); } /** @@ -87,12 +64,16 @@ class OC_Preferences{ * @param string $value value * @param string $preCondition only set value if the key had a specific value before * @return bool true if value was set, otherwise false + * @deprecated use setUserValue of \OCP\IConfig instead * * Adds a value to the preferences. If the key did not exist before, it * will be added automagically. */ public static function setValue( $user, $app, $key, $value, $preCondition = null ) { - return self::$object->setValue( $user, $app, $key, $value, $preCondition ); + return \OC::$server->getConfig()->setUserValue($user, $app, $key, $value); + + // TODO maybe catch exceptions and then return false + return true; } /** @@ -100,24 +81,13 @@ class OC_Preferences{ * @param string $user user * @param string $app app * @param string $key key + * @return bool true + * @deprecated use deleteUserValue of \OCP\IConfig instead * * Deletes a key. */ public static function deleteKey( $user, $app, $key ) { - self::$object->deleteKey( $user, $app, $key ); - return true; - } - - /** - * Remove app of user from preferences - * @param string $user user - * @param string $app app - * @return bool - * - * Removes all keys in preferences belonging to the app and the user. - */ - public static function deleteApp( $user, $app ) { - self::$object->deleteApp( $user, $app ); + \OC::$server->getConfig()->deleteUserValue($user, $app, $key); return true; } @@ -125,11 +95,12 @@ class OC_Preferences{ * Remove user from preferences * @param string $user user * @return bool + * @deprecated use deleteUser of \OCP\IConfig instead * * Removes all keys in preferences belonging to the user. */ public static function deleteUser( $user ) { - self::$object->deleteUser( $user ); + \OC::$server->getConfig()->deleteAllUserValues($user); return true; } @@ -137,11 +108,12 @@ class OC_Preferences{ * Remove app from all users * @param string $app app * @return bool + * @deprecated use deleteAppFromAllUsers of \OCP\IConfig instead * * Removes all keys in preferences belonging to the app. */ public static function deleteAppFromAllUsers( $app ) { - self::$object->deleteAppFromAllUsers( $app ); + \OC::$server->getConfig()->deleteAppFromAllUsers($app); return true; } } diff --git a/lib/private/preferences.php b/lib/private/preferences.php index cdaa207449d..9f33136aeb2 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -41,12 +41,9 @@ use OCP\IDBConnection; /** * This class provides an easy way for storing user preferences. + * @deprecated use \OCP\IConfig methods instead */ class Preferences { - /** - * @var \OC\DB\Connection - */ - protected $conn; /** * 3 dimensional array with the following structure: @@ -60,65 +57,14 @@ class Preferences { */ protected $cache = array(); + /** @var \OCP\IConfig */ + protected $config; + /** * @param \OCP\IDBConnection $conn */ public function __construct(IDBConnection $conn) { - $this->conn = $conn; - } - - /** - * Get all users using the preferences - * @return array an array of user ids - * - * This function returns a list of all users that have at least one entry - * in the preferences table. - */ - public function getUsers() { - $query = 'SELECT DISTINCT `userid` FROM `*PREFIX*preferences`'; - $result = $this->conn->executeQuery($query); - - $users = array(); - while ($userid = $result->fetchColumn()) { - $users[] = $userid; - } - - return $users; - } - - /** - * @param string $user - * @return array[] - */ - protected function getUserValues($user) { - if (isset($this->cache[$user])) { - return $this->cache[$user]; - } - $data = array(); - $query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; - $result = $this->conn->executeQuery($query, array($user)); - while ($row = $result->fetch()) { - $app = $row['appid']; - if (!isset($data[$app])) { - $data[$app] = array(); - } - $data[$app][$row['configkey']] = $row['configvalue']; - } - $this->cache[$user] = $data; - return $data; - } - - /** - * Get all apps of an user - * @param string $user user - * @return integer[] with app ids - * - * This function returns a list of all apps of the user that have at least - * one entry in the preferences table. - */ - public function getApps($user) { - $data = $this->getUserValues($user); - return array_keys($data); + $this->config = \OC::$server->getConfig(); } /** @@ -126,17 +72,13 @@ class Preferences { * @param string $user user * @param string $app the app we are looking for * @return array an array of key names + * @deprecated use getUserKeys of \OCP\IConfig instead * * This function gets all keys of an app of an user. Please note that the * values are not returned. */ public function getKeys($user, $app) { - $data = $this->getUserValues($user); - if (isset($data[$app])) { - return array_keys($data[$app]); - } else { - return array(); - } + return $this->config->getUserKeys($user, $app); } /** @@ -146,17 +88,13 @@ class Preferences { * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated use getUserValue of \OCP\IConfig instead * * This function gets a value from the preferences table. If the key does * not exist the default value will be returned */ public function getValue($user, $app, $key, $default = null) { - $data = $this->getUserValues($user); - if (isset($data[$app]) and isset($data[$app][$key])) { - return $data[$app][$key]; - } else { - return $default; - } + return $this->config->getUserValue($user, $app, $key, $default); } /** @@ -167,59 +105,16 @@ class Preferences { * @param string $value value * @param string $preCondition only set value if the key had a specific value before * @return bool true if value was set, otherwise false + * @deprecated use setUserValue of \OCP\IConfig instead * * Adds a value to the preferences. If the key did not exist before, it * will be added automagically. */ public function setValue($user, $app, $key, $value, $preCondition = null) { - // Check if the key does exist - $query = 'SELECT `configvalue` FROM `*PREFIX*preferences`' - . ' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; - $oldValue = $this->conn->fetchColumn($query, array($user, $app, $key)); - $exists = $oldValue !== false; - - if($oldValue === strval($value)) { - // no changes - return true; - } - - $affectedRows = 0; - - if (!$exists && $preCondition === null) { - $data = array( - 'userid' => $user, - 'appid' => $app, - 'configkey' => $key, - 'configvalue' => $value, - ); - $affectedRows = $this->conn->insert('*PREFIX*preferences', $data); - } elseif ($exists) { - $data = array($value, $user, $app, $key); - $sql = "UPDATE `*PREFIX*preferences` SET `configvalue` = ?" - . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"; - - if ($preCondition !== null) { - if (\OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { - //oracle hack: need to explicitly cast CLOB to CHAR for comparison - $sql .= " AND to_char(`configvalue`) = ?"; - } else { - $sql .= " AND `configvalue` = ?"; - } - $data[] = $preCondition; - } - $affectedRows = $this->conn->executeUpdate($sql, $data); - } - - // only add to the cache if we already loaded data for the user - if ($affectedRows > 0 && isset($this->cache[$user])) { - if (!isset($this->cache[$user][$app])) { - $this->cache[$user][$app] = array(); - } - $this->cache[$user][$app][$key] = $value; - } - - return ($affectedRows > 0) ? true : false; + return $this->config->setUserValue($user, $app, $key, $value); + // TODO maybe catch exceptions and then return false + return true; } /** @@ -228,35 +123,10 @@ class Preferences { * @param string $key * @param array $users * @return array Mapped values: userid => value + * @deprecated use getUserValueForUsers of \OCP\IConfig instead */ public function getValueForUsers($app, $key, $users) { - if (empty($users) || !is_array($users)) { - return array(); - } - - $chunked_users = array_chunk($users, 50, true); - $placeholders_50 = implode(',', array_fill(0, 50, '?')); - - $userValues = array(); - foreach ($chunked_users as $chunk) { - $queryParams = $chunk; - array_unshift($queryParams, $key); - array_unshift($queryParams, $app); - - $placeholders = (sizeof($chunk) == 50) ? $placeholders_50 : implode(',', array_fill(0, sizeof($chunk), '?')); - - $query = 'SELECT `userid`, `configvalue` ' - . ' FROM `*PREFIX*preferences` ' - . ' WHERE `appid` = ? AND `configkey` = ?' - . ' AND `userid` IN (' . $placeholders . ')'; - $result = $this->conn->executeQuery($query, $queryParams); - - while ($row = $result->fetch()) { - $userValues[$row['userid']] = $row['configvalue']; - } - } - - return $userValues; + return $this->config->getUserValueForUsers($app, $key, $users); } /** @@ -265,28 +135,10 @@ class Preferences { * @param string $key * @param string $value * @return array + * @deprecated use getUsersForUserValue of \OCP\IConfig instead */ public function getUsersForValue($app, $key, $value) { - $users = array(); - - $query = 'SELECT `userid` ' - . ' FROM `*PREFIX*preferences` ' - . ' WHERE `appid` = ? AND `configkey` = ? AND '; - - if (\OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { - //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison - $query .= ' to_char(`configvalue`)= ?'; - } else { - $query .= ' `configvalue` = ?'; - } - - $result = $this->conn->executeQuery($query, array($app, $key, $value)); - - while ($row = $result->fetch()) { - $users[] = $row['userid']; - } - - return $users; + return $this->config->getUsersForUserValue($app, $key, $value); } /** @@ -294,72 +146,33 @@ class Preferences { * @param string $user user * @param string $app app * @param string $key key + * @deprecated use deleteUserValue of \OCP\IConfig instead * * Deletes a key. */ public function deleteKey($user, $app, $key) { - $where = array( - 'userid' => $user, - 'appid' => $app, - 'configkey' => $key, - ); - $this->conn->delete('*PREFIX*preferences', $where); - - if (isset($this->cache[$user]) and isset($this->cache[$user][$app])) { - unset($this->cache[$user][$app][$key]); - } - } - - /** - * Remove app of user from preferences - * @param string $user user - * @param string $app app - * - * Removes all keys in preferences belonging to the app and the user. - */ - public function deleteApp($user, $app) { - $where = array( - 'userid' => $user, - 'appid' => $app, - ); - $this->conn->delete('*PREFIX*preferences', $where); - - if (isset($this->cache[$user])) { - unset($this->cache[$user][$app]); - } + $this->config->deleteUserValue($user, $app, $key); } /** * Remove user from preferences * @param string $user user + * @deprecated use deleteAllUserValues of \OCP\IConfig instead * * Removes all keys in preferences belonging to the user. */ public function deleteUser($user) { - $where = array( - 'userid' => $user, - ); - $this->conn->delete('*PREFIX*preferences', $where); - - unset($this->cache[$user]); + $this->config->deleteAllUserValues($user); } /** * Remove app from all users * @param string $app app + * @deprecated use deleteAppFromAllUsers of \OCP\IConfig instead * * Removes all keys in preferences belonging to the app. */ public function deleteAppFromAllUsers($app) { - $where = array( - 'appid' => $app, - ); - $this->conn->delete('*PREFIX*preferences', $where); - - foreach ($this->cache as &$userCache) { - unset($userCache[$app]); - } + $this->config->deleteAppFromAllUsers($app); } } - -require_once __DIR__ . '/legacy/' . basename(__FILE__); diff --git a/lib/private/server.php b/lib/private/server.php index 5a1e955bdd2..28406d87319 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -168,7 +168,8 @@ class Server extends SimpleContainer implements IServerContainer { }); $this->registerService('AllConfig', function (Server $c) { return new \OC\AllConfig( - $c->getSystemConfig() + $c->getSystemConfig(), + $c->getDatabaseConnection() ); }); $this->registerService('SystemConfig', function ($c) { diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index fe155cc61b0..1d3502ffb4c 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -109,7 +109,6 @@ interface IConfig { * @param string $appName the appName that we want to store the value under * @param string $key the key under which the value is being stored * @param string $value the value that you want to store - * @return void */ public function setUserValue($userId, $appName, $key, $value); @@ -124,6 +123,16 @@ interface IConfig { */ public function getUserValue($userId, $appName, $key, $default = ''); + /** + * Fetches a mapped list of userId -> value, for a specified app and key and a list of user IDs. + * + * @param $appName app to get the value for + * @param $key the key to get the value for + * @param $userIds the user IDs to fetch the values for + * @return array Mapped values: userId => value + */ + public function getUserValueForUsers($appName, $key, $userIds); + /** * Get the keys of all stored by an app for the user * @@ -148,4 +157,21 @@ interface IConfig { * @param string $userId the userId of the user that we want to remove all values from */ public function deleteAllUserValues($userId); + + /** + * Delete all user related values of one app + * + * @param string $appName the appName of the app that we want to remove all values from + */ + public function deleteAppFromAllUsers($appName); + + /** + * Determines the users that have the given value set for a specific app-key-pair + * + * @param string $appName the app to get the user for + * @param string $key the key to get the user for + * @param string $value the value to get the user for + * @return array of user IDs + */ + public function getUsersForUserValue($appName, $key, $value); } diff --git a/tests/lib/allconfig.php b/tests/lib/allconfig.php new file mode 100644 index 00000000000..a2da46a6105 --- /dev/null +++ b/tests/lib/allconfig.php @@ -0,0 +1,334 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test; + +class TestAllConfig extends \Test\TestCase { + + /** @var \OCP\IDBConnection */ + protected $connection; + + protected function getConfig($systemConfig = null, $connection = null) { + if($this->connection === null) { + $this->connection = \OC::$server->getDatabaseConnection(); + } + if($connection === null) { + $connection = $this->connection; + } + if($systemConfig === null) { + $systemConfig = $this->getMock('\OC\SystemConfig'); + } + return new \OC\AllConfig($systemConfig, $connection); + } + + public function testDeleteUserValue() { + $config = $this->getConfig(); + + // preparation - add something to the database + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + array('userDelete', 'appDelete', 'keyDelete', 'valueDelete') + ); + + $config->deleteUserValue('userDelete', 'appDelete', 'keyDelete'); + + $result = $this->connection->executeQuery( + 'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences` WHERE `userid` = ?', + array('userDelete') + )->fetch(); + $actualCount = $result['count']; + + $this->assertEquals(0, $actualCount, 'There was one value in the database and after the tests there should be no entry left.'); + } + + public function testSetUserValue() { + $selectAllSQL = 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; + $config = $this->getConfig(); + + $config->setUserValue('userSet', 'appSet', 'keySet', 'valueSet'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userSet'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userSet', + 'appid' => 'appSet', + 'configkey' => 'keySet', + 'configvalue' => 'valueSet' + ), $result[0]); + + // test if the method overwrites existing database entries + $config->setUserValue('userSet', 'appSet', 'keySet', 'valueSet2'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userSet'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userSet', + 'appid' => 'appSet', + 'configkey' => 'keySet', + 'configvalue' => 'valueSet2' + ), $result[0]); + + // cleanup - it therefore relies on the successful execution of the previous test + $config->deleteUserValue('userSet', 'appSet', 'keySet'); + } + + public function testSetUserValueUnchanged() { + $resultMock = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement') + ->disableOriginalConstructor()->getMock(); + $resultMock->expects($this->once()) + ->method('fetchColumn') + ->will($this->returnValue('valueSetUnchanged')); + + $connectionMock = $this->getMock('\OCP\IDBConnection'); + $connectionMock->expects($this->once()) + ->method('executeQuery') + ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences` '. + 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'), + $this->equalTo(array('userSetUnchanged', 'appSetUnchanged', 'keySetUnchanged'))) + ->will($this->returnValue($resultMock)); + $connectionMock->expects($this->never()) + ->method('executeUpdate'); + + $config = $this->getConfig(null, $connectionMock); + + $config->setUserValue('userSetUnchanged', 'appSetUnchanged', 'keySetUnchanged', 'valueSetUnchanged'); + } + + public function testGetUserValue() { + $config = $this->getConfig(); + + // setup - it therefore relies on the successful execution of the previous test + $config->setUserValue('userGet', 'appGet', 'keyGet', 'valueGet'); + $value = $config->getUserValue('userGet', 'appGet', 'keyGet'); + + $this->assertEquals('valueGet', $value); + + $result = $this->connection->executeQuery( + 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?', + array('userGet') + )->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userGet', + 'appid' => 'appGet', + 'configkey' => 'keyGet', + 'configvalue' => 'valueGet' + ), $result[0]); + + // drop data from database - but the config option should be cached in the config object + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?', array('userGet')); + + // testing the caching mechanism + $value = $config->getUserValue('userGet', 'appGet', 'keyGet'); + + $this->assertEquals('valueGet', $value); + + $result = $this->connection->executeQuery( + 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?', + array('userGet') + )->fetchAll(); + + $this->assertEquals(0, count($result)); + } + + public function testGetUserKeys() { + $config = $this->getConfig(); + + // preparation - add something to the database + $data = array( + array('userFetch', 'appFetch1', 'keyFetch1', 'value1'), + array('userFetch', 'appFetch1', 'keyFetch2', 'value2'), + array('userFetch', 'appFetch2', 'keyFetch3', 'value3'), + array('userFetch', 'appFetch1', 'keyFetch4', 'value4'), + array('userFetch', 'appFetch4', 'keyFetch1', 'value5'), + array('userFetch', 'appFetch5', 'keyFetch1', 'value6'), + array('userFetch2', 'appFetch', 'keyFetch1', 'value7') + ); + foreach ($data as $entry) { + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + $entry + ); + } + + $value = $config->getUserKeys('userFetch', 'appFetch1'); + $this->assertEquals(array('keyFetch1', 'keyFetch2', 'keyFetch4'), $value); + + $value = $config->getUserKeys('userFetch2', 'appFetch'); + $this->assertEquals(array('keyFetch1'), $value); + + // cleanup + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`'); + } + + public function testGetUserValueDefault() { + $config = $this->getConfig(); + + $this->assertEquals('', $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset')); + $this->assertEquals(null, $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset', null)); + $this->assertEquals('foobar', $config->getUserValue('userGetUnset', 'appGetUnset', 'keyGetUnset', 'foobar')); + } + + public function testGetUserValueForUsers() { + $config = $this->getConfig(); + + // preparation - add something to the database + $data = array( + array('userFetch1', 'appFetch2', 'keyFetch1', 'value1'), + array('userFetch2', 'appFetch2', 'keyFetch1', 'value2'), + array('userFetch3', 'appFetch2', 'keyFetch1', 3), + array('userFetch4', 'appFetch2', 'keyFetch1', 'value4'), + array('userFetch5', 'appFetch2', 'keyFetch1', 'value5'), + array('userFetch6', 'appFetch2', 'keyFetch1', 'value6'), + array('userFetch7', 'appFetch2', 'keyFetch1', 'value7') + ); + foreach ($data as $entry) { + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + $entry + ); + } + + $value = $config->getUserValueForUsers('appFetch2', 'keyFetch1', + array('userFetch1', 'userFetch2', 'userFetch3', 'userFetch5')); + $this->assertEquals(array( + 'userFetch1' => 'value1', + 'userFetch2' => 'value2', + 'userFetch3' => 3, + 'userFetch5' => 'value5' + ), $value); + + $value = $config->getUserValueForUsers('appFetch2', 'keyFetch1', + array('userFetch1', 'userFetch4', 'userFetch9')); + $this->assertEquals(array( + 'userFetch1' => 'value1', + 'userFetch4' => 'value4' + ), $value, 'userFetch9 is an non-existent user and should not be shown.'); + + // cleanup + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`'); + } + + public function testDeleteAllUserValues() { + $config = $this->getConfig(); + + // preparation - add something to the database + $data = array( + array('userFetch3', 'appFetch1', 'keyFetch1', 'value1'), + array('userFetch3', 'appFetch1', 'keyFetch2', 'value2'), + array('userFetch3', 'appFetch2', 'keyFetch3', 'value3'), + array('userFetch3', 'appFetch1', 'keyFetch4', 'value4'), + array('userFetch3', 'appFetch4', 'keyFetch1', 'value5'), + array('userFetch3', 'appFetch5', 'keyFetch1', 'value6'), + array('userFetch4', 'appFetch2', 'keyFetch1', 'value7') + ); + foreach ($data as $entry) { + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + $entry + ); + } + + $config->deleteAllUserValues('userFetch3'); + + $result = $this->connection->executeQuery( + 'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`' + )->fetch(); + $actualCount = $result['count']; + + $this->assertEquals(1, $actualCount, 'After removing `userFetch3` there should be exactly 1 entry left.'); + + // cleanup + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`'); + } + + public function testDeleteAppFromAllUsers() { + $config = $this->getConfig(); + + // preparation - add something to the database + $data = array( + array('userFetch5', 'appFetch1', 'keyFetch1', 'value1'), + array('userFetch5', 'appFetch1', 'keyFetch2', 'value2'), + array('userFetch5', 'appFetch2', 'keyFetch3', 'value3'), + array('userFetch5', 'appFetch1', 'keyFetch4', 'value4'), + array('userFetch5', 'appFetch4', 'keyFetch1', 'value5'), + array('userFetch5', 'appFetch5', 'keyFetch1', 'value6'), + array('userFetch6', 'appFetch2', 'keyFetch1', 'value7') + ); + foreach ($data as $entry) { + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + $entry + ); + } + + $config->deleteAppFromAllUsers('appFetch1'); + + $result = $this->connection->executeQuery( + 'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`' + )->fetch(); + $actualCount = $result['count']; + + $this->assertEquals(4, $actualCount, 'After removing `appFetch1` there should be exactly 4 entries left.'); + + $config->deleteAppFromAllUsers('appFetch2'); + + $result = $this->connection->executeQuery( + 'SELECT COUNT(*) AS `count` FROM `*PREFIX*preferences`' + )->fetch(); + $actualCount = $result['count']; + + $this->assertEquals(2, $actualCount, 'After removing `appFetch2` there should be exactly 2 entries left.'); + + // cleanup + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`'); + } + + public function testGetUsersForUserValue() { + // mock the check for the database to run the correct SQL statements for each database type + $systemConfig = $this->getMock('\OC\SystemConfig'); + $systemConfig->expects($this->once()) + ->method('getValue') + ->with($this->equalTo('dbtype'), + $this->equalTo('sqlite')) + ->will($this->returnValue(\OC::$server->getConfig()->getSystemValue('dbtype', 'sqlite'))); + $config = $this->getConfig($systemConfig); + + // preparation - add something to the database + $data = array( + array('user1', 'appFetch9', 'keyFetch9', 'value9'), + array('user2', 'appFetch9', 'keyFetch9', 'value9'), + array('user3', 'appFetch9', 'keyFetch9', 'value8'), + array('user4', 'appFetch9', 'keyFetch8', 'value9'), + array('user5', 'appFetch8', 'keyFetch9', 'value9'), + array('user6', 'appFetch9', 'keyFetch9', 'value9'), + ); + foreach ($data as $entry) { + $this->connection->executeUpdate( + 'INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, ' . + '`configkey`, `configvalue`) VALUES (?, ?, ?, ?)', + $entry + ); + } + + $value = $config->getUsersForUserValue('appFetch9', 'keyFetch9', 'value9'); + $this->assertEquals(array('user1', 'user2', 'user6'), $value); + + // cleanup + $this->connection->executeUpdate('DELETE FROM `*PREFIX*preferences`'); + } + +} diff --git a/tests/lib/preferences-singleton.php b/tests/lib/preferences-singleton.php deleted file mode 100644 index 01e15acdfe1..00000000000 --- a/tests/lib/preferences-singleton.php +++ /dev/null @@ -1,176 +0,0 @@ - - * Copyright (c) 2013 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_Preferences extends \Test\TestCase { - public static function setUpBeforeClass() { - parent::setUpBeforeClass(); - - $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)'); - $query->execute(array("Someuser", "someapp", "somekey", "somevalue")); - - $query->execute(array("Someuser", "getusersapp", "somekey", "somevalue")); - $query->execute(array("Anotheruser", "getusersapp", "somekey", "someothervalue")); - $query->execute(array("Anuser", "getusersapp", "somekey", "somevalue")); - - $query->execute(array("Someuser", "getappsapp", "somekey", "somevalue")); - - $query->execute(array("Someuser", "getkeysapp", "firstkey", "somevalue")); - $query->execute(array("Someuser", "getkeysapp", "anotherkey", "somevalue")); - $query->execute(array("Someuser", "getkeysapp", "key-tastic", "somevalue")); - - $query->execute(array("Someuser", "getvalueapp", "key", "a value for a key")); - - $query->execute(array("Deleteuser", "deleteapp", "deletekey", "somevalue")); - $query->execute(array("Deleteuser", "deleteapp", "somekey", "somevalue")); - $query->execute(array("Deleteuser", "someapp", "somekey", "somevalue")); - } - - public static function tearDownAfterClass() { - $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?'); - $query->execute(array('Someuser')); - $query->execute(array('Anotheruser')); - $query->execute(array('Anuser')); - - parent::tearDownAfterClass(); - } - - public function testGetUsers() { - $query = \OC_DB::prepare('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`'); - $result = $query->execute(); - $expected = array(); - while ($row = $result->fetchRow()) { - $expected[] = $row['userid']; - } - - sort($expected); - $users = \OC_Preferences::getUsers(); - sort($users); - $this->assertEquals($expected, $users); - } - - public function testGetApps() { - $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*preferences` WHERE `userid` = ?'); - $result = $query->execute(array('Someuser')); - $expected = array(); - while ($row = $result->fetchRow()) { - $expected[] = $row['appid']; - } - - sort($expected); - $apps = \OC_Preferences::getApps('Someuser'); - sort($apps); - $this->assertEquals($expected, $apps); - } - - public function testGetKeys() { - $query = \OC_DB::prepare('SELECT DISTINCT `configkey` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?'); - $result = $query->execute(array('Someuser', 'getkeysapp')); - $expected = array(); - while ($row = $result->fetchRow()) { - $expected[] = $row['configkey']; - } - - sort($expected); - $keys = \OC_Preferences::getKeys('Someuser', 'getkeysapp'); - sort($keys); - $this->assertEquals($expected, $keys); - } - - public function testGetValue() { - $this->assertNull(\OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant')); - - $this->assertEquals('default', \OC_Preferences::getValue('nonexistant', 'nonexistant', 'nonexistant', 'default')); - - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'getvalueapp', 'key')); - $row = $result->fetchRow(); - $expected = $row['configvalue']; - $this->assertEquals($expected, \OC_Preferences::getValue('Someuser', 'getvalueapp', 'key')); - } - - public function testSetValue() { - $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $value = $row['configvalue']; - $this->assertEquals('newvalue', $value); - - $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $value = $row['configvalue']; - $this->assertEquals('othervalue', $value); - } - - public function testSetValueWithPreCondition() { - // remove existing key - $this->assertTrue(\OC_Preferences::deleteKey('Someuser', 'setvalueapp', 'newkey')); - - // add new preference with pre-condition should fails - $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue', 'preCondition')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $this->assertFalse($row); - - // add new preference without pre-condition should insert the new value - $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'newvalue')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $value = $row['configvalue']; - $this->assertEquals('newvalue', $value); - - // wrong pre-condition, value should stay the same - $this->assertFalse(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'preCondition')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $value = $row['configvalue']; - $this->assertEquals('newvalue', $value); - - // correct pre-condition, value should change - $this->assertTrue(\OC_Preferences::setValue('Someuser', 'setvalueapp', 'newkey', 'othervalue', 'newvalue')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Someuser', 'setvalueapp', 'newkey')); - $row = $result->fetchRow(); - $value = $row['configvalue']; - $this->assertEquals('othervalue', $value); - } - - public function testDeleteKey() { - $this->assertTrue(\OC_Preferences::deleteKey('Deleteuser', 'deleteapp', 'deletekey')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'); - $result = $query->execute(array('Deleteuser', 'deleteapp', 'deletekey')); - $this->assertEquals(0, count($result->fetchAll())); - } - - public function testDeleteApp() { - $this->assertTrue(\OC_Preferences::deleteApp('Deleteuser', 'deleteapp')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?'); - $result = $query->execute(array('Deleteuser', 'deleteapp')); - $this->assertEquals(0, count($result->fetchAll())); - } - - public function testDeleteUser() { - $this->assertTrue(\OC_Preferences::deleteUser('Deleteuser')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'); - $result = $query->execute(array('Deleteuser')); - $this->assertEquals(0, count($result->fetchAll())); - } - - public function testDeleteAppFromAllUsers() { - $this->assertTrue(\OC_Preferences::deleteAppFromAllUsers('someapp')); - $query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `appid` = ?'); - $result = $query->execute(array('someapp')); - $this->assertEquals(0, count($result->fetchAll())); - } -} diff --git a/tests/lib/preferences.php b/tests/lib/preferences.php deleted file mode 100644 index 193b1f80280..00000000000 --- a/tests/lib/preferences.php +++ /dev/null @@ -1,241 +0,0 @@ - - * Copyright (c) 2013 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_Preferences_Object extends \Test\TestCase { - public function testGetUsers() - { - $statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false); - $statementMock->expects($this->exactly(2)) - ->method('fetchColumn') - ->will($this->onConsecutiveCalls('foo', false)); - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('executeQuery') - ->with($this->equalTo('SELECT DISTINCT `userid` FROM `*PREFIX*preferences`')) - ->will($this->returnValue($statementMock)); - - $preferences = new OC\Preferences($connectionMock); - $apps = $preferences->getUsers(); - $this->assertEquals(array('foo'), $apps); - } - - public function testSetValue() - { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->exactly(2)) - ->method('fetchColumn') - ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`' - .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'), - $this->equalTo(array('grg', 'bar', 'foo'))) - ->will($this->onConsecutiveCalls(false, 'v1')); - $connectionMock->expects($this->once()) - ->method('insert') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - 'appid' => 'bar', - 'configkey' => 'foo', - 'configvalue' => 'v1', - ) - )); - $connectionMock->expects($this->once()) - ->method('executeUpdate') - ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?" - . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"), - $this->equalTo(array('v2', 'grg', 'bar', 'foo')) - ); - - $preferences = new OC\Preferences($connectionMock); - $preferences->setValue('grg', 'bar', 'foo', 'v1'); - $preferences->setValue('grg', 'bar', 'foo', 'v2'); - } - - public function testSetValueUnchanged() { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->exactly(3)) - ->method('fetchColumn') - ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`' - .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'), - $this->equalTo(array('grg', 'bar', 'foo'))) - ->will($this->onConsecutiveCalls(false, 'v1', 'v1')); - $connectionMock->expects($this->once()) - ->method('insert') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - 'appid' => 'bar', - 'configkey' => 'foo', - 'configvalue' => 'v1', - ) - )); - $connectionMock->expects($this->never()) - ->method('executeUpdate'); - - $preferences = new OC\Preferences($connectionMock); - $preferences->setValue('grg', 'bar', 'foo', 'v1'); - $preferences->setValue('grg', 'bar', 'foo', 'v1'); - $preferences->setValue('grg', 'bar', 'foo', 'v1'); - } - - public function testSetValueUnchanged2() { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->exactly(3)) - ->method('fetchColumn') - ->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*preferences`' - .' WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'), - $this->equalTo(array('grg', 'bar', 'foo'))) - ->will($this->onConsecutiveCalls(false, 'v1', 'v2')); - $connectionMock->expects($this->once()) - ->method('insert') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - 'appid' => 'bar', - 'configkey' => 'foo', - 'configvalue' => 'v1', - ) - )); - $connectionMock->expects($this->once()) - ->method('executeUpdate') - ->with($this->equalTo("UPDATE `*PREFIX*preferences` SET `configvalue` = ?" - . " WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?"), - $this->equalTo(array('v2', 'grg', 'bar', 'foo')) - ); - - $preferences = new OC\Preferences($connectionMock); - $preferences->setValue('grg', 'bar', 'foo', 'v1'); - $preferences->setValue('grg', 'bar', 'foo', 'v2'); - $preferences->setValue('grg', 'bar', 'foo', 'v2'); - } - - public function testGetUserValues() - { - $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)'); - $query->execute(array('SomeUser', 'testGetUserValues', 'somekey', 'somevalue')); - $query->execute(array('AnotherUser', 'testGetUserValues', 'somekey', 'someothervalue')); - $query->execute(array('AUser', 'testGetUserValues', 'somekey', 'somevalue')); - - $preferences = new OC\Preferences(\OC_DB::getConnection()); - $users = array('SomeUser', 'AnotherUser', 'NoValueSet'); - - $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users); - $this->assertUserValues($values); - - // Add a lot of users so the array is chunked - for ($i = 1; $i <= 75; $i++) { - array_unshift($users, 'NoValueBefore#' . $i); - array_push($users, 'NoValueAfter#' . $i); - } - - $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users); - $this->assertUserValues($values); - - // Clean DB after the test - $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?'); - $query->execute(array('testGetUserValues')); - } - - protected function assertUserValues($values) { - $this->assertEquals(2, sizeof($values)); - - $this->assertArrayHasKey('SomeUser', $values); - $this->assertEquals('somevalue', $values['SomeUser']); - - $this->assertArrayHasKey('AnotherUser', $values); - $this->assertEquals('someothervalue', $values['AnotherUser']); - } - - public function testGetValueUsers() - { - // Prepare data - $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)'); - $query->execute(array('SomeUser', 'testGetUsersForValue', 'somekey', 'somevalue')); - $query->execute(array('AnotherUser', 'testGetUsersForValue', 'somekey', 'someothervalue')); - $query->execute(array('AUser', 'testGetUsersForValue', 'somekey', 'somevalue')); - - $preferences = new OC\Preferences(\OC_DB::getConnection()); - $result = $preferences->getUsersForValue('testGetUsersForValue', 'somekey', 'somevalue'); - sort($result); - $this->assertEquals(array('AUser', 'SomeUser'), $result); - - // Clean DB after the test - $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?'); - $query->execute(array('testGetUsersForValue')); - } - - public function testDeleteKey() - { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('delete') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - 'appid' => 'bar', - 'configkey' => 'foo', - ) - )); - - $preferences = new OC\Preferences($connectionMock); - $preferences->deleteKey('grg', 'bar', 'foo'); - } - - public function testDeleteApp() - { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('delete') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - 'appid' => 'bar', - ) - )); - - $preferences = new OC\Preferences($connectionMock); - $preferences->deleteApp('grg', 'bar'); - } - - public function testDeleteUser() - { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('delete') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'userid' => 'grg', - ) - )); - - $preferences = new OC\Preferences($connectionMock); - $preferences->deleteUser('grg'); - } - - public function testDeleteAppFromAllUsers() - { - $connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false); - $connectionMock->expects($this->once()) - ->method('delete') - ->with($this->equalTo('*PREFIX*preferences'), - $this->equalTo( - array( - 'appid' => 'bar', - ) - )); - - $preferences = new OC\Preferences($connectionMock); - $preferences->deleteAppFromAllUsers('bar'); - } -} -- cgit v1.2.3 From af91ee97c981d32bcd531e71d31e16f1232c44ce Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Wed, 3 Dec 2014 21:31:29 +0100 Subject: introduce preCondition for setUserValue to provide atomic check-and-update --- lib/private/allconfig.php | 28 +++++++--- lib/private/legacy/preferences.php | 10 ++-- lib/private/preferences.php | 11 ++-- lib/public/iconfig.php | 4 +- lib/public/preconditionnotmetexception.php | 30 +++++++++++ tests/lib/allconfig.php | 85 ++++++++++++++++++++++++++++++ 6 files changed, 153 insertions(+), 15 deletions(-) create mode 100644 lib/public/preconditionnotmetexception.php (limited to 'tests') diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 17872fd4f69..ed4378cfc44 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -9,6 +9,7 @@ namespace OC; use OCP\IDBConnection; +use OCP\PreConditionNotMetException; /** * Class to combine all the configuration options ownCloud offers @@ -140,8 +141,10 @@ class AllConfig implements \OCP\IConfig { * @param string $appName the appName that we want to store the value under * @param string $key the key under which the value is being stored * @param string $value the value that you want to store + * @param string $preCondition only update if the config value was previously the value passed as $preCondition + * @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met */ - public function setUserValue($userId, $appName, $key, $value) { + public function setUserValue($userId, $appName, $key, $value, $preCondition = null) { // Check if the key does exist $sql = 'SELECT `configvalue` FROM `*PREFIX*preferences` '. 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; @@ -154,15 +157,24 @@ class AllConfig implements \OCP\IConfig { return; } - if (!$exists) { + $data = array($value, $userId, $appName, $key); + if (!$exists && $preCondition === null) { $sql = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'. 'VALUES (?, ?, ?, ?)'; - } else { + } elseif ($exists) { $sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '. - 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; - + 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? '; + + if($preCondition !== null) { + if($this->getSystemValue('dbtype', 'sqlite') === 'oci') { + //oracle hack: need to explicitly cast CLOB to CHAR for comparison + $sql .= 'AND to_char(`configvalue`) = ?'; + } else { + $sql .= 'AND `configvalue` = ?'; + } + $data[] = $preCondition; + } } - $data = array($value, $userId, $appName, $key); $affectedRows = $this->connection->executeUpdate($sql, $data); // only add to the cache if we already loaded data for the user @@ -172,6 +184,10 @@ class AllConfig implements \OCP\IConfig { } $this->userCache[$userId][$appName][$key] = $value; } + + if ($preCondition !== null && $affectedRows === 0) { + throw new PreConditionNotMetException; + } } /** diff --git a/lib/private/legacy/preferences.php b/lib/private/legacy/preferences.php index 28af124db32..907aafbc915 100644 --- a/lib/private/legacy/preferences.php +++ b/lib/private/legacy/preferences.php @@ -70,10 +70,12 @@ class OC_Preferences{ * will be added automagically. */ public static function setValue( $user, $app, $key, $value, $preCondition = null ) { - return \OC::$server->getConfig()->setUserValue($user, $app, $key, $value); - - // TODO maybe catch exceptions and then return false - return true; + try { + \OC::$server->getConfig()->setUserValue($user, $app, $key, $value, $preCondition); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } /** diff --git a/lib/private/preferences.php b/lib/private/preferences.php index 9f33136aeb2..cd4a9fd1c19 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -37,6 +37,7 @@ namespace OC; use OCP\IDBConnection; +use OCP\PreConditionNotMetException; /** @@ -111,10 +112,12 @@ class Preferences { * will be added automagically. */ public function setValue($user, $app, $key, $value, $preCondition = null) { - return $this->config->setUserValue($user, $app, $key, $value); - - // TODO maybe catch exceptions and then return false - return true; + try { + $this->config->setUserValue($user, $app, $key, $value, $preCondition); + return true; + } catch(PreConditionNotMetException $e) { + return false; + } } /** diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index 1d3502ffb4c..fe0f1273a80 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -109,8 +109,10 @@ interface IConfig { * @param string $appName the appName that we want to store the value under * @param string $key the key under which the value is being stored * @param string $value the value that you want to store + * @param string $preCondition only update if the config value was previously the value passed as $preCondition + * @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met */ - public function setUserValue($userId, $appName, $key, $value); + public function setUserValue($userId, $appName, $key, $value, $preCondition = null); /** * Shortcut for getting a user defined value diff --git a/lib/public/preconditionnotmetexception.php b/lib/public/preconditionnotmetexception.php new file mode 100644 index 00000000000..ceba01a0b4b --- /dev/null +++ b/lib/public/preconditionnotmetexception.php @@ -0,0 +1,30 @@ + + * + * 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 . + * + */ + +// use OCP namespace for all classes that are considered public. +// This means that they should be used by apps instead of the internal ownCloud classes +namespace OCP; + +/** + * Exception if the precondition of the config update method isn't met + */ +class PreConditionNotMetException extends \Exception {} diff --git a/tests/lib/allconfig.php b/tests/lib/allconfig.php index a2da46a6105..63ee60f2078 100644 --- a/tests/lib/allconfig.php +++ b/tests/lib/allconfig.php @@ -80,6 +80,91 @@ class TestAllConfig extends \Test\TestCase { $config->deleteUserValue('userSet', 'appSet', 'keySet'); } + public function testSetUserValueWithPreCondition() { + // mock the check for the database to run the correct SQL statements for each database type + $systemConfig = $this->getMock('\OC\SystemConfig'); + $systemConfig->expects($this->once()) + ->method('getValue') + ->with($this->equalTo('dbtype'), + $this->equalTo('sqlite')) + ->will($this->returnValue(\OC::$server->getConfig()->getSystemValue('dbtype', 'sqlite'))); + $config = $this->getConfig($systemConfig); + + $selectAllSQL = 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; + + $config->setUserValue('userPreCond', 'appPreCond', 'keyPreCond', 'valuePreCond'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userPreCond'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userPreCond', + 'appid' => 'appPreCond', + 'configkey' => 'keyPreCond', + 'configvalue' => 'valuePreCond' + ), $result[0]); + + // test if the method overwrites existing database entries with valid precond + $config->setUserValue('userPreCond', 'appPreCond', 'keyPreCond', 'valuePreCond2', 'valuePreCond'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userPreCond'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userPreCond', + 'appid' => 'appPreCond', + 'configkey' => 'keyPreCond', + 'configvalue' => 'valuePreCond2' + ), $result[0]); + + // cleanup + $config->deleteUserValue('userPreCond', 'appPreCond', 'keyPreCond'); + } + + /** + * @expectedException \OCP\PreConditionNotMetException + */ + public function testSetUserValueWithPreConditionFailure() { + // mock the check for the database to run the correct SQL statements for each database type + $systemConfig = $this->getMock('\OC\SystemConfig'); + $systemConfig->expects($this->once()) + ->method('getValue') + ->with($this->equalTo('dbtype'), + $this->equalTo('sqlite')) + ->will($this->returnValue(\OC::$server->getConfig()->getSystemValue('dbtype', 'sqlite'))); + $config = $this->getConfig($systemConfig); + + $selectAllSQL = 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?'; + + $config->setUserValue('userPreCond1', 'appPreCond', 'keyPreCond', 'valuePreCond'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userPreCond1'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userPreCond1', + 'appid' => 'appPreCond', + 'configkey' => 'keyPreCond', + 'configvalue' => 'valuePreCond' + ), $result[0]); + + // test if the method overwrites existing database entries with valid precond + $config->setUserValue('userPreCond1', 'appPreCond', 'keyPreCond', 'valuePreCond2', 'valuePreCond3'); + + $result = $this->connection->executeQuery($selectAllSQL, array('userPreCond1'))->fetchAll(); + + $this->assertEquals(1, count($result)); + $this->assertEquals(array( + 'userid' => 'userPreCond1', + 'appid' => 'appPreCond', + 'configkey' => 'keyPreCond', + 'configvalue' => 'valuePreCond' + ), $result[0]); + + // cleanup + $config->deleteUserValue('userPreCond1', 'appPreCond', 'keyPreCond'); + } + public function testSetUserValueUnchanged() { $resultMock = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement') ->disableOriginalConstructor()->getMock(); -- cgit v1.2.3 From 2d5fc9c1a6beec15f04277ccf1408b17f04631e9 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 4 Dec 2014 09:35:01 +0100 Subject: Workaround to fix the too early init dilemma * this needs to be properly fixed by a proper organisation of the base.php * introduced fixDIInit() in AllConfig that moves the injection of DatabaseConnection to a later point in time * problems mostly because of the autoconfig setup --- lib/private/allconfig.php | 41 ++++++++++++++++++++++++++++++++++++++--- lib/private/server.php | 3 +-- tests/lib/allconfig.php | 3 +++ 3 files changed, 42 insertions(+), 5 deletions(-) (limited to 'tests') diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index ed4378cfc44..ea919006f96 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -46,9 +46,27 @@ class AllConfig implements \OCP\IConfig { /** * @param SystemConfig $systemConfig */ - function __construct(SystemConfig $systemConfig, IDBConnection $connection) { + function __construct(SystemConfig $systemConfig) { $this->systemConfig = $systemConfig; - $this->connection = $connection; + } + + /** + * TODO - FIXME This fixes an issue with base.php that cause cyclic + * dependencies, especially with autoconfig setup + * + * Replace this by properly injected database connection. Currently the + * base.php triggers the getDatabaseConnection too early which causes in + * autoconfig setup case a too early distributed database connection and + * the autoconfig then needs to reinit all already initialized dependencies + * that use the database connection. + * + * otherwise a SQLite database is created in the wrong directory + * because the database connection was created with an uninitialized config + */ + private function fixDIInit() { + if($this->connection === null) { + $this->connection = \OC::$server->getDatabaseConnection(); + } } /** @@ -145,6 +163,9 @@ class AllConfig implements \OCP\IConfig { * @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met */ public function setUserValue($userId, $appName, $key, $value, $preCondition = null) { + // TODO - FIXME + $this->fixDIInit(); + // Check if the key does exist $sql = 'SELECT `configvalue` FROM `*PREFIX*preferences` '. 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; @@ -232,6 +253,9 @@ class AllConfig implements \OCP\IConfig { * @param string $key the key under which the value is being stored */ public function deleteUserValue($userId, $appName, $key) { + // TODO - FIXME + $this->fixDIInit(); + $sql = 'DELETE FROM `*PREFIX*preferences` '. 'WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?'; $this->connection->executeUpdate($sql, array($userId, $appName, $key)); @@ -247,6 +271,9 @@ class AllConfig implements \OCP\IConfig { * @param string $userId the userId of the user that we want to remove all values from */ public function deleteAllUserValues($userId) { + // TODO - FIXME + $this->fixDIInit(); + $sql = 'DELETE FROM `*PREFIX*preferences` '. 'WHERE `userid` = ?'; $this->connection->executeUpdate($sql, array($userId)); @@ -260,6 +287,9 @@ class AllConfig implements \OCP\IConfig { * @param string $appName the appName of the app that we want to remove all values from */ public function deleteAppFromAllUsers($appName) { + // TODO - FIXME + $this->fixDIInit(); + $sql = 'DELETE FROM `*PREFIX*preferences` '. 'WHERE `appid` = ?'; $this->connection->executeUpdate($sql, array($appName)); @@ -279,6 +309,9 @@ class AllConfig implements \OCP\IConfig { * ] */ private function getUserValues($userId) { + // TODO - FIXME + $this->fixDIInit(); + if (isset($this->userCache[$userId])) { return $this->userCache[$userId]; } @@ -305,6 +338,9 @@ class AllConfig implements \OCP\IConfig { * @return array Mapped values: userId => value */ public function getUserValueForUsers($appName, $key, $userIds) { + // TODO - FIXME + $this->fixDIInit(); + if (empty($userIds) || !is_array($userIds)) { return array(); } @@ -333,7 +369,6 @@ class AllConfig implements \OCP\IConfig { } return $userValues; - } /** diff --git a/lib/private/server.php b/lib/private/server.php index 28406d87319..5a1e955bdd2 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -168,8 +168,7 @@ class Server extends SimpleContainer implements IServerContainer { }); $this->registerService('AllConfig', function (Server $c) { return new \OC\AllConfig( - $c->getSystemConfig(), - $c->getDatabaseConnection() + $c->getSystemConfig() ); }); $this->registerService('SystemConfig', function ($c) { diff --git a/tests/lib/allconfig.php b/tests/lib/allconfig.php index 63ee60f2078..7f8ad5ec221 100644 --- a/tests/lib/allconfig.php +++ b/tests/lib/allconfig.php @@ -166,6 +166,9 @@ class TestAllConfig extends \Test\TestCase { } public function testSetUserValueUnchanged() { + // TODO - FIXME until the dependency injection is handled properly (in AllConfig) + $this->markTestSkipped('Skipped because this is just testable if database connection can be injected'); + $resultMock = $this->getMockBuilder('\Doctrine\DBAL\Driver\Statement') ->disableOriginalConstructor()->getMock(); $resultMock->expects($this->once()) -- cgit v1.2.3 From 0d4f0ab87182cf2cb588bd3285fe41b46f26ee4d Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 4 Dec 2014 16:48:07 +0100 Subject: reduce OC_Preferences, OC_Config and \OCP\Config usage * files_encryption * files_versions * files_trashbin * tests * status.php * core * server container --- apps/files_encryption/hooks/hooks.php | 2 +- apps/files_encryption/lib/util.php | 20 +++++++++++++++----- apps/files_encryption/tests/util.php | 4 +++- apps/files_trashbin/lib/trashbin.php | 6 ++++-- apps/files_versions/lib/storage.php | 7 ++++--- lib/base.php | 2 +- lib/private/allconfig.php | 8 ++++---- lib/private/ocs/cloud.php | 2 +- lib/private/share/mailnotifications.php | 2 +- lib/private/user/session.php | 6 +++--- lib/private/user/user.php | 7 ++++--- lib/public/config.php | 4 ++-- settings/ajax/lostpassword.php | 2 +- settings/ajax/setlanguage.php | 2 +- settings/ajax/setquota.php | 2 +- settings/personal.php | 15 ++++++++------- settings/users.php | 6 ++++-- status.php | 6 ++++-- tests/lib/helperstorage.php | 2 +- tests/lib/user/session.php | 6 +++--- tests/lib/util.php | 8 ++++---- 21 files changed, 70 insertions(+), 49 deletions(-) (limited to 'tests') diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index a6b7555b376..f26eefa30e2 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -502,7 +502,7 @@ class Hooks { public static function preDisable($params) { if ($params['app'] === 'files_encryption') { - \OC_Preferences::deleteAppFromAllUsers('files_encryption'); + \OC::$server->getConfig()->deleteAppFromAllUsers('files_encryption'); $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); $session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED); diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index 42a7e20c87f..2b4a50d6e2b 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -225,7 +225,7 @@ class Util { */ public function recoveryEnabledForUser() { - $recoveryMode = \OC_Preferences::getValue($this->userId, 'files_encryption', 'recovery_enabled', '0'); + $recoveryMode = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'recovery_enabled', '0'); return ($recoveryMode === '1') ? true : false; @@ -239,7 +239,12 @@ class Util { public function setRecoveryForUser($enabled) { $value = $enabled ? '1' : '0'; - return \OC_Preferences::setValue($this->userId, 'files_encryption', 'recovery_enabled', $value); + try { + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'recovery_enabled', $value); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } @@ -1102,7 +1107,12 @@ class Util { // convert to string if preCondition is set $preCondition = ($preCondition === null) ? null : (string)$preCondition; - return \OC_Preferences::setValue($this->userId, 'files_encryption', 'migration_status', (string)$status, $preCondition); + try { + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)$status, $preCondition); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } @@ -1154,9 +1164,9 @@ class Util { $migrationStatus = false; if (\OCP\User::userExists($this->userId)) { - $migrationStatus = \OC_Preferences::getValue($this->userId, 'files_encryption', 'migration_status'); + $migrationStatus = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'migration_status', null); if ($migrationStatus === null) { - \OC_Preferences::setValue($this->userId, 'files_encryption', 'migration_status', (string)self::MIGRATION_OPEN); + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)self::MIGRATION_OPEN); $migrationStatus = self::MIGRATION_OPEN; } } diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php index 8d9aba423cd..2d58db2128c 100755 --- a/apps/files_encryption/tests/util.php +++ b/apps/files_encryption/tests/util.php @@ -617,7 +617,9 @@ class Test_Encryption_Util extends \OCA\Files_Encryption\Tests\TestCase { * @return boolean */ private function setMigrationStatus($status, $user) { - return \OC_Preferences::setValue($user, 'files_encryption', 'migration_status', (string)$status); + \OC::$server->getConfig()->setUserValue($user, 'files_encryption', 'migration_status', (string)$status); + // the update will definitely be executed -> return value is always true + return true; } } diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index 661fc271dfc..b9d7a4aa6cf 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -621,11 +621,13 @@ class Trashbin { * @return int available free space for trash bin */ private static function calculateFreeSpace($trashbinSize, $user) { + $config = \OC::$server->getConfig(); + $softQuota = true; - $quota = \OC_Preferences::getValue($user, 'files', 'quota'); + $quota = $config->getUserValue($user, 'files', 'quota', null); $view = new \OC\Files\View('/' . $user); if ($quota === null || $quota === 'default') { - $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota'); + $quota = $config->getAppValue('files', 'default_quota', null); } if ($quota === null || $quota === 'none') { $quota = \OC\Files\Filesystem::free_space('/'); diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php index 82e0ecc3e2f..3d30ada863a 100644 --- a/apps/files_versions/lib/storage.php +++ b/apps/files_versions/lib/storage.php @@ -479,15 +479,16 @@ class Storage { * Erase a file's versions which exceed the set quota */ private static function expire($filename, $versionsSize = null, $offset = 0) { - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + $config = \OC::$server->getConfig(); + if($config->getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); $versionsFileview = new \OC\Files\View('/'.$uid.'/files_versions'); // get available disk space for user $softQuota = true; - $quota = \OC_Preferences::getValue($uid, 'files', 'quota'); + $quota = $config->getUserValue($uid, 'files', 'quota', null); if ( $quota === null || $quota === 'default') { - $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota'); + $quota = $config->getAppValue('files', 'default_quota', null); } if ( $quota === null || $quota === 'none' ) { $quota = \OC\Files\Filesystem::free_space('/'); diff --git a/lib/base.php b/lib/base.php index 141657fe095..af2474c7d76 100644 --- a/lib/base.php +++ b/lib/base.php @@ -236,7 +236,7 @@ class OC { $header = 'Strict-Transport-Security: max-age=31536000'; // If SSL for subdomains is enabled add "; includeSubDomains" to the header - if(\OC::$server->getSystemConfig()->getmValue('forceSSLforSubdomains', false)) { + if(\OC::$server->getSystemConfig()->getValue('forceSSLforSubdomains', false)) { $header .= '; includeSubDomains'; } header($header); diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index ea919006f96..e20f3698258 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -117,7 +117,7 @@ class AllConfig implements \OCP\IConfig { * @param string $value the value that should be stored */ public function setAppValue($appName, $key, $value) { - \OCP\Config::setAppValue($appName, $key, $value); + \OC::$server->getAppConfig()->setValue($appName, $key, $value); } /** @@ -129,7 +129,7 @@ class AllConfig implements \OCP\IConfig { * @return string the saved value */ public function getAppValue($appName, $key, $default = '') { - return \OCP\Config::getAppValue($appName, $key, $default); + return \OC::$server->getAppConfig()->getValue($appName, $key, $default); } /** @@ -139,7 +139,7 @@ class AllConfig implements \OCP\IConfig { * @param string $key the key of the value, under which it was saved */ public function deleteAppValue($appName, $key) { - \OC_Appconfig::deleteKey($appName, $key); + \OC::$server->getAppConfig()->deleteKey($appName, $key); } /** @@ -148,7 +148,7 @@ class AllConfig implements \OCP\IConfig { * @param string $appName the appName the configs are stored under */ public function deleteAppValues($appName) { - \OC_Appconfig::deleteApp($appName); + \OC::$server->getAppConfig()->deleteApp($appName); } diff --git a/lib/private/ocs/cloud.php b/lib/private/ocs/cloud.php index 3ced0af8ee1..552aa96a26b 100644 --- a/lib/private/ocs/cloud.php +++ b/lib/private/ocs/cloud.php @@ -91,7 +91,7 @@ class OC_OCS_Cloud { } public static function getCurrentUser() { - $email=OC_Preferences::getValue(OC_User::getUser(), 'settings', 'email', ''); + $email=\OC::$server->getConfig()->getUserValue(OC_User::getUser(), 'settings', 'email', ''); $data = array( 'id' => OC_User::getUser(), 'display-name' => OC_User::getDisplayName(), diff --git a/lib/private/share/mailnotifications.php b/lib/private/share/mailnotifications.php index 2f704fb2b3c..342d3d5057a 100644 --- a/lib/private/share/mailnotifications.php +++ b/lib/private/share/mailnotifications.php @@ -79,7 +79,7 @@ class MailNotifications { foreach ($recipientList as $recipient) { $recipientDisplayName = \OCP\User::getDisplayName($recipient); - $to = \OC_Preferences::getValue($recipient, 'settings', 'email', ''); + $to = \OC::$server->getConfig()->getUserValue($recipient, 'settings', 'email', ''); if ($to === '') { $noMail[] = $recipientDisplayName; diff --git a/lib/private/user/session.php b/lib/private/user/session.php index 94abaca3e76..277aa1a047e 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -211,15 +211,15 @@ class Session implements IUserSession, Emitter { } // get stored tokens - $tokens = \OC_Preferences::getKeys($uid, 'login_token'); + $tokens = \OC::$server->getConfig()->getUserKeys($uid, 'login_token'); // test cookies token against stored tokens if (!in_array($currentToken, $tokens, true)) { return false; } // replace successfully used token with a new one - \OC_Preferences::deleteKey($uid, 'login_token', $currentToken); + \OC::$server->getConfig()->deleteUserValue($uid, 'login_token', $currentToken); $newToken = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(32); - \OC_Preferences::setValue($uid, 'login_token', $newToken, time()); + \OC::$server->getConfig()->setUserValue($uid, 'login_token', $newToken, time()); $this->setMagicInCookie($user->getUID(), $newToken); //login diff --git a/lib/private/user/user.php b/lib/private/user/user.php index fb66f893c61..00ded84f955 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -68,10 +68,11 @@ class User implements IUser { if ($this->config) { $enabled = $this->config->getUserValue($uid, 'core', 'enabled', 'true'); $this->enabled = ($enabled === 'true'); + $this->lastLogin = $this->config->getUserValue($uid, 'login', 'lastLogin', 0); } else { $this->enabled = true; + $this->lastLogin = \OC::$server->getConfig()->getUserValue($uid, 'login', 'lastLogin', 0); } - $this->lastLogin = \OC_Preferences::getValue($uid, 'login', 'lastLogin', 0); } /** @@ -140,7 +141,7 @@ class User implements IUser { */ public function updateLastLoginTimestamp() { $this->lastLogin = time(); - \OC_Preferences::setValue( + \OC::$server->getConfig()->setUserValue( $this->uid, 'login', 'lastLogin', $this->lastLogin); } @@ -163,7 +164,7 @@ class User implements IUser { \OC_Group::removeFromGroup($this->uid, $i); } // Delete the user's keys in preferences - \OC_Preferences::deleteUser($this->uid); + \OC::$server->getConfig()->deleteAllUserValues($this->uid); // Delete user files in /data/ \OC_Helper::rmdirr(\OC_User::getHome($this->uid)); diff --git a/lib/public/config.php b/lib/public/config.php index fc4df3f7567..70ff3a3fed0 100644 --- a/lib/public/config.php +++ b/lib/public/config.php @@ -96,7 +96,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::$server->getConfig()->getAppValue( $app, $key, $default ); } /** @@ -111,7 +111,7 @@ class Config { */ public static function setAppValue( $app, $key, $value ) { try { - \OC_Appconfig::setValue( $app, $key, $value ); + \OC::$server->getConfig()->setAppValue( $app, $key, $value ); } catch (\Exception $e) { return false; } diff --git a/settings/ajax/lostpassword.php b/settings/ajax/lostpassword.php index 395ba31f92b..b0fb20c4a7e 100644 --- a/settings/ajax/lostpassword.php +++ b/settings/ajax/lostpassword.php @@ -8,7 +8,7 @@ $l = \OC::$server->getL10N('settings'); // Get data if( isset( $_POST['email'] ) && OC_Mail::validateAddress($_POST['email']) ) { $email=trim($_POST['email']); - OC_Preferences::setValue(OC_User::getUser(), 'settings', 'email', $email); + \OC::$server->getConfig()->setUserValue(OC_User::getUser(), 'settings', 'email', $email); OC_JSON::success(array("data" => array( "message" => $l->t("Email saved") ))); }else{ OC_JSON::error(array("data" => array( "message" => $l->t("Invalid email") ))); diff --git a/settings/ajax/setlanguage.php b/settings/ajax/setlanguage.php index a3988db85bb..a83212927bf 100644 --- a/settings/ajax/setlanguage.php +++ b/settings/ajax/setlanguage.php @@ -11,7 +11,7 @@ if( isset( $_POST['lang'] ) ) { $languageCodes=OC_L10N::findAvailableLanguages(); $lang=$_POST['lang']; if(array_search($lang, $languageCodes) or $lang === 'en') { - OC_Preferences::setValue( OC_User::getUser(), 'core', 'lang', $lang ); + \OC::$server->getConfig()->setUserValue( OC_User::getUser(), 'core', 'lang', $lang ); OC_JSON::success(array("data" => array( "message" => $l->t("Language changed") ))); }else{ OC_JSON::error(array("data" => array( "message" => $l->t("Invalid request") ))); diff --git a/settings/ajax/setquota.php b/settings/ajax/setquota.php index f19506a0456..64a686e83d7 100644 --- a/settings/ajax/setquota.php +++ b/settings/ajax/setquota.php @@ -27,7 +27,7 @@ if($quota !== 'none' and $quota !== 'default') { // Return Success story if($username) { - OC_Preferences::setValue($username, 'files', 'quota', $quota); + \OC::$server->getConfig()->setUserValue($username, 'files', 'quota', $quota); }else{//set the default quota when no username is specified if($quota === 'default') {//'default' as default quota makes no sense $quota='none'; diff --git a/settings/personal.php b/settings/personal.php index bef800ae7f1..f181c9cb2c1 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -9,6 +9,7 @@ OC_Util::checkLoggedIn(); $defaults = new OC_Defaults(); // initialize themable default strings and urls $certificateManager = \OC::$server->getCertificateManager(); +$config = \OC::$server->getConfig(); // Highlight navigation entry OC_Util::addScript( 'settings', 'personal' ); @@ -16,7 +17,7 @@ OC_Util::addStyle( 'settings', 'settings' ); \OC_Util::addVendorScript('strengthify/jquery.strengthify'); \OC_Util::addVendorStyle('strengthify/strengthify'); \OC_Util::addScript('files', 'jquery.fileupload'); -if (\OC_Config::getValue('enable_avatars', true) === true) { +if ($config->getSystemValue('enable_avatars', true) === true) { \OC_Util::addVendorScript('jcrop/js/jquery.Jcrop'); \OC_Util::addVendorStyle('jcrop/css/jquery.Jcrop'); } @@ -26,9 +27,9 @@ OC_App::setActiveNavigationEntry( 'personal' ); $storageInfo=OC_Helper::getStorageInfo('/'); -$email=OC_Preferences::getValue(OC_User::getUser(), 'settings', 'email', ''); +$email=$config->getUserValue(OC_User::getUser(), 'settings', 'email', ''); -$userLang=OC_Preferences::getValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() ); +$userLang=$config->getUserValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() ); $languageCodes=OC_L10N::findAvailableLanguages(); //check if encryption was enabled in the past @@ -74,9 +75,9 @@ usort( $languages, function ($a, $b) { //links to clients $clients = array( - 'desktop' => OC_Config::getValue('customclient_desktop', $defaults->getSyncClientUrl()), - 'android' => OC_Config::getValue('customclient_android', $defaults->getAndroidClientUrl()), - 'ios' => OC_Config::getValue('customclient_ios', $defaults->getiOSClientUrl()) + 'desktop' => $config->getSystemValue('customclient_desktop', $defaults->getSyncClientUrl()), + 'android' => $config->getSystemValue('customclient_android', $defaults->getAndroidClientUrl()), + 'ios' => $config->getSystemValue('customclient_ios', $defaults->getiOSClientUrl()) ); // Return template @@ -95,7 +96,7 @@ $tmpl->assign('displayName', OC_User::getDisplayName()); $tmpl->assign('enableDecryptAll' , $enableDecryptAll); $tmpl->assign('backupKeysExists' , $backupKeysExists); $tmpl->assign('filesStillEncrypted' , $filesStillEncrypted); -$tmpl->assign('enableAvatars', \OC_Config::getValue('enable_avatars', true)); +$tmpl->assign('enableAvatars', $config->getSystemValue('enable_avatars', true)); $tmpl->assign('avatarChangeSupported', OC_User::canUserChangeAvatar(OC_User::getUser())); $tmpl->assign('certs', $certificateManager->listCertificates()); diff --git a/settings/users.php b/settings/users.php index 85f160a1552..3da8017b883 100644 --- a/settings/users.php +++ b/settings/users.php @@ -21,6 +21,8 @@ $users = array(); $userManager = \OC_User::getManager(); $groupManager = \OC_Group::getManager(); +$config = \OC::$server->getConfig(); + $isAdmin = OC_User::isAdminUser(OC_User::getUser()); $groupsInfo = new \OC\Group\MetaData(OC_User::getUser(), $isAdmin, $groupManager); @@ -28,7 +30,7 @@ $groupsInfo->setSorting($groupsInfo::SORT_USERCOUNT); list($adminGroup, $groups) = $groupsInfo->get(); $recoveryAdminEnabled = OC_App::isEnabled('files_encryption') && - OC_Appconfig::getValue( 'files_encryption', 'recoveryAdminEnabled' ); + $config->getAppValue( 'files_encryption', 'recoveryAdminEnabled', null ); if($isAdmin) { $accessibleUsers = OC_User::getDisplayNames('', 30); @@ -59,7 +61,7 @@ $defaultQuotaIsUserDefined=array_search($defaultQuota, $quotaPreset)===false // load users and quota foreach($accessibleUsers as $uid => $displayName) { - $quota = OC_Preferences::getValue($uid, 'files', 'quota', 'default'); + $quota = $config->getUserValue($uid, 'files', 'quota', 'default'); $isQuotaUserDefined = array_search($quota, $quotaPreset) === false && array_search($quota, array('none', 'default')) === false; diff --git a/status.php b/status.php index db5813814d0..f7bdfe1fd51 100644 --- a/status.php +++ b/status.php @@ -25,8 +25,10 @@ try { require_once 'lib/base.php'; - $installed = OC_Config::getValue('installed') == 1; - $maintenance = OC_Config::getValue('maintenance', false); + $systemConfig = \OC::$server->getSystemConfig(); + + $installed = $systemConfig->getValue('installed') == 1; + $maintenance = $systemConfig->getValue('maintenance', false); $values=array( 'installed'=>$installed, 'maintenance' => $maintenance, diff --git a/tests/lib/helperstorage.php b/tests/lib/helperstorage.php index 9f3bd8824f7..8b5f41fc94c 100644 --- a/tests/lib/helperstorage.php +++ b/tests/lib/helperstorage.php @@ -45,7 +45,7 @@ class Test_Helper_Storage extends \Test\TestCase { \OC_User::setUserId(''); \OC_User::deleteUser($this->user); - \OC_Preferences::deleteUser($this->user); + \OC::$server->getConfig()->deleteAllUserValues($this->user); parent::tearDown(); } diff --git a/tests/lib/user/session.php b/tests/lib/user/session.php index 8d9d024197c..aa1ea5841c0 100644 --- a/tests/lib/user/session.php +++ b/tests/lib/user/session.php @@ -234,7 +234,7 @@ class Session extends \Test\TestCase { //prepare login token $token = 'goodToken'; - \OC_Preferences::setValue('foo', 'login_token', $token, time()); + \OC::$server->getConfig()->setUserValue('foo', 'login_token', $token, time()); $userSession = $this->getMock( '\OC\User\Session', @@ -282,7 +282,7 @@ class Session extends \Test\TestCase { //prepare login token $token = 'goodToken'; - \OC_Preferences::setValue('foo', 'login_token', $token, time()); + \OC::$server->getConfig()->setUserValue('foo', 'login_token', $token, time()); $userSession = new \OC\User\Session($manager, $session); $granted = $userSession->loginWithCookie('foo', 'badToken'); @@ -323,7 +323,7 @@ class Session extends \Test\TestCase { //prepare login token $token = 'goodToken'; - \OC_Preferences::setValue('foo', 'login_token', $token, time()); + \OC::$server->getConfig()->setUserValue('foo', 'login_token', $token, time()); $userSession = new \OC\User\Session($manager, $session); $granted = $userSession->loginWithCookie('foo', $token); diff --git a/tests/lib/util.php b/tests/lib/util.php index 1ddbd2aba2b..3bb4b47c09c 100644 --- a/tests/lib/util.php +++ b/tests/lib/util.php @@ -152,7 +152,7 @@ class Test_Util extends \Test\TestCase { function testHomeStorageWrapperWithoutQuota() { $user1 = $this->getUniqueID(); \OC_User::createUser($user1, 'test'); - OC_Preferences::setValue($user1, 'files', 'quota', 'none'); + \OC::$server->getConfig()->setUserValue($user1, 'files', 'quota', 'none'); \OC_User::setUserId($user1); \OC_Util::setupFS($user1); @@ -164,7 +164,7 @@ class Test_Util extends \Test\TestCase { // clean up \OC_User::setUserId(''); \OC_User::deleteUser($user1); - OC_Preferences::deleteUser($user1); + \OC::$server->getConfig()->deleteAllUserValues($user1); \OC_Util::tearDownFS(); } @@ -174,7 +174,7 @@ class Test_Util extends \Test\TestCase { function testHomeStorageWrapperWithQuota() { $user1 = $this->getUniqueID(); \OC_User::createUser($user1, 'test'); - OC_Preferences::setValue($user1, 'files', 'quota', '1024'); + \OC::$server->getConfig()->setUserValue($user1, 'files', 'quota', '1024'); \OC_User::setUserId($user1); \OC_Util::setupFS($user1); @@ -191,7 +191,7 @@ class Test_Util extends \Test\TestCase { // clean up \OC_User::setUserId(''); \OC_User::deleteUser($user1); - OC_Preferences::deleteUser($user1); + \OC::$server->getConfig()->deleteAllUserValues($user1); \OC_Util::tearDownFS(); } -- cgit v1.2.3 From 9a7362dd0d4e0f738089302329ce10817377433e Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Fri, 28 Nov 2014 18:38:49 +0100 Subject: drop unused isDebugMode and setDebugMode of OC_Config --- lib/private/config.php | 18 ------------------ tests/lib/config.php | 33 --------------------------------- 2 files changed, 51 deletions(-) (limited to 'tests') diff --git a/lib/private/config.php b/lib/private/config.php index cc07d6a1ed1..8544de34b72 100644 --- a/lib/private/config.php +++ b/lib/private/config.php @@ -39,24 +39,6 @@ class Config { $this->debugMode = (defined('DEBUG') && DEBUG); } - /** - * Enables or disables the debug mode - * @param bool $state True to enable, false to disable - */ - public function setDebugMode($state) { - $this->debugMode = $state; - $this->writeData(); - $this->cache; - } - - /** - * Returns whether the debug mode is enabled or disabled - * @return bool True when enabled, false otherwise - */ - public function isDebugMode() { - return $this->debugMode; - } - /** * Lists all available config keys * @return array an array of key names diff --git a/tests/lib/config.php b/tests/lib/config.php index 9dff3aab84f..6adba356a1c 100644 --- a/tests/lib/config.php +++ b/tests/lib/config.php @@ -47,7 +47,6 @@ class Test_Config extends \Test\TestCase { } public function testSetValue() { - $this->config->setDebugMode(false); $this->config->setValue('foo', 'moo'); $expectedConfig = $this->initialConfig; $expectedConfig['foo'] = 'moo'; @@ -73,7 +72,6 @@ class Test_Config extends \Test\TestCase { } public function testDeleteKey() { - $this->config->setDebugMode(false); $this->config->deleteKey('foo'); $expectedConfig = $this->initialConfig; unset($expectedConfig['foo']); @@ -85,37 +83,6 @@ class Test_Config extends \Test\TestCase { $this->assertEquals($expected, $content); } - public function testSetDebugMode() { - $this->config->setDebugMode(true); - $this->assertAttributeEquals($this->initialConfig, 'cache', $this->config); - $this->assertAttributeEquals(true, 'debugMode', $this->config); - $content = file_get_contents($this->configFile); - $expected = " 'bar',\n 'beers' => \n array (\n 0 => 'Appenzeller',\n " . - " 1 => 'Guinness',\n 2 => 'Kölsch',\n ),\n 'alcohol_free' => false,\n);\n"; - $this->assertEquals($expected, $content); - - $this->config->setDebugMode(false); - $this->assertAttributeEquals($this->initialConfig, 'cache', $this->config); - $this->assertAttributeEquals(false, 'debugMode', $this->config); - $content = file_get_contents($this->configFile); - $expected = " 'bar',\n 'beers' => \n array (\n 0 => 'Appenzeller',\n " . - " 1 => 'Guinness',\n 2 => 'Kölsch',\n ),\n 'alcohol_free' => false,\n);\n"; - $this->assertEquals($expected, $content); - } - - public function testIsDebugMode() { - // Default - $this->assertFalse($this->config->isDebugMode()); - - // Manually set to false - $this->config->setDebugMode(false); - $this->assertFalse($this->config->isDebugMode()); - - // Manually set to true - $this->config->setDebugMode(true); - $this->assertTrue($this->config->isDebugMode()); - } - public function testConfigMerge() { // Create additional config $additionalConfig = '"totallyOutdated");'; -- cgit v1.2.3