diff options
Diffstat (limited to 'lib/private')
-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 |
13 files changed, 425 insertions, 315 deletions
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)); |