From a598de627c65b1a9774d1bda1826f7b15f2bfd0b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 5 Mar 2024 14:55:22 +0100 Subject: [PATCH] chore: remove long depricated share code Signed-off-by: Robin Appelman --- .../files_sharing/lib/ShareBackend/Folder.php | 59 ---- lib/private/Share/Share.php | 309 ------------------ lib/public/Share.php | 94 +----- tests/lib/Share/ShareTest.php | 106 ------ 4 files changed, 1 insertion(+), 567 deletions(-) diff --git a/apps/files_sharing/lib/ShareBackend/Folder.php b/apps/files_sharing/lib/ShareBackend/Folder.php index 51d0c709d988e..f0e44524c8ad7 100644 --- a/apps/files_sharing/lib/ShareBackend/Folder.php +++ b/apps/files_sharing/lib/ShareBackend/Folder.php @@ -29,65 +29,6 @@ namespace OCA\Files_Sharing\ShareBackend; class Folder extends File implements \OCP\Share_Backend_Collection { - - /** - * get shared parents - * - * @param int $itemSource item source ID - * @param string $shareWith with whom should the item be shared - * @param string $owner owner of the item - * @return array with shares - */ - public function getParents($itemSource, $shareWith = null, $owner = null) { - $result = []; - $parent = $this->getParentId($itemSource); - - $userManager = \OC::$server->getUserManager(); - - while ($parent) { - $shares = \OCP\Share::getItemSharedWithUser('folder', $parent, $shareWith, $owner); - if ($shares) { - foreach ($shares as $share) { - $name = basename($share['path']); - $share['collection']['path'] = $name; - $share['collection']['item_type'] = 'folder'; - $share['file_path'] = $name; - - $ownerUser = $userManager->get($share['uid_owner']); - $displayNameOwner = $ownerUser === null ? $share['uid_owner'] : $ownerUser->getDisplayName(); - $shareWithUser = $userManager->get($share['share_with']); - $displayNameShareWith = $shareWithUser === null ? $share['share_with'] : $shareWithUser->getDisplayName(); - $share['displayname_owner'] = $displayNameOwner ? $displayNameOwner : $share['uid_owner']; - $share['share_with_displayname'] = $displayNameShareWith ? $displayNameShareWith : $share['uid_owner']; - - $result[] = $share; - } - } - $parent = $this->getParentId($parent); - } - - return $result; - } - - /** - * get file cache ID of parent - * - * @param int $child file cache ID of child - * @return mixed parent ID or null - */ - private function getParentId($child) { - $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); - $qb->select('parent') - ->from('filecache') - ->where( - $qb->expr()->eq('fileid', $qb->createNamedParameter($child)) - ); - $result = $qb->execute(); - $row = $result->fetch(); - $result->closeCursor(); - return $row ? $row['parent'] : null; - } - public function getChildren($itemSource) { $children = []; $parents = [$itemSource]; diff --git a/lib/private/Share/Share.php b/lib/private/Share/Share.php index fb1cd50d94a6c..54e0eb72662a1 100644 --- a/lib/private/Share/Share.php +++ b/lib/private/Share/Share.php @@ -36,10 +36,6 @@ namespace OC\Share; use OCA\Files_Sharing\ShareBackend\File; -use OCP\DB\Exception; -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IDBConnection; -use OCP\Share\IShare; use Psr\Log\LoggerInterface; /** @@ -93,107 +89,6 @@ public static function registerBackend($itemType, $class, $collectionOf = null, return false; } - /** - * Get the item of item type shared with a given user by source - * - * @param string $itemType - * @param string $itemSource - * @param ?string $user User to whom the item was shared - * @param ?string $owner Owner of the share - * @param ?int $shareType only look for a specific share type - * @return array Return list of items with file_target, permissions and expiration - * @throws Exception - */ - public static function getItemSharedWithUser(string $itemType, string $itemSource, ?string $user = null, ?string $owner = null, ?int $shareType = null) { - $shares = []; - $fileDependent = $itemType === 'file' || $itemType === 'folder'; - $qb = self::getSelectStatement(self::FORMAT_NONE, $fileDependent); - $qb->from('share', 's'); - if ($fileDependent) { - $qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('file_source', 'f.fileid')); - $qb->innerJoin('s', 'storages', 'st', $qb->expr()->eq('numeric_id', 'f.storage')); - $column = 'file_source'; - } else { - $column = 'item_source'; - } - - $qb->where($qb->expr()->eq($column, $qb->createNamedParameter($itemSource))) - ->andWhere($qb->expr()->eq('item_type', $qb->createNamedParameter($itemType))); - - // for link shares $user === null - if ($user !== null) { - $qb->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($user))); - } - - if ($shareType !== null) { - $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType, IQueryBuilder::PARAM_INT))); - } - - if ($owner !== null) { - $qb->andWhere($qb->expr()->eq('uid_owner', $qb->createNamedParameter($owner))); - } - - $result = $qb->executeQuery(); - while ($row = $result->fetch()) { - if ($fileDependent && !self::isFileReachable($row['path'], $row['storage_id'])) { - continue; - } - if ($fileDependent && (int)$row['file_parent'] === -1) { - // if it is a mount point we need to get the path from the mount manager - $mountManager = \OC\Files\Filesystem::getMountManager(); - $mountPoint = $mountManager->findByStorageId($row['storage_id']); - if (!empty($mountPoint)) { - $path = $mountPoint[0]->getMountPoint(); - $path = trim($path, '/'); - $path = substr($path, strlen($owner) + 1); //normalize path to 'files/foo.txt` - $row['path'] = $path; - } else { - \OC::$server->get(LoggerInterface::class)->warning( - 'Could not resolve mount point for ' . $row['storage_id'], - ['app' => 'OCP\Share'] - ); - } - } - $shares[] = $row; - } - $result->closeCursor(); - - // if we didn't found a result then let's look for a group share. - if (empty($shares) && $user !== null) { - $userObject = \OC::$server->getUserManager()->get($user); - $groups = []; - if ($userObject) { - $groups = \OC::$server->getGroupManager()->getUserGroupIds($userObject); - } - - if (!empty($groups)) { - $qb = self::getSelectStatement(self::FORMAT_NONE, $fileDependent); - $qb->from('share', 's'); - - if ($fileDependent) { - $qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('file_source', 'f.fileid')) - ->innerJoin('s', 'storages', 'st', $qb->expr()->eq('numeric_id', 'f.storage')); - } - - $qb->where($qb->expr()->eq($column, $qb->createNamedParameter($itemSource))) - ->andWhere($qb->expr()->eq('item_type', $qb->createNamedParameter($itemType, IQueryBuilder::PARAM_STR))) - ->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter($groups, IQueryBuilder::PARAM_STR_ARRAY))); - - if ($owner !== null) { - $qb->andWhere($qb->expr()->eq('uid_owner', $qb->createNamedParameter($owner))); - } - $result = $qb->executeQuery(); - - while ($row = $result->fetch()) { - $shares[] = $row; - } - $result->closeCursor(); - } - } - - return $shares; - } - /** * Get the backend class for the specified item type * @@ -287,185 +182,6 @@ protected static function groupItems($items, $itemType) { return $result; } - /** - * Construct select statement - * - * @param bool $fileDependent ist it a file/folder share or a general share - */ - private static function getSelectStatement(int $format, bool $fileDependent, ?string $uidOwner = null): IQueryBuilder { - /** @var IDBConnection $connection */ - $connection = \OC::$server->get(IDBConnection::class); - $qb = $connection->getQueryBuilder(); - if ($format == self::FORMAT_STATUSES) { - if ($fileDependent) { - return $qb->select( - 's.id', - 's.parent', - 'share_type', - 'path', - 'storage', - 'share_with', - 'uid_owner', - 'file_source', - 'stime', - 's.permissions', - 'uid_initiator' - )->selectAlias('st.id', 'storage_id') - ->selectAlias('f.parent', 'file_parent'); - } - return $qb->select('id', 'parent', 'share_type', 'share_with', 'uid_owner', 'item_source', 'stime', 's.permissions'); - } - - if (isset($uidOwner)) { - if ($fileDependent) { - return $qb->select( - 's.id', - 'item_type', - 'item_source', - 's.parent', - 'share_type', - 'share_with', - 'file_source', - 'file_target', - 'path', - 's.permissions', - 'stime', - 'expiration', - 'token', - 'storage', - 'mail_send', - 'uid_owner', - 'uid_initiator' - )->selectAlias('st.id', 'storage_id') - ->selectAlias('f.parent', 'file_parent'); - } - return $qb->select('id', 'item_type', 'item_source', 'parent', 'share_type', - 'share_with', 'uid_owner', 'file_source', 'stime', 's.permissions', - 'expiration', 'token', 'mail_send'); - } - - if ($fileDependent) { - if ($format == File::FORMAT_GET_FOLDER_CONTENTS || $format == File::FORMAT_FILE_APP_ROOT) { - return $qb->select( - 's.id', - 'item_type', - 'item_source', - 's.parent', - 'uid_owner', - 'share_type', - 'share_with', - 'file_source', - 'path', - 'file_target', - 's.permissions', - 'stime', - 'expiration', - 'storage', - 'name', - 'mtime', - 'mimepart', - 'size', - 'encrypted', - 'etag', - 'mail_send' - )->selectAlias('f.parent', 'file_parent'); - } - return $qb->select( - 's.id', - 'item_type', - 'item_source', - 'item_target', - 's.parent', - 'share_type', - 'share_with', - 'uid_owner', - 'file_source', - 'path', - 'file_target', - 's.permissions', - 'stime', - 'expiration', - 'token', - 'storage', - 'mail_send', - )->selectAlias('f.parent', 'file_parent') - ->selectAlias('st.id', 'storage_id'); - } - return $qb->select('*'); - } - - - /** - * transform db results - * - * @param array $row result - */ - private static function transformDBResults(&$row) { - if (isset($row['id'])) { - $row['id'] = (int)$row['id']; - } - if (isset($row['share_type'])) { - $row['share_type'] = (int)$row['share_type']; - } - if (isset($row['parent'])) { - $row['parent'] = (int)$row['parent']; - } - if (isset($row['file_parent'])) { - $row['file_parent'] = (int)$row['file_parent']; - } - if (isset($row['file_source'])) { - $row['file_source'] = (int)$row['file_source']; - } - if (isset($row['permissions'])) { - $row['permissions'] = (int)$row['permissions']; - } - if (isset($row['storage'])) { - $row['storage'] = (int)$row['storage']; - } - if (isset($row['stime'])) { - $row['stime'] = (int)$row['stime']; - } - if (isset($row['expiration']) && $row['share_type'] !== IShare::TYPE_LINK) { - // discard expiration date for non-link shares, which might have been - // set by ancient bugs - $row['expiration'] = null; - } - } - - /** - * format result - * - * @param array $items result - * @param string $column is it a file share or a general share ('file_target' or 'item_target') - * @param \OCP\Share_Backend $backend sharing backend - * @param int $format - * @param array $parameters additional format parameters - * @return array format result - */ - private static function formatResult($items, $column, $backend, $format = self::FORMAT_NONE, $parameters = null) { - if ($format === self::FORMAT_NONE) { - return $items; - } elseif ($format === self::FORMAT_STATUSES) { - $statuses = []; - foreach ($items as $item) { - if ($item['share_type'] === IShare::TYPE_LINK) { - if ($item['uid_initiator'] !== \OC::$server->getUserSession()->getUser()->getUID()) { - continue; - } - $statuses[$item[$column]]['link'] = true; - } elseif (!isset($statuses[$item[$column]])) { - $statuses[$item[$column]]['link'] = false; - } - if (!empty($item['file_target'])) { - $statuses[$item[$column]]['path'] = $item['path']; - } - } - return $statuses; - } else { - return $backend->formatItems($items, $format, $parameters); - } - } - /** * remove protocol from URL * @@ -489,29 +205,4 @@ public static function removeProtocolFromUrl($url) { public static function getExpireInterval() { return (int)\OC::$server->getConfig()->getAppValue('core', 'shareapi_expire_after_n_days', '7'); } - - /** - * Checks whether the given path is reachable for the given owner - * - * @param string $path path relative to files - * @param string $ownerStorageId storage id of the owner - * - * @return boolean true if file is reachable, false otherwise - */ - private static function isFileReachable($path, $ownerStorageId) { - // if outside the home storage, file is always considered reachable - if (!(substr($ownerStorageId, 0, 6) === 'home::' || - substr($ownerStorageId, 0, 13) === 'object::user:' - )) { - return true; - } - - // if inside the home storage, the file has to be under "/files/" - $path = ltrim($path, '/'); - if (substr($path, 0, 6) === 'files/') { - return true; - } - - return false; - } } diff --git a/lib/public/Share.php b/lib/public/Share.php index 9e0ef96a15874..2004f77cf0a55 100644 --- a/lib/public/Share.php +++ b/lib/public/Share.php @@ -33,8 +33,7 @@ namespace OCP; /** - * This class provides the ability for apps to share their content between users. - * Apps must create a backend class that implements OCP\Share_Backend and register it with this class. + * This class remains only for use with the ::class namespace used for various hooks * * It provides the following hooks: * - post_shared @@ -42,95 +41,4 @@ * @deprecated 17.0.0 */ class Share extends \OC\Share\Constants { - /** - * Get the item of item type shared with a given user by source - * @param string $itemType - * @param string $itemSource - * @param string $user User to whom the item was shared - * @param string $owner Owner of the share - * @return array Return list of items with file_target, permissions and expiration - * @since 6.0.0 - parameter $owner was added in 8.0.0 - * @deprecated 17.0.0 - */ - public static function getItemSharedWithUser($itemType, $itemSource, $user, $owner = null) { - return \OC\Share\Share::getItemSharedWithUser($itemType, $itemSource, $user, $owner); - } - - /** - * Get the item of item type shared with the current user by source - * @param string $itemType - * @param string $itemSource - * @param int $format (optional) Format type must be defined by the backend - * @param mixed $parameters - * @param bool $includeCollections - * @return void - * @since 5.0.0 - * @deprecated 17.0.0 - */ - public static function getItemSharedWithBySource($itemType, $itemSource, $format = self::FORMAT_NONE, - $parameters = null, $includeCollections = false) { - // not used by any app - only here to not break apps syntax - } - - /** - * Based on the given token the share information will be returned - password protected shares will be verified - * @param string $token - * @param bool $checkPasswordProtection - * @return void - * @since 5.0.0 - parameter $checkPasswordProtection was added in 7.0.0 - * @deprecated 17.0.0 - */ - public static function getShareByToken($token, $checkPasswordProtection = true) { - // not used by any app - only here to not break apps syntax - } - - - /** - * Get the shared items of item type owned by the current user - * @param string $itemType - * @param int $format (optional) Format type must be defined by the backend - * @param mixed $parameters - * @param int $limit Number of items to return (optional) Returns all by default - * @param bool $includeCollections - * @return void - * @since 5.0.0 - * @deprecated 17.0.0 - */ - public static function getItemsShared($itemType, $format = self::FORMAT_NONE, $parameters = null, - $limit = -1, $includeCollections = false) { - // only used by AppVNCSafe app (https://github.com/vnc-biz/nextcloud-appvncsafe/issues/2) - only here to not break apps syntax - } - - /** - * Get the shared item of item type owned by the current user - * @param string $itemType - * @param string $itemSource - * @param int $format (optional) Format type must be defined by the backend - * @param mixed $parameters - * @param bool $includeCollections - * @return void - * @since 5.0.0 - * @deprecated 17.0.0 - * - * Refactoring notes: - * * defacto $parameters and $format is always the default and therefore is removed in the subsequent call - */ - public static function getItemShared($itemType, $itemSource, $format = self::FORMAT_NONE, - $parameters = null, $includeCollections = false) { - // not used by any app - only here to not break apps syntax - } - - /** - * sent status if users got informed by mail about share - * @param string $itemType - * @param string $itemSource - * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK - * @param string $recipient with whom was the item shared - * @param bool $status - * @since 6.0.0 - parameter $originIsSource was added in 8.0.0 - * @deprecated 17.0.0 - */ - public static function setSendMailStatus($itemType, $itemSource, $shareType, $recipient, $status) { - // not used by any app - only here to not break apps syntax - } } diff --git a/tests/lib/Share/ShareTest.php b/tests/lib/Share/ShareTest.php index 35dc00739f665..121f337e4ab48 100644 --- a/tests/lib/Share/ShareTest.php +++ b/tests/lib/Share/ShareTest.php @@ -22,13 +22,11 @@ namespace Test\Share; use OC\Share\Share; -use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\IGroup; use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; -use OCP\Share\IShare; /** * Class Test_Share @@ -127,110 +125,6 @@ protected function tearDown(): void { parent::tearDown(); } - public function testGetItemSharedWithUser() { - \OC_User::setUserId($this->user1->getUID()); - - // add dummy values to the share table - $query = $this->connection->getQueryBuilder(); - $query->insert('share') - ->values([ - 'item_type' => $query->createParameter('itemType'), - 'item_source' => $query->createParameter('itemSource'), - 'item_target' => $query->createParameter('itemTarget'), - 'share_type' => $query->createParameter('shareType'), - 'share_with' => $query->createParameter('shareWith'), - 'uid_owner' => $query->createParameter('uidOwner') - ]); - $args = [ - ['test', 99, 'target1', IShare::TYPE_USER, $this->user2->getUID(), $this->user1->getUID()], - ['test', 99, 'target2', IShare::TYPE_USER, $this->user4->getUID(), $this->user1->getUID()], - ['test', 99, 'target3', IShare::TYPE_USER, $this->user3->getUID(), $this->user2->getUID()], - ['test', 99, 'target4', IShare::TYPE_USER, $this->user3->getUID(), $this->user4->getUID()], - ['test', 99, 'target4', IShare::TYPE_USER, $this->user6->getUID(), $this->user4->getUID()], - ]; - foreach ($args as $row) { - $query->setParameter('itemType', $row[0]); - $query->setParameter('itemSource', $row[1], IQueryBuilder::PARAM_INT); - $query->setParameter('itemTarget', $row[2]); - $query->setParameter('shareType', $row[3], IQueryBuilder::PARAM_INT); - $query->setParameter('shareWith', $row[4]); - $query->setParameter('uidOwner', $row[5]); - $query->executeStatement(); - } - - $result1 = Share::getItemSharedWithUser('test', 99, $this->user2->getUID(), $this->user1->getUID()); - $this->assertSame(1, count($result1)); - $this->verifyResult($result1, ['target1']); - - $result2 = Share::getItemSharedWithUser('test', 99, null, $this->user1->getUID()); - $this->assertSame(2, count($result2)); - $this->verifyResult($result2, ['target1', 'target2']); - - $result3 = Share::getItemSharedWithUser('test', 99, $this->user3->getUID()); - $this->assertSame(2, count($result3)); - $this->verifyResult($result3, ['target3', 'target4']); - - $result4 = Share::getItemSharedWithUser('test', 99, null, null); - $this->assertSame(5, count($result4)); // 5 because target4 appears twice - $this->verifyResult($result4, ['target1', 'target2', 'target3', 'target4']); - - $result6 = Share::getItemSharedWithUser('test', 99, $this->user6->getUID(), null); - $this->assertSame(1, count($result6)); - $this->verifyResult($result6, ['target4']); - } - - public function testGetItemSharedWithUserFromGroupShare() { - \OC_User::setUserId($this->user1->getUID()); - - // add dummy values to the share table - $query = $this->connection->getQueryBuilder(); - $query->insert('share') - ->values([ - 'item_type' => $query->createParameter('itemType'), - 'item_source' => $query->createParameter('itemSource'), - 'item_target' => $query->createParameter('itemTarget'), - 'share_type' => $query->createParameter('shareType'), - 'share_with' => $query->createParameter('shareWith'), - 'uid_owner' => $query->createParameter('uidOwner') - ]); - $args = [ - ['test', 99, 'target1', IShare::TYPE_GROUP, $this->group1->getGID(), $this->user1->getUID()], - ['test', 99, 'target2', IShare::TYPE_GROUP, $this->group2->getGID(), $this->user1->getUID()], - ['test', 99, 'target3', IShare::TYPE_GROUP, $this->group1->getGID(), $this->user2->getUID()], - ['test', 99, 'target4', IShare::TYPE_GROUP, $this->group1->getGID(), $this->user4->getUID()], - ]; - foreach ($args as $row) { - $query->setParameter('itemType', $row[0]); - $query->setParameter('itemSource', $row[1], IQueryBuilder::PARAM_INT); - $query->setParameter('itemTarget', $row[2]); - $query->setParameter('shareType', $row[3], IQueryBuilder::PARAM_INT); - $query->setParameter('shareWith', $row[4]); - $query->setParameter('uidOwner', $row[5]); - $query->executeStatement(); - } - - // user2 is in group1 and group2 - $result1 = Share::getItemSharedWithUser('test', 99, $this->user2->getUID(), $this->user1->getUID()); - $this->assertSame(2, count($result1)); - $this->verifyResult($result1, ['target1', 'target2']); - - $result2 = Share::getItemSharedWithUser('test', 99, null, $this->user1->getUID()); - $this->assertSame(2, count($result2)); - $this->verifyResult($result2, ['target1', 'target2']); - - // user3 is in group1 and group2 - $result3 = Share::getItemSharedWithUser('test', 99, $this->user3->getUID()); - $this->assertSame(3, count($result3)); - $this->verifyResult($result3, ['target1', 'target3', 'target4']); - - $result4 = Share::getItemSharedWithUser('test', 99, null, null); - $this->assertSame(4, count($result4)); - $this->verifyResult($result4, ['target1', 'target2', 'target3', 'target4']); - - $result6 = Share::getItemSharedWithUser('test', 99, $this->user6->getUID(), null); - $this->assertSame(0, count($result6)); - } - public function verifyResult($result, $expected) { foreach ($result as $r) { if (in_array($r['item_target'], $expected)) {