From 07bf1298090075295535684ff9ecb601ac8237d9 Mon Sep 17 00:00:00 2001 From: Christopher Ng Date: Wed, 18 May 2022 01:23:30 +0000 Subject: [PATCH 1/2] Skip instead of throwing on invalid calendar migration Signed-off-by: Christopher Ng --- apps/dav/lib/UserMigration/CalendarMigrator.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/dav/lib/UserMigration/CalendarMigrator.php b/apps/dav/lib/UserMigration/CalendarMigrator.php index 14ea4459435d7..22a207030247f 100644 --- a/apps/dav/lib/UserMigration/CalendarMigrator.php +++ b/apps/dav/lib/UserMigration/CalendarMigrator.php @@ -182,6 +182,9 @@ function (ICalendar $calendar) use ($user, $output) { ))); } + /** + * @throws InvalidCalendarException + */ private function getUniqueCalendarUri(IUser $user, string $initialCalendarUri): string { $principalUri = $this->getPrincipalUri($user); @@ -190,7 +193,7 @@ private function getUniqueCalendarUri(IUser $user, string $initialCalendarUri): : CalendarMigrator::MIGRATED_URI_PREFIX . $initialCalendarUri; if ($initialCalendarUri === '') { - throw new CalendarMigratorException('Failed to get unique calendar URI'); + throw new InvalidCalendarException(); } $existingCalendarUris = array_map( @@ -457,17 +460,20 @@ public function import(IUser $user, IImportSource $importSource, OutputInterface VObjectReader::OPTION_FORGIVING, ); } catch (Throwable $e) { - throw new CalendarMigratorException("Failed to read file \"$importPath\"", 0, $e); + $output->writeln("Failed to read file \"$importPath\", skipping…"); + continue; } $problems = $vCalendar->validate(); if (!empty($problems)) { - throw new CalendarMigratorException("Invalid calendar data contained in \"$importPath\""); + $output->writeln("Invalid calendar data contained in \"$importPath\", skipping…"); + continue; } $splitFilename = explode('.', $filename, 2); if (count($splitFilename) !== 2) { - throw new CalendarMigratorException("Invalid filename \"$filename\", expected filename of the format \"" . CalendarMigrator::FILENAME_EXT . '"'); + $output->writeln("Invalid filename \"$filename\", expected filename of the format \"" . CalendarMigrator::FILENAME_EXT . '", skipping…'); + continue; } [$initialCalendarUri, $ext] = $splitFilename; From a770fd82364569851b92a7e5f49db98f0c58c640 Mon Sep 17 00:00:00 2001 From: Christopher Ng Date: Wed, 18 May 2022 01:27:33 +0000 Subject: [PATCH 2/2] Skip instead of throwing on invalid address book migration Signed-off-by: Christopher Ng --- .../lib/UserMigration/ContactsMigrator.php | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/dav/lib/UserMigration/ContactsMigrator.php b/apps/dav/lib/UserMigration/ContactsMigrator.php index 879642b9dc10d..38c53a1f76e27 100644 --- a/apps/dav/lib/UserMigration/ContactsMigrator.php +++ b/apps/dav/lib/UserMigration/ContactsMigrator.php @@ -160,6 +160,9 @@ function (array $addressBookInfo) use ($user, $output) { ))); } + /** + * @throws InvalidAddressBookException + */ private function getUniqueAddressBookUri(IUser $user, string $initialAddressBookUri): string { $principalUri = $this->getPrincipalUri($user); @@ -168,7 +171,7 @@ private function getUniqueAddressBookUri(IUser $user, string $initialAddressBook : ContactsMigrator::MIGRATED_URI_PREFIX . $initialAddressBookUri; if ($initialAddressBookUri === '') { - throw new ContactsMigratorException('Failed to get unique address book URI'); + throw new InvalidAddressBookException(); } $existingAddressBookUris = array_map( @@ -272,6 +275,8 @@ private function importContact(int $addressBookId, VCard $vCard, string $filenam /** * @param array{displayName: string, description?: string} $metadata * @param VCard[] $vCards + * + * @throws InvalidAddressBookException */ private function importAddressBook(IUser $user, string $filename, string $initialAddressBookUri, array $metadata, array $vCards, OutputInterface $output): void { $principalUri = $this->getPrincipalUri($user); @@ -366,24 +371,29 @@ public function import(IUser $user, IImportSource $importSource, OutputInterface $splitFilename = explode('.', $addressBookFilename, 2); if (count($splitFilename) !== 2) { - throw new ContactsMigratorException("Invalid filename \"$addressBookFilename\", expected filename of the format \"." . ContactsMigrator::FILENAME_EXT . '"'); + $output->writeln("Invalid filename \"$addressBookFilename\", expected filename of the format \"." . ContactsMigrator::FILENAME_EXT . '", skipping…'); + continue; } [$initialAddressBookUri, $ext] = $splitFilename; /** @var array{displayName: string, description?: string} $metadata */ $metadata = json_decode($importSource->getFileContents($metadataImportPath), true, 512, JSON_THROW_ON_ERROR); - $this->importAddressBook( - $user, - $addressBookFilename, - $initialAddressBookUri, - $metadata, - $vCards, - $output, - ); - - foreach ($vCards as $vCard) { - $vCard->destroy(); + try { + $this->importAddressBook( + $user, + $addressBookFilename, + $initialAddressBookUri, + $metadata, + $vCards, + $output, + ); + } catch (InvalidAddressBookException $e) { + // Allow this exception to skip a failed import + } finally { + foreach ($vCards as $vCard) { + $vCard->destroy(); + } } } }