Skip to content
Snippets Groups Projects
Commit ca2fd300 authored by Joas Schilling's avatar Joas Schilling
Browse files

Remove shares where the parent does not exist anymore

parent 527ef76d
No related branches found
No related tags found
No related merge requests found
......@@ -70,11 +70,43 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
}
}
/**
* Remove shares where the parent share does not exist anymore
*/
private function removeSharesNonExistingParent() {
$deletedEntries = 0;
$query = $this->connection->getQueryBuilder();
$query->select('s1.parent')
->from('share', 's1')
->where($query->expr()->isNotNull('s1.parent'))
->andWhere($query->expr()->isNull('s2.id'))
->leftJoin('s1', 'share', 's2', $query->expr()->eq('s1.parent', 's2.id'))
->groupBy('s1.parent');
$deleteQuery = $this->connection->getQueryBuilder();
$deleteQuery->delete('share')
->where($query->expr()->eq('parent', $deleteQuery->createParameter('parent')));
$result = $query->execute();
while ($row = $result->fetch()) {
$deletedEntries += $deleteQuery->setParameter('parent', (int) $row['parent'])
->execute();
}
$result->closeCursor();
if ($deletedEntries) {
$this->emit('\OC\Repair', 'info', array('Removed ' . $deletedEntries . ' shares where the parent did not exist'));
}
}
public function run() {
$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.7', '<')) {
// this situation was only possible before 8.2
$this->removeExpirationDateFromNonLinkShares();
}
$this->removeSharesNonExistingParent();
}
}
......@@ -119,5 +119,83 @@ class RepairInvalidSharesTest extends TestCase {
$this->assertNull($userShare['expiration'], 'bogus expiration date was removed');
$this->assertNotNull($linkShare['expiration'], 'valid link share expiration date still there');
}
/**
* 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();
$this->assertSame([['id' => $parent], ['id' => $validChild], ['id' => $invalidChild]], $rows);
$result->closeCursor();
$this->repair->run();
$query = $this->connection->getQueryBuilder();
$result = $query->select('id')
->from('share')
->orderBy('id', 'ASC')
->execute();
$rows = $result->fetchAll();
$this->assertSame([['id' => $parent], ['id' => $validChild]], $rows);
$result->closeCursor();
}
/**
* @return int
*/
protected function getLastShareId() {
// select because lastInsertId does not work with OCI
$query = $this->connection->getQueryBuilder();
$result = $query->select('id')
->from('share')
->orderBy('id', 'DESC')
->execute();
$row = $result->fetch();
$result->closeCursor();
return $row['id'];
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment