fix: replace null character when serializing
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>pull/49855/head
parent
f3129c4e82
commit
7bf1863545
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OC\Repair;
|
||||
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class RemoveBrokenProperties implements IRepairStep {
|
||||
/**
|
||||
* RemoveBrokenProperties constructor.
|
||||
*
|
||||
* @param IDBConnection $db
|
||||
*/
|
||||
public function __construct(
|
||||
private IDBConnection $db,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getName() {
|
||||
return 'Remove broken DAV object properties';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function run(IOutput $output) {
|
||||
// retrieve all object properties
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id', 'propertyvalue')
|
||||
->from('properties')
|
||||
->where($qb->expr()->eq('valuetype', $qb->createNamedParameter('3', IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
|
||||
$result = $qb->executeQuery();
|
||||
// find broken object properties
|
||||
$brokenIds = [];
|
||||
while ($entry = $result->fetch()) {
|
||||
if (!empty($entry['propertyvalue'])) {
|
||||
$object = @unserialize(str_replace('\x00', chr(0), $entry['propertyvalue']));
|
||||
if ($object === false) {
|
||||
$brokenIds[] = $entry['id'];
|
||||
}
|
||||
} else {
|
||||
$brokenIds[] = $entry['id'];
|
||||
}
|
||||
}
|
||||
$result->closeCursor();
|
||||
// delete broken object properties
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->delete('properties')
|
||||
->where($qb->expr()->in('id', $qb->createParameter('ids'), IQueryBuilder::PARAM_STR_ARRAY));
|
||||
foreach (array_chunk($brokenIds, 1000) as $chunkIds) {
|
||||
$qb->setParameter('ids', $chunkIds, IQueryBuilder::PARAM_STR_ARRAY);
|
||||
$qb->executeStatement();
|
||||
}
|
||||
$total = count($brokenIds);
|
||||
$output->info("$total broken object properties removed");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue