Skip to content

Commit

Permalink
Merge pull request #32466 from nextcloud/fix/skip-dav-migrator
Browse files Browse the repository at this point in the history
  • Loading branch information
skjnldsv authored Feb 23, 2024
2 parents f40c2a0 + a770fd8 commit 3cc5079
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
14 changes: 10 additions & 4 deletions apps/dav/lib/UserMigration/CalendarMigrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ function (ICalendar $calendar) use ($user, $output) {
)));
}

/**
* @throws InvalidCalendarException
*/
private function getUniqueCalendarUri(IUser $user, string $initialCalendarUri): string {
$principalUri = $this->getPrincipalUri($user);

Expand All @@ -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(
Expand Down Expand Up @@ -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 \"<calendar_name>" . CalendarMigrator::FILENAME_EXT . '"');
$output->writeln("Invalid filename \"$filename\", expected filename of the format \"<calendar_name>" . CalendarMigrator::FILENAME_EXT . '", skipping…');
continue;
}
[$initialCalendarUri, $ext] = $splitFilename;

Expand Down
36 changes: 23 additions & 13 deletions apps/dav/lib/UserMigration/ContactsMigrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ function (array $addressBookInfo) use ($user, $output) {
)));
}

/**
* @throws InvalidAddressBookException
*/
private function getUniqueAddressBookUri(IUser $user, string $initialAddressBookUri): string {
$principalUri = $this->getPrincipalUri($user);

Expand All @@ -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(
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 \"<address_book_name>." . ContactsMigrator::FILENAME_EXT . '"');
$output->writeln("Invalid filename \"$addressBookFilename\", expected filename of the format \"<address_book_name>." . 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();
}
}
}
}
Expand Down

0 comments on commit 3cc5079

Please sign in to comment.