Skip to content

Commit 146cef4

Browse files
authored
Merge pull request #46142 from nextcloud/backport/46097/stable29
[stable29] fix(files_sharing): Also set the expiration date timezone during validation
2 parents 45fda86 + 1fb0cc2 commit 146cef4

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

apps/files_sharing/lib/Controller/ShareAPIController.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,9 +1652,6 @@ private function parseDate(string $expireDate): \DateTime {
16521652
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
16531653
}
16541654

1655-
// Use server timezone to store the date
1656-
$date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
1657-
16581655
return $date;
16591656
}
16601657

lib/private/Share20/DefaultShareProvider.php

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,22 +138,28 @@ public function create(\OCP\Share\IShare $share) {
138138
$qb->insert('share');
139139
$qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
140140

141+
$expirationDate = $share->getExpirationDate();
142+
if ($expirationDate !== null) {
143+
$expirationDate = clone $expirationDate;
144+
$expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
145+
}
146+
141147
if ($share->getShareType() === IShare::TYPE_USER) {
142148
//Set the UID of the user we share with
143149
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
144150
$qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
145151

146152
//If an expiration date is set store it
147-
if ($share->getExpirationDate() !== null) {
148-
$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
153+
if ($expirationDate !== null) {
154+
$qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
149155
}
150156
} elseif ($share->getShareType() === IShare::TYPE_GROUP) {
151157
//Set the GID of the group we share with
152158
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
153159

154160
//If an expiration date is set store it
155-
if ($share->getExpirationDate() !== null) {
156-
$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
161+
if ($expirationDate !== null) {
162+
$qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
157163
}
158164
} elseif ($share->getShareType() === IShare::TYPE_LINK) {
159165
//set label for public link
@@ -169,8 +175,8 @@ public function create(\OCP\Share\IShare $share) {
169175
$qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
170176

171177
//If an expiration date is set store it
172-
if ($share->getExpirationDate() !== null) {
173-
$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
178+
if ($expirationDate !== null) {
179+
$qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
174180
}
175181

176182
if (method_exists($share, 'getParent')) {
@@ -250,6 +256,12 @@ public function update(\OCP\Share\IShare $share) {
250256

251257
$shareAttributes = $this->formatShareAttributes($share->getAttributes());
252258

259+
$expirationDate = $share->getExpirationDate();
260+
if ($expirationDate !== null) {
261+
$expirationDate = clone $expirationDate;
262+
$expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
263+
}
264+
253265
if ($share->getShareType() === IShare::TYPE_USER) {
254266
/*
255267
* We allow updating the recipient on user shares.
@@ -264,7 +276,7 @@ public function update(\OCP\Share\IShare $share) {
264276
->set('attributes', $qb->createNamedParameter($shareAttributes))
265277
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
266278
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
267-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
279+
->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
268280
->set('note', $qb->createNamedParameter($share->getNote()))
269281
->set('accepted', $qb->createNamedParameter($share->getStatus()))
270282
->execute();
@@ -278,7 +290,7 @@ public function update(\OCP\Share\IShare $share) {
278290
->set('attributes', $qb->createNamedParameter($shareAttributes))
279291
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
280292
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
281-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
293+
->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
282294
->set('note', $qb->createNamedParameter($share->getNote()))
283295
->execute();
284296

@@ -293,7 +305,7 @@ public function update(\OCP\Share\IShare $share) {
293305
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
294306
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
295307
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
296-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
308+
->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
297309
->set('note', $qb->createNamedParameter($share->getNote()))
298310
->execute();
299311

@@ -320,7 +332,7 @@ public function update(\OCP\Share\IShare $share) {
320332
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
321333
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
322334
->set('token', $qb->createNamedParameter($share->getToken()))
323-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
335+
->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
324336
->set('note', $qb->createNamedParameter($share->getNote()))
325337
->set('label', $qb->createNamedParameter($share->getLabel()))
326338
->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)

lib/private/Share20/Manager.php

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ protected function validateExpirationDateInternal(IShare $share) {
310310

311311
// If $expirationDate is falsy, noExpirationDate is true and expiration not enforced
312312
// Then skip expiration date validation as null is accepted
313-
if(!($share->getNoExpirationDate() && !$isEnforced)) {
314-
if ($expirationDate != null) {
313+
if(!$share->getNoExpirationDate() || $isEnforced) {
314+
if ($expirationDate !== null) {
315315
$expirationDate->setTimezone($this->dateTimeZone->getTimeZone());
316316
$expirationDate->setTime(0, 0, 0);
317317

@@ -394,7 +394,7 @@ protected function validateExpirationDateLink(IShare $share) {
394394
if ($expirationDate !== null) {
395395
$expirationDate->setTimezone($this->dateTimeZone->getTimeZone());
396396
$expirationDate->setTime(0, 0, 0);
397-
397+
398398
$date = new \DateTime('now', $this->dateTimeZone->getTimeZone());
399399
$date->setTime(0, 0, 0);
400400
if ($date >= $expirationDate) {
@@ -410,24 +410,24 @@ protected function validateExpirationDateLink(IShare $share) {
410410
} catch (\UnexpectedValueException $e) {
411411
// This is a new share
412412
}
413-
413+
414414
if ($fullId === null && $expirationDate === null && $this->shareApiLinkDefaultExpireDate()) {
415415
$expirationDate = new \DateTime('now', $this->dateTimeZone->getTimeZone());
416416
$expirationDate->setTime(0, 0, 0);
417-
417+
418418
$days = (int)$this->config->getAppValue('core', 'link_defaultExpDays', (string)$this->shareApiLinkDefaultExpireDays());
419419
if ($days > $this->shareApiLinkDefaultExpireDays()) {
420420
$days = $this->shareApiLinkDefaultExpireDays();
421421
}
422422
$expirationDate->add(new \DateInterval('P' . $days . 'D'));
423423
}
424-
424+
425425
// If we enforce the expiration date check that is does not exceed
426426
if ($isEnforced) {
427427
if (empty($expirationDate)) {
428428
throw new \InvalidArgumentException('Expiration date is enforced');
429429
}
430-
430+
431431
$date = new \DateTime('now', $this->dateTimeZone->getTimeZone());
432432
$date->setTime(0, 0, 0);
433433
$date->add(new \DateInterval('P' . $this->shareApiLinkDefaultExpireDays() . 'D'));
@@ -452,9 +452,6 @@ protected function validateExpirationDateLink(IShare $share) {
452452
throw new \Exception($message);
453453
}
454454

455-
if ($expirationDate instanceof \DateTime) {
456-
$expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
457-
}
458455
$share->setExpirationDate($expirationDate);
459456

460457
return $share;

0 commit comments

Comments
 (0)