123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test\Repair;
- use OC\Repair\RepairInvalidShares;
- use OCP\IConfig;
- use OCP\Migration\IOutput;
- use OCP\Migration\IRepairStep;
- use OCP\Share\IShare;
- use Test\TestCase;
- /**
- * Tests for repairing invalid shares
- *
- * @group DB
- *
- * @see \OC\Repair\RepairInvalidShares
- */
- class RepairInvalidSharesTest extends TestCase {
- /** @var IRepairStep */
- private $repair;
- /** @var \OCP\IDBConnection */
- private $connection;
- protected function setUp(): void {
- parent::setUp();
- $config = $this->getMockBuilder(IConfig::class)
- ->disableOriginalConstructor()
- ->getMock();
- $config->expects($this->any())
- ->method('getSystemValueString')
- ->with('version')
- ->willReturn('12.0.0.0');
- $this->connection = \OC::$server->getDatabaseConnection();
- $this->deleteAllShares();
- /** @var \OCP\IConfig $config */
- $this->repair = new RepairInvalidShares($config, $this->connection);
- }
- protected function tearDown(): void {
- $this->deleteAllShares();
- parent::tearDown();
- }
- protected function deleteAllShares() {
- $qb = $this->connection->getQueryBuilder();
- $qb->delete('share')->execute();
- }
- /**
- * Test remove shares where the parent share does not exist anymore
- */
- public function testSharesNonExistingParent() {
- $qb = $this->connection->getQueryBuilder();
- $shareValues = [
- 'share_type' => $qb->expr()->literal(IShare::TYPE_USER),
- 'share_with' => $qb->expr()->literal('recipientuser1'),
- 'uid_owner' => $qb->expr()->literal('user1'),
- 'item_type' => $qb->expr()->literal('folder'),
- 'item_source' => $qb->expr()->literal(123),
- 'item_target' => $qb->expr()->literal('/123'),
- 'file_source' => $qb->expr()->literal(123),
- 'file_target' => $qb->expr()->literal('/test'),
- 'permissions' => $qb->expr()->literal(1),
- 'stime' => $qb->expr()->literal(time()),
- 'expiration' => $qb->expr()->literal('2015-09-25 00:00:00')
- ];
- // valid share
- $qb = $this->connection->getQueryBuilder();
- $qb->insert('share')
- ->values($shareValues)
- ->execute();
- $parent = $this->getLastShareId();
- // share with existing parent
- $qb = $this->connection->getQueryBuilder();
- $qb->insert('share')
- ->values(array_merge($shareValues, [
- 'parent' => $qb->expr()->literal($parent),
- ]))->execute();
- $validChild = $this->getLastShareId();
- // share with non-existing parent
- $qb = $this->connection->getQueryBuilder();
- $qb->insert('share')
- ->values(array_merge($shareValues, [
- 'parent' => $qb->expr()->literal($parent + 100),
- ]))->execute();
- $invalidChild = $this->getLastShareId();
- $query = $this->connection->getQueryBuilder();
- $result = $query->select('id')
- ->from('share')
- ->orderBy('id', 'ASC')
- ->execute();
- $rows = $result->fetchAll();
- $this->assertEquals([['id' => $parent], ['id' => $validChild], ['id' => $invalidChild]], $rows);
- $result->closeCursor();
- /** @var IOutput | \PHPUnit\Framework\MockObject\MockObject $outputMock */
- $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
- ->disableOriginalConstructor()
- ->getMock();
- $this->repair->run($outputMock);
- $query = $this->connection->getQueryBuilder();
- $result = $query->select('id')
- ->from('share')
- ->orderBy('id', 'ASC')
- ->execute();
- $rows = $result->fetchAll();
- $this->assertEquals([['id' => $parent], ['id' => $validChild]], $rows);
- $result->closeCursor();
- }
- public function fileSharePermissionsProvider() {
- return [
- // unchanged for folder
- [
- 'folder',
- 31,
- 31,
- ],
- // unchanged for read-write + share
- [
- 'file',
- \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE,
- \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE,
- ],
- // fixed for all perms
- [
- 'file',
- \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE,
- \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE,
- ],
- ];
- }
- /**
- * Test adjusting file share permissions
- *
- * @dataProvider fileSharePermissionsProvider
- */
- public function testFileSharePermissions($itemType, $testPerms, $expectedPerms) {
- $qb = $this->connection->getQueryBuilder();
- $qb->insert('share')
- ->values([
- 'share_type' => $qb->expr()->literal(IShare::TYPE_LINK),
- 'uid_owner' => $qb->expr()->literal('user1'),
- 'item_type' => $qb->expr()->literal($itemType),
- 'item_source' => $qb->expr()->literal(123),
- 'item_target' => $qb->expr()->literal('/123'),
- 'file_source' => $qb->expr()->literal(123),
- 'file_target' => $qb->expr()->literal('/test'),
- 'permissions' => $qb->expr()->literal($testPerms),
- 'stime' => $qb->expr()->literal(time()),
- ])
- ->execute();
- $shareId = $this->getLastShareId();
- /** @var IOutput | \PHPUnit\Framework\MockObject\MockObject $outputMock */
- $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
- ->disableOriginalConstructor()
- ->getMock();
- $this->repair->run($outputMock);
- $results = $this->connection->getQueryBuilder()
- ->select('*')
- ->from('share')
- ->orderBy('permissions', 'ASC')
- ->execute()
- ->fetchAll();
- $this->assertCount(1, $results);
- $updatedShare = $results[0];
- $this->assertEquals($expectedPerms, $updatedShare['permissions']);
- }
- /**
- * @return int
- */
- protected function getLastShareId() {
- return $this->connection->lastInsertId('*PREFIX*share');
- }
- }
|