summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2014-02-14 23:03:27 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2014-02-14 23:03:27 +0100
commit9fac95c2ab46a734607657bbad6f164aaa61286f (patch)
treefc035f83bc812fd4b2f36427bb130ddabf71433e /lib/private
parentb330d07b51a983dc563a91244a3c83e691c9e97d (diff)
parentdf282d9ef8e040833574fac5c5fd3cbbae1b3209 (diff)
downloadnextcloud-server-9fac95c2ab46a734607657bbad6f164aaa61286f.tar.gz
nextcloud-server-9fac95c2ab46a734607657bbad6f164aaa61286f.zip
Merge branch 'master' into scrutinizer_documentation_patches
Conflicts: lib/private/appconfig.php
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/appconfig.php194
-rw-r--r--lib/private/db/statementwrapper.php3
-rw-r--r--lib/private/files.php2
-rw-r--r--lib/private/files/cache/storage.php19
-rw-r--r--lib/private/files/fileinfo.php185
-rw-r--r--lib/private/files/storage/common.php9
-rw-r--r--lib/private/files/storage/local.php7
-rw-r--r--lib/private/files/storage/wrapper/wrapper.php8
-rw-r--r--lib/private/files/type/detection.php3
-rw-r--r--lib/private/files/view.php42
-rw-r--r--lib/private/group/manager.php14
-rw-r--r--lib/private/helper.php16
-rw-r--r--lib/private/image.php4
-rw-r--r--lib/private/l10n.php4
-rw-r--r--lib/private/legacy/appconfig.php126
-rw-r--r--lib/private/memcache/memcached.php12
-rw-r--r--lib/private/ocs/result.php18
-rw-r--r--lib/private/preview/office.php2
-rw-r--r--lib/private/preview/pdf.php2
-rw-r--r--lib/private/preview/svg.php2
-rw-r--r--lib/private/preview/unknown.php2
-rwxr-xr-xlib/private/request.php1
-rw-r--r--lib/private/response.php6
-rw-r--r--lib/private/server.php12
-rw-r--r--lib/private/setup/mysql.php12
-rw-r--r--lib/private/share/searchresultsorter.php59
-rw-r--r--lib/private/user.php3
27 files changed, 616 insertions, 151 deletions
diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php
index 5da0a7e906b..a32c1126c7b 100644
--- a/lib/private/appconfig.php
+++ b/lib/private/appconfig.php
@@ -33,15 +33,56 @@
*
*/
+namespace OC;
+
+use \OC\DB\Connection;
+
/**
* This class provides an easy way for apps to store config values in the
* database.
*/
-class OC_Appconfig {
+class AppConfig implements \OCP\IAppConfig {
+ /**
+ * @var \OC\DB\Connection $conn
+ */
+ protected $conn;
+
+ private $cache = array();
- private static $cache = array();
+ private $appsLoaded = array();
- private static $appsLoaded = array();
+ /**
+ * @param \OC\DB\Connection $conn
+ */
+ public function __construct(Connection $conn) {
+ $this->conn = $conn;
+ }
+
+ /**
+ * @param string $app
+ * @return string[]
+ */
+ private function getAppCache($app) {
+ if (!isset($this->cache[$app])) {
+ $this->cache[$app] = array();
+ }
+ return $this->cache[$app];
+ }
+
+ private function getAppValues($app) {
+ $appCache = $this->getAppCache($app);
+ if (array_search($app, $this->appsLoaded) === false) {
+ $query = 'SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`'
+ . ' WHERE `appid` = ?';
+ $result = $this->conn->executeQuery($query, array($app));
+ while ($row = $result->fetch()) {
+ $appCache[$row['configkey']] = $row['configvalue'];
+ }
+ $this->appsLoaded[] = $app;
+ }
+ $this->cache[$app] = $appCache;
+ return $appCache;
+ }
/**
* @brief Get all apps using the config
@@ -50,16 +91,14 @@ class OC_Appconfig {
* This function returns a list of all apps that have at least one
* entry in the appconfig table.
*/
- public static function getApps() {
- // No magic in here!
- $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`');
- $result = $query->execute();
+ public function getApps() {
+ $query = 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`';
+ $result = $this->conn->executeQuery($query);
$apps = array();
- while ($row = $result->fetchRow()) {
- $apps[] = $row["appid"];
+ while ($appid = $result->fetchColumn()) {
+ $apps[] = $appid;
}
-
return $apps;
}
@@ -71,39 +110,14 @@ class OC_Appconfig {
* This function gets all keys of an app. Please note that the values are
* not returned.
*/
- public static function getKeys($app) {
- // No magic in here as well
- $query = OC_DB::prepare('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?');
- $result = $query->execute(array($app));
-
- $keys = array();
- while ($row = $result->fetchRow()) {
- $keys[] = $row["configkey"];
- }
-
+ public function getKeys($app) {
+ $values = $this->getAppValues($app);
+ $keys = array_keys($values);
+ sort($keys);
return $keys;
}
/**
- * @param string $app
- */
- private static function getAppValues($app) {
- if (!isset(self::$cache[$app])) {
- self::$cache[$app] = array();
- }
- if (array_search($app, self::$appsLoaded) === false) {
- $query = OC_DB::prepare('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`'
- . ' WHERE `appid` = ?');
- $result = $query->execute(array($app));
- while ($row = $result->fetchRow()) {
- self::$cache[$app][$row['configkey']] = $row['configvalue'];
- }
- self::$appsLoaded[] = $app;
- }
- return self::$cache[$app];
- }
-
- /**
* @brief Gets the config value
* @param string $app app
* @param string $key key
@@ -113,18 +127,11 @@ class OC_Appconfig {
* This function gets a value from the appconfig table. If the key does
* not exist the default value will be returned
*/
- public static function getValue($app, $key, $default = null) {
- if (!isset(self::$cache[$app])) {
- self::$cache[$app] = array();
- }
- if (isset(self::$cache[$app][$key])) {
- return self::$cache[$app][$key];
- }
- $values = self::getAppValues($app);
+ public function getValue($app, $key, $default = null) {
+ $values = $this->getAppValues($app);
if (isset($values[$key])) {
return $values[$key];
} else {
- self::$cache[$app][$key] = $default;
return $default;
}
}
@@ -135,12 +142,9 @@ class OC_Appconfig {
* @param string $key
* @return bool
*/
- public static function hasKey($app, $key) {
- if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) {
- return true;
- }
- $exists = self::getKeys($app);
- return in_array($key, $exists);
+ public function hasKey($app, $key) {
+ $values = $this->getAppValues($app);
+ return isset($values[$key]);
}
/**
@@ -148,31 +152,32 @@ class OC_Appconfig {
* @param string $app app
* @param string $key key
* @param string $value value
- * @return boolean|null
*
* Sets a value. If the key did not exist before it will be created.
*/
- public static function setValue($app, $key, $value) {
- // Does the key exist? yes: update. No: insert
- if (!self::hasKey($app, $key)) {
- $query = OC_DB::prepare('INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )'
- . ' VALUES( ?, ?, ? )');
- $query->execute(array($app, $key, $value));
+ public function setValue($app, $key, $value) {
+ // Does the key exist? no: insert, yes: update.
+ if (!$this->hasKey($app, $key)) {
+ $data = array(
+ 'appid' => $app,
+ 'configkey' => $key,
+ 'configvalue' => $value,
+ );
+ $this->conn->insert('*PREFIX*appconfig', $data);
} else {
- $query = OC_DB::prepare('UPDATE `*PREFIX*appconfig` SET `configvalue` = ?'
- . ' WHERE `appid` = ? AND `configkey` = ?');
- $query->execute(array($value, $app, $key));
+ $data = array(
+ 'configvalue' => $value,
+ );
+ $where = array(
+ 'appid' => $app,
+ 'configkey' => $key,
+ );
+ $this->conn->update('*PREFIX*appconfig', $data, $where);
}
- // TODO where should this be documented?
- \OC_Hook::emit('OC_Appconfig', 'post_set_value', array(
- 'app' => $app,
- 'key' => $key,
- 'value' => $value
- ));
- if (!isset(self::$cache[$app])) {
- self::$cache[$app] = array();
+ if (!isset($this->cache[$app])) {
+ $this->cache[$app] = array();
}
- self::$cache[$app][$key] = $value;
+ $this->cache[$app][$key] = $value;
}
/**
@@ -181,15 +186,15 @@ class OC_Appconfig {
* @param string $key key
* @return bool
*/
- public static function deleteKey($app, $key) {
- // Boring!
- $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?');
- $query->execute(array($app, $key));
- if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) {
- unset(self::$cache[$app][$key]);
+ public function deleteKey($app, $key) {
+ $where = array(
+ 'appid' => $app,
+ 'configkey' => $key,
+ );
+ $this->conn->delete('*PREFIX*appconfig', $where);
+ if (isset($this->cache[$app]) and isset($this->cache[$app][$key])) {
+ unset($this->cache[$app][$key]);
}
-
- return true;
}
/**
@@ -199,13 +204,12 @@ class OC_Appconfig {
*
* Removes all keys in appconfig belonging to the app.
*/
- public static function deleteApp($app) {
- // Nothing special
- $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?');
- $query->execute(array($app));
- self::$cache[$app] = array();
-
- return true;
+ public function deleteApp($app) {
+ $where = array(
+ 'appid' => $app,
+ );
+ $this->conn->delete('*PREFIX*appconfig', $where);
+ unset($this->cache[$app]);
}
/**
@@ -215,10 +219,11 @@ class OC_Appconfig {
* @param string $key
* @return array
*/
- public static function getValues($app, $key) {
- if ($app !== false and $key !== false) {
+ public function getValues($app, $key) {
+ if (($app !== false) == ($key !== false)) {
return false;
}
+
$fields = '`configvalue`';
$where = 'WHERE';
$params = array();
@@ -233,13 +238,14 @@ class OC_Appconfig {
$params[] = $key;
$key = 'appid';
}
- $queryString = 'SELECT ' . $fields . ' FROM `*PREFIX*appconfig` ' . $where;
- $query = OC_DB::prepare($queryString);
- $result = $query->execute($params);
+ $query = 'SELECT ' . $fields . ' FROM `*PREFIX*appconfig` ' . $where;
+ $result = $this->conn->executeQuery($query, $params);
+
$values = array();
- while ($row = $result->fetchRow()) {
+ while ($row = $result->fetch((\PDO::FETCH_ASSOC))) {
$values[$row[$key]] = $row['configvalue'];
}
+
return $values;
}
}
diff --git a/lib/private/db/statementwrapper.php b/lib/private/db/statementwrapper.php
index 2da10741ce6..90dbef1c730 100644
--- a/lib/private/db/statementwrapper.php
+++ b/lib/private/db/statementwrapper.php
@@ -34,6 +34,9 @@ class OC_DB_StatementWrapper {
/**
* make execute return the result instead of a bool
+ *
+ * @param array $input
+ * @return \OC_DB_StatementWrapper | int
*/
public function execute($input=array()) {
if(OC_Config::getValue( "log_query", false)) {
diff --git a/lib/private/files.php b/lib/private/files.php
index 6fb7d9ff41d..4a6b9d8ca0e 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -131,7 +131,7 @@ class OC_Files {
}
if ($xsendfile) {
list($storage) = \OC\Files\Filesystem::resolvePath(\OC\Files\Filesystem::getView()->getAbsolutePath($filename));
- if ($storage instanceof \OC\Files\Storage\Local) {
+ if ($storage->isLocal()) {
self::addSendfileHeader(\OC\Files\Filesystem::getLocalFile($filename));
}
}
diff --git a/lib/private/files/cache/storage.php b/lib/private/files/cache/storage.php
index 59972667287..6b6b0bce9d7 100644
--- a/lib/private/files/cache/storage.php
+++ b/lib/private/files/cache/storage.php
@@ -76,4 +76,23 @@ class Storage {
return false;
}
}
+
+ /**
+ * remove the entry for the storage
+ *
+ * @param string $storageId
+ */
+ public static function remove($storageId) {
+ $storageCache = new Storage($storageId);
+ $numericId = $storageCache->getNumericId();
+
+ if (strlen($storageId) > 64) {
+ $storageId = md5($storageId);
+ }
+ $sql = 'DELETE FROM `*PREFIX*storages` WHERE `id` = ?';
+ \OC_DB::executeAudited($sql, array($storageId));
+
+ $sql = 'DELETE FROM `*PREFIX*filecache` WHERE `storage` = ?';
+ \OC_DB::executeAudited($sql, array($numericId));
+ }
}
diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php
new file mode 100644
index 00000000000..c77571cd2a7
--- /dev/null
+++ b/lib/private/files/fileinfo.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Files;
+
+class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
+ /**
+ * @var array $data
+ */
+ private $data;
+
+ /**
+ * @var string $path
+ */
+ private $path;
+
+ /**
+ * @var \OC\Files\Storage\Storage $storage
+ */
+ private $storage;
+
+ /**
+ * @var string $internalPath
+ */
+ private $internalPath;
+
+ public function __construct($path, $storage, $internalPath, $data) {
+ $this->path = $path;
+ $this->storage = $storage;
+ $this->internalPath = $internalPath;
+ $this->data = $data;
+ }
+
+ public function offsetSet($offset, $value) {
+ $this->data[$offset] = $value;
+ }
+
+ public function offsetExists($offset) {
+ return isset($this->data[$offset]);
+ }
+
+ public function offsetUnset($offset) {
+ unset($this->data[$offset]);
+ }
+
+ public function offsetGet($offset) {
+ return $this->data[$offset];
+ }
+
+ /**
+ * @return string
+ */
+ public function getPath() {
+ return $this->path;
+ }
+
+ /**
+ * @return \OCP\Files\Storage
+ */
+ public function getStorage() {
+ return $this->storage;
+ }
+
+ /**
+ * @return string
+ */
+ public function getInternalPath() {
+ return $this->internalPath;
+ }
+
+ /**
+ * @return int
+ */
+ public function getId() {
+ return $this->data['fileid'];
+ }
+
+ /**
+ * @return string
+ */
+ public function getMimetype() {
+ return $this->data['mimetype'];
+ }
+
+ /**
+ * @return string
+ */
+ public function getMimePart() {
+ return $this->data['mimepart'];
+ }
+
+ /**
+ * @return string
+ */
+ public function getName() {
+ return $this->data['name'];
+ }
+
+ /**
+ * @return string
+ */
+ public function getEtag() {
+ return $this->data['etag'];
+ }
+
+ /**
+ * @return int
+ */
+ public function getSize() {
+ return $this->data['size'];
+ }
+
+ /**
+ * @return int
+ */
+ public function getMTime() {
+ return $this->data['mtime'];
+ }
+
+ /**
+ * @return bool
+ */
+ public function isEncrypted() {
+ return $this->data['encrypted'];
+ }
+
+ /**
+ * @return int
+ */
+ public function getPermissions() {
+ return $this->data['permissions'];
+ }
+
+ /**
+ * @return \OCP\Files\FileInfo::TYPE_FILE | \OCP\Files\FileInfo::TYPE_FOLDER
+ */
+ public function getType() {
+ return $this->data['type'];
+ }
+
+ public function getData(){
+ return $this->data;
+ }
+
+ /**
+ * @param int $permissions
+ * @return bool
+ */
+ protected function checkPermissions($permissions) {
+ return ($this->getPermissions() & $permissions) === $permissions;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isReadable() {
+ return $this->checkPermissions(\OCP\PERMISSION_READ);
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUpdateable() {
+ return $this->checkPermissions(\OCP\PERMISSION_UPDATE);
+ }
+
+ /**
+ * @return bool
+ */
+ public function isDeletable() {
+ return $this->checkPermissions(\OCP\PERMISSION_DELETE);
+ }
+
+ /**
+ * @return bool
+ */
+ public function isShareable() {
+ return $this->checkPermissions(\OCP\PERMISSION_SHARE);
+ }
+}
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 35464035209..d4dca780ff3 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -380,4 +380,13 @@ abstract class Common implements \OC\Files\Storage\Storage {
public function free_space($path) {
return \OC\Files\SPACE_UNKNOWN;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLocal() {
+ // the common implementation returns a temporary file by
+ // default, which is not local
+ return false;
+ }
}
diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php
index ba5e036cd8e..a62230bdba5 100644
--- a/lib/private/files/storage/local.php
+++ b/lib/private/files/storage/local.php
@@ -307,5 +307,12 @@ if (\OC_Util::runningOnWindows()) {
public function hasUpdated($path, $time) {
return $this->filemtime($path) > $time;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLocal() {
+ return true;
+ }
}
}
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index f9adda80314..11ea9f71da7 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
@@ -432,4 +432,12 @@ class Wrapper implements \OC\Files\Storage\Storage {
public function test() {
return $this->storage->test();
}
+
+ /**
+ * Returns the wrapped storage's value for isLocal()
+ * @return bool wrapped storage's isLocal() value
+ */
+ public function isLocal() {
+ return $this->storage->isLocal();
+ }
}
diff --git a/lib/private/files/type/detection.php b/lib/private/files/type/detection.php
index d7cc9ebbf4e..11e439032ce 100644
--- a/lib/private/files/type/detection.php
+++ b/lib/private/files/type/detection.php
@@ -72,11 +72,12 @@ class Detection {
and function_exists('finfo_file') and $finfo = finfo_open(FILEINFO_MIME)
) {
$info = @strtolower(finfo_file($finfo, $path));
+ finfo_close($finfo);
if ($info) {
$mimeType = substr($info, 0, strpos($info, ';'));
return empty($mimeType) ? 'application/octet-stream' : $mimeType;
}
- finfo_close($finfo);
+
}
$isWrapped = (strpos($path, '://') !== false) and (substr($path, 0, 7) === 'file://');
if (!$isWrapped and $mimeType === 'application/octet-stream' && function_exists("mime_content_type")) {
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 147bbed1ef3..530aa8f7514 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -787,14 +787,7 @@ class View {
* @param string $path
* @param boolean $includeMountPoints whether to add mountpoint sizes,
* defaults to true
- * @return array
- *
- * returns an associative array with the following keys:
- * - size
- * - mtime
- * - mimetype
- * - encrypted
- * - versioned
+ * @return \OC\Files\FileInfo | false
*/
public function getFileInfo($path, $includeMountPoints = true) {
$data = array();
@@ -847,10 +840,13 @@ class View {
$data['permissions'] = $permissions;
}
}
+ if (!$data) {
+ return false;
+ }
$data = \OC_FileProxy::runPostProxies('getFileInfo', $path, $data);
- return $data;
+ return new FileInfo($path, $storage, $internalPath, $data);
}
/**
@@ -858,7 +854,7 @@ class View {
*
* @param string $directory path under datadirectory
* @param string $mimetype_filter limit returned content to this mimetype or mimepart
- * @return array
+ * @return FileInfo[]
*/
public function getDirectoryContent($directory, $mimetype_filter = '') {
$result = array();
@@ -884,7 +880,11 @@ class View {
$watcher->checkUpdate($internalPath);
}
- $files = $cache->getFolderContents($internalPath); //TODO: mimetype_filter
+ $files = array();
+ $contents = $cache->getFolderContents($internalPath); //TODO: mimetype_filter
+ foreach ($contents as $content) {
+ $files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content);
+ }
$permissions = $permissionsCache->getDirectoryPermissions($cache->getId($internalPath), $user);
$ids = array();
@@ -942,7 +942,7 @@ class View {
break;
}
}
- $files[] = $rootEntry;
+ $files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry);
}
}
}
@@ -964,6 +964,7 @@ class View {
$result = $files;
}
}
+
return $result;
}
@@ -971,12 +972,15 @@ class View {
* change file metadata
*
* @param string $path
- * @param array $data
+ * @param array | \OCP\Files\FileInfo $data
* @return int
*
* returns the fileid of the updated file
*/
public function putFileInfo($path, $data) {
+ if ($data instanceof FileInfo) {
+ $data = $data->getData();
+ }
$path = Filesystem::normalizePath($this->fakeRoot . '/' . $path);
/**
* @var \OC\Files\Storage\Storage $storage
@@ -1001,7 +1005,7 @@ class View {
* search for files with the name matching $query
*
* @param string $query
- * @return array
+ * @return FileInfo[]
*/
public function search($query) {
return $this->searchCommon('%' . $query . '%', 'search');
@@ -1011,7 +1015,7 @@ class View {
* search for files by mimetype
*
* @param string $mimetype
- * @return array
+ * @return FileInfo[]
*/
public function searchByMime($mimetype) {
return $this->searchCommon($mimetype, 'searchByMime');
@@ -1020,7 +1024,7 @@ class View {
/**
* @param string $query
* @param string $method
- * @return array
+ * @return FileInfo[]
*/
private function searchCommon($query, $method) {
$files = array();
@@ -1034,8 +1038,9 @@ class View {
$results = $cache->$method($query);
foreach ($results as $result) {
if (substr($mountPoint . $result['path'], 0, $rootLength + 1) === $this->fakeRoot . '/') {
+ $internalPath = $result['path'];
$result['path'] = substr($mountPoint . $result['path'], $rootLength);
- $files[] = $result;
+ $files[] = new FileInfo($mountPoint . $result['path'], $storage, $internalPath, $result);
}
}
@@ -1049,8 +1054,9 @@ class View {
$results = $cache->$method($query);
if ($results) {
foreach ($results as $result) {
+ $internalPath = $result['path'];
$result['path'] = $relativeMountPoint . $result['path'];
- $files[] = $result;
+ $files[] = new FileInfo($mountPoint . $result['path'], $storage, $internalPath, $result);
}
}
}
diff --git a/lib/private/group/manager.php b/lib/private/group/manager.php
index bf469d51d12..9b433b64fd4 100644
--- a/lib/private/group/manager.php
+++ b/lib/private/group/manager.php
@@ -76,12 +76,7 @@ class Manager extends PublicEmitter {
if (isset($this->cachedGroups[$gid])) {
return $this->cachedGroups[$gid];
}
- foreach ($this->backends as $backend) {
- if ($backend->groupExists($gid)) {
- return $this->getGroupObject($gid);
- }
- }
- return null;
+ return $this->getGroupObject($gid);
}
protected function getGroupObject($gid) {
@@ -91,6 +86,9 @@ class Manager extends PublicEmitter {
$backends[] = $backend;
}
}
+ if (count($backends) === 0) {
+ return null;
+ }
$this->cachedGroups[$gid] = new Group($gid, $backends, $this->userManager, $this);
return $this->cachedGroups[$gid];
}
@@ -110,8 +108,8 @@ class Manager extends PublicEmitter {
public function createGroup($gid) {
if (!$gid) {
return false;
- } else if ($this->groupExists($gid)) {
- return $this->get($gid);
+ } else if ($group = $this->get($gid)) {
+ return $group;
} else {
$this->emit('\OC\Group', 'preCreate', array($gid));
foreach ($this->backends as $backend) {
diff --git a/lib/private/helper.php b/lib/private/helper.php
index 580f81acc62..58cb1b88d66 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -804,18 +804,22 @@ class OC_Helper {
/**
* @brief calculates the maximum upload size respecting system settings, free space and user quota
*
- * @param $dir the current folder where the user currently operates
- * @return number of bytes representing
+ * @param string $dir the current folder where the user currently operates
+ * @param int $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly
+ * @return int number of bytes representing
*/
- public static function maxUploadFilesize($dir) {
- return min(self::freeSpace($dir), self::uploadLimit());
+ public static function maxUploadFilesize($dir, $freeSpace = null) {
+ if (is_null($freeSpace)){
+ $freeSpace = self::freeSpace($dir);
+ }
+ return min($freeSpace, self::uploadLimit());
}
/**
* Calculate free space left within user quota
*
- * @param $dir the current folder where the user currently operates
- * @return number of bytes representing
+ * @param string $dir the current folder where the user currently operates
+ * @return int number of bytes representing
*/
public static function freeSpace($dir) {
$freeSpace = \OC\Files\Filesystem::free_space($dir);
diff --git a/lib/private/image.php b/lib/private/image.php
index 54232234fe7..42afa35ea56 100644
--- a/lib/private/image.php
+++ b/lib/private/image.php
@@ -409,14 +409,14 @@ class OC_Image {
/**
* @brief Loads an image from a local file.
- * @param $imageref The path to a local file.
+ * @param $imagePath The path to a local file.
* @returns An image resource or false on error
*/
public function loadFromFile($imagePath=false) {
// exif_imagetype throws "read error!" if file is less than 12 byte
if(!@is_file($imagePath) || !file_exists($imagePath) || filesize($imagePath) < 12 || !is_readable($imagePath)) {
// Debug output disabled because this method is tried before loadFromBase64?
- OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: '.$imagePath, OC_Log::DEBUG);
+ OC_Log::write('core', 'OC_Image->loadFromFile, couldn\'t load: ' . (string) urlencode($imagePath), OC_Log::DEBUG);
return false;
}
$iType = exif_imagetype($imagePath);
diff --git a/lib/private/l10n.php b/lib/private/l10n.php
index 0aa949ba9be..1d8152c5844 100644
--- a/lib/private/l10n.php
+++ b/lib/private/l10n.php
@@ -132,10 +132,10 @@ class OC_L10N implements \OCP\IL10N {
$i18ndir = self::findI18nDir($app);
// Localization is in /l10n, Texts are in $i18ndir
// (Just no need to define date/time format etc. twice)
- if((OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC_App::getAppPath($app).'/l10n/')
- || OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/core/l10n/')
+ if((OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/core/l10n/')
|| OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/lib/l10n/')
|| OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC::$SERVERROOT.'/settings')
+ || OC_Helper::issubdirectory($i18ndir.$lang.'.php', OC_App::getAppPath($app).'/l10n/')
)
&& file_exists($i18ndir.$lang.'.php')) {
// Include the file, save the data from $CONFIG
diff --git a/lib/private/legacy/appconfig.php b/lib/private/legacy/appconfig.php
new file mode 100644
index 00000000000..46a8068c3b4
--- /dev/null
+++ b/lib/private/legacy/appconfig.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Frank Karlitschek
+ * @author Jakob Sack
+ * @copyright 2012 Frank Karlitschek frank@owncloud.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This class provides an easy way for apps to store config values in the
+ * database.
+ */
+class OC_Appconfig {
+ /**
+ * @return \OCP\IAppConfig
+ */
+ private static function getAppConfig() {
+ return \OC::$server->getAppConfig();
+ }
+
+ /**
+ * @brief Get all apps using the config
+ * @return array with app ids
+ *
+ * This function returns a list of all apps that have at least one
+ * entry in the appconfig table.
+ */
+ public static function getApps() {
+ return self::getAppConfig()->getApps();
+ }
+
+ /**
+ * @brief Get the available keys for an app
+ * @param string $app the app we are looking for
+ * @return array with key names
+ *
+ * This function gets all keys of an app. Please note that the values are
+ * not returned.
+ */
+ public static function getKeys($app) {
+ return self::getAppConfig()->getKeys($app);
+ }
+
+ /**
+ * @brief Gets the config value
+ * @param string $app app
+ * @param string $key key
+ * @param string $default = null, default value if the key does not exist
+ * @return string the value or $default
+ *
+ * This function gets a value from the appconfig table. If the key does
+ * not exist the default value will be returned
+ */
+ public static function getValue($app, $key, $default = null) {
+ return self::getAppConfig()->getValue($app, $key, $default);
+ }
+
+ /**
+ * @brief check if a key is set in the appconfig
+ * @param string $app
+ * @param string $key
+ * @return bool
+ */
+ public static function hasKey($app, $key) {
+ return self::getAppConfig()->hasKey($app, $key);
+ }
+
+ /**
+ * @brief sets a value in the appconfig
+ * @param string $app app
+ * @param string $key key
+ * @param string $value value
+ *
+ * Sets a value. If the key did not exist before it will be created.
+ */
+ public static function setValue($app, $key, $value) {
+ self::getAppConfig()->setValue($app, $key, $value);
+ }
+
+ /**
+ * @brief Deletes a key
+ * @param string $app app
+ * @param string $key key
+ *
+ * Deletes a key.
+ */
+ public static function deleteKey($app, $key) {
+ self::getAppConfig()->deleteKey($app, $key);
+ }
+
+ /**
+ * @brief Remove app from appconfig
+ * @param string $app app
+ *
+ * Removes all keys in appconfig belonging to the app.
+ */
+ public static function deleteApp($app) {
+ self::getAppConfig()->deleteApp($app);
+ }
+
+ /**
+ * get multiply values, either the app or key can be used as wildcard by setting it to false
+ *
+ * @param app
+ * @param key
+ * @return array
+ */
+ public static function getValues($app, $key) {
+ return self::getAppConfig()->getValues($app, $key);
+ }
+}
diff --git a/lib/private/memcache/memcached.php b/lib/private/memcache/memcached.php
index 978e6c2eff1..075828eebad 100644
--- a/lib/private/memcache/memcached.php
+++ b/lib/private/memcache/memcached.php
@@ -18,8 +18,16 @@ class Memcached extends Cache {
parent::__construct($prefix);
if (is_null(self::$cache)) {
self::$cache = new \Memcached();
- list($host, $port) = \OC_Config::getValue('memcached_server', array('localhost', 11211));
- self::$cache->addServer($host, $port);
+ $servers = \OC_Config::getValue('memcached_servers');
+ if (!$servers) {
+ $server = \OC_Config::getValue('memcached_server');
+ if ($server) {
+ $servers = array($server);
+ } else {
+ $servers = array(array('localhost', 11211));
+ }
+ }
+ self::$cache->addServers($servers);
}
}
diff --git a/lib/private/ocs/result.php b/lib/private/ocs/result.php
index 84f06fa01c7..9f14e8da7e8 100644
--- a/lib/private/ocs/result.php
+++ b/lib/private/ocs/result.php
@@ -29,7 +29,13 @@ class OC_OCS_Result{
* @param $data mixed the data to return
*/
public function __construct($data=null, $code=100, $message=null) {
- $this->data = $data;
+ if ($data === null) {
+ $this->data = array();
+ } elseif (!is_array($data)) {
+ $this->data = array($this->data);
+ } else {
+ $this->data = $data;
+ }
$this->statusCode = $code;
$this->message = $message;
}
@@ -49,7 +55,7 @@ class OC_OCS_Result{
public function setItemsPerPage(int $items) {
$this->perPage = $items;
}
-
+
/**
* get the status code
* @return int
@@ -57,7 +63,7 @@ class OC_OCS_Result{
public function getStatusCode() {
return $this->statusCode;
}
-
+
/**
* get the meta data for the result
* @return array
@@ -76,15 +82,15 @@ class OC_OCS_Result{
return $meta;
}
-
+
/**
* get the result data
- * @return array|string|int
+ * @return array
*/
public function getData() {
return $this->data;
}
-
+
/**
* return bool if the method succedded
* @return bool
diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php
index 7a4826c76ec..02bb22e9b94 100644
--- a/lib/private/preview/office.php
+++ b/lib/private/preview/office.php
@@ -6,7 +6,7 @@
* See the COPYING-README file.
*/
//both, libreoffice backend and php fallback, need imagick
-if (extension_loaded('imagick')) {
+if (extension_loaded('imagick') && count(@\Imagick::queryFormats("PDF")) === 1) {
$isShellExecEnabled = \OC_Helper::is_function_enabled('shell_exec');
// LibreOffice preview is currently not supported on Windows
diff --git a/lib/private/preview/pdf.php b/lib/private/preview/pdf.php
index cc974b68818..d390b4fc677 100644
--- a/lib/private/preview/pdf.php
+++ b/lib/private/preview/pdf.php
@@ -7,7 +7,7 @@
*/
namespace OC\Preview;
-if (extension_loaded('imagick')) {
+if (extension_loaded('imagick') && count(@\Imagick::queryFormats("PDF")) === 1) {
class PDF extends Provider {
diff --git a/lib/private/preview/svg.php b/lib/private/preview/svg.php
index b49e51720fa..9a73fff9467 100644
--- a/lib/private/preview/svg.php
+++ b/lib/private/preview/svg.php
@@ -7,7 +7,7 @@
*/
namespace OC\Preview;
-if (extension_loaded('imagick')) {
+if (extension_loaded('imagick') && count(@\Imagick::queryFormats("SVG")) === 1) {
class SVG extends Provider {
diff --git a/lib/private/preview/unknown.php b/lib/private/preview/unknown.php
index 4747f9e25ed..2d3b5c5655e 100644
--- a/lib/private/preview/unknown.php
+++ b/lib/private/preview/unknown.php
@@ -22,7 +22,7 @@ class Unknown extends Provider {
$svgPath = substr_replace($path, 'svg', -3);
- if (extension_loaded('imagick') && file_exists($svgPath)) {
+ if (extension_loaded('imagick') && file_exists($svgPath) && count(@\Imagick::queryFormats("SVG")) === 1) {
// http://www.php.net/manual/de/imagick.setresolution.php#85284
$svg = new \Imagick();
diff --git a/lib/private/request.php b/lib/private/request.php
index ee3d2fd54db..a7e7bd0ea1d 100755
--- a/lib/private/request.php
+++ b/lib/private/request.php
@@ -11,6 +11,7 @@ class OC_Request {
const USER_AGENT_IE = '/MSIE/';
// Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent
const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#';
+ const USER_AGENT_FREEBOX = '#^Mozilla/5\.0$#';
/**
* @brief Check overwrite condition
diff --git a/lib/private/response.php b/lib/private/response.php
index 5e941acbb4b..71c538fb311 100644
--- a/lib/private/response.php
+++ b/lib/private/response.php
@@ -153,7 +153,11 @@ class OC_Response {
* @param string $type disposition type, either 'attachment' or 'inline'
*/
static public function setContentDispositionHeader( $filename, $type = 'attachment' ) {
- if (OC_Request::isUserAgent(array(OC_Request::USER_AGENT_IE, OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME))) {
+ if (OC_Request::isUserAgent(array(
+ OC_Request::USER_AGENT_IE,
+ OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ OC_Request::USER_AGENT_FREEBOX
+ ))) {
header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' );
} else {
header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename )
diff --git a/lib/private/server.php b/lib/private/server.php
index c9e593ec2ed..fc8f170dc4a 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -124,6 +124,9 @@ class Server extends SimpleContainer implements IServerContainer {
$this->registerService('AllConfig', function($c) {
return new \OC\AllConfig();
});
+ $this->registerService('AppConfig', function ($c) {
+ return new \OC\AppConfig(\OC_DB::getConnection());
+ });
$this->registerService('L10NFactory', function($c) {
return new \OC\L10N\Factory();
});
@@ -270,6 +273,15 @@ class Server extends SimpleContainer implements IServerContainer {
}
/**
+ * Returns the app config manager
+ *
+ * @return \OCP\IAppConfig
+ */
+ function getAppConfig(){
+ return $this->query('AppConfig');
+ }
+
+ /**
* get an L10N instance
* @param $app string appid
* @return \OC_L10N
diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php
index d97b6d2602f..b2c28173b1c 100644
--- a/lib/private/setup/mysql.php
+++ b/lib/private/setup/mysql.php
@@ -3,13 +3,13 @@
namespace OC\Setup;
class MySQL extends AbstractDatabase {
- public $dbprettyname = 'MySQL';
+ public $dbprettyname = 'MySQL/MariaDB';
public function setupDatabase($username) {
//check if the database user has admin right
$connection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword);
if(!$connection) {
- throw new \DatabaseSetupException($this->trans->t('MySQL username and/or password not valid'),
+ throw new \DatabaseSetupException($this->trans->t('MySQL/MariaDB username and/or password not valid'),
$this->trans->t('You need to enter either an existing account or the administrator.'));
}
$oldUser=\OC_Config::getValue('dbuser', false);
@@ -82,14 +82,14 @@ class MySQL extends AbstractDatabase {
$query = "CREATE USER '$name'@'localhost' IDENTIFIED BY '$password'";
$result = mysql_query($query, $connection);
if (!$result) {
- throw new \DatabaseSetupException($this->trans->t("MySQL user '%s'@'localhost' exists already.", array($name)),
- $this->trans->t("Drop this user from MySQL", array($name)));
+ throw new \DatabaseSetupException($this->trans->t("MySQL/MariaDB user '%s'@'localhost' exists already.", array($name)),
+ $this->trans->t("Drop this user from MySQL/MariaDB", array($name)));
}
$query = "CREATE USER '$name'@'%' IDENTIFIED BY '$password'";
$result = mysql_query($query, $connection);
if (!$result) {
- throw new \DatabaseSetupException($this->trans->t("MySQL user '%s'@'%%' already exists", array($name)),
- $this->trans->t("Drop this user from MySQL."));
+ throw new \DatabaseSetupException($this->trans->t("MySQL/MariaDB user '%s'@'%%' already exists", array($name)),
+ $this->trans->t("Drop this user from MySQL/MariaDB."));
}
}
}
diff --git a/lib/private/share/searchresultsorter.php b/lib/private/share/searchresultsorter.php
new file mode 100644
index 00000000000..fbf77179097
--- /dev/null
+++ b/lib/private/share/searchresultsorter.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+namespace OC\Share;
+
+class SearchResultSorter {
+ private $search;
+ private $encoding;
+ private $key;
+ private $log;
+
+ /**
+ * @param $search the search term as was given by the user
+ * @param $key the array key containing the value that should be compared
+ * against
+ * @param $encoding optional, encoding to use, defaults to UTF-8
+ * @param $log optional, an \OC\Log instance
+ */
+ public function __construct($search, $key, \OC\Log $log = null, $encoding = 'UTF-8') {
+ $this->encoding = $encoding;
+ $this->key = $key;
+ $this->log = $log;
+ $this->search = mb_strtolower($search, $this->encoding);
+ }
+
+ /**
+ * User and Group names matching the search term at the beginning shall appear
+ * on top of the share dialog. Following entries in alphabetical order.
+ * Callback function for usort. http://php.net/usort
+ */
+ public function sort($a, $b) {
+ if(!isset($a[$this->key]) || !isset($b[$this->key])) {
+ if(!is_null($this->log)) {
+ $this->log->error('Sharing dialogue: cannot sort due to ' .
+ 'missing array key', array('app' => 'core'));
+ }
+ return 0;
+ }
+ $nameA = mb_strtolower($a[$this->key], $this->encoding);
+ $nameB = mb_strtolower($b[$this->key], $this->encoding);
+ $i = mb_strpos($nameA, $this->search, 0, $this->encoding);
+ $j = mb_strpos($nameB, $this->search, 0, $this->encoding);
+
+ if($i === $j || $i > 0 && $j > 0) {
+ return strcmp(mb_strtolower($nameA, $this->encoding),
+ mb_strtolower($nameB, $this->encoding));
+ } elseif ($i === 0) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+}
+
diff --git a/lib/private/user.php b/lib/private/user.php
index c78fb094c4d..a8e7967783e 100644
--- a/lib/private/user.php
+++ b/lib/private/user.php
@@ -205,6 +205,9 @@ class OC_User {
// Delete user files in /data/
OC_Helper::rmdirr(\OC_User::getHome($uid));
+ // Delete the users entry in the storage table
+ \OC\Files\Cache\Storage::remove('home::' . $uid);
+
// Remove it from the Cache
self::getManager()->delete($uid);
}