diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-10-20 14:27:15 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-10-20 14:27:15 +0200 |
commit | 474f34eb6bd60c0024853276bcce018fa6cdb42a (patch) | |
tree | 85b0d4e55221f74e5cd3758f8022d5be11627736 /apps/files_sharing | |
parent | 899165113caad413a9698bbfcf0c99e26e766400 (diff) | |
parent | e1c47d6823682bd4e417a58f8d676ee19905f59c (diff) | |
download | nextcloud-server-474f34eb6bd60c0024853276bcce018fa6cdb42a.tar.gz nextcloud-server-474f34eb6bd60c0024853276bcce018fa6cdb42a.zip |
Merge pull request #19636 from owncloud/share_expire_backgroun
Add backgroundjob to expire link shares
Diffstat (limited to 'apps/files_sharing')
-rw-r--r-- | apps/files_sharing/appinfo/info.xml | 2 | ||||
-rw-r--r-- | apps/files_sharing/appinfo/install.php | 1 | ||||
-rw-r--r-- | apps/files_sharing/appinfo/update.php | 1 | ||||
-rw-r--r-- | apps/files_sharing/lib/expiresharesjob.php | 76 | ||||
-rw-r--r-- | apps/files_sharing/tests/expiresharesjobtest.php | 204 |
5 files changed, 283 insertions, 1 deletions
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index 80925dd3d6b..72e56456961 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -11,7 +11,7 @@ Turning the feature off removes shared files and folders on the server for all s <author>Michael Gapczynski, Bjoern Schiessle</author> <shipped>true</shipped> <default_enable/> - <version>0.8.0</version> + <version>0.8.1</version> <types> <filesystem/> </types> diff --git a/apps/files_sharing/appinfo/install.php b/apps/files_sharing/appinfo/install.php index f076a17e444..607e990346a 100644 --- a/apps/files_sharing/appinfo/install.php +++ b/apps/files_sharing/appinfo/install.php @@ -20,3 +20,4 @@ */ \OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob'); +\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob'); diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php index 0eb3224c1ca..03fb78a05af 100644 --- a/apps/files_sharing/appinfo/update.php +++ b/apps/files_sharing/appinfo/update.php @@ -30,3 +30,4 @@ if (version_compare($installedVersion, '0.6.0', '<')) { } \OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob'); +\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob'); diff --git a/apps/files_sharing/lib/expiresharesjob.php b/apps/files_sharing/lib/expiresharesjob.php new file mode 100644 index 00000000000..bcd3fbe4605 --- /dev/null +++ b/apps/files_sharing/lib/expiresharesjob.php @@ -0,0 +1,76 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing; + +use OC\BackgroundJob\TimedJob; + +/** + * Delete all shares that are expired + */ +class ExpireSharesJob extends TimedJob { + + /** + * sets the correct interval for this timed job + */ + public function __construct() { + // Run once a day + $this->setInterval(24 * 60 * 60); + } + + /** + * Makes the background job do its work + * + * @param array $argument unused argument + */ + public function run($argument) { + $connection = \OC::$server->getDatabaseConnection(); + $logger = \OC::$server->getLogger(); + + //Current time + $now = new \DateTime(); + $now = $now->format('Y-m-d H:i:s'); + + /* + * Expire file link shares only (for now) + */ + $qb = $connection->getQueryBuilder(); + $qb->select('id', 'file_source', 'uid_owner', 'item_type') + ->from('share') + ->where( + $qb->expr()->andX( + $qb->expr()->eq('share_type', $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK)), + $qb->expr()->lte('expiration', $qb->expr()->literal($now)), + $qb->expr()->orX( + $qb->expr()->eq('item_type', $qb->expr()->literal('file')), + $qb->expr()->eq('item_type', $qb->expr()->literal('folder')) + ) + ) + ); + + $shares = $qb->execute(); + while($share = $shares->fetch()) { + \OCP\Share::unshare($share['item_type'], $share['file_source'], \OCP\Share::SHARE_TYPE_LINK, null, $share['uid_owner']); + } + $shares->closeCursor(); + } + +} diff --git a/apps/files_sharing/tests/expiresharesjobtest.php b/apps/files_sharing/tests/expiresharesjobtest.php new file mode 100644 index 00000000000..90da4011d8b --- /dev/null +++ b/apps/files_sharing/tests/expiresharesjobtest.php @@ -0,0 +1,204 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files_Sharing\Tests; + +use OCA\Files_Sharing\ExpireSharesJob; + +class ExpireSharesJobTest extends \Test\TestCase { + + /** + * @var ExpireSharesJob + */ + private $job; + + /** + * @var \OCP\IDBConnection + */ + private $connection; + + /** + * @var string + */ + private $user1; + + /** + * @var string + */ + private $user2; + + protected function setup() { + parent::setUp(); + + $this->connection = \OC::$server->getDatabaseConnection(); + // clear occasional leftover shares from other tests + $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`'); + + $this->user1 = $this->getUniqueID('user1_'); + $this->user2 = $this->getUniqueID('user2_'); + + $userManager = \OC::$server->getUserManager(); + $userManager->createUser($this->user1, 'pass'); + $userManager->createUser($this->user2, 'pass'); + + \OC::registerShareHooks(); + + $this->job = new ExpireSharesJob(); + } + + protected function tearDown() { + $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`'); + + $userManager = \OC::$server->getUserManager(); + $user1 = $userManager->get($this->user1); + if($user1) { + $user1->delete(); + } + $user2 = $userManager->get($this->user2); + if($user2) { + $user2->delete(); + } + + $this->logout(); + + parent::tearDown(); + } + + private function getShares() { + $shares = []; + $qb = $this->connection->getQueryBuilder(); + + $result = $qb->select('*') + ->from('share') + ->execute(); + + while ($row = $result->fetch()) { + $shares[] = $row; + } + $result->closeCursor(); + return $shares; + } + + public function dataExpireLinkShare() { + return [ + [false, '', false, false], + [false, '', true, false], + [true, 'P1D', false, true], + [true, 'P1D', true, false], + [true, 'P1W', false, true], + [true, 'P1W', true, false], + [true, 'P1M', false, true], + [true, 'P1M', true, false], + [true, 'P1Y', false, true], + [true, 'P1Y', true, false], + ]; + } + + /** + * @dataProvider dataExpireLinkShare + * + * @param bool addExpiration Should we add an expire date + * @param string $interval The dateInterval + * @param bool $addInterval If true add to the current time if false subtract + * @param bool $shouldExpire Should this share be expired + */ + public function testExpireLinkShare($addExpiration, $interval, $addInterval, $shouldExpire) { + $this->loginAsUser($this->user1); + + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/test'); + + $fileInfo = $view->getFileInfo('files/test'); + + $this->assertNotNull( + \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ), + 'Failed asserting that user 1 successfully shared "test" by link.' + ); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + reset($shares); + $share = current($shares); + + if ($addExpiration) { + $expire = new \DateTime(); + $expire->setTime(0, 0, 0); + if ($addInterval) { + $expire->add(new \DateInterval($interval)); + } else { + $expire->sub(new \DateInterval($interval)); + } + $expire = $expire->format('Y-m-d 00:00:00'); + + // Set expiration date to yesterday + $qb = $this->connection->getQueryBuilder(); + $qb->update('share') + ->set('expiration', $qb->createParameter('expiration')) + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $share['id']) + ->setParameter('expiration', $expire) + ->execute(); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + } + + $this->logout(); + + $this->job->run([]); + + $shares = $this->getShares(); + + if ($shouldExpire) { + $this->assertCount(0, $shares); + } else { + $this->assertCount(1, $shares); + } + } + + public function testDoNotExpireOtherShares() { + $this->loginAsUser($this->user1); + + $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view->mkdir('files/test'); + + $fileInfo = $view->getFileInfo('files/test'); + + $this->assertNotNull( + \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ), + 'Failed asserting that user 1 successfully shared "test" by link with user2.' + ); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + reset($shares); + $share = current($shares); + + $this->logout(); + + $this->job->run([]); + + $shares = $this->getShares(); + $this->assertCount(1, $shares); + } + +} + |