|
32 | 32 | use OCP\Share\Exceptions\ShareNotFound; |
33 | 33 | use OCP\Share\IAttributes; |
34 | 34 | use OCP\Share\IManager; |
| 35 | +use OCP\Share\IPartialShareProvider; |
35 | 36 | use OCP\Share\IShare; |
36 | 37 | use OCP\Share\IShareProviderSupportsAccept; |
37 | 38 | use OCP\Share\IShareProviderSupportsAllSharesInFolder; |
|
44 | 45 | * |
45 | 46 | * @package OC\Share20 |
46 | 47 | */ |
47 | | -class DefaultShareProvider implements IShareProviderWithNotification, IShareProviderSupportsAccept, IShareProviderSupportsAllSharesInFolder { |
| 48 | +class DefaultShareProvider implements IShareProviderWithNotification, IShareProviderSupportsAccept, IShareProviderSupportsAllSharesInFolder, IPartialShareProvider { |
48 | 49 | public function __construct( |
49 | 50 | private IDBConnection $dbConn, |
50 | 51 | private IUserManager $userManager, |
@@ -948,6 +949,112 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) { |
948 | 949 | return $shares; |
949 | 950 | } |
950 | 951 |
|
| 952 | + /** |
| 953 | + * @inheritDoc |
| 954 | + */ |
| 955 | + public function getSharedWithByPath( |
| 956 | + string $userId, |
| 957 | + int $shareType, |
| 958 | + string $path, |
| 959 | + bool $forChildren, |
| 960 | + int $limit, |
| 961 | + int $offset |
| 962 | + ): iterable { |
| 963 | + $shares = []; |
| 964 | + |
| 965 | + if ($shareType === IShare::TYPE_USER) { |
| 966 | + //Get shares directly with this user |
| 967 | + $qb = $this->dbConn->getQueryBuilder(); |
| 968 | + $qb->select('s.*', |
| 969 | + 'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash', |
| 970 | + 'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime', |
| 971 | + 'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum' |
| 972 | + ) |
| 973 | + ->selectAlias('st.id', 'storage_string_id') |
| 974 | + ->from('share', 's') |
| 975 | + ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid')) |
| 976 | + ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id')); |
| 977 | + |
| 978 | + // Order by id |
| 979 | + $qb->orderBy('s.id'); |
| 980 | + |
| 981 | + // Set limit and offset |
| 982 | + if ($limit !== -1) { |
| 983 | + $qb->setMaxResults($limit); |
| 984 | + } |
| 985 | + $qb->setFirstResult($offset); |
| 986 | + |
| 987 | + $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER))) |
| 988 | + ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId))) |
| 989 | + ->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY))); |
| 990 | + |
| 991 | + if ($forChildren) { |
| 992 | + $qb->andWhere($qb->expr()->like('file_target', $qb->createNamedParameter ($this->dbConn->escapeLikeParameter($path) . '_%'))); |
| 993 | + } else { |
| 994 | + $qb->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($path))); |
| 995 | + } |
| 996 | + |
| 997 | + $cursor = $qb->executeQuery(); |
| 998 | + |
| 999 | + while ($data = $cursor->fetch()) { |
| 1000 | + if ($data['fileid'] && $data['path'] === null) { |
| 1001 | + $data['path'] = (string)$data['path']; |
| 1002 | + $data['name'] = (string)$data['name']; |
| 1003 | + $data['checksum'] = (string)$data['checksum']; |
| 1004 | + } |
| 1005 | + if ($this->isAccessibleResult($data)) { |
| 1006 | + $shares[] = $this->createShare($data); |
| 1007 | + } |
| 1008 | + } |
| 1009 | + $cursor->closeCursor(); |
| 1010 | + } elseif ($shareType === IShare::TYPE_GROUP) { |
| 1011 | + // get the parent share info (s) along with the child one (s2) |
| 1012 | + $qb = $this->dbConn->getQueryBuilder(); |
| 1013 | + $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', |
| 1014 | + 'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash', |
| 1015 | + 'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime', |
| 1016 | + 'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum' |
| 1017 | + ) |
| 1018 | + ->selectAlias('st.id', 'storage_string_id') |
| 1019 | + ->from('share', 's2') |
| 1020 | + ->leftJoin('s2', 'filecache', 'f', $qb->expr()->eq('s2.file_source', 'f.fileid')) |
| 1021 | + ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id')) |
| 1022 | + ->leftJoin('s2', 'share', 's', $qb->expr()->eq('s2.parent', 's.id')) |
| 1023 | + ->where($qb->expr()->eq('s2.share_with', $qb->createNamedParameter($userId))) |
| 1024 | + ->andWhere($qb->expr()->eq('s2.share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP))) |
| 1025 | + ->andWhere($qb->expr()->in('s2.item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY))) |
| 1026 | + ->orderBy('s2.id') |
| 1027 | + ->setFirstResult($offset); |
| 1028 | + if ($limit !== -1) { |
| 1029 | + $qb->setMaxResults($limit); |
| 1030 | + } |
| 1031 | + |
| 1032 | + if ($forChildren) { |
| 1033 | + $qb->andWhere($qb->expr()->like('s2.file_target', $qb->createNamedParameter ($this->dbConn->escapeLikeParameter($path) . '_%'))); |
| 1034 | + } else { |
| 1035 | + $qb->andWhere($qb->expr()->eq('s2.file_target', $qb->createNamedParameter($path))); |
| 1036 | + } |
| 1037 | + |
| 1038 | + $cursor = $qb->executeQuery(); |
| 1039 | + while ($data = $cursor->fetch()) { |
| 1040 | + if ($this->isAccessibleResult($data)) { |
| 1041 | + $share = $this->createShare($data); |
| 1042 | + // patch the parent data with the user-specific changes |
| 1043 | + $share->setPermissions((int)$data['s2_permissions']); |
| 1044 | + $share->setStatus((int)$data['s2_accepted']); |
| 1045 | + $share->setTarget($data['s2_file_target']); |
| 1046 | + $share->setParent($data['s2_parent']); |
| 1047 | + $shares[] = $share; |
| 1048 | + } |
| 1049 | + } |
| 1050 | + $cursor->closeCursor(); |
| 1051 | + } else { |
| 1052 | + throw new BackendError('Invalid backend'); |
| 1053 | + } |
| 1054 | + |
| 1055 | + return $shares; |
| 1056 | + } |
| 1057 | + |
951 | 1058 | /** |
952 | 1059 | * Get a share by token |
953 | 1060 | * |
|
0 commit comments