]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix: Migrate existing bg jobs to use sha256
authorLouis Chemineau <louis@chmn.me>
Thu, 5 Sep 2024 16:08:39 +0000 (18:08 +0200)
committerLouis Chemineau <louis@chmn.me>
Thu, 5 Sep 2024 16:09:27 +0000 (18:09 +0200)
Signed-off-by: Louis Chemineau <louis@chmn.me>
core/Migrations/Version28000Date20240828142927.php [new file with mode: 0644]
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php

diff --git a/core/Migrations/Version28000Date20240828142927.php b/core/Migrations/Version28000Date20240828142927.php
new file mode 100644 (file)
index 0000000..9c0daff
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OC\Core\Migrations;
+
+use Closure;
+use OCP\DB\ISchemaWrapper;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+
+/**
+ * Migrate the argument_hash column of oc_jobs to use sha256 instead of md5.
+ */
+class Version28000Date20240828142927 extends SimpleMigrationStep {
+       public function __construct(
+               protected IDBConnection $connection,
+       ) {
+       }
+
+       public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
+               /** @var ISchemaWrapper $schema */
+               $schema = $schemaClosure();
+
+               // Increase the column size from 32 to 64
+               $table = $schema->getTable('jobs');
+               $table->modifyColumn('argument_hash', [
+                       'notnull' => false,
+                       'length' => 64,
+               ]);
+
+               return $schema;
+       }
+
+       public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
+               $chunkSize = 1000;
+               $offset = 0;
+               $nullHash = hash('sha256', 'null');
+
+               $selectQuery = $this->connection->getQueryBuilder()
+                       ->select('*')
+                       ->from('jobs')
+                       ->setMaxResults($chunkSize);
+
+               $insertQuery = $this->connection->getQueryBuilder();
+               $insertQuery->update('jobs')
+                       ->set('argument_hash', $insertQuery->createParameter('argument_hash'))
+                       ->where($insertQuery->expr()->eq('id', $insertQuery->createParameter('id')));
+
+               do {
+                       $result = $selectQuery
+                               ->setFirstResult($offset)
+                               ->executeQuery();
+
+                       $jobs = $result->fetchAll();
+                       $count = count($jobs);
+
+                       foreach ($jobs as $jobRow) {
+                               if ($jobRow['argument'] === 'null') {
+                                       $hash = $nullHash;
+                               } else {
+                                       $hash = hash('sha256', $jobRow['argument']);
+                               }
+                               $insertQuery->setParameter('id', (string)$jobRow['id'], IQueryBuilder::PARAM_INT);
+                               $insertQuery->setParameter('argument_hash', $hash);
+                               $insertQuery->executeStatement();
+                       }
+
+                       $offset += $chunkSize;
+               } while ($count === $chunkSize);
+       }
+}
index 855994de474d896bcbfa949c884a3e8a8429eeb1..2b7b5b6e652b1cefa0151fd72c5a3a0dcf2253bb 100644 (file)
@@ -1232,6 +1232,7 @@ return array(
     'OC\\Core\\Migrations\\Version28000Date20231004103301' => $baseDir . '/core/Migrations/Version28000Date20231004103301.php',
     'OC\\Core\\Migrations\\Version28000Date20231103104802' => $baseDir . '/core/Migrations/Version28000Date20231103104802.php',
     'OC\\Core\\Migrations\\Version28000Date20231126110901' => $baseDir . '/core/Migrations/Version28000Date20231126110901.php',
+    'OC\\Core\\Migrations\\Version28000Date20240828142927' => $baseDir . '/core/Migrations/Version28000Date20240828142927.php',
     'OC\\Core\\Migrations\\Version30000Date20240814180800' => $baseDir . '/core/Migrations/Version30000Date20240814180800.php',
     'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php',
     'OC\\Core\\Service\\LoginFlowV2Service' => $baseDir . '/core/Service/LoginFlowV2Service.php',
index 22294859422c55f40f8856d4c0413b7396da94b9..2dd883a794b1966aac4c0e702340d11932abefb9 100644 (file)
@@ -1265,6 +1265,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OC\\Core\\Migrations\\Version28000Date20231004103301' => __DIR__ . '/../../..' . '/core/Migrations/Version28000Date20231004103301.php',
         'OC\\Core\\Migrations\\Version28000Date20231103104802' => __DIR__ . '/../../..' . '/core/Migrations/Version28000Date20231103104802.php',
         'OC\\Core\\Migrations\\Version28000Date20231126110901' => __DIR__ . '/../../..' . '/core/Migrations/Version28000Date20231126110901.php',
+        'OC\\Core\\Migrations\\Version28000Date20240828142927' => __DIR__ . '/../../..' . '/core/Migrations/Version28000Date20240828142927.php',
         'OC\\Core\\Migrations\\Version30000Date20240814180800' => __DIR__ . '/../../..' . '/core/Migrations/Version30000Date20240814180800.php',
         'OC\\Core\\Notification\\CoreNotifier' => __DIR__ . '/../../..' . '/core/Notification/CoreNotifier.php',
         'OC\\Core\\Service\\LoginFlowV2Service' => __DIR__ . '/../../..' . '/core/Service/LoginFlowV2Service.php',