mirror of
https://github.com/nextcloud/server.git
synced 2026-05-28 04:32:30 -04:00
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:
commit
c9b69b4d1f
3 changed files with 36 additions and 40 deletions
|
|
@ -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 {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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' &&
|
||||
|
|
|
|||
Loading…
Reference in a new issue