summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2016-10-06 22:58:56 +0200
committerGitHub <noreply@github.com>2016-10-06 22:58:56 +0200
commitc4b26395859939ab07b875ab6ccff6598c12f2b2 (patch)
tree2bb7df8037c87ae758c1ddd0d567050bd64ebfdf /lib
parenta0b34dfd2f5e6ed1ea5e35692816acf73f3ede4e (diff)
parent626daabb56c91755bccb327f090e6bdcd94789ad (diff)
downloadnextcloud-server-c4b26395859939ab07b875ab6ccff6598c12f2b2.tar.gz
nextcloud-server-c4b26395859939ab07b875ab6ccff6598c12f2b2.zip
Merge pull request #1514 from nextcloud/integration-tests-orphaned-shares
Integration tests orphaned shares + Prefilter inaccessible shares
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Share20/DefaultShareProvider.php46
1 files changed, 38 insertions, 8 deletions
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index f33c297b02d..d6afcf99912 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -583,6 +583,25 @@ class DefaultShareProvider implements IShareProvider {
}
/**
+ * Returns whether the given database result can be interpreted as
+ * a share with accessible file (not trashed, not deleted)
+ */
+ private function isAccessibleResult($data) {
+ // exclude shares leading to deleted file entries
+ if ($data['fileid'] === null) {
+ return false;
+ }
+
+ // exclude shares leading to trashbin on home storages
+ $pathSections = explode('/', $data['path'], 2);
+ // FIXME: would not detect rare md5'd home storage case properly
+ if ($pathSections[0] !== 'files' && explode(':', $data['storage_string_id'], 2)[0] === 'home') {
+ return false;
+ }
+ return true;
+ }
+
+ /**
* @inheritdoc
*/
public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
@@ -592,11 +611,14 @@ class DefaultShareProvider implements IShareProvider {
if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
//Get shares directly with this user
$qb = $this->dbConn->getQueryBuilder();
- $qb->select('*')
- ->from('share');
+ $qb->select('s.*', 'f.fileid', 'f.path')
+ ->selectAlias('st.id', 'storage_string_id')
+ ->from('share', 's')
+ ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
+ ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
// Order by id
- $qb->orderBy('id');
+ $qb->orderBy('s.id');
// Set limit and offset
if ($limit !== -1) {
@@ -619,7 +641,9 @@ class DefaultShareProvider implements IShareProvider {
$cursor = $qb->execute();
while($data = $cursor->fetch()) {
- $shares[] = $this->createShare($data);
+ if ($this->isAccessibleResult($data)) {
+ $shares[] = $this->createShare($data);
+ }
}
$cursor->closeCursor();
@@ -640,9 +664,12 @@ class DefaultShareProvider implements IShareProvider {
}
$qb = $this->dbConn->getQueryBuilder();
- $qb->select('*')
- ->from('share')
- ->orderBy('id')
+ $qb->select('s.*', 'f.fileid', 'f.path')
+ ->selectAlias('st.id', 'storage_string_id')
+ ->from('share', 's')
+ ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
+ ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
+ ->orderBy('s.id')
->setFirstResult(0);
if ($limit !== -1) {
@@ -672,7 +699,10 @@ class DefaultShareProvider implements IShareProvider {
$offset--;
continue;
}
- $shares2[] = $this->createShare($data);
+
+ if ($this->isAccessibleResult($data)) {
+ $shares2[] = $this->createShare($data);
+ }
}
$cursor->closeCursor();
}