chore: remove long depricated share code

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2024-03-05 14:55:22 +01:00
parent c651e06a6d
commit a598de627c
4 changed files with 1 additions and 567 deletions

View File

@ -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];

View File

@ -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 @@ class Share extends Constants {
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 @@ class Share extends Constants {
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 @@ class Share extends Constants {
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;
}
}

View File

@ -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 @@ namespace OCP;
* @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
}
}

View File

@ -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 @@ class ShareTest extends \Test\TestCase {
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)) {