Skip to content

Commit

Permalink
chore: remove long depricated share code
Browse files Browse the repository at this point in the history
Signed-off-by: Robin Appelman <robin@icewind.nl>
  • Loading branch information
icewind1991 committed Mar 5, 2024
1 parent ad8cb2c commit 32b1dd5
Show file tree
Hide file tree
Showing 3 changed files with 0 additions and 500 deletions.
59 changes: 0 additions & 59 deletions apps/files_sharing/lib/ShareBackend/Folder.php
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
305 changes: 0 additions & 305 deletions lib/private/Share/Share.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,107 +93,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
*
Expand Down Expand Up @@ -287,185 +186,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
*
Expand All @@ -489,29 +209,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;
}
}
Loading

0 comments on commit 32b1dd5

Please sign in to comment.