2015-09-17 14:01:11 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
|
|
|
|
* This file is licensed under the Affero General Public License version 3 or
|
|
|
|
* later.
|
|
|
|
* See the COPYING-README file.
|
|
|
|
*/
|
2015-10-01 06:32:24 +00:00
|
|
|
|
2015-09-17 14:01:11 +00:00
|
|
|
namespace Test\Repair;
|
|
|
|
|
2015-10-01 06:32:24 +00:00
|
|
|
|
|
|
|
use OC\Repair\RepairInvalidShares;
|
|
|
|
use OC\Share\Constants;
|
2017-10-24 13:26:53 +00:00
|
|
|
use OCP\IConfig;
|
2016-04-22 13:35:39 +00:00
|
|
|
use OCP\Migration\IOutput;
|
|
|
|
use OCP\Migration\IRepairStep;
|
2015-10-01 06:32:24 +00:00
|
|
|
use Test\TestCase;
|
|
|
|
|
2015-09-17 14:01:11 +00:00
|
|
|
/**
|
|
|
|
* Tests for repairing invalid shares
|
|
|
|
*
|
2015-11-03 00:52:41 +00:00
|
|
|
* @group DB
|
|
|
|
*
|
2015-09-17 14:01:11 +00:00
|
|
|
* @see \OC\Repair\RepairInvalidShares
|
|
|
|
*/
|
2015-10-01 06:32:24 +00:00
|
|
|
class RepairInvalidSharesTest extends TestCase {
|
2015-09-17 14:01:11 +00:00
|
|
|
|
2016-04-22 13:35:39 +00:00
|
|
|
/** @var IRepairStep */
|
2015-09-17 14:01:11 +00:00
|
|
|
private $repair;
|
|
|
|
|
|
|
|
/** @var \OCP\IDBConnection */
|
|
|
|
private $connection;
|
|
|
|
|
|
|
|
protected function setUp() {
|
|
|
|
parent::setUp();
|
|
|
|
|
2017-10-24 13:26:53 +00:00
|
|
|
$config = $this->getMockBuilder(IConfig::class)
|
2015-09-17 14:01:11 +00:00
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
|
|
|
$config->expects($this->any())
|
|
|
|
->method('getSystemValue')
|
|
|
|
->with('version')
|
2017-02-23 04:20:56 +00:00
|
|
|
->will($this->returnValue('12.0.0.0'));
|
2015-09-17 14:01:11 +00:00
|
|
|
|
|
|
|
$this->connection = \OC::$server->getDatabaseConnection();
|
2015-10-01 06:32:24 +00:00
|
|
|
$this->deleteAllShares();
|
2015-09-17 14:01:11 +00:00
|
|
|
|
2015-10-01 06:32:24 +00:00
|
|
|
/** @var \OCP\IConfig $config */
|
|
|
|
$this->repair = new RepairInvalidShares($config, $this->connection);
|
2015-09-17 14:01:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function tearDown() {
|
2015-10-01 06:32:24 +00:00
|
|
|
$this->deleteAllShares();
|
2015-09-17 14:01:11 +00:00
|
|
|
|
|
|
|
parent::tearDown();
|
|
|
|
}
|
|
|
|
|
2015-10-01 06:32:24 +00:00
|
|
|
protected function deleteAllShares() {
|
|
|
|
$qb = $this->connection->getQueryBuilder();
|
|
|
|
$qb->delete('share')->execute();
|
|
|
|
}
|
|
|
|
|
2015-10-19 13:39:39 +00:00
|
|
|
/**
|
|
|
|
* Test remove shares where the parent share does not exist anymore
|
|
|
|
*/
|
|
|
|
public function testSharesNonExistingParent() {
|
|
|
|
$qb = $this->connection->getQueryBuilder();
|
|
|
|
$shareValues = [
|
|
|
|
'share_type' => $qb->expr()->literal(Constants::SHARE_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();
|
2015-11-19 16:18:22 +00:00
|
|
|
$this->assertEquals([['id' => $parent], ['id' => $validChild], ['id' => $invalidChild]], $rows);
|
2015-10-19 13:39:39 +00:00
|
|
|
$result->closeCursor();
|
|
|
|
|
2016-04-22 13:35:39 +00:00
|
|
|
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
|
|
|
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
|
|
|
|
|
|
|
$this->repair->run($outputMock);
|
2015-10-19 13:39:39 +00:00
|
|
|
|
|
|
|
$query = $this->connection->getQueryBuilder();
|
|
|
|
$result = $query->select('id')
|
|
|
|
->from('share')
|
|
|
|
->orderBy('id', 'ASC')
|
|
|
|
->execute();
|
|
|
|
$rows = $result->fetchAll();
|
2015-11-19 16:18:22 +00:00
|
|
|
$this->assertEquals([['id' => $parent], ['id' => $validChild]], $rows);
|
2015-10-19 13:39:39 +00:00
|
|
|
$result->closeCursor();
|
|
|
|
}
|
|
|
|
|
2016-11-07 11:25:05 +00:00
|
|
|
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(Constants::SHARE_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']);
|
|
|
|
}
|
|
|
|
|
2015-10-19 13:39:39 +00:00
|
|
|
/**
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
protected function getLastShareId() {
|
2015-11-19 16:18:22 +00:00
|
|
|
return $this->connection->lastInsertId('*PREFIX*share');
|
2015-10-19 13:39:39 +00:00
|
|
|
}
|
2015-09-17 14:01:11 +00:00
|
|
|
}
|
|
|
|
|