Skip to content

Commit 9e65d4c

Browse files
salmart-devartonge
authored andcommitted
feature: implement IPartialShareProvider support
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Signed-off-by: Louis Chmn <louis@chmn.me>
1 parent 7756dfc commit 9e65d4c

File tree

1 file changed

+61
-1
lines changed

1 file changed

+61
-1
lines changed

lib/Share/RoomShareProvider.php

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use OCP\Share\Exceptions\GenericShareException;
3232
use OCP\Share\Exceptions\ShareNotFound;
3333
use OCP\Share\IManager as IShareManager;
34+
use OCP\Share\IPartialShareProvider;
3435
use OCP\Share\IShare;
3536
use OCP\Share\IShareProvider;
3637

@@ -44,7 +45,7 @@
4445
* Like in group shares, a recipient can move or delete a share without
4546
* modifying the share for the other users in the room.
4647
*/
47-
class RoomShareProvider implements IShareProvider {
48+
class RoomShareProvider implements IShareProvider, IPartialShareProvider {
4849
use TTransactional;
4950
// Special share type for user modified room shares
5051
public const SHARE_TYPE_USERROOM = 11;
@@ -856,6 +857,65 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset): arra
856857
return $shares;
857858
}
858859

860+
#[\Override]
861+
public function getSharedWithByPath(
862+
string $userId,
863+
int $shareType,
864+
string $path,
865+
bool $forChildren,
866+
int $limit,
867+
int $offset,
868+
): iterable {
869+
/** @var IShare[] $shares */
870+
$shares = [];
871+
$qb = $this->dbConnection->getQueryBuilder();
872+
$qb->select('s.*', 's2.permissions AS s2_permissions', 's2.file_target AS s2_file_target',
873+
'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
874+
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
875+
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
876+
)
877+
->selectAlias('st.id', 'storage_string_id')
878+
->from('share', 's2')
879+
->orderBy('s2.id', 'ASC')
880+
->leftJoin('s2', 'filecache', 'f', $qb->expr()->eq('s2.file_source', 'f.fileid'))
881+
->leftJoin('s2', 'share', 's', $qb->expr()->eq('s2.parent', 's.id'))
882+
->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
883+
->setFirstResult($offset);
884+
885+
if ($limit !== -1) {
886+
$qb->setMaxResults($limit);
887+
}
888+
889+
$qb->andWhere($qb->expr()->eq('s2.share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERROOM)))
890+
->andWhere($qb->expr()->eq('s2.share_with', $qb->createNamedParameter($userId)))
891+
->andWhere($qb->expr()->neq('s2.uid_initiator', $qb->createNamedParameter($userId)))
892+
->andWhere($qb->expr()->neq('s2.uid_owner', $qb->createNamedParameter($userId)));
893+
894+
if ($forChildren) {
895+
$qb->andWhere($qb->expr()->like('s2.file_target', $qb->createNamedParameter($this->dbConnection->escapeLikeParameter($path) . '_%')));
896+
} else {
897+
$qb->andWhere($qb->expr()->eq('s2.file_target', $qb->createNamedParameter($path)));
898+
}
899+
900+
$cursor = $qb->executeQuery();
901+
while ($data = $cursor->fetch()) {
902+
if (!$this->isAccessibleResult($data)) {
903+
continue;
904+
}
905+
906+
$share = $this->createShareObject($data);
907+
// patch the parent data with the user-specific changes
908+
$share->setPermissions((int)$data['s2_permissions']);
909+
$share->setTarget($data['s2_file_target']);
910+
$shares[] = $share;
911+
}
912+
$cursor->closeCursor();
913+
914+
// todo: check for group membership?
915+
916+
return $shares;
917+
}
918+
859919
private function isAccessibleResult(array $data): bool {
860920
// exclude shares leading to deleted file entries
861921
if ($data['fileid'] === null || $data['path'] === null) {

0 commit comments

Comments
 (0)