Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 45 additions & 108 deletions lib/private/Share20/DefaultShareProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -830,10 +830,33 @@ private function isAccessibleResult($data) {
return true;
}

public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
return $this->_getSharedWith($userId, $shareType, $limit, $offset, $node);
}

public function getSharedWithByPath(
string $userId,
int $shareType,
string $path,
bool $forChildren,
int $limit,
int $offset,
): iterable {
return $this->_getSharedWith($userId, $shareType, $limit, $offset, null, $path, $forChildren);
}

/**
* @inheritdoc
* @return IShare[]
*/
public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
private function _getSharedWith(
string $userId,
int $shareType,
int $limit,
int $offset,
?Node $node = null,
?string $path = null,
?bool $forChildren = false,
): iterable {
/** @var Share[] $shares */
$shares = [];

Expand Down Expand Up @@ -868,6 +891,14 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
}

if ($path !== null) {
if ($forChildren) {
$qb->andWhere($qb->expr()->like('file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')));
} else {
$qb->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($path)));
}
}

$cursor = $qb->executeQuery();

while ($data = $cursor->fetch()) {
Expand Down Expand Up @@ -919,6 +950,18 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
}

if ($path !== null) {
$qb->leftJoin('s', 'share', 'sc', $qb->expr()->eq('sc.parent', 's.id'))
->andWhere($qb->expr()->eq('sc.share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
->where($qb->expr()->eq('sc.share_with', $qb->createNamedParameter($userId)));

if ($forChildren) {
$qb->andWhere($qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')));
} else {
$qb->andWhere($qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path)));
}
}

$groups = array_filter($groups);

$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)))
Expand Down Expand Up @@ -955,112 +998,6 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
return $shares;
}

/**
* @inheritDoc
*/
public function getSharedWithByPath(
string $userId,
int $shareType,
string $path,
bool $forChildren,
int $limit,
int $offset,
): iterable {
$shares = [];

if ($shareType === IShare::TYPE_USER) {
//Get shares directly with this user
$qb = $this->dbConn->getQueryBuilder();
$qb->select('s.*',
'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
)
->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('s.id');

// Set limit and offset
if ($limit !== -1) {
$qb->setMaxResults($limit);
}
$qb->setFirstResult($offset);

$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)))
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));

if ($forChildren) {
$qb->andWhere($qb->expr()->like('file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')));
} else {
$qb->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($path)));
}

$cursor = $qb->executeQuery();

while ($data = $cursor->fetch()) {
if ($data['fileid'] && $data['path'] === null) {
$data['path'] = (string)$data['path'];
$data['name'] = (string)$data['name'];
$data['checksum'] = (string)$data['checksum'];
}
if ($this->isAccessibleResult($data)) {
$shares[] = $this->createShare($data);
}
}
$cursor->closeCursor();
} elseif ($shareType === IShare::TYPE_GROUP) {
// get the parent share info (s) along with the child one (s2)
$qb = $this->dbConn->getQueryBuilder();
$qb->select('s.*', 's2.permissions AS s2_permissions', 's2.accepted AS s2_accepted', 's2.file_target AS s2_file_target', 's2.parent AS s2_parent',
'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
)
->selectAlias('st.id', 'storage_string_id')
->from('share', 's2')
->leftJoin('s2', 'filecache', 'f', $qb->expr()->eq('s2.file_source', 'f.fileid'))
->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
->leftJoin('s2', 'share', 's', $qb->expr()->eq('s2.parent', 's.id'))
->where($qb->expr()->eq('s2.share_with', $qb->createNamedParameter($userId)))
->andWhere($qb->expr()->eq('s2.share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
->andWhere($qb->expr()->in('s2.item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
->orderBy('s2.id')
->setFirstResult($offset);
if ($limit !== -1) {
$qb->setMaxResults($limit);
}

if ($forChildren) {
$qb->andWhere($qb->expr()->like('s2.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')));
} else {
$qb->andWhere($qb->expr()->eq('s2.file_target', $qb->createNamedParameter($path)));
}

$cursor = $qb->executeQuery();
while ($data = $cursor->fetch()) {
if ($this->isAccessibleResult($data)) {
$share = $this->createShare($data);
// patch the parent data with the user-specific changes
$share->setPermissions((int)$data['s2_permissions']);
$share->setStatus((int)$data['s2_accepted']);
$share->setTarget($data['s2_file_target']);
$share->setParent($data['s2_parent']);
$shares[] = $share;
}
}
$cursor->closeCursor();
} else {
throw new BackendError('Invalid backend');
}

return $shares;
}

/**
* Get a share by token
*
Expand Down
Loading