From d7ce6deb74f9ee2d642d9e2fb0ab1053d875610e Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Wed, 4 Oct 2023 18:12:35 +0200 Subject: [PATCH] Add logic to migrate users' credentials Signed-off-by: Louis Chemineau --- apps/files_external/lib/Command/MigrateOc.php | 66 +++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/apps/files_external/lib/Command/MigrateOc.php b/apps/files_external/lib/Command/MigrateOc.php index ec35523ca9fd5..5b9a3cc12986d 100644 --- a/apps/files_external/lib/Command/MigrateOc.php +++ b/apps/files_external/lib/Command/MigrateOc.php @@ -104,17 +104,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $output->writeln("Successfully migrated"); } - $passwords = $this->getV2StoragePasswords(); - - if (count($passwords)) { - $output->writeln("Found " . count($passwords) . " stored passwords that need re-encoding"); - foreach ($passwords as $id => $password) { - $decoded = $this->decodePassword($password); - if (!$dryRun) { - $this->setStorageConfig($id, $this->encryptPassword($decoded)); - } - } - } + $this->migrateV2StoragePasswords($dryRun, $output); + $this->migrateUserCredentials($dryRun, $output); return 0; } @@ -167,7 +158,21 @@ private function getV2StoragePasswords(): array { return $configs; } - private function setStorageConfig(int $id, string $value) { + private function migrateV2StoragePasswords(bool $dryRun, OutputInterface $output): void { + $passwords = $this->getV2StoragePasswords(); + + if (count($passwords)) { + $output->writeln("Found " . count($passwords) . " stored passwords that need re-encoding"); + foreach ($passwords as $id => $password) { + $decoded = $this->decodePassword($password); + if (!$dryRun) { + $this->setStorageConfig($id, $this->encryptPassword($decoded)); + } + } + } + } + + private function setStorageConfig(int $id, string $value): void { $query = $this->connection->getQueryBuilder(); $query->update('external_config') ->set('value', $query->createNamedParameter($value)) @@ -175,6 +180,43 @@ private function setStorageConfig(int $id, string $value) { $query->executeStatement(); } + /** + * @return array> + */ + private function getUserCredentials(): array { + $query = $this->connection->getQueryBuilder(); + $query->select('user', 'identifier', 'credentials') + ->from('credentials'); + + return $query->executeQuery()->fetchAll(); + } + + private function migrateUserCredentials(bool $dryRun, OutputInterface $output): void { + $passwords = $this->getUserCredentials(); + + if (count($passwords)) { + $output->writeln("Found " . count($passwords) . " stored user credentials that need re-encoding"); + foreach ($passwords as $passwordRow) { + $decoded = $this->decodePassword($passwordRow["credentials"]); + if (!$dryRun) { + $this->setStorageCredentials($passwordRow, $this->encryptPassword($decoded)); + } + } + } + } + + private function setStorageCredentials(array $row, string $encryptedPassword): void { + $query = $this->connection->getQueryBuilder(); + + $query->insert('storages_credentials') + ->values([ + 'user' => $query->createNamedParameter($row['user']), + 'identifier' => $query->createNamedParameter($row['identifier']), + 'credentials' => $query->createNamedParameter($encryptedPassword), + ]) + ->executeStatement(); + } + private function setStorageId(string $old, string $new): bool { $query = $this->connection->getQueryBuilder(); $query->update('storages')