Browse Source

files_sharing: Add OpenAPI spec

Signed-off-by: jld3103 <jld3103yt@gmail.com>
tags/v28.0.0beta1
jld3103 1 year ago
parent
commit
c6806684d2
No account linked to committer's email address

+ 1
- 0
apps/files_sharing/composer/composer/autoload_classmap.php View File

@@ -76,6 +76,7 @@ return array(
'OCA\\Files_Sharing\\Notification\\Listener' => $baseDir . '/../lib/Notification/Listener.php',
'OCA\\Files_Sharing\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
'OCA\\Files_Sharing\\OrphanHelper' => $baseDir . '/../lib/OrphanHelper.php',
'OCA\\Files_Sharing\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
'OCA\\Files_Sharing\\Scanner' => $baseDir . '/../lib/Scanner.php',
'OCA\\Files_Sharing\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php',
'OCA\\Files_Sharing\\ShareBackend\\File' => $baseDir . '/../lib/ShareBackend/File.php',

+ 1
- 0
apps/files_sharing/composer/composer/autoload_static.php View File

@@ -91,6 +91,7 @@ class ComposerStaticInitFiles_Sharing
'OCA\\Files_Sharing\\Notification\\Listener' => __DIR__ . '/..' . '/../lib/Notification/Listener.php',
'OCA\\Files_Sharing\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
'OCA\\Files_Sharing\\OrphanHelper' => __DIR__ . '/..' . '/../lib/OrphanHelper.php',
'OCA\\Files_Sharing\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
'OCA\\Files_Sharing\\Scanner' => __DIR__ . '/..' . '/../lib/Scanner.php',
'OCA\\Files_Sharing\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php',
'OCA\\Files_Sharing\\ShareBackend\\File' => __DIR__ . '/..' . '/../lib/ShareBackend/File.php',

+ 62
- 0
apps/files_sharing/lib/Capabilities.php View File

@@ -8,6 +8,7 @@
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tobias Kaminsky <tobias@kaminsky.me>
* @author Vincent Petry <vincent@nextcloud.com>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license AGPL-3.0
*
@@ -50,6 +51,67 @@ class Capabilities implements ICapability {

/**
* Return this classes capabilities
*
* @return array{
* files_sharing: array{
* api_enabled: bool,
* public: array{
* enabled: bool,
* password?: array{
* enforced: bool,
* askForOptionalPassword: bool
* },
* multiple_links?: bool,
* expire_date?: array{
* enabled: bool,
* days?: int,
* enforced?: bool,
* },
* expire_date_internal?: array{
* enabled: bool,
* days?: int,
* enforced?: bool,
* },
* expire_date_remote?: array{
* enabled: bool,
* days?: int,
* enforced?: bool,
* },
* send_mail?: bool,
* upload?: bool,
* upload_files_drop?: bool,
* },
* user: array{
* send_mail: bool,
* expire_date?: array{
* enabled: bool,
* },
* },
* resharing: bool,
* group_sharing?: bool,
* group?: array{
* enabled: bool,
* expire_date?: array{
* enabled: bool,
* },
* },
* default_permissions?: int,
* federation: array{
* outgoing: bool,
* incoming: bool,
* expire_date: array{
* enabled: bool,
* },
* expire_date_supported: array{
* enabled: bool,
* },
* },
* sharee: array{
* query_lookup_default: bool,
* always_show_unique: bool,
* },
* },
* }
*/
public function getCapabilities() {
$res = [];

+ 3
- 0
apps/files_sharing/lib/Controller/AcceptController.php View File

@@ -6,6 +6,7 @@ declare(strict_types=1);
* @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -27,6 +28,7 @@ namespace OCA\Files_Sharing\Controller;

use OCA\Files_Sharing\AppInfo\Application;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\IgnoreOpenAPI;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\Response;
@@ -36,6 +38,7 @@ use OCP\IUserSession;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager as ShareManager;

#[IgnoreOpenAPI]
class AcceptController extends Controller {

/** @var ShareManager */

+ 19
- 0
apps/files_sharing/lib/Controller/DeletedShareAPIController.php View File

@@ -11,6 +11,7 @@ declare(strict_types=1);
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Julius Härtl <jus@bitgrid.net>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -30,7 +31,9 @@ declare(strict_types=1);
*/
namespace OCA\Files_Sharing\Controller;

use OCA\Files_Sharing\ResponseDefinitions;
use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCS\OCSNotFoundException;
@@ -47,6 +50,9 @@ use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager as ShareManager;
use OCP\Share\IShare;

/**
* @psalm-import-type FilesSharingDeletedShare from ResponseDefinitions
*/
class DeletedShareAPIController extends OCSController {

/** @var ShareManager */
@@ -92,6 +98,8 @@ class DeletedShareAPIController extends OCSController {

/**
* @suppress PhanUndeclaredClassMethod
*
* @return FilesSharingDeletedShare
*/
private function formatShare(IShare $share): array {
$result = [
@@ -176,6 +184,10 @@ class DeletedShareAPIController extends OCSController {

/**
* @NoAdminRequired
*
* Get a list of all deleted shares
*
* @return DataResponse<Http::STATUS_OK, FilesSharingDeletedShare[], array{}>
*/
public function index(): DataResponse {
$groupShares = $this->shareManager->getDeletedSharedWith($this->userId, IShare::TYPE_GROUP, null, -1, 0);
@@ -195,7 +207,14 @@ class DeletedShareAPIController extends OCSController {
/**
* @NoAdminRequired
*
* Undelete a deleted share
*
* @param string $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSException
* @throws OCSNotFoundException Share not found
*
* 200: Share undeleted successfully
*/
public function undelete(string $id): DataResponse {
try {

+ 23
- 7
apps/files_sharing/lib/Controller/PublicPreviewController.php View File

@@ -5,6 +5,7 @@
* @author Julius Härtl <jus@bitgrid.net>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -82,11 +83,19 @@ class PublicPreviewController extends PublicShareController {
* @PublicPage
* @NoCSRFRequired
*
* @param string $file
* @param int $x
* @param int $y
* @param bool $a
* @return DataResponse|FileDisplayResponse
* Get a preview for a shared file
*
* @param string $token Token of the share
* @param string $file File in the share
* @param int $x Width of the preview
* @param int $y Height of the preview
* @param bool $a Whether to not crop the preview
* @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>
*
* 200: Preview returned
* 400: Getting preview is not possible
* 403: Getting preview is not allowed
* 404: Share or preview not found
*/
public function getPreview(
string $token,
@@ -138,8 +147,15 @@ class PublicPreviewController extends PublicShareController {
* @NoCSRFRequired
* @NoSameSiteCookieRequired
*
* @param $token
* @return DataResponse|FileDisplayResponse
* Get a direct link preview for a shared file
*
* @param string $token Token of the share
* @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|DataResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>
*
* 200: Preview returned
* 400: Getting preview is not possible
* 403: Getting preview is not allowed
* 404: Share or preview not found
*/
public function directLink(string $token) {
// No token no image

+ 30
- 16
apps/files_sharing/lib/Controller/RemoteController.php View File

@@ -5,6 +5,7 @@
* @author Bjoern Schiessle <bjoern@schiessle.org>
* @author Joas Schilling <coding@schilljs.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license AGPL-3.0
*
@@ -24,6 +25,8 @@
namespace OCA\Files_Sharing\Controller;

use OCA\Files_Sharing\External\Manager;
use OCA\Files_Sharing\ResponseDefinitions;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSForbiddenException;
use OCP\AppFramework\OCS\OCSNotFoundException;
@@ -31,6 +34,9 @@ use OCP\AppFramework\OCSController;
use OCP\IRequest;
use Psr\Log\LoggerInterface;

/**
* @psalm-import-type FilesSharingRemoteShare from ResponseDefinitions
*/
class RemoteController extends OCSController {
/**
* @NoAdminRequired
@@ -55,7 +61,7 @@ class RemoteController extends OCSController {
*
* Get list of pending remote shares
*
* @return DataResponse
* @return DataResponse<Http::STATUS_OK, FilesSharingRemoteShare[], array{}>
*/
public function getOpenShares() {
return new DataResponse($this->externalManager->getOpenShares());
@@ -66,9 +72,11 @@ class RemoteController extends OCSController {
*
* Accept a remote share
*
* @param int $id
* @return DataResponse
* @throws OCSNotFoundException
* @param int $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSNotFoundException Share not found
*
* 200: Share accepted successfully
*/
public function acceptShare($id) {
if ($this->externalManager->acceptShare($id)) {
@@ -86,9 +94,11 @@ class RemoteController extends OCSController {
*
* Decline a remote share
*
* @param int $id
* @return DataResponse
* @throws OCSNotFoundException
* @param int $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSNotFoundException Share not found
*
* 200: Share declined successfully
*/
public function declineShare($id) {
if ($this->externalManager->declineShare($id)) {
@@ -125,9 +135,9 @@ class RemoteController extends OCSController {
/**
* @NoAdminRequired
*
* List accepted remote shares
* Get a list of accepted remote shares
*
* @return DataResponse
* @return DataResponse<Http::STATUS_OK, FilesSharingRemoteShare[], array{}>
*/
public function getShares() {
$shares = $this->externalManager->getAcceptedShares();
@@ -141,9 +151,11 @@ class RemoteController extends OCSController {
*
* Get info of a remote share
*
* @param int $id
* @return DataResponse
* @throws OCSNotFoundException
* @param int $id ID of the share
* @return DataResponse<Http::STATUS_OK, FilesSharingRemoteShare, array{}>
* @throws OCSNotFoundException Share not found
*
* 200: Share returned
*/
public function getShare($id) {
$shareInfo = $this->externalManager->getShare($id);
@@ -161,10 +173,12 @@ class RemoteController extends OCSController {
*
* Unshare a remote share
*
* @param int $id
* @return DataResponse
* @throws OCSNotFoundException
* @throws OCSForbiddenException
* @param int $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSNotFoundException Share not found
* @throws OCSForbiddenException Unsharing is not possible
*
* 200: Share unshared successfully
*/
public function unshare($id) {
$shareInfo = $this->externalManager->getShare($id);

+ 98
- 85
apps/files_sharing/lib/Controller/ShareAPIController.php View File

@@ -26,6 +26,7 @@ declare(strict_types=1);
* @author Valdnet <47037905+Valdnet@users.noreply.github.com>
* @author Vincent Petry <vincent@nextcloud.com>
* @author waleczny <michal@walczak.xyz>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license AGPL-3.0
*
@@ -42,6 +43,7 @@ declare(strict_types=1);
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/

namespace OCA\Files_Sharing\Controller;

use Exception;
@@ -50,8 +52,10 @@ use OC\Files\Storage\Wrapper\Wrapper;
use OCA\Files\Helper;
use OCA\Files_Sharing\Exceptions\SharingRightsException;
use OCA\Files_Sharing\External\Storage;
use OCA\Files_Sharing\ResponseDefinitions;
use OCA\Files_Sharing\SharedStorage;
use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSBadRequestException;
use OCP\AppFramework\OCS\OCSException;
@@ -85,9 +89,9 @@ use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;

/**
* Class Share20OCS
*
* @package OCA\Files_Sharing\API
*
* @psalm-import-type FilesSharingShare from ResponseDefinitions
*/
class ShareAPIController extends OCSController {

@@ -173,7 +177,7 @@ class ShareAPIController extends OCSController {
*
* @param \OCP\Share\IShare $share
* @param Node|null $recipientNode
* @return array
* @return FilesSharingShare
* @throws NotFoundException In case the node can't be resolved.
*
* @suppress PhanUndeclaredClassMethod
@@ -258,7 +262,6 @@ class ShareAPIController extends OCSController {
$result['share_with_displayname_unique'] = $sharedWith !== null ? (
!empty($sharedWith->getSystemEMailAddress()) ? $sharedWith->getSystemEMailAddress() : $sharedWith->getUID()
) : $share->getSharedWith();
$result['status'] = [];

$userStatuses = $this->userStatusManager->getUserStatuses([$share->getSharedWith()]);
$userStatus = array_shift($userStatuses);
@@ -328,7 +331,9 @@ class ShareAPIController extends OCSController {
$result['share_with_displayname'] = '';

try {
$result = array_merge($result, $this->getRoomShareHelper()->formatShare($share));
/** @var array{share_with_displayname: string, share_with_link: string, share_with?: string, token?: string} $roomShare */
$roomShare = $this->getRoomShareHelper()->formatShare($share);
$result = array_merge($result, $roomShare);
} catch (QueryException $e) {
}
} elseif ($share->getShareType() === IShare::TYPE_DECK) {
@@ -336,7 +341,9 @@ class ShareAPIController extends OCSController {
$result['share_with_displayname'] = '';

try {
$result = array_merge($result, $this->getDeckShareHelper()->formatShare($share));
/** @var array{share_with: string, share_with_displayname: string, share_with_link: string} $deckShare */
$deckShare = $this->getDeckShareHelper()->formatShare($share);
$result = array_merge($result, $deckShare);
} catch (QueryException $e) {
}
} elseif ($share->getShareType() === IShare::TYPE_SCIENCEMESH) {
@@ -344,7 +351,9 @@ class ShareAPIController extends OCSController {
$result['share_with_displayname'] = '';

try {
$result = array_merge($result, $this->getSciencemeshShareHelper()->formatShare($share));
/** @var array{share_with: string, share_with_displayname: string, token: string} $scienceMeshShare */
$scienceMeshShare = $this->getSciencemeshShareHelper()->formatShare($share);
$result = array_merge($result, $scienceMeshShare);
} catch (QueryException $e) {
}
}
@@ -355,7 +364,7 @@ class ShareAPIController extends OCSController {

$result['attributes'] = null;
if ($attributes = $share->getAttributes()) {
$result['attributes'] = \json_encode($attributes->toArray());
$result['attributes'] = (string)\json_encode($attributes->toArray());
}

return $result;
@@ -493,14 +502,16 @@ class ShareAPIController extends OCSController {


/**
* @NoAdminRequired
*
* Get a specific share by id
*
* @NoAdminRequired
* @param string $id ID of the share
* @param bool $include_tags Include tags in the share
* @return DataResponse<Http::STATUS_OK, FilesSharingShare, array{}>
* @throws OCSNotFoundException Share not found
*
* @param string $id
* @param bool $includeTags
* @return DataResponse
* @throws OCSNotFoundException
* 200: Share returned
*/
public function getShare(string $id, bool $include_tags = false): DataResponse {
try {
@@ -529,13 +540,16 @@ class ShareAPIController extends OCSController {
}

/**
* @NoAdminRequired
*
* Delete a share
*
* @NoAdminRequired
* @param string $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSNotFoundException Share not found
* @throws OCSForbiddenException Missing permissions to delete the share
*
* @param string $id
* @return DataResponse
* @throws OCSNotFoundException
* 200: Share deleted successfully
*/
public function deleteShare(string $id): DataResponse {
try {
@@ -574,25 +588,28 @@ class ShareAPIController extends OCSController {
/**
* @NoAdminRequired
*
* @param string $path
* @param int $permissions
* @param int $shareType
* @param string $shareWith
* @param string $publicUpload
* @param string $password
* @param string $sendPasswordByTalk
* @param string $expireDate
* @param string $label
* @param string $attributes
* Create a share
*
* @return DataResponse
* @throws NotFoundException
* @throws OCSBadRequestException
* @param string|null $path Path of the share
* @param int|null $permissions Permissions for the share
* @param int $shareType Type of the share
* @param string|null $shareWith The entity this should be shared with
* @param string $publicUpload If public uploading is allowed
* @param string $password Password for the share
* @param string|null $sendPasswordByTalk Send the password for the share over Talk
* @param string $expireDate Expiry date of the share
* @param string $note Note for the share
* @param string $label Label for the share (only used in link and email)
* @param string|null $attributes Additional attributes for the share
*
* @return DataResponse<Http::STATUS_OK, FilesSharingShare, array{}>
* @throws OCSBadRequestException Unknown share type
* @throws OCSException
* @throws OCSForbiddenException
* @throws OCSNotFoundException
* @throws InvalidPathException
* @throws OCSForbiddenException Creating the share is not allowed
* @throws OCSNotFoundException Creating the share failed
* @suppress PhanUndeclaredClassMethod
*
* 200: Share created
*/
public function createShare(
string $path = null,
@@ -862,7 +879,7 @@ class ShareAPIController extends OCSController {
* @param null|Node $node
* @param boolean $includeTags
*
* @return array
* @return FilesSharingShare[]
*/
private function getSharedWithMe($node, bool $includeTags): array {
$userShares = $this->shareManager->getSharedWith($this->currentUser, IShare::TYPE_USER, $node, -1, 0);
@@ -899,7 +916,7 @@ class ShareAPIController extends OCSController {
/**
* @param \OCP\Files\Node $folder
*
* @return array
* @return FilesSharingShare[]
* @throws OCSBadRequestException
* @throws NotFoundException
*/
@@ -951,27 +968,20 @@ class ShareAPIController extends OCSController {
}

/**
* The getShares function.
*
* @NoAdminRequired
*
* @param string $shared_with_me
* @param string $reshares
* @param string $subfiles
* @param string $path
* Get shares of the current user
*
* - Get shares by the current user
* - Get shares by the current user and reshares (?reshares=true)
* - Get shares with the current user (?shared_with_me=true)
* - Get shares for a specific path (?path=...)
* - Get all shares in a folder (?subfiles=true&path=..)
* @param string $shared_with_me Only get shares with the current user
* @param string $reshares Only get shares by the current user and reshares
* @param string $subfiles Only get all shares in a folder
* @param string $path Get shares for a specific path
* @param string $include_tags Include tags in the share
*
* @param string $include_tags
* @return DataResponse<Http::STATUS_OK, FilesSharingShare[], array{}>
* @throws OCSNotFoundException The folder was not found or is inaccessible
*
* @return DataResponse
* @throws NotFoundException
* @throws OCSBadRequestException
* @throws OCSNotFoundException
* 200: Shares returned
*/
public function getShares(
string $shared_with_me = 'false',
@@ -1016,7 +1026,7 @@ class ShareAPIController extends OCSController {
* @param bool $subFiles
* @param bool $includeTags
*
* @return array
* @return FilesSharingShare[]
* @throws NotFoundException
* @throws OCSBadRequestException
*/
@@ -1095,25 +1105,19 @@ class ShareAPIController extends OCSController {


/**
* The getInheritedShares function.
* returns all shares relative to a file, including parent folders shares rights.
*
* @NoAdminRequired
*
* @param string $path
* Get all shares relative to a file, including parent folders shares rights
*
* - Get shares by the current user
* - Get shares by the current user and reshares (?reshares=true)
* - Get shares with the current user (?shared_with_me=true)
* - Get shares for a specific path (?path=...)
* - Get all shares in a folder (?subfiles=true&path=..)
* @param string $path Path all shares will be relative to
*
* @return DataResponse
* @return DataResponse<Http::STATUS_OK, FilesSharingShare[], array{}>
* @throws InvalidPathException
* @throws NotFoundException
* @throws OCSNotFoundException
* @throws OCSBadRequestException
* @throws OCSNotFoundException The given path is invalid
* @throws SharingRightsException
*
* 200: Shares returned
*/
public function getInheritedShares(string $path): DataResponse {

@@ -1197,22 +1201,24 @@ class ShareAPIController extends OCSController {
/**
* @NoAdminRequired
*
* @param string $id
* @param int $permissions
* @param string $password
* @param string $sendPasswordByTalk
* @param string $publicUpload
* @param string $expireDate
* @param string $note
* @param string $label
* @param string $hideDownload
* @param string $attributes
* @return DataResponse
* @throws LockedException
* @throws NotFoundException
* @throws OCSBadRequestException
* @throws OCSForbiddenException
* @throws OCSNotFoundException
* Update a share
*
* @param string $id ID of the share
* @param int|null $permissions New permissions
* @param string|null $password New password
* @param string|null $sendPasswordByTalk New condition if the password should be send over Talk
* @param string|null $publicUpload New condition if public uploading is allowed
* @param string|null $expireDate New expiry date
* @param string|null $note New note
* @param string|null $label New label
* @param string|null $hideDownload New condition if the download should be hidden
* @param string|null $attributes New additional attributes
* @return DataResponse<Http::STATUS_OK, FilesSharingShare, array{}>
* @throws OCSBadRequestException Share could not be updated because the requested changes are invalid
* @throws OCSForbiddenException Missing permissions to update the share
* @throws OCSNotFoundException Share not found
*
* 200: Share updated successfully
*/
public function updateShare(
string $id,
@@ -1400,6 +1406,10 @@ class ShareAPIController extends OCSController {

/**
* @NoAdminRequired
*
* Get all shares that are still pending
*
* @return DataResponse<Http::STATUS_OK, FilesSharingShare[], array{}>
*/
public function pendingShares(): DataResponse {
$pendingShares = [];
@@ -1434,7 +1444,6 @@ class ShareAPIController extends OCSController {

try {
$formattedShare = $this->formatShare($share, $node);
$formattedShare['status'] = $share->getStatus();
$formattedShare['path'] = '/' . $share->getNode()->getName();
$formattedShare['permissions'] = 0;
return $formattedShare;
@@ -1451,11 +1460,15 @@ class ShareAPIController extends OCSController {
/**
* @NoAdminRequired
*
* @param string $id
* @return DataResponse
* @throws OCSNotFoundException
* Accept a share
*
* @param string $id ID of the share
* @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
* @throws OCSNotFoundException Share not found
* @throws OCSException
* @throws OCSBadRequestException
* @throws OCSBadRequestException Share could not be accepted
*
* 200: Share accepted successfully
*/
public function acceptShare(string $id): DataResponse {
try {

+ 3
- 2
apps/files_sharing/lib/Controller/ShareController.php View File

@@ -24,6 +24,7 @@
* @author Sascha Sambale <mastixmc@gmail.com>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Vincent Petry <vincent@nextcloud.com>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license AGPL-3.0
*
@@ -51,6 +52,7 @@ use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
use OCA\Files_Sharing\Event\ShareLinkAccessedEvent;
use OCP\Accounts\IAccountManager;
use OCP\AppFramework\AuthPublicShareController;
use OCP\AppFramework\Http\Attribute\IgnoreOpenAPI;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Defaults;
@@ -74,10 +76,9 @@ use OCP\Share\IPublicShareTemplateFactory;
use OCP\Template;

/**
* Class ShareController
*
* @package OCA\Files_Sharing\Controllers
*/
#[IgnoreOpenAPI]
class ShareController extends AuthPublicShareController {
protected ?Share\IShare $share = null;


+ 28
- 4
apps/files_sharing/lib/Controller/ShareInfoController.php View File

@@ -4,6 +4,7 @@
*
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -24,6 +25,7 @@
namespace OCA\Files_Sharing\Controller;

use OCA\Files_External\NotFoundException;
use OCA\Files_Sharing\ResponseDefinitions;
use OCP\AppFramework\ApiController;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
@@ -35,6 +37,9 @@ use OCP\IRequest;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;

/**
* @psalm-import-type FilesSharingShareInfo from ResponseDefinitions
*/
class ShareInfoController extends ApiController {

/** @var IManager */
@@ -60,10 +65,17 @@ class ShareInfoController extends ApiController {
* @NoCSRFRequired
* @BruteForceProtection(action=shareinfo)
*
* @param string $t
* @param ?string $password
* @param ?string $dir
* @return JSONResponse
* Get the info about a share
*
* @param string $t Token of the share
* @param string|null $password Password of the share
* @param string|null $dir Subdirectory to get info about
* @param int $depth Maximum depth to get info about
* @return JSONResponse<Http::STATUS_OK, FilesSharingShareInfo, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_NOT_FOUND, array<empty>, array{}>
*
* 200: Share info returned
* 403: Getting share info is not allowed
* 404: Share not found
*/
public function info(string $t, ?string $password = null, ?string $dir = null, int $depth = -1): JSONResponse {
try {
@@ -99,6 +111,9 @@ class ShareInfoController extends ApiController {
return new JSONResponse($this->parseNode($node, $permissionMask, $depth));
}

/**
* @return FilesSharingShareInfo
*/
private function parseNode(Node $node, int $permissionMask, int $depth): array {
if ($node instanceof File) {
return $this->parseFile($node, $permissionMask);
@@ -107,10 +122,16 @@ class ShareInfoController extends ApiController {
return $this->parseFolder($node, $permissionMask, $depth);
}

/**
* @return FilesSharingShareInfo
*/
private function parseFile(File $file, int $permissionMask): array {
return $this->format($file, $permissionMask);
}

/**
* @return FilesSharingShareInfo
*/
private function parseFolder(Folder $folder, int $permissionMask, int $depth): array {
$data = $this->format($folder, $permissionMask);

@@ -128,6 +149,9 @@ class ShareInfoController extends ApiController {
return $data;
}

/**
* @return FilesSharingShareInfo
*/
private function format(Node $node, int $permissionMask): array {
$entry = [];


+ 28
- 18
apps/files_sharing/lib/Controller/ShareesAPIController.php View File

@@ -43,6 +43,8 @@ use function array_slice;
use function array_values;
use Generator;
use OC\Collaboration\Collaborators\SearchResult;
use OCA\Files_Sharing\ResponseDefinitions;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSBadRequestException;
use OCP\AppFramework\OCSController;
@@ -56,6 +58,10 @@ use OCP\Share\IShare;
use OCP\Share\IManager;
use function usort;

/**
* @psalm-import-type FilesSharingShareesSearchResult from ResponseDefinitions
* @psalm-import-type FilesSharingShareesRecommendedResult from ResponseDefinitions
*/
class ShareesAPIController extends OCSController {

/** @var string */
@@ -76,7 +82,7 @@ class ShareesAPIController extends OCSController {
/** @var int */
protected $limit = 10;

/** @var array */
/** @var FilesSharingShareesSearchResult */
protected $result = [
'exact' => [
'users' => [],
@@ -131,14 +137,18 @@ class ShareesAPIController extends OCSController {
/**
* @NoAdminRequired
*
* @param string $search
* @param string $itemType
* @param int $page
* @param int $perPage
* @param int|int[] $shareType
* @param bool $lookup
* @return DataResponse
* @throws OCSBadRequestException
* Search for sharees
*
* @param string $search Text to search for
* @param string|null $itemType Limit to specific item types
* @param int $page Page offset for searching
* @param int $perPage Limit amount of search results per page
* @param int|int[]|null $shareType Limit to specific share types
* @param bool $lookup If a global lookup should be performed too
* @return DataResponse<Http::STATUS_OK, FilesSharingShareesSearchResult, array{Link?: string}>
* @throws OCSBadRequestException Invalid search parameters
*
* 200: Sharees search result returned
*/
public function search(string $search = '', string $itemType = null, int $page = 1, int $perPage = 200, $shareType = null, bool $lookup = false): DataResponse {

@@ -234,12 +244,12 @@ class ShareesAPIController extends OCSController {
$response = new DataResponse($this->result);

if ($hasMoreResults) {
$response->addHeader('Link', $this->getPaginationLink($page, [
$response->setHeaders(['Link' => $this->getPaginationLink($page, [
'search' => $search,
'itemType' => $itemType,
'shareType' => $shareTypes,
'perPage' => $perPage,
]));
])]);
}

return $response;
@@ -333,18 +343,18 @@ class ShareesAPIController extends OCSController {
/**
* @NoAdminRequired
*
* @param string $itemType
* @return DataResponse
* @throws OCSBadRequestException
* Find recommended sharees
*
* @param string $itemType Limit to specific item types
* @param int|int[]|null $shareType Limit to specific share types
* @return DataResponse<Http::STATUS_OK, FilesSharingShareesRecommendedResult, array{}>
*/
public function findRecommended(string $itemType = null, $shareType = null): DataResponse {
public function findRecommended(string $itemType, $shareType = null): DataResponse {
$shareTypes = [
IShare::TYPE_USER,
];

if ($itemType === null) {
throw new OCSBadRequestException('Missing itemType');
} elseif ($itemType === 'file' || $itemType === 'folder') {
if ($itemType === 'file' || $itemType === 'folder') {
if ($this->shareManager->allowGroupSharing()) {
$shareTypes[] = IShare::TYPE_GROUP;
}

+ 243
- 0
apps/files_sharing/lib/ResponseDefinitions.php View File

@@ -0,0 +1,243 @@
<?php
declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Kate Döen <kate.doeen@nextcloud.com>
*
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Files_Sharing;

/**
* @psalm-type FilesSharingShare = array{
* attributes: ?string,
* can_delete: bool,
* can_edit: bool,
* displayname_file_owner: string,
* displayname_owner: string,
* expiration: ?string,
* file_parent: int,
* file_source: int,
* file_target: string,
* has_preview: bool,
* hide_download: 0|1,
* id: string,
* item_mtime: int,
* item_permissions?: int,
* item_size: float|int,
* item_source: int,
* item_type: 'file'|'folder',
* label: string,
* mail_send: 0|1,
* mimetype: string,
* note: string,
* parent: null,
* password?: string,
* password_expiration_time?: ?string,
* path: ?string,
* permissions: int,
* send_password_by_talk?: bool,
* share_type: int,
* share_with?: string,
* share_with_avatar?: string,
* share_with_displayname?: string,
* share_with_displayname_unique?: ?string,
* share_with_link?: string,
* status?: array{clearAt?: int|null, icon?: ?string, message?: ?string, status?: string},
* stime: int,
* storage: int,
* storage_id: string,
* token: ?string,
* uid_file_owner: string,
* uid_owner: string,
* url?: string,
* }
*
* @psalm-type FilesSharingDeletedShare = array{
* id: string,
* share_type: int,
* uid_owner: string,
* displayname_owner: string,
* permissions: int,
* stime: int,
* uid_file_owner: string,
* displayname_file_owner: string,
* path: string,
* item_type: string,
* mimetype: string,
* storage: int,
* item_source: int,
* file_source: int,
* file_parent: int,
* file_target: int,
* expiration: string|null,
* share_with: string|null,
* share_with_displayname: string|null,
* share_with_link: string|null,
* }
*
* @psalm-type FilesSharingRemoteShare = array{
* accepted: bool,
* file_id: int|null,
* id: int,
* mimetype: string|null,
* mountpoint: string,
* mtime: int|null,
* name: string,
* owner: string,
* parent: int|null,
* permissions: int|null,
* remote: string,
* remote_id: string,
* share_token: string,
* share_type: int,
* type: string|null,
* user: string,
* }
*
* @psalm-type FilesSharingSharee = array{
* count: int|null,
* label: string,
* }
*
* @psalm-type FilesSharingShareeValue = array{
* shareType: int,
* shareWith: string,
* }
*
* @psalm-type FilesSharingShareeUser = FilesSharingSharee&array{
* subline: string,
* icon: string,
* shareWithDisplayNameUnique: string,
* status: array{
* status: string,
* message: string,
* icon: string,
* clearAt: int|null,
* },
* value: FilesSharingShareeValue,
* }
*
* @psalm-type FilesSharingShareeRemoteGroup = FilesSharingSharee&array{
* guid: string,
* name: string,
* value: FilesSharingShareeValue&array{
* server: string,
* }
* }
*
* @psalm-type FilesSharingLookup = array{
* value: string,
* verified: int,
* }
*
* @psalm-type FilesSharingShareeLookup = FilesSharingSharee&array{
* extra: array{
* federationId: string,
* name: FilesSharingLookup|null,
* email: FilesSharingLookup|null,
* address: FilesSharingLookup|null,
* website: FilesSharingLookup|null,
* twitter: FilesSharingLookup|null,
* phone: FilesSharingLookup|null,
* twitter_signature: FilesSharingLookup|null,
* website_signature: FilesSharingLookup|null,
* userid: FilesSharingLookup|null,
* },
* value: FilesSharingShareeValue&array{
* globalScale: bool,
* }
* }
*
* @psalm-type FilesSharingShareeEmail = FilesSharingSharee&array{
* uuid: string,
* name: string,
* type: string,
* shareWithDisplayNameUnique: string,
* value: FilesSharingShareeValue,
* }
*
* @psalm-type FilesSharingShareeRemote = FilesSharingSharee&array{
* uuid: string,
* name: string,
* type: string,
* value: FilesSharingShareeValue&array{
* server: string,
* }
* }
*
* @psalm-type FilesSharingShareeCircle = FilesSharingSharee&array{
* shareWithDescription: string,
* value: FilesSharingShareeValue&array{
* circle: string,
* }
* }
*
* @psalm-type FilesSharingShareesSearchResult = array{
* exact: array{
* circles: FilesSharingShareeCircle[],
* emails: FilesSharingShareeEmail[],
* groups: FilesSharingSharee[],
* remote_groups: FilesSharingShareeRemoteGroup[],
* remotes: FilesSharingShareeRemote[],
* rooms: FilesSharingSharee[],
* users: FilesSharingShareeUser[],
* },
* circles: FilesSharingShareeCircle[],
* emails: FilesSharingShareeEmail[],
* groups: FilesSharingSharee[],
* lookup: FilesSharingShareeLookup[],
* remote_groups: FilesSharingShareeRemoteGroup[],
* remotes: FilesSharingShareeRemote[],
* rooms: FilesSharingSharee[],
* users: FilesSharingShareeUser[],
* lookupEnabled: bool,
* }
*
* @psalm-type FilesSharingShareesRecommendedResult = array{
* exact: array{
* emails: FilesSharingShareeEmail[],
* groups: FilesSharingSharee[],
* remote_groups: FilesSharingShareeRemoteGroup[],
* remotes: FilesSharingShareeRemote[],
* users: FilesSharingShareeUser[],
* },
* emails: FilesSharingShareeEmail[],
* groups: FilesSharingSharee[],
* remote_groups: FilesSharingShareeRemoteGroup[],
* remotes: FilesSharingShareeRemote[],
* users: FilesSharingShareeUser[],
* }
*
* @psalm-type FilesSharingShareInfo = array{
* id: int,
* parentId: int,
* mtime: int,
* name: string,
* permissions: int,
* mimetype: string,
* size: int|float,
* type: string,
* etag: string,
* children?: array<string, mixed>[],
* }
*/
class ResponseDefinitions {
}

+ 403
- 101
apps/files_sharing/openapi.json View File

@@ -479,31 +479,26 @@
"file_source",
"file_target",
"has_preview",
"hide_download",
"id",
"item_mtime",
"item_size",
"item_source",
"item_type",
"label",
"mail_send",
"mimetype",
"note",
"password",
"password_expiration_time",
"parent",
"path",
"permissions",
"send_password_by_talk",
"share_type",
"share_with",
"share_with_avatar",
"share_with_displayname",
"share_with_link",
"status",
"stime",
"storage",
"storage_id",
"token",
"uid_file_owner",
"uid_owner",
"url"
"uid_owner"
],
"properties": {
"attributes": {
@@ -540,15 +535,43 @@
"has_preview": {
"type": "boolean"
},
"hide_download": {
"type": "integer",
"format": "int64"
},
"id": {
"type": "string"
},
"item_mtime": {
"type": "integer",
"format": "int64"
},
"item_permissions": {
"type": "integer",
"format": "int64"
},
"item_size": {
"oneOf": [
{
"type": "number",
"format": "float"
},
{
"type": "integer",
"format": "int64"
}
]
},
"item_source": {
"type": "integer",
"format": "int64"
},
"item_type": {
"type": "string"
"type": "string",
"enum": [
"file",
"folder"
]
},
"label": {
"type": "string"
@@ -563,80 +586,67 @@
"note": {
"type": "string"
},
"password": {
"type": "string",
"parent": {
"nullable": true
},
"password": {
"type": "string"
},
"password_expiration_time": {
"type": "string",
"nullable": true
},
"path": {
"type": "string"
"type": "string",
"nullable": true
},
"permissions": {
"type": "integer",
"format": "int64"
},
"send_password_by_talk": {
"type": "boolean",
"nullable": true
"type": "boolean"
},
"share_type": {
"type": "integer",
"format": "int64"
},
"share_with": {
"type": "string",
"nullable": true
"type": "string"
},
"share_with_avatar": {
"type": "string",
"nullable": true
"type": "string"
},
"share_with_displayname": {
"type": "string"
},
"share_with_displayname_unique": {
"type": "string",
"nullable": true
},
"share_with_link": {
"type": "string",
"nullable": true
"type": "string"
},
"status": {
"nullable": true,
"oneOf": [
{
"type": "object",
"required": [
"status",
"message",
"icon",
"clearAt"
],
"properties": {
"status": {
"type": "string"
},
"message": {
"type": "string",
"nullable": true
},
"icon": {
"type": "string",
"nullable": true
},
"clearAt": {
"type": "integer",
"format": "int64",
"nullable": true
}
}
},
{
"type": "object",
"properties": {
"clearAt": {
"type": "integer",
"format": "int64"
"format": "int64",
"nullable": true
},
"icon": {
"type": "string",
"nullable": true
},
"message": {
"type": "string",
"nullable": true
},
"status": {
"type": "string"
}
]
}
},
"stime": {
"type": "integer",
@@ -660,8 +670,7 @@
"type": "string"
},
"url": {
"type": "string",
"nullable": true
"type": "string"
}
}
},
@@ -676,8 +685,7 @@
"mimetype",
"size",
"type",
"etag",
"children"
"etag"
],
"properties": {
"id": {
@@ -703,8 +711,16 @@
"type": "string"
},
"size": {
"type": "integer",
"format": "int64"
"oneOf": [
{
"type": "integer",
"format": "int64"
},
{
"type": "number",
"format": "float"
}
]
},
"type": {
"type": "string"
@@ -714,7 +730,6 @@
},
"children": {
"type": "array",
"nullable": true,
"items": {
"type": "object",
"additionalProperties": {
@@ -1272,6 +1287,314 @@
}
},
"paths": {
"/index.php/s/{token}/preview": {
"get": {
"operationId": "public_preview-direct-link",
"summary": "Get a direct link preview for a shared file",
"tags": [
"public_preview"
],
"security": [
{},
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"parameters": [
{
"name": "token",
"in": "path",
"description": "Token of the share",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "OCS-APIRequest",
"in": "header",
"required": true,
"schema": {
"type": "string",
"default": "true"
}
}
],
"responses": {
"200": {
"description": "Preview returned",
"content": {
"*/*": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"400": {
"description": "Getting preview is not possible",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"403": {
"description": "Getting preview is not allowed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"404": {
"description": "Share or preview not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/index.php/apps/files_sharing/publicpreview/{token}": {
"get": {
"operationId": "public_preview-get-preview",
"summary": "Get a preview for a shared file",
"tags": [
"public_preview"
],
"security": [
{},
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"parameters": [
{
"name": "file",
"in": "query",
"description": "File in the share",
"schema": {
"type": "string",
"default": ""
}
},
{
"name": "x",
"in": "query",
"description": "Width of the preview",
"schema": {
"type": "integer",
"format": "int64",
"default": 32
}
},
{
"name": "y",
"in": "query",
"description": "Height of the preview",
"schema": {
"type": "integer",
"format": "int64",
"default": 32
}
},
{
"name": "a",
"in": "query",
"description": "Whether to not crop the preview",
"schema": {
"type": "integer",
"default": 0
}
},
{
"name": "token",
"in": "path",
"description": "Token of the share",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "OCS-APIRequest",
"in": "header",
"required": true,
"schema": {
"type": "string",
"default": "true"
}
}
],
"responses": {
"200": {
"description": "Preview returned",
"content": {
"*/*": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"400": {
"description": "Getting preview is not possible",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"403": {
"description": "Getting preview is not allowed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"404": {
"description": "Share or preview not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/index.php/apps/files_sharing/shareinfo": {
"post": {
"operationId": "share_info-info",
@@ -1323,7 +1646,7 @@
"schema": {
"type": "integer",
"format": "int64",
"default": 1
"default": -1
}
}
],
@@ -1339,13 +1662,10 @@
}
},
"403": {
"description": "Getting share info not allowed",
"description": "Getting share info is not allowed",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
"schema": {}
}
}
},
@@ -1353,10 +1673,7 @@
"description": "Share not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
"schema": {}
}
}
}
@@ -1521,7 +1838,7 @@
"schema": {
"type": "integer",
"format": "int64",
"default": 1
"default": -1
}
},
{
@@ -2146,10 +2463,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -2236,10 +2550,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -2389,10 +2700,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -2498,6 +2806,13 @@
"responses": {
"200": {
"description": "Sharees search result returned",
"headers": {
"Link": {
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
@@ -2800,10 +3115,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -2879,10 +3191,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -3038,10 +3347,7 @@
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "object",
"additionalProperties": true
}
"data": {}
}
}
}
@@ -3060,7 +3366,7 @@
}
},
"403": {
"description": "Unsharing not possible",
"description": "Unsharing is not possible",
"content": {
"text/plain": {
"schema": {
@@ -3074,10 +3380,6 @@
}
},
"tags": [
{
"name": "share",
"description": "Class ShareController"
},
{
"name": "external_shares",
"description": "Class ExternalSharesController"

+ 0
- 6
apps/files_sharing/tests/Controller/ShareAPIControllerTest.php View File

@@ -640,7 +640,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => false,
'can_delete' => false,
'status' => [],
'item_size' => 123465,
'item_mtime' => 1234567890,
'attributes' => null,
@@ -3820,7 +3819,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => false,
'can_delete' => false,
'status' => [],
'item_size' => 123456,
'item_mtime' => 1234567890,
'attributes' => '[{"scope":"permissions","key":"download","enabled":true}]',
@@ -3860,7 +3858,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => false,
'can_delete' => false,
'status' => [],
'item_size' => 123456,
'item_mtime' => 1234567890,
'attributes' => '[{"scope":"permissions","key":"download","enabled":true}]',
@@ -3916,7 +3913,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => false,
'can_delete' => false,
'status' => [],
'item_size' => 123456,
'item_mtime' => 1234567890,
'attributes' => null,
@@ -3968,7 +3964,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => true,
'can_delete' => true,
'status' => [],
'item_size' => 123456,
'item_mtime' => 1234567890,
'attributes' => null,
@@ -4606,7 +4601,6 @@ class ShareAPIControllerTest extends TestCase {
'hide_download' => 0,
'can_edit' => true,
'can_delete' => true,
'status' => [],
'item_size' => 123456,
'item_mtime' => 1234567890,
'attributes' => null,

Loading…
Cancel
Save