-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
[stable28] Respect empty expiryDate value in server
#45482
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -586,7 +586,8 @@ public function deleteShare(string $id): DataResponse { | |
| * @param string $publicUpload If public uploading is allowed | ||
| * @param string $password Password for the share | ||
| * @param string|null $sendPasswordByTalk Send the password for the share over Talk | ||
| * @param string $expireDate Expiry date of the share using user timezone at 00:00. It means date in UTC timezone will be used. | ||
| * @param ?string $expireDate The expiry date of the share in the user's timezone (UTC) at 00:00. | ||
Check failureCode scanning / Psalm MismatchingDocblockParamType
Parameter $expireDate has wrong type 'null|string', should be 'string'
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. L612 missing? ?string $expireDate = null,And L793? if ($expireDate !== null) {
if ($expireDate !== '') { |
||
| * If $expireDate is not supplied or set to `null`, the system default will be used. | ||
| * @param string $note Note for the share | ||
| * @param string $label Label for the share (only used in link and email) | ||
| * @param string|null $attributes Additional attributes for the share | ||
|
|
@@ -812,19 +813,19 @@ public function createShare( | |
| $share->setPermissions($permissions); | ||
| } elseif ($shareType === IShare::TYPE_ROOM) { | ||
| try { | ||
| $this->getRoomShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); | ||
| $this->getRoomShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); | ||
| } catch (QueryException $e) { | ||
| throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$node->getPath()])); | ||
| } | ||
| } elseif ($shareType === IShare::TYPE_DECK) { | ||
| try { | ||
| $this->getDeckShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); | ||
| $this->getDeckShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); | ||
| } catch (QueryException $e) { | ||
| throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$node->getPath()])); | ||
| } | ||
| } elseif ($shareType === IShare::TYPE_SCIENCEMESH) { | ||
| try { | ||
| $this->getSciencemeshShareHelper()->createShare($share, $shareWith, $permissions, $expireDate); | ||
| $this->getSciencemeshShareHelper()->createShare($share, $shareWith, $permissions, $expireDate ?? ''); | ||
| } catch (QueryException $e) { | ||
| throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support ScienceMesh shares', [$node->getPath()])); | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -85,43 +85,9 @@ | |||||
| * This class is the communication hub for all sharing related operations. | ||||||
| */ | ||||||
| class Manager implements IManager { | ||||||
| /** @var IProviderFactory */ | ||||||
| private $factory; | ||||||
| private LoggerInterface $logger; | ||||||
| /** @var IConfig */ | ||||||
| private $config; | ||||||
| /** @var ISecureRandom */ | ||||||
| private $secureRandom; | ||||||
| /** @var IHasher */ | ||||||
| private $hasher; | ||||||
| /** @var IMountManager */ | ||||||
| private $mountManager; | ||||||
| /** @var IGroupManager */ | ||||||
| private $groupManager; | ||||||
| /** @var IL10N */ | ||||||
| private $l; | ||||||
| /** @var IFactory */ | ||||||
| private $l10nFactory; | ||||||
| /** @var IUserManager */ | ||||||
| private $userManager; | ||||||
| /** @var IRootFolder */ | ||||||
| private $rootFolder; | ||||||
| /** @var LegacyHooks */ | ||||||
| private $legacyHooks; | ||||||
| /** @var IMailer */ | ||||||
| private $mailer; | ||||||
| /** @var IURLGenerator */ | ||||||
| private $urlGenerator; | ||||||
| /** @var \OC_Defaults */ | ||||||
| private $defaults; | ||||||
| /** @var IEventDispatcher */ | ||||||
| private $dispatcher; | ||||||
| /** @var IUserSession */ | ||||||
| private $userSession; | ||||||
| /** @var KnownUserService */ | ||||||
| private $knownUserService; | ||||||
| private ShareDisableChecker $shareDisableChecker; | ||||||
| private IDateTimeZone $dateTimeZone; | ||||||
|
|
||||||
| private IL10N|null $l; | ||||||
| private LegacyHooks $legacyHooks; | ||||||
|
|
||||||
| public function __construct( | ||||||
| LoggerInterface $logger, | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
and further? |
||||||
|
|
@@ -157,15 +123,7 @@ public function __construct( | |||||
| $this->rootFolder = $rootFolder; | ||||||
| // The constructor of LegacyHooks registers the listeners of share events | ||||||
| // do not remove if those are not properly migrated | ||||||
| $this->legacyHooks = new LegacyHooks($dispatcher); | ||||||
| $this->mailer = $mailer; | ||||||
| $this->urlGenerator = $urlGenerator; | ||||||
| $this->defaults = $defaults; | ||||||
| $this->dispatcher = $dispatcher; | ||||||
| $this->userSession = $userSession; | ||||||
| $this->knownUserService = $knownUserService; | ||||||
| $this->shareDisableChecker = $shareDisableChecker; | ||||||
| $this->dateTimeZone = $dateTimeZone; | ||||||
| $this->legacyHooks = new LegacyHooks($this->dispatcher); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dispatcher is not defined
|
||||||
| } | ||||||
|
|
||||||
| /** | ||||||
|
|
@@ -391,26 +349,6 @@ protected function validateExpirationDateInternal(IShare $share) { | |||||
|
|
||||||
| $expirationDate = $share->getExpirationDate(); | ||||||
|
|
||||||
| 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) { | ||||||
| $message = $this->l->t('Expiration date is in the past'); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| // If expiredate is empty set a default one if there is a default | ||||||
| $fullId = null; | ||||||
| try { | ||||||
| $fullId = $share->getFullId(); | ||||||
| } catch (\UnexpectedValueException $e) { | ||||||
| // This is a new share | ||||||
| } | ||||||
|
|
||||||
| if ($isRemote) { | ||||||
| $defaultExpireDate = $this->shareApiRemoteDefaultExpireDate(); | ||||||
| $defaultExpireDays = $this->shareApiRemoteDefaultExpireDays(); | ||||||
|
|
@@ -422,28 +360,53 @@ protected function validateExpirationDateInternal(IShare $share) { | |||||
| $configProp = 'internal_defaultExpDays'; | ||||||
| $isEnforced = $this->shareApiInternalDefaultExpireDateEnforced(); | ||||||
| } | ||||||
| if ($fullId === null && $expirationDate === null && $defaultExpireDate) { | ||||||
| $expirationDate = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
| $expirationDate->setTime(0, 0, 0); | ||||||
| $days = (int)$this->config->getAppValue('core', $configProp, (string)$defaultExpireDays); | ||||||
| if ($days > $defaultExpireDays) { | ||||||
| $days = $defaultExpireDays; | ||||||
|
|
||||||
| // 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) { | ||||||
| $expirationDate->setTimezone($this->dateTimeZone->getTimeZone()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $expirationDate->setTime(0, 0, 0); | ||||||
|
|
||||||
| $date = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
| $date->setTime(0, 0, 0); | ||||||
| if ($date >= $expirationDate) { | ||||||
| $message = $this->l->t('Expiration date is in the past'); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
| $expirationDate->add(new \DateInterval('P' . $days . 'D')); | ||||||
| } | ||||||
|
|
||||||
| // If we enforce the expiration date check that is does not exceed | ||||||
| if ($isEnforced) { | ||||||
| if ($expirationDate === null) { | ||||||
| throw new \InvalidArgumentException('Expiration date is enforced'); | ||||||
| // If expiredate is empty set a default one if there is a default | ||||||
| $fullId = null; | ||||||
| try { | ||||||
| $fullId = $share->getFullId(); | ||||||
| } catch (\UnexpectedValueException $e) { | ||||||
| // This is a new share | ||||||
| } | ||||||
|
|
||||||
| $date = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
| $date->setTime(0, 0, 0); | ||||||
| $date->add(new \DateInterval('P' . $defaultExpireDays . 'D')); | ||||||
| if ($date < $expirationDate) { | ||||||
| $message = $this->l->n('Cannot set expiration date more than %n day in the future', 'Cannot set expiration date more than %n days in the future', $defaultExpireDays); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| if ($fullId === null && $expirationDate === null && $defaultExpireDate) { | ||||||
| $expirationDate = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $expirationDate->setTime(0, 0, 0); | ||||||
| $days = (int)$this->config->getAppValue('core', $configProp, (string)$defaultExpireDays); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$config is not defined
|
||||||
| if ($days > $defaultExpireDays) { | ||||||
| $days = $defaultExpireDays; | ||||||
| } | ||||||
| $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()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $date->setTime(0, 0, 0); | ||||||
| $date->add(new \DateInterval('P' . $defaultExpireDays . 'D')); | ||||||
| if ($date < $expirationDate) { | ||||||
| $message = $this->l->n('Cannot set expiration date more than %n day in the future', 'Cannot set expiration date more than %n days in the future', $defaultExpireDays); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
|
|
@@ -476,51 +439,57 @@ protected function validateExpirationDateInternal(IShare $share) { | |||||
| */ | ||||||
| protected function validateExpirationDateLink(IShare $share) { | ||||||
| $expirationDate = $share->getExpirationDate(); | ||||||
|
|
||||||
| 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) { | ||||||
| $message = $this->l->t('Expiration date is in the past'); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| $isEnforced = $this->shareApiLinkDefaultExpireDateEnforced(); | ||||||
|
|
||||||
| // 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) { | ||||||
| $expirationDate->setTimezone($this->dateTimeZone->getTimeZone()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $expirationDate->setTime(0, 0, 0); | ||||||
|
|
||||||
| $date = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
| $date->setTime(0, 0, 0); | ||||||
| if ($date >= $expirationDate) { | ||||||
| $message = $this->l->t('Expiration date is in the past'); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| // If expiredate is empty set a default one if there is a default | ||||||
| $fullId = null; | ||||||
| try { | ||||||
| $fullId = $share->getFullId(); | ||||||
| } 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(); | ||||||
| // If expiredate is empty set a default one if there is a default | ||||||
| $fullId = null; | ||||||
| try { | ||||||
| $fullId = $share->getFullId(); | ||||||
| } catch (\UnexpectedValueException $e) { | ||||||
| // This is a new share | ||||||
| } | ||||||
|
|
||||||
| if ($fullId === null && $expirationDate === null && $this->shareApiLinkDefaultExpireDate()) { | ||||||
| $expirationDate = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $expirationDate->setTime(0, 0, 0); | ||||||
|
|
||||||
| $days = (int)$this->config->getAppValue('core', 'link_defaultExpDays', (string)$this->shareApiLinkDefaultExpireDays()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$config is not defined
|
||||||
| if ($days > $this->shareApiLinkDefaultExpireDays()) { | ||||||
| $days = $this->shareApiLinkDefaultExpireDays(); | ||||||
| } | ||||||
| $expirationDate->add(new \DateInterval('P' . $days . 'D')); | ||||||
| } | ||||||
| $expirationDate->add(new \DateInterval('P' . $days . 'D')); | ||||||
| } | ||||||
|
|
||||||
| // If we enforce the expiration date check that is does not exceed | ||||||
| if ($this->shareApiLinkDefaultExpireDateEnforced()) { | ||||||
| if ($expirationDate === null) { | ||||||
| throw new \InvalidArgumentException('Expiration date is enforced'); | ||||||
|
|
||||||
| // 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()); | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Manager::$dateTimeZone is not defined
|
||||||
| $date->setTime(0, 0, 0); | ||||||
| $date->add(new \DateInterval('P' . $this->shareApiLinkDefaultExpireDays() . 'D')); | ||||||
| if ($date < $expirationDate) { | ||||||
| $message = $this->l->n('Cannot set expiration date more than %n day in the future', 'Cannot set expiration date more than %n days in the future', $this->shareApiLinkDefaultExpireDays()); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| $date = new \DateTime('now', $this->dateTimeZone->getTimeZone()); | ||||||
| $date->setTime(0, 0, 0); | ||||||
| $date->add(new \DateInterval('P' . $this->shareApiLinkDefaultExpireDays() . 'D')); | ||||||
| if ($date < $expirationDate) { | ||||||
| $message = $this->l->n('Cannot set expiration date more than %n day in the future', 'Cannot set expiration date more than %n days in the future', $this->shareApiLinkDefaultExpireDays()); | ||||||
| throw new GenericShareException($message, $message, 404); | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| $accepted = true; | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -99,7 +99,6 @@ class Share implements IShare { | |||||
|
|
||||||
| /** @var ICacheEntry|null */ | ||||||
| private $nodeCacheEntry; | ||||||
|
|
||||||
| /** @var bool */ | ||||||
| private $hideDownload = false; | ||||||
|
|
||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
@@ -421,6 +420,21 @@ public function getExpirationDate() { | |||||
| return $this->expireDate; | ||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * @inheritdoc | ||||||
| */ | ||||||
| public function setNoExpirationDate(bool $noExpirationDate) { | ||||||
| $this->noExpirationDate = $noExpirationDate; | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyAssignment
Instance property OC\Share20\Share::$noExpirationDate is not defined
|
||||||
| return $this; | ||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * @inheritdoc | ||||||
| */ | ||||||
| public function getNoExpirationDate(): bool { | ||||||
| return $this->noExpirationDate; | ||||||
Check failureCode scanning / Psalm UndefinedThisPropertyFetch
Instance property OC\Share20\Share::$noExpirationDate is not defined
|
||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * @inheritdoc | ||||||
| */ | ||||||
|
|
||||||
Uh oh!
There was an error while loading. Please reload this page.