Merge pull request #42808 from nextcloud/backport/42660/stable26

[stable26] fix(share): use user timezone to parse share expiration date
This commit is contained in:
Benjamin Gaussorgues 2024-01-18 12:32:21 +01:00 committed by GitHub
commit c9b69b4d1f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 36 additions and 40 deletions

View file

@ -66,6 +66,7 @@ use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IPreview;
@ -90,7 +91,6 @@ use Psr\Log\LoggerInterface;
* @package OCA\Files_Sharing\API
*/
class ShareAPIController extends OCSController {
/** @var IManager */
private $shareManager;
/** @var IGroupManager */
@ -120,20 +120,6 @@ class ShareAPIController extends OCSController {
/**
* Share20OCS constructor.
*
* @param string $appName
* @param IRequest $request
* @param IManager $shareManager
* @param IGroupManager $groupManager
* @param IUserManager $userManager
* @param IRootFolder $rootFolder
* @param IURLGenerator $urlGenerator
* @param string $userId
* @param IL10N $l10n
* @param IConfig $config
* @param IAppManager $appManager
* @param IServerContainer $serverContainer
* @param IUserStatusManager $userStatusManager
*/
public function __construct(
string $appName,
@ -149,7 +135,8 @@ class ShareAPIController extends OCSController {
IAppManager $appManager,
IServerContainer $serverContainer,
IUserStatusManager $userStatusManager,
IPreview $previewManager
IPreview $previewManager,
private IDateTimeZone $dateTimeZone,
) {
parent::__construct($appName, $request);
@ -244,7 +231,7 @@ class ShareAPIController extends OCSController {
$result['share_with'] = $share->getSharedWith();
$result['share_with_displayname'] = $sharedWith !== null ? $sharedWith->getDisplayName() : $share->getSharedWith();
$result['share_with_displayname_unique'] = $sharedWith !== null ? (
!empty($sharedWith->getSystemEMailAddress()) ? $sharedWith->getSystemEMailAddress() : $sharedWith->getUID()
!empty($sharedWith->getSystemEMailAddress()) ? $sharedWith->getSystemEMailAddress() : $sharedWith->getUID()
) : $share->getSharedWith();
$result['status'] = [];
@ -265,7 +252,6 @@ class ShareAPIController extends OCSController {
$result['share_with'] = $share->getSharedWith();
$result['share_with_displayname'] = $group !== null ? $group->getDisplayName() : $share->getSharedWith();
} elseif ($share->getShareType() === IShare::TYPE_LINK) {
// "share_with" and "share_with_displayname" for passwords of link
// shares was deprecated in Nextcloud 15, use "password" instead.
$result['share_with'] = $share->getPassword();
@ -343,7 +329,7 @@ class ShareAPIController extends OCSController {
$result['attributes'] = null;
if ($attributes = $share->getAttributes()) {
$result['attributes'] = \json_encode($attributes->toArray());
$result['attributes'] = \json_encode($attributes->toArray());
}
return $result;
@ -600,7 +586,6 @@ class ShareAPIController extends OCSController {
if ($permissions === null) {
if ($shareType === IShare::TYPE_LINK
|| $shareType === IShare::TYPE_EMAIL) {
// to keep legacy default behaviour, we ignore the setting below for link shares
$permissions = Constants::PERMISSION_READ;
} else {
@ -687,7 +672,6 @@ class ShareAPIController extends OCSController {
$share->setPermissions($permissions);
} elseif ($shareType === IShare::TYPE_LINK
|| $shareType === IShare::TYPE_EMAIL) {
// Can we even share links?
if (!$this->shareManager->shareApiAllowLinks()) {
throw new OCSNotFoundException($this->l->t('Public link sharing is disabled by the administrator'));
@ -1104,7 +1088,6 @@ class ShareAPIController extends OCSController {
* @throws SharingRightsException
*/
public function getInheritedShares(string $path): DataResponse {
// get Node from (string) path.
$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
try {
@ -1258,7 +1241,6 @@ class ShareAPIController extends OCSController {
*/
if ($share->getShareType() === IShare::TYPE_LINK
|| $share->getShareType() === IShare::TYPE_EMAIL) {
/**
* We do not allow editing link shares that the current user
* doesn't own. This is confusing and lead to errors when
@ -1296,8 +1278,8 @@ class ShareAPIController extends OCSController {
}
if (!$this->hasPermission($newPermissions, Constants::PERMISSION_READ) && (
$this->hasPermission($newPermissions, Constants::PERMISSION_UPDATE) || $this->hasPermission($newPermissions, Constants::PERMISSION_DELETE)
)) {
$this->hasPermission($newPermissions, Constants::PERMISSION_UPDATE) || $this->hasPermission($newPermissions, Constants::PERMISSION_DELETE)
)) {
throw new OCSBadRequestException($this->l->t('Share must have READ permission if UPDATE or DELETE permission is set'));
}
}
@ -1679,11 +1661,12 @@ class ShareAPIController extends OCSController {
*/
private function parseDate(string $expireDate): \DateTime {
try {
$date = new \DateTime(trim($expireDate, "\""));
$date = new \DateTime(trim($expireDate, "\""), $this->dateTimeZone->getTimeZone());
} catch (\Exception $e) {
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
}
$date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
$date->setTime(0, 0, 0);
return $date;
@ -2097,6 +2080,5 @@ class ShareAPIController extends OCSController {
}
}
}
}
}

View file

@ -37,7 +37,6 @@ namespace OCA\Files_Sharing\Tests;
use OC\Files\Cache\Scanner;
use OC\Files\Filesystem;
use OC\Files\SetupManager;
use OCA\Files_Sharing\Controller\ShareAPIController;
use OCP\App\IAppManager;
use OCP\AppFramework\OCS\OCSBadRequestException;
@ -45,6 +44,7 @@ use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCS\OCSForbiddenException;
use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IL10N;
use OCP\IPreview;
use OCP\IRequest;
@ -123,6 +123,7 @@ class ApiTest extends TestCase {
$serverContainer = $this->createMock(IServerContainer::class);
$userStatusManager = $this->createMock(IUserStatusManager::class);
$previewManager = $this->createMock(IPreview::class);
$dateTimeZone = $this->createMock(IDateTimeZone::class);
return new ShareAPIController(
self::APP_NAME,
@ -138,7 +139,8 @@ class ApiTest extends TestCase {
$appManager,
$serverContainer,
$userStatusManager,
$previewManager
$previewManager,
$dateTimeZone,
);
}

View file

@ -46,8 +46,8 @@ use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
use OCP\Files\Storage;
use OCP\Files\Storage\IStorage;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IL10N;
@ -72,7 +72,6 @@ use OCP\UserStatus\IManager as IUserStatusManager;
* @group DB
*/
class ShareAPIControllerTest extends TestCase {
/** @var string */
private $appName = 'files_sharing';
@ -118,6 +117,9 @@ class ShareAPIControllerTest extends TestCase {
/** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */
private $previewManager;
/** @var IDateTimeZone|\PHPUnit\Framework\MockObject\MockObject */
private $dateTimeZone;
protected function setUp(): void {
$this->shareManager = $this->createMock(IManager::class);
$this->shareManager
@ -148,6 +150,7 @@ class ShareAPIControllerTest extends TestCase {
->willReturnCallback(function ($fileInfo) {
return $fileInfo->getMimeType() === 'mimeWithPreview';
});
$this->dateTimeZone = $this->createMock(IDateTimeZone::class);
$this->ocs = new ShareAPIController(
$this->appName,
@ -163,7 +166,8 @@ class ShareAPIControllerTest extends TestCase {
$this->appManager,
$this->serverContainer,
$this->userStatusManager,
$this->previewManager
$this->previewManager,
$this->dateTimeZone,
);
}
@ -187,6 +191,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
}
@ -775,6 +780,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['canAccessShare'])
->getMock();
@ -1399,6 +1405,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -1738,6 +1745,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -1832,6 +1840,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -2175,7 +2184,7 @@ class ShareAPIControllerTest extends TestCase {
$this->shareManager->expects($this->once())->method('createShare')->with(
$this->callback(function (\OCP\Share\IShare $share) use ($path) {
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
return $share->getNode() === $path &&
$share->getShareType() === IShare::TYPE_LINK &&
@ -2241,6 +2250,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -2307,6 +2317,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -2546,6 +2557,7 @@ class ShareAPIControllerTest extends TestCase {
$this->serverContainer,
$this->userStatusManager,
$this->previewManager,
$this->dateTimeZone,
])->setMethods(['formatShare'])
->getMock();
@ -2734,7 +2746,7 @@ class ShareAPIControllerTest extends TestCase {
$this->shareManager->expects($this->once())->method('updateShare')->with(
$this->callback(function (\OCP\Share\IShare $share) {
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
return $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) &&
$share->getPassword() === 'password' &&
@ -3020,7 +3032,7 @@ class ShareAPIControllerTest extends TestCase {
$ocs = $this->mockFormatShare();
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
[$userFolder, $node] = $this->getNonSharedUserFolder();
$node->method('getId')->willReturn(42);
@ -3072,7 +3084,7 @@ class ShareAPIControllerTest extends TestCase {
$ocs = $this->mockFormatShare();
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
[$userFolder, $node] = $this->getNonSharedUserFolder();
$userFolder->method('getById')
@ -3130,7 +3142,7 @@ class ShareAPIControllerTest extends TestCase {
$ocs = $this->mockFormatShare();
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
[$userFolder, $node] = $this->getNonSharedUserFolder();
$userFolder->method('getById')
@ -3170,7 +3182,7 @@ class ShareAPIControllerTest extends TestCase {
$ocs = $this->mockFormatShare();
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
[$userFolder, $node] = $this->getNonSharedUserFolder();
$userFolder->method('getById')
@ -3224,7 +3236,7 @@ class ShareAPIControllerTest extends TestCase {
$ocs = $this->mockFormatShare();
$date = new \DateTime('2000-01-01');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
[$userFolder, $node] = $this->getNonSharedUserFolder();
$node->method('getId')
@ -3319,7 +3331,7 @@ class ShareAPIControllerTest extends TestCase {
$this->shareManager->expects($this->once())->method('updateShare')->with(
$this->callback(function (\OCP\Share\IShare $share) {
$date = new \DateTime('2010-12-23');
$date->setTime(0,0,0);
$date->setTime(0, 0, 0);
return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
$share->getPassword() === 'password' &&