From e8d684d91cc69ac2ff649545acda0b5952dfd02b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 30 Jun 2023 11:30:27 +0200 Subject: [PATCH 1/3] fix(dav): change type of propertyvalue column to blob MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The propertyvalue column can contain null 0x00 characters values because of serializing PHP objects since https://github.com/nextcloud/server/pull/30368. This truncates data in text fields, but not blob fields. We start by removing invalid value and altering the column to match the new type. That's what Sabre PDO's being doing in the first place 🙈 Closes #37754 Signed-off-by: Thomas Citharel --- .../composer/composer/autoload_classmap.php | 4 + .../dav/composer/composer/autoload_static.php | 4 + .../Version1032Date20230630084412.php | 75 +++++++++++++++++++ .../Version1032Date20230630091518.php | 54 +++++++++++++ .../Version1032Date20230702074215.php | 67 +++++++++++++++++ .../Version1032Date20230702074341.php | 54 +++++++++++++ 6 files changed, 258 insertions(+) create mode 100644 apps/dav/lib/Migration/Version1032Date20230630084412.php create mode 100644 apps/dav/lib/Migration/Version1032Date20230630091518.php create mode 100644 apps/dav/lib/Migration/Version1032Date20230702074215.php create mode 100644 apps/dav/lib/Migration/Version1032Date20230702074341.php diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index 2e878decb3f96..333d28896ecaa 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -340,6 +340,10 @@ 'OCA\\DAV\\Migration\\Version1029Date20231004091403' => $baseDir . '/../lib/Migration/Version1029Date20231004091403.php', 'OCA\\DAV\\Migration\\Version1030Date20240205103243' => $baseDir . '/../lib/Migration/Version1030Date20240205103243.php', 'OCA\\DAV\\Migration\\Version1031Date20240610134258' => $baseDir . '/../lib/Migration/Version1031Date20240610134258.php', + 'OCA\\DAV\\Migration\\Version1032Date20230630084412' => $baseDir . '/../lib/Migration/Version1032Date20230630084412.php', + 'OCA\\DAV\\Migration\\Version1032Date20230630091518' => $baseDir . '/../lib/Migration/Version1032Date20230630091518.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074215' => $baseDir . '/../lib/Migration/Version1032Date20230702074215.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074341' => $baseDir . '/../lib/Migration/Version1032Date20230702074341.php', 'OCA\\DAV\\Profiler\\ProfilerPlugin' => $baseDir . '/../lib/Profiler/ProfilerPlugin.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 5f43453cda6a7..c70d5e3308ef1 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -355,6 +355,10 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Migration\\Version1029Date20231004091403' => __DIR__ . '/..' . '/../lib/Migration/Version1029Date20231004091403.php', 'OCA\\DAV\\Migration\\Version1030Date20240205103243' => __DIR__ . '/..' . '/../lib/Migration/Version1030Date20240205103243.php', 'OCA\\DAV\\Migration\\Version1031Date20240610134258' => __DIR__ . '/..' . '/../lib/Migration/Version1031Date20240610134258.php', + 'OCA\\DAV\\Migration\\Version1032Date20230630084412' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230630084412.php', + 'OCA\\DAV\\Migration\\Version1032Date20230630091518' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230630091518.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074215' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230702074215.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074341' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230702074341.php', 'OCA\\DAV\\Profiler\\ProfilerPlugin' => __DIR__ . '/..' . '/../lib/Profiler/ProfilerPlugin.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', diff --git a/apps/dav/lib/Migration/Version1032Date20230630084412.php b/apps/dav/lib/Migration/Version1032Date20230630084412.php new file mode 100644 index 0000000000000..57b97e6489acf --- /dev/null +++ b/apps/dav/lib/Migration/Version1032Date20230630084412.php @@ -0,0 +1,75 @@ +connection->getQueryBuilder(); + $query->delete('properties') + ->where($query->expr()->eq('valuetype', $query->createNamedParameter(3))) + ->executeStatement(); + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + * @return null|ISchemaWrapper + */ + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + $propertiesTable = $schema->getTable('properties'); + if ($propertiesTable->hasColumn('propertyvaluenew')) { + return null; + } + $propertiesTable->addColumn('propertyvaluenew', Types::TEXT, [ + 'notnull' => false + ]); + + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + $query = $this->connection->getQueryBuilder(); + $query->update('properties') + ->set('propertyvaluenew', 'propertyvalue') + ->executeStatement(); + } +} diff --git a/apps/dav/lib/Migration/Version1032Date20230630091518.php b/apps/dav/lib/Migration/Version1032Date20230630091518.php new file mode 100644 index 0000000000000..176bf4e906f59 --- /dev/null +++ b/apps/dav/lib/Migration/Version1032Date20230630091518.php @@ -0,0 +1,54 @@ +getTable('properties'); + + $propertiesTable->dropColumn('propertyvalue'); + + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } +} diff --git a/apps/dav/lib/Migration/Version1032Date20230702074215.php b/apps/dav/lib/Migration/Version1032Date20230702074215.php new file mode 100644 index 0000000000000..17d97c607d1a5 --- /dev/null +++ b/apps/dav/lib/Migration/Version1032Date20230702074215.php @@ -0,0 +1,67 @@ +getTable('properties'); + $propertiesTable->addColumn('propertyvalue', Types::BLOB, [ + 'notnull' => false + ]); + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + if ($this->connection->getDatabasePlatform() instanceof PostgreSQLPlatform) { + $this->connection->executeStatement('UPDATE `*prefix*properties` SET `propertyvalue` = propertyvaluenew::bytea'); + } else { + $query = $this->connection->getQueryBuilder(); + $query->update('properties') + ->set('propertyvalue', 'propertyvaluenew') + ->executeStatement(); + } + } +} diff --git a/apps/dav/lib/Migration/Version1032Date20230702074341.php b/apps/dav/lib/Migration/Version1032Date20230702074341.php new file mode 100644 index 0000000000000..778787fba49a6 --- /dev/null +++ b/apps/dav/lib/Migration/Version1032Date20230702074341.php @@ -0,0 +1,54 @@ +getTable('properties'); + $propertiesTable->changeColumn('propertyvalue', [ + 'notnull' => true + ]); + $propertiesTable->dropColumn('propertyvaluenew'); + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } +} From 4c82fc45585b67ae8c0183b297c3f4ac38a0ac1d Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sun, 2 Jul 2023 10:11:28 +0200 Subject: [PATCH 2/3] fix(dav): increase length of propertypath column Match it to the value in oc_filecache table path column should be fine. Closes #9907 Signed-off-by: Thomas Citharel --- .../composer/composer/autoload_classmap.php | 1 + .../dav/composer/composer/autoload_static.php | 1 + .../Version1032Date20230702074342.php | 61 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 apps/dav/lib/Migration/Version1032Date20230702074342.php diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index 333d28896ecaa..bc33183347207 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -344,6 +344,7 @@ 'OCA\\DAV\\Migration\\Version1032Date20230630091518' => $baseDir . '/../lib/Migration/Version1032Date20230630091518.php', 'OCA\\DAV\\Migration\\Version1032Date20230702074215' => $baseDir . '/../lib/Migration/Version1032Date20230702074215.php', 'OCA\\DAV\\Migration\\Version1032Date20230702074341' => $baseDir . '/../lib/Migration/Version1032Date20230702074341.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074342' => $baseDir . '/../lib/Migration/Version1032Date20230702074342.php', 'OCA\\DAV\\Profiler\\ProfilerPlugin' => $baseDir . '/../lib/Profiler/ProfilerPlugin.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index c70d5e3308ef1..3759d3d41a900 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -359,6 +359,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Migration\\Version1032Date20230630091518' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230630091518.php', 'OCA\\DAV\\Migration\\Version1032Date20230702074215' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230702074215.php', 'OCA\\DAV\\Migration\\Version1032Date20230702074341' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230702074341.php', + 'OCA\\DAV\\Migration\\Version1032Date20230702074342' => __DIR__ . '/..' . '/../lib/Migration/Version1032Date20230702074342.php', 'OCA\\DAV\\Profiler\\ProfilerPlugin' => __DIR__ . '/..' . '/../lib/Profiler/ProfilerPlugin.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', 'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', diff --git a/apps/dav/lib/Migration/Version1032Date20230702074342.php b/apps/dav/lib/Migration/Version1032Date20230702074342.php new file mode 100644 index 0000000000000..7ba84d1f80113 --- /dev/null +++ b/apps/dav/lib/Migration/Version1032Date20230702074342.php @@ -0,0 +1,61 @@ +getTable('properties'); + + // Indexes can't be added on columns with such length, so we drop them here before recreating them + $propertiesTable->dropIndex('properties_path_index'); + $propertiesTable->dropIndex('properties_pathonly_index'); + + $propertyValueColumn = $propertiesTable->getColumn('propertypath'); + $propertyValueColumn->setLength(4000); + + $propertiesTable->addIndex(['userid', 'propertypath'], 'properties_path_idx_prefix', [], ['lengths' => [null, 64]]); + $propertiesTable->addIndex(['propertypath'], 'properties_pathonly_idx_prefix', [], ['lengths' => [64]]); + + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } +} From 1440e5a74f5ef430a661f47ddd7438cad4ff78b7 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 30 Jun 2023 11:50:00 +0200 Subject: [PATCH 3/3] chore(dav): bump dav app version for new migrations Signed-off-by: Thomas Citharel --- apps/dav/appinfo/info.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 6f5a085ef0576..438cde89b47c9 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -10,7 +10,7 @@ WebDAV WebDAV endpoint WebDAV endpoint - 1.32.0 + 1.32.1 agpl owncloud.org DAV