aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Chemineau <louis@chmn.me>2024-06-26 12:45:23 +0200
committerLouis Chemineau <louis@chmn.me>2024-07-01 22:23:26 +0200
commit1fb0cc25d2979c92ef9426b1843ebad6b2ad043b (patch)
treefeb5b2c450a89d84942897f43c64ef854464cc1b
parent45fda866264e6d939d0bde62318b34a9afd05064 (diff)
downloadnextcloud-server-1fb0cc25d2979c92ef9426b1843ebad6b2ad043b.tar.gz
nextcloud-server-1fb0cc25d2979c92ef9426b1843ebad6b2ad043b.zip
fix(files_sharing): Store the expiration date relative to the server's timezone
This is needed as we want to store the difference between the server's and the user's timezones. Signed-off-by: Louis Chemineau <louis@chmn.me>
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php3
-rw-r--r--lib/private/Share20/DefaultShareProvider.php32
-rw-r--r--lib/private/Share20/Manager.php17
3 files changed, 29 insertions, 23 deletions
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index 36a515bf29d..b99f063d465 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -1652,9 +1652,6 @@ class ShareAPIController extends OCSController {
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
}
- // Use server timezone to store the date
- $date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
-
return $date;
}
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index c22c65f6c7b..f38dcf05298 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -138,22 +138,28 @@ class DefaultShareProvider implements IShareProvider {
$qb->insert('share');
$qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
+ $expirationDate = $share->getExpirationDate();
+ if ($expirationDate !== null) {
+ $expirationDate = clone $expirationDate;
+ $expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
+ }
+
if ($share->getShareType() === IShare::TYPE_USER) {
//Set the UID of the user we share with
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
$qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
//If an expiration date is set store it
- if ($share->getExpirationDate() !== null) {
- $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
+ if ($expirationDate !== null) {
+ $qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
}
} elseif ($share->getShareType() === IShare::TYPE_GROUP) {
//Set the GID of the group we share with
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
//If an expiration date is set store it
- if ($share->getExpirationDate() !== null) {
- $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
+ if ($expirationDate !== null) {
+ $qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
}
} elseif ($share->getShareType() === IShare::TYPE_LINK) {
//set label for public link
@@ -169,8 +175,8 @@ class DefaultShareProvider implements IShareProvider {
$qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
//If an expiration date is set store it
- if ($share->getExpirationDate() !== null) {
- $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
+ if ($expirationDate !== null) {
+ $qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
}
if (method_exists($share, 'getParent')) {
@@ -250,6 +256,12 @@ class DefaultShareProvider implements IShareProvider {
$shareAttributes = $this->formatShareAttributes($share->getAttributes());
+ $expirationDate = $share->getExpirationDate();
+ if ($expirationDate !== null) {
+ $expirationDate = clone $expirationDate;
+ $expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
+ }
+
if ($share->getShareType() === IShare::TYPE_USER) {
/*
* We allow updating the recipient on user shares.
@@ -264,7 +276,7 @@ class DefaultShareProvider implements IShareProvider {
->set('attributes', $qb->createNamedParameter($shareAttributes))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
- ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
->set('note', $qb->createNamedParameter($share->getNote()))
->set('accepted', $qb->createNamedParameter($share->getStatus()))
->execute();
@@ -278,7 +290,7 @@ class DefaultShareProvider implements IShareProvider {
->set('attributes', $qb->createNamedParameter($shareAttributes))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
- ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
@@ -293,7 +305,7 @@ class DefaultShareProvider implements IShareProvider {
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
- ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
@@ -320,7 +332,7 @@ class DefaultShareProvider implements IShareProvider {
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('token', $qb->createNamedParameter($share->getToken()))
- ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATE))
->set('note', $qb->createNamedParameter($share->getNote()))
->set('label', $qb->createNamedParameter($share->getLabel()))
->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 1a250c411b3..ab5a1614b16 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -310,8 +310,8 @@ class Manager implements IManager {
// If $expirationDate is falsy, noExpirationDate is true and expiration not enforced
// Then skip expiration date validation as null is accepted
- if(!($share->getNoExpirationDate() && !$isEnforced)) {
- if ($expirationDate != null) {
+ if(!$share->getNoExpirationDate() || $isEnforced) {
+ if ($expirationDate !== null) {
$expirationDate->setTimezone($this->dateTimeZone->getTimeZone());
$expirationDate->setTime(0, 0, 0);
@@ -394,7 +394,7 @@ class Manager implements IManager {
if ($expirationDate !== null) {
$expirationDate->setTimezone($this->dateTimeZone->getTimeZone());
$expirationDate->setTime(0, 0, 0);
-
+
$date = new \DateTime('now', $this->dateTimeZone->getTimeZone());
$date->setTime(0, 0, 0);
if ($date >= $expirationDate) {
@@ -410,24 +410,24 @@ class Manager implements IManager {
} catch (\UnexpectedValueException $e) {
// This is a new share
}
-
+
if ($fullId === null && $expirationDate === null && $this->shareApiLinkDefaultExpireDate()) {
$expirationDate = new \DateTime('now', $this->dateTimeZone->getTimeZone());
$expirationDate->setTime(0, 0, 0);
-
+
$days = (int)$this->config->getAppValue('core', 'link_defaultExpDays', (string)$this->shareApiLinkDefaultExpireDays());
if ($days > $this->shareApiLinkDefaultExpireDays()) {
$days = $this->shareApiLinkDefaultExpireDays();
}
$expirationDate->add(new \DateInterval('P' . $days . 'D'));
}
-
+
// If we enforce the expiration date check that is does not exceed
if ($isEnforced) {
if (empty($expirationDate)) {
throw new \InvalidArgumentException('Expiration date is enforced');
}
-
+
$date = new \DateTime('now', $this->dateTimeZone->getTimeZone());
$date->setTime(0, 0, 0);
$date->add(new \DateInterval('P' . $this->shareApiLinkDefaultExpireDays() . 'D'));
@@ -452,9 +452,6 @@ class Manager implements IManager {
throw new \Exception($message);
}
- if ($expirationDate instanceof \DateTime) {
- $expirationDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));
- }
$share->setExpirationDate($expirationDate);
return $share;