Skip to content

Commit ee6a10f

Browse files
committed
fix(share): use user timezone to parse share expiration date
If an user in UTC+1 try to create a share at 00:00, it's day D for him, but D-1 for the server (UTC). This fix aims to apply the correct offset Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
1 parent baf49e3 commit ee6a10f

4 files changed

Lines changed: 25 additions & 19 deletions

File tree

apps/files_sharing/lib/Controller/ShareAPIController.php

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
use OCP\Files\Node;
6767
use OCP\Files\NotFoundException;
6868
use OCP\IConfig;
69+
use OCP\IDateTimeZone;
6970
use OCP\IGroupManager;
7071
use OCP\IL10N;
7172
use OCP\IPreview;
@@ -120,20 +121,6 @@ class ShareAPIController extends OCSController {
120121

121122
/**
122123
* Share20OCS constructor.
123-
*
124-
* @param string $appName
125-
* @param IRequest $request
126-
* @param IManager $shareManager
127-
* @param IGroupManager $groupManager
128-
* @param IUserManager $userManager
129-
* @param IRootFolder $rootFolder
130-
* @param IURLGenerator $urlGenerator
131-
* @param string $userId
132-
* @param IL10N $l10n
133-
* @param IConfig $config
134-
* @param IAppManager $appManager
135-
* @param IServerContainer $serverContainer
136-
* @param IUserStatusManager $userStatusManager
137124
*/
138125
public function __construct(
139126
string $appName,
@@ -149,7 +136,8 @@ public function __construct(
149136
IAppManager $appManager,
150137
IServerContainer $serverContainer,
151138
IUserStatusManager $userStatusManager,
152-
IPreview $previewManager
139+
IPreview $previewManager,
140+
private IDateTimeZone $dateTimeZone,
153141
) {
154142
parent::__construct($appName, $request);
155143

@@ -1679,11 +1667,12 @@ protected function canDeleteShareFromSelf(\OCP\Share\IShare $share): bool {
16791667
*/
16801668
private function parseDate(string $expireDate): \DateTime {
16811669
try {
1682-
$date = new \DateTime(trim($expireDate, "\""));
1670+
$date = new \DateTime(trim($expireDate, "\""), $this->dateTimeZone->getTimeZone());
16831671
} catch (\Exception $e) {
16841672
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
16851673
}
16861674

1675+
$date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
16871676
$date->setTime(0, 0, 0);
16881677

16891678
return $date;

apps/files_sharing/openapi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,7 @@
15631563
{
15641564
"name": "expireDate",
15651565
"in": "query",
1566-
"description": "Expiry date of the share",
1566+
"description": "Expiry date of the share using user timezone at 00:00. It means date in UTC timezone will be used.",
15671567
"schema": {
15681568
"type": "string",
15691569
"default": ""

apps/files_sharing/tests/ApiTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
use OCP\AppFramework\OCS\OCSForbiddenException;
4646
use OCP\AppFramework\OCS\OCSNotFoundException;
4747
use OCP\IConfig;
48+
use OCP\IDateTimeZone;
4849
use OCP\IL10N;
4950
use OCP\IPreview;
5051
use OCP\IRequest;
@@ -123,6 +124,7 @@ private function createOCS($userId) {
123124
$serverContainer = $this->createMock(IServerContainer::class);
124125
$userStatusManager = $this->createMock(IUserStatusManager::class);
125126
$previewManager = $this->createMock(IPreview::class);
127+
$dateTimeZone = $this->createMock(IDateTimeZone::class);
126128

127129
return new ShareAPIController(
128130
self::APP_NAME,
@@ -138,7 +140,8 @@ private function createOCS($userId) {
138140
$appManager,
139141
$serverContainer,
140142
$userStatusManager,
141-
$previewManager
143+
$previewManager,
144+
$dateTimeZone,
142145
);
143146
}
144147

apps/files_sharing/tests/Controller/ShareAPIControllerTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use OCP\Files\Storage;
4949
use OCP\Files\Storage\IStorage;
5050
use OCP\IConfig;
51+
use OCP\IDateTimeZone;
5152
use OCP\IGroup;
5253
use OCP\IGroupManager;
5354
use OCP\IL10N;
@@ -118,6 +119,9 @@ class ShareAPIControllerTest extends TestCase {
118119
/** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */
119120
private $previewManager;
120121

122+
/** @var IDateTimeZone|\PHPUnit\Framework\MockObject\MockObject */
123+
private $dateTimeZone;
124+
121125
protected function setUp(): void {
122126
$this->shareManager = $this->createMock(IManager::class);
123127
$this->shareManager
@@ -148,6 +152,7 @@ protected function setUp(): void {
148152
->willReturnCallback(function ($fileInfo) {
149153
return $fileInfo->getMimeType() === 'mimeWithPreview';
150154
});
155+
$this->dateTimeZone = $this->createMock(IDateTimeZone::class);
151156

152157
$this->ocs = new ShareAPIController(
153158
$this->appName,
@@ -163,7 +168,8 @@ protected function setUp(): void {
163168
$this->appManager,
164169
$this->serverContainer,
165170
$this->userStatusManager,
166-
$this->previewManager
171+
$this->previewManager,
172+
$this->dateTimeZone,
167173
);
168174
}
169175

@@ -187,6 +193,7 @@ private function mockFormatShare() {
187193
$this->serverContainer,
188194
$this->userStatusManager,
189195
$this->previewManager,
196+
$this->dateTimeZone,
190197
])->setMethods(['formatShare'])
191198
->getMock();
192199
}
@@ -775,6 +782,7 @@ public function testGetShare(\OCP\Share\IShare $share, array $result) {
775782
$this->serverContainer,
776783
$this->userStatusManager,
777784
$this->previewManager,
785+
$this->dateTimeZone,
778786
])->setMethods(['canAccessShare'])
779787
->getMock();
780788

@@ -1399,6 +1407,7 @@ public function testGetShares(array $getSharesParameters, array $shares, array $
13991407
$this->serverContainer,
14001408
$this->userStatusManager,
14011409
$this->previewManager,
1410+
$this->dateTimeZone,
14021411
])->setMethods(['formatShare'])
14031412
->getMock();
14041413

@@ -1738,6 +1747,7 @@ public function testCreateShareUser() {
17381747
$this->serverContainer,
17391748
$this->userStatusManager,
17401749
$this->previewManager,
1750+
$this->dateTimeZone,
17411751
])->setMethods(['formatShare'])
17421752
->getMock();
17431753

@@ -1832,6 +1842,7 @@ public function testCreateShareGroup() {
18321842
$this->serverContainer,
18331843
$this->userStatusManager,
18341844
$this->previewManager,
1845+
$this->dateTimeZone,
18351846
])->setMethods(['formatShare'])
18361847
->getMock();
18371848

@@ -2241,6 +2252,7 @@ public function testCreateShareRemote() {
22412252
$this->serverContainer,
22422253
$this->userStatusManager,
22432254
$this->previewManager,
2255+
$this->dateTimeZone,
22442256
])->setMethods(['formatShare'])
22452257
->getMock();
22462258

@@ -2307,6 +2319,7 @@ public function testCreateShareRemoteGroup() {
23072319
$this->serverContainer,
23082320
$this->userStatusManager,
23092321
$this->previewManager,
2322+
$this->dateTimeZone,
23102323
])->setMethods(['formatShare'])
23112324
->getMock();
23122325

@@ -2546,6 +2559,7 @@ public function testCreateReshareOfFederatedMountNoDeletePermissions() {
25462559
$this->serverContainer,
25472560
$this->userStatusManager,
25482561
$this->previewManager,
2562+
$this->dateTimeZone,
25492563
])->setMethods(['formatShare'])
25502564
->getMock();
25512565

0 commit comments

Comments
 (0)