diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php index 9256f9bcc8..371c94a8c8 100644 --- a/apps/files_sharing/tests/api.php +++ b/apps/files_sharing/tests/api.php @@ -1079,6 +1079,24 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertTrue(is_array($updatedLinkShare)); $this->assertEquals($dateWithinRange->format('Y-m-d') . ' 00:00:00', $updatedLinkShare['expiration']); + + // Try to remove expire date + $params = array(); + $params['id'] = $linkShare['id']; + $params['_put'] = ['expireDate' => '']; + + $result = \OCA\Files_Sharing\API\Local::updateShare($params); + + $this->assertFalse($result->succeeded()); + + $items = \OCP\Share::getItemShared('file', $linkShare['file_source']); + + $updatedLinkShare = reset($items); + + // date shouldn't be changed + $this->assertTrue(is_array($updatedLinkShare)); + $this->assertEquals($dateWithinRange->format('Y-m-d') . ' 00:00:00', $updatedLinkShare['expiration']); + // cleanup $config->setAppValue('core', 'shareapi_default_expire_date', 'no'); $config->setAppValue('core', 'shareapi_enforce_expire_date', 'no'); diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 974ebf41f9..dff3af56f4 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -1097,9 +1097,17 @@ class Share extends \OC\Share\Constants { */ public static function setExpirationDate($itemType, $itemSource, $date, $shareTime = null) { $user = \OC_User::getUser(); + $l = \OC::$server->getL10N('lib'); if ($date == '') { - $date = null; + if (\OCP\Util::isDefaultExpireDateEnforced()) { + $warning = 'Cannot clear expiration date. Shares are required to have an expiration date.'; + $warning_t = $l->t('Cannot clear expiration date. Shares are required to have an expiration date.'); + \OCP\Util::writeLog('OCP\Share', $warning, \OCP\Util::WARN); + throw new \Exception($warning_t); + } else { + $date = null; + } } else { $date = self::validateExpireDate($date, $shareTime, $itemType, $itemSource); } diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php index 1ef62dc2b0..42bb82968a 100644 --- a/tests/lib/share/share.php +++ b/tests/lib/share/share.php @@ -1051,6 +1051,41 @@ class Test_Share extends \Test\TestCase { ), ); } + + /** + * Ensure that we do not allow removing a an expiration date from a link share if this + * is enforced by the settings. + */ + public function testClearExpireDateWhileEnforced() { + OC_User::setUserId($this->user1); + + \OC_Appconfig::setValue('core', 'shareapi_default_expire_date', 'yes'); + \OC_Appconfig::setValue('core', 'shareapi_expire_after_n_days', '2'); + \OC_Appconfig::setValue('core', 'shareapi_enforce_expire_date', 'yes'); + + $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ); + $this->assertInternalType( + 'string', + $token, + 'Failed asserting that user 1 successfully shared text.txt as link with token.' + ); + + $setExpireDateFailed = false; + try { + $this->assertTrue( + OCP\Share::setExpirationDate('test', 'test.txt', '', ''), + 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.' + ); + } catch (\Exception $e) { + $setExpireDateFailed = true; + } + + $this->assertTrue($setExpireDateFailed); + + \OC_Appconfig::deleteKey('core', 'shareapi_default_expire_date'); + \OC_Appconfig::deleteKey('core', 'shareapi_expire_after_n_days'); + \OC_Appconfig::deleteKey('core', 'shareapi_enforce_expire_date'); + } } class DummyShareClass extends \OC\Share\Share {