diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2014-12-09 09:36:38 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2014-12-09 09:36:38 +0100 |
commit | c36bac3abdd4b41620bdebbc3391612aac620fb8 (patch) | |
tree | 81367a95e82769d78f862426b37e015a665642ea /lib | |
parent | 8f8f9deb66af0e32c508bbca033573824b1388f5 (diff) | |
parent | 9a7362dd0d4e0f738089302329ce10817377433e (diff) | |
download | nextcloud-server-c36bac3abdd4b41620bdebbc3391612aac620fb8.tar.gz nextcloud-server-c36bac3abdd4b41620bdebbc3391612aac620fb8.zip |
Merge pull request #12406 from owncloud/drop-getApps-getUsers
Config cleanup - OC_Preferences refactoring
Diffstat (limited to 'lib')
-rw-r--r-- | lib/base.php | 50 | ||||
-rw-r--r-- | lib/private/allconfig.php | 293 | ||||
-rw-r--r-- | lib/private/config.php | 18 | ||||
-rw-r--r-- | lib/private/db/connectionfactory.php | 20 | ||||
-rw-r--r-- | lib/private/httphelper.php | 8 | ||||
-rw-r--r-- | lib/private/legacy/preferences.php | 64 | ||||
-rw-r--r-- | lib/private/ocs/cloud.php | 2 | ||||
-rw-r--r-- | lib/private/preferences.php | 234 | ||||
-rw-r--r-- | lib/private/server.php | 23 | ||||
-rw-r--r-- | lib/private/share/mailnotifications.php | 2 | ||||
-rw-r--r-- | lib/private/systemconfig.php | 49 | ||||
-rw-r--r-- | lib/private/user/manager.php | 7 | ||||
-rw-r--r-- | lib/private/user/session.php | 6 | ||||
-rw-r--r-- | lib/private/user/user.php | 14 | ||||
-rw-r--r-- | lib/public/config.php | 22 | ||||
-rw-r--r-- | lib/public/iappconfig.php | 7 | ||||
-rw-r--r-- | lib/public/iconfig.php | 46 | ||||
-rw-r--r-- | lib/public/preconditionnotmetexception.php | 30 |
18 files changed, 544 insertions, 351 deletions
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 {} |