diff options
39 files changed, 1034 insertions, 841 deletions
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 a019e9a0009..af2474c7d76 100644 --- a/lib/base.php +++ b/lib/base.php @@ -218,7 +218,7 @@ class OC { public static function checkInstalled() { // Redirect to installer if not installed - if (!\OC::$server->getConfig()->getSystemValue('installed', false) && OC::$SUBURI != '/index.php') { + if (!\OC::$server->getSystemConfig()->getValue('installed', false) && OC::$SUBURI != '/index.php') { if (OC::$CLI) { throw new Exception('Not installed'); } else { @@ -231,12 +231,12 @@ class OC { public static function checkSSL() { // redirect to https site if configured - if (\OC::$server->getConfig()->getSystemValue('forcessl', false)) { + if (\OC::$server->getSystemConfig()->getValue('forcessl', false)) { // Default HSTS policy $header = 'Strict-Transport-Security: max-age=31536000'; // If SSL for subdomains is enabled add "; includeSubDomains" to the header - if(\OC::$server->getConfig()->getSystemValue('forceSSLforSubdomains', false)) { + if(\OC::$server->getSystemConfig()->getValue('forceSSLforSubdomains', false)) { $header .= '; includeSubDomains'; } header($header); @@ -256,7 +256,7 @@ class OC { public static function checkMaintenanceMode() { // Allow ajax update script to execute without being stopped - if (\OC::$server->getConfig()->getSystemValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') { + if (\OC::$server->getSystemConfig()->getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') { // send http status 503 header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); @@ -273,7 +273,7 @@ class OC { public static function checkSingleUserMode() { $user = OC_User::getUserSession()->getUser(); $group = OC_Group::getManager()->get('admin'); - if ($user && \OC::$server->getConfig()->getSystemValue('singleuser', false) && !$group->inGroup($user)) { + if ($user && \OC::$server->getSystemConfig()->getValue('singleuser', false) && !$group->inGroup($user)) { // send http status 503 header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); @@ -303,11 +303,11 @@ class OC { */ public static function checkUpgrade($showTemplate = true) { if (\OCP\Util::needUpgrade()) { - $config = \OC::$server->getConfig(); - if ($showTemplate && !$config->getSystemValue('maintenance', false)) { + $systemConfig = \OC::$server->getSystemConfig(); + if ($showTemplate && !$systemConfig->getValue('maintenance', false)) { $version = OC_Util::getVersion(); - $oldTheme = $config->getSystemValue('theme'); - $config->setSystemValue('theme', ''); + $oldTheme = $systemConfig->getValue('theme'); + $systemConfig->setValue('theme', ''); OC_Util::addScript('config'); // needed for web root OC_Util::addScript('update'); $tmpl = new OC_Template('', 'update.admin', 'guest'); @@ -361,7 +361,7 @@ class OC { OC_Util::addVendorScript('moment/min/moment-with-locales'); // avatars - if (\OC::$server->getConfig()->getSystemValue('enable_avatars', true) === true) { + if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) { \OC_Util::addScript('placeholder'); \OC_Util::addVendorScript('blueimp-md5/js/md5'); \OC_Util::addScript('jquery.avatar'); @@ -557,10 +557,10 @@ class OC { $sessionLifeTime = self::getSessionLifeTime(); @ini_set('gc_maxlifetime', (string)$sessionLifeTime); - $config = \OC::$server->getConfig(); + $systemConfig = \OC::$server->getSystemConfig(); // User and Groups - if (!$config->getSystemValue("installed", false)) { + if (!$systemConfig->getValue("installed", false)) { self::$server->getSession()->set('user_id', ''); } @@ -583,14 +583,14 @@ class OC { $tmpManager = \OC::$server->getTempManager(); register_shutdown_function(array($tmpManager, 'clean')); - if ($config->getSystemValue('installed', false) && !self::checkUpgrade(false)) { - if (\OC::$server->getAppConfig()->getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { + if ($systemConfig->getValue('installed', false) && !self::checkUpgrade(false)) { + if (\OC::$server->getConfig()->getAppValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { OC_Util::addScript('backgroundjobs'); } } // Check whether the sample configuration has been copied - if($config->getSystemValue('copied_sample_config', false)) { + if($systemConfig->getValue('copied_sample_config', false)) { $l = \OC::$server->getL10N('lib'); header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); @@ -632,7 +632,7 @@ class OC { * register hooks for the cache */ public static function registerCacheHooks() { - if (\OC::$server->getConfig()->getSystemValue('installed', false) && !\OCP\Util::needUpgrade()) { //don't try to do this before we are properly setup + if (\OC::$server->getSystemConfig()->getValue('installed', false) && !\OCP\Util::needUpgrade()) { //don't try to do this before we are properly setup \OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC'); // NOTE: This will be replaced to use OCP @@ -645,11 +645,11 @@ class OC { * register hooks for the cache */ public static function registerLogRotate() { - $config = \OC::$server->getConfig(); - if ($config->getSystemValue('installed', false) && $config->getSystemValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) { + $systemConfig = \OC::$server->getSystemConfig(); + if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !\OCP\Util::needUpgrade()) { //don't try to do this before we are properly setup //use custom logfile path if defined, otherwise use default of owncloud.log in data directory - \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $config->getSystemValue('logfile', $config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log')); + \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log')); } } @@ -679,7 +679,7 @@ class OC { * register hooks for sharing */ public static function registerShareHooks() { - if (\OC::$server->getConfig()->getSystemValue('installed')) { + if (\OC::$server->getSystemConfig()->getValue('installed')) { OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share\Hooks', 'post_deleteUser'); OC_Hook::connect('OC_User', 'post_addToGroup', 'OC\Share\Hooks', 'post_addToGroup'); OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share\Hooks', 'post_removeFromGroup'); @@ -694,7 +694,7 @@ class OC { // generate an instanceid via \OC_Util::getInstanceId() because the // config file may not be writable. As such, we only register a class // loader cache if instanceid is available without trying to create one. - $instanceId = \OC::$server->getConfig()->getSystemValue('instanceid', null); + $instanceId = \OC::$server->getSystemConfig()->getValue('instanceid', null); if ($instanceId) { try { $memcacheFactory = new \OC\Memcache\Factory($instanceId); @@ -709,13 +709,13 @@ class OC { */ public static function handleRequest() { \OC::$server->getEventLogger()->start('handle_request', 'Handle request'); - $config = \OC::$server->getConfig(); + $systemConfig = \OC::$server->getSystemConfig(); // load all the classpaths from the enabled apps so they are available // in the routing files of each app OC::loadAppClassPaths(); // Check if ownCloud is installed or in maintenance (update) mode - if (!$config->getSystemValue('installed', false)) { + if (!$systemConfig->getValue('installed', false)) { \OC::$server->getSession()->clear(); $controller = new OC\Core\Setup\Controller(\OC::$server->getConfig()); $controller->run($_POST); @@ -730,7 +730,7 @@ class OC { if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) { try { - if (!$config->getSystemValue('maintenance', false) && !\OCP\Util::needUpgrade()) { + if (!$systemConfig->getValue('maintenance', false) && !\OCP\Util::needUpgrade()) { OC_App::loadApps(array('authentication')); OC_App::loadApps(array('filesystem', 'logging')); OC_App::loadApps(); @@ -796,7 +796,7 @@ class OC { if (isset($_GET["logout"]) and ($_GET["logout"])) { OC_JSON::callCheck(); if (isset($_COOKIE['oc_token'])) { - $config->deleteUserValue(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']); + \OC::$server->getConfig()->deleteUserValue(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']); } OC_User::logout(); // redirect to webroot and add slash if webroot is empty diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 7ebff7cf2db..e20f3698258 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -8,11 +8,67 @@ */ namespace OC; +use OCP\IDBConnection; +use OCP\PreConditionNotMetException; /** * Class to combine all the configuration options ownCloud offers */ 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) { + $this->systemConfig = $systemConfig; + } + + /** + * 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(); + } + } + /** * Sets a new system wide value * @@ -20,7 +76,7 @@ class AllConfig implements \OCP\IConfig { * @param mixed $value the value that should be stored */ public function setSystemValue($key, $value) { - \OCP\Config::setSystemValue($key, $value); + $this->systemConfig->setValue($key, $value); } /** @@ -31,7 +87,7 @@ class AllConfig implements \OCP\IConfig { * @return mixed the value or $default */ public function getSystemValue($key, $default = '') { - return \OCP\Config::getSystemValue($key, $default); + return $this->systemConfig->getValue($key, $default); } /** @@ -40,7 +96,7 @@ class AllConfig implements \OCP\IConfig { * @param string $key the key of the value, under which it was saved */ public function deleteSystemValue($key) { - \OCP\Config::deleteSystemValue($key); + $this->systemConfig->deleteValue($key); } /** @@ -61,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); } /** @@ -73,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); } /** @@ -83,7 +139,16 @@ 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); + } + + /** + * Removes all keys in appconfig belonging to the app + * + * @param string $appName the appName the configs are stored under + */ + public function deleteAppValues($appName) { + \OC::$server->getAppConfig()->deleteApp($appName); } @@ -94,13 +159,60 @@ 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) { - \OCP\Config::setUserValue($userId, $appName, $key, $value); + 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` = ?'; + $result = $this->connection->executeQuery($sql, array($userId, $appName, $key)); + $oldValue = $result->fetchColumn(); + $exists = $oldValue !== false; + + if($oldValue === strval($value)) { + // no changes + return; + } + + $data = array($value, $userId, $appName, $key); + if (!$exists && $preCondition === null) { + $sql = 'INSERT INTO `*PREFIX*preferences` (`configvalue`, `userid`, `appid`, `configkey`)'. + 'VALUES (?, ?, ?, ?)'; + } elseif ($exists) { + $sql = 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? '. + '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; + } + } + $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; + } + + if ($preCondition !== null && $affectedRows === 0) { + throw new PreConditionNotMetException; + } } /** - * 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 @@ -109,7 +221,12 @@ class AllConfig implements \OCP\IConfig { * @return string */ public function getUserValue($userId, $appName, $key, $default = '') { - return \OCP\Config::getUserValue($userId, $appName, $key, $default); + $data = $this->getUserValues($userId); + if (isset($data[$appName]) and isset($data[$appName][$key])) { + return $data[$appName][$key]; + } else { + return $default; + } } /** @@ -120,7 +237,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(); + } } /** @@ -131,6 +253,153 @@ 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); + // TODO - FIXME + $this->fixDIInit(); + + $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]); + } + } + + /** + * Delete all user values + * + * @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)); + + 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) { + // TODO - FIXME + $this->fixDIInit(); + + $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) { + // TODO - FIXME + $this->fixDIInit(); + + 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) { + // TODO - FIXME + $this->fixDIInit(); + + 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/config.php b/lib/private/config.php index cc07d6a1ed1..8544de34b72 100644 --- a/lib/private/config.php +++ b/lib/private/config.php @@ -40,24 +40,6 @@ class Config { } /** - * 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/lib/private/db/connectionfactory.php b/lib/private/db/connectionfactory.php index 58043b30440..9c75baf887d 100644 --- a/lib/private/db/connectionfactory.php +++ b/lib/private/db/connectionfactory.php @@ -123,23 +123,23 @@ class ConnectionFactory { /** * Create the connection parameters for the config * - * @param \OCP\IConfig $config + * @param \OC\SystemConfig $config * @return array */ public function createConnectionParams($config) { - $type = $config->getSystemValue('dbtype', 'sqlite'); + $type = $config->getValue('dbtype', 'sqlite'); $connectionParams = array( - 'user' => $config->getSystemValue('dbuser', ''), - 'password' => $config->getSystemValue('dbpassword', ''), + 'user' => $config->getValue('dbuser', ''), + 'password' => $config->getValue('dbpassword', ''), ); - $name = $config->getSystemValue('dbname', 'owncloud'); + $name = $config->getValue('dbname', 'owncloud'); if ($this->normalizeType($type) === 'sqlite3') { - $datadir = $config->getSystemValue("datadirectory", \OC::$SERVERROOT . '/data'); + $datadir = $config->getValue("datadirectory", \OC::$SERVERROOT . '/data'); $connectionParams['path'] = $datadir . '/' . $name . '.db'; } else { - $host = $config->getSystemValue('dbhost', ''); + $host = $config->getValue('dbhost', ''); if (strpos($host, ':')) { // Host variable may carry a port or socket. list($host, $portOrSocket) = explode(':', $host, 2); @@ -153,11 +153,11 @@ class ConnectionFactory { $connectionParams['dbname'] = $name; } - $connectionParams['tablePrefix'] = $config->getSystemValue('dbtableprefix', 'oc_'); - $connectionParams['sqlite.journal_mode'] = $config->getSystemValue('sqlite.journal_mode', 'WAL'); + $connectionParams['tablePrefix'] = $config->getValue('dbtableprefix', 'oc_'); + $connectionParams['sqlite.journal_mode'] = $config->getValue('sqlite.journal_mode', 'WAL'); //additional driver options, eg. for mysql ssl - $driverOptions = $config->getSystemValue('dbdriveroptions', null); + $driverOptions = $config->getValue('dbdriveroptions', null); if ($driverOptions) { $connectionParams['driverOptions'] = $driverOptions; } 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/legacy/preferences.php b/lib/private/legacy/preferences.php index 4b68b0e69aa..907aafbc915 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,18 @@ 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 ); + try { + \OC::$server->getConfig()->setUserValue($user, $app, $key, $value, $preCondition); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } /** @@ -100,24 +83,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 +97,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 +110,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/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/preferences.php b/lib/private/preferences.php index cdaa207449d..cd4a9fd1c19 100644 --- a/lib/private/preferences.php +++ b/lib/private/preferences.php @@ -37,16 +37,14 @@ namespace OC; use OCP\IDBConnection; +use OCP\PreConditionNotMetException; /** * 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 +58,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 +73,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 +89,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 +106,18 @@ 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 + try { + $this->config->setUserValue($user, $app, $key, $value, $preCondition); return true; + } catch(PreConditionNotMetException $e) { + return false; } - - $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; - } /** @@ -228,35 +126,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 +138,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 +149,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 9dc8a32b737..ce21980c532 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -167,8 +167,13 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('NavigationManager', function ($c) { return new \OC\NavigationManager(); }); - $this->registerService('AllConfig', function ($c) { - return new \OC\AllConfig(); + $this->registerService('AllConfig', function (Server $c) { + return new \OC\AllConfig( + $c->getSystemConfig() + ); + }); + $this->registerService('SystemConfig', function ($c) { + return new \OC\SystemConfig(); }); $this->registerService('AppConfig', function ($c) { return new \OC\AppConfig(\OC_DB::getConnection()); @@ -230,11 +235,12 @@ class Server extends SimpleContainer implements IServerContainer { }); $this->registerService('DatabaseConnection', function (Server $c) { $factory = new \OC\DB\ConnectionFactory(); - $type = $c->getConfig()->getSystemValue('dbtype', 'sqlite'); + $systemConfig = $c->getSystemConfig(); + $type = $systemConfig->getValue('dbtype', 'sqlite'); if (!$factory->isValidType($type)) { throw new \OC\DatabaseException('Invalid database type'); } - $connectionParams = $factory->createConnectionParams($c->getConfig()); + $connectionParams = $factory->createConnectionParams($systemConfig); $connection = $factory->getConnection($type, $connectionParams); $connection->getConfiguration()->setSQLLogger($c->getQueryLogger()); return $connection; @@ -446,6 +452,15 @@ class Server extends SimpleContainer implements IServerContainer { } /** + * For internal use only + * + * @return \OC\SystemConfig + */ + function getSystemConfig() { + return $this->query('SystemConfig'); + } + + /** * Returns the app config manager * * @return \OCP\IAppConfig 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/systemconfig.php b/lib/private/systemconfig.php new file mode 100644 index 00000000000..ce6883e5ab3 --- /dev/null +++ b/lib/private/systemconfig.php @@ -0,0 +1,49 @@ +<?php +/** + * Copyright (c) 2014 Morris Jobke <hey@morrisjobke.de> + * 2013 Bart Visscher <bartv@thisnet.nl> + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + * + */ + +namespace OC; + +/** + * Class which provides access to the system config values stored in config.php + * Internal class for bootstrap only. + * fixes cyclic DI: AllConfig needs AppConfig needs Database needs AllConfig + */ +class SystemConfig { + /** + * Sets a new system wide value + * + * @param string $key the key of the value, under which will be saved + * @param mixed $value the value that should be stored + */ + public function setValue($key, $value) { + \OC_Config::setValue($key, $value); + } + + /** + * Looks up a system wide defined value + * + * @param string $key the key of the value, under which it was saved + * @param mixed $default the default value to be returned if the value isn't set + * @return mixed the value or $default + */ + public function getValue($key, $default = '') { + return \OC_Config::getValue($key, $default); + } + + /** + * Delete a system wide defined value + * + * @param string $key the key of the value, under which it was saved + */ + public function deleteValue($key) { + \OC_Config::deleteKey($key); + } +} 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/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 ad85337f628..00ded84f955 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; @@ -67,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); } /** @@ -139,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); } @@ -162,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 65dde39cdce..70ff3a3fed0 100644 --- a/lib/public/config.php +++ b/lib/public/config.php @@ -37,6 +37,7 @@ namespace OCP; /** * This class provides functions to read and write configuration data. * configuration can be on a system, application or user level + * @deprecated use methods of \OCP\IConfig */ class Config { /** @@ -44,12 +45,13 @@ class Config { * @param string $key key * @param mixed $default = null default value * @return mixed the value or $default + * @deprecated use method getSystemValue of \OCP\IConfig * * This function gets the value from config.php. If it does not exist, * $default will be returned. */ public static function getSystemValue( $key, $default = null ) { - return \OC_Config::getValue( $key, $default ); + return \OC::$server->getConfig()->getSystemValue( $key, $default ); } /** @@ -57,13 +59,14 @@ class Config { * @param string $key key * @param mixed $value value * @return bool + * @deprecated use method setSystemValue of \OCP\IConfig * * This function sets the value and writes the config.php. If the file can * not be written, false will be returned. */ public static function setSystemValue( $key, $value ) { try { - \OC_Config::setValue( $key, $value ); + \OC::$server->getConfig()->setSystemValue( $key, $value ); } catch (\Exception $e) { return false; } @@ -73,11 +76,12 @@ class Config { /** * Deletes a value from config.php * @param string $key key + * @deprecated use method deleteSystemValue of \OCP\IConfig * * This function deletes the value from config.php. */ public static function deleteSystemValue( $key ) { - return \OC_Config::deleteKey( $key ); + \OC::$server->getConfig()->deleteSystemValue( $key ); } /** @@ -86,12 +90,13 @@ class Config { * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated use method getAppValue of \OCP\IConfig * * This function gets a value from the appconfig table. If the key does * 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 ); } /** @@ -100,12 +105,13 @@ class Config { * @param string $key key * @param string $value value * @return boolean true/false + * @deprecated use method setAppValue of \OCP\IConfig * * Sets a value. If the key did not exist before it will be created. */ 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; } @@ -119,12 +125,13 @@ class Config { * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated use method getUserValue of \OCP\IConfig * * This function gets a value from the preferences table. If the key does * not exist the default value will be returned */ public static function getUserValue( $user, $app, $key, $default = null ) { - return \OC_Preferences::getValue( $user, $app, $key, $default ); + return \OC::$server->getConfig()->getUserValue( $user, $app, $key, $default ); } /** @@ -134,13 +141,14 @@ class Config { * @param string $key key * @param string $value value * @return bool + * @deprecated use method setUserValue of \OCP\IConfig * * Adds a value to the preferences. If the key did not exist before, it * will be added automagically. */ public static function setUserValue( $user, $app, $key, $value ) { try { - \OC_Preferences::setValue( $user, $app, $key, $value ); + \OC::$server->getConfig()->setUserValue( $user, $app, $key, $value ); } catch (\Exception $e) { return false; } diff --git a/lib/public/iappconfig.php b/lib/public/iappconfig.php index d43eb70ee04..cbd1a7e0573 100644 --- a/lib/public/iappconfig.php +++ b/lib/public/iappconfig.php @@ -26,6 +26,7 @@ interface IAppConfig { * @param string $key key * @param string $default = null, default value if the key does not exist * @return string the value or $default + * @deprecated use method getAppValue of \OCP\IConfig * * This function gets a value from the appconfig table. If the key does * not exist the default value will be returned @@ -37,8 +38,7 @@ interface IAppConfig { * @param string $app app * @param string $key key * @return bool - * - * Deletes a key. + * @deprecated use method deleteAppValue of \OCP\IConfig */ public function deleteKey($app, $key); @@ -46,6 +46,7 @@ interface IAppConfig { * Get the available keys for an app * @param string $app the app we are looking for * @return array an array of key names + * @deprecated use method getAppKeys of \OCP\IConfig * * This function gets all keys of an app. Please note that the values are * not returned. @@ -66,6 +67,7 @@ interface IAppConfig { * @param string $app app * @param string $key key * @param string $value value + * @deprecated use method setAppValue of \OCP\IConfig * * Sets a value. If the key did not exist before it will be created. * @return void @@ -85,6 +87,7 @@ interface IAppConfig { * Remove app from appconfig * @param string $app app * @return bool + * @deprecated use method deleteAppValue of \OCP\IConfig * * Removes all keys in appconfig belonging to the app. */ diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index 554fee5b22f..fe0f1273a80 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -94,6 +94,13 @@ interface IConfig { */ public function deleteAppValue($appName, $key); + /** + * Removes all keys in appconfig belonging to the app + * + * @param string $appName the appName the configs are stored under + */ + public function deleteAppValues($appName); + /** * Set a user defined value @@ -102,9 +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 - * @return void + * @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 @@ -118,6 +126,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 * * @param string $userId the userId of the user that we want to store the value under @@ -134,4 +152,28 @@ interface IConfig { * @param string $key the key under which the value is being stored */ public function deleteUserValue($userId, $appName, $key); + + /** + * Delete all user values + * + * @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/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 @@ +<?php +/** + * ownCloud + * + * @author Morris Jobke + * @copyright 2014 Morris Jobke <hey@morrisjobke.de> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +// 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/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/allconfig.php b/tests/lib/allconfig.php new file mode 100644 index 00000000000..7f8ad5ec221 --- /dev/null +++ b/tests/lib/allconfig.php @@ -0,0 +1,422 @@ +<?php +/** + * Copyright (c) 2014 Morris Jobke <hey@morrisjobke.de> + * 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 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() { + // 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()) + ->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/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/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 = "<?php\ndefine('DEBUG',true);\n\$CONFIG = array (\n 'foo' => '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 = "<?php\n\$CONFIG = array (\n 'foo' => '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 = '<?php $CONFIG=array("php53"=>"totallyOutdated");'; 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/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/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 @@ -<?php -/** - * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it> - * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_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 @@ -<?php -/** - * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it> - * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_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'); - } -} 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/user/user.php b/tests/lib/user/user.php index 6aa7243a75a..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,10 +227,19 @@ class User extends \Test\TestCase { ->method('implementsActions') ->will($this->returnValue(false)); - $allConfig = new AllConfig(); + $allConfig = $this->getMockBuilder('\OCP\IConfig') + ->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() { 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(); } |