-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #863 from nextcloud/fix/862/migrate-members-also
fix(Groups): take over members during migration
- Loading branch information
Showing
11 changed files
with
592 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
/** | ||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors | ||
* SPDX-License-Identifier: AGPL-3.0-or-later | ||
*/ | ||
namespace OCA\User_SAML\Command; | ||
|
||
use OC\Core\Command\Base; | ||
use OCA\User_SAML\Service\GroupMigration; | ||
use Psr\Log\LoggerInterface; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
use Throwable; | ||
|
||
class GroupMigrationCopyIncomplete extends Base { | ||
public function __construct( | ||
protected GroupMigration $groupMigration, | ||
protected LoggerInterface $logger, | ||
) { | ||
parent::__construct(); | ||
} | ||
protected function configure(): void { | ||
$this->setName('saml:group-migration:copy-incomplete-members'); | ||
$this->setDescription('Transfers remaining group members from old local to current SAML groups'); | ||
} | ||
|
||
protected function execute(InputInterface $input, OutputInterface $output): int { | ||
$groupsToTreat = $this->groupMigration->findGroupsWithLocalMembers(); | ||
if (empty($groupsToTreat)) { | ||
if ($output->isVerbose()) { | ||
$output->writeln('<info>No pending group member transfer</info>'); | ||
} | ||
return 0; | ||
} | ||
|
||
if (!$this->doMemberTransfer($groupsToTreat, $output)) { | ||
if (!$output->isQuiet()) { | ||
$output->writeln('<comment>Not all group members could be transferred completely. Rerun this command or check the Nextcloud log.</comment>'); | ||
} | ||
return 1; | ||
} | ||
|
||
if (!$output->isQuiet()) { | ||
$output->writeln('<info>All group members could be transferred completely.</info>'); | ||
} | ||
return 0; | ||
} | ||
|
||
/** | ||
* @param string[]|array<empty> $groups | ||
* @param OutputInterface $output | ||
* @return bool | ||
*/ | ||
protected function doMemberTransfer(array $groups, OutputInterface $output): bool { | ||
$errorOccurred = false; | ||
for ($i = 0; $i < 2; $i++) { | ||
$retry = []; | ||
foreach ($groups as $gid) { | ||
try { | ||
$isComplete = $this->groupMigration->migrateGroupUsers($gid); | ||
if (!$isComplete) { | ||
$retry[] = $gid; | ||
} else { | ||
$this->groupMigration->cleanUpOldGroupUsers($gid); | ||
if ($output->isVerbose()) { | ||
$output->writeln(sprintf('<info>Members transferred successfully for group %s</info>', $gid)); | ||
} | ||
} | ||
} catch (Throwable $e) { | ||
$errorOccurred = true; | ||
if (!$output->isQuiet()) { | ||
$output->writeln(sprintf('<error>Failed to transfer users from group %s: %s</error>', $gid, $e->getMessage())); | ||
} | ||
$this->logger->warning('Error while transferring group members of {gid}', ['gid' => $gid, 'exception' => $e]); | ||
} | ||
} | ||
if (empty($retry)) { | ||
return true; | ||
} | ||
/** @var string[]|array<empty> $groups */ | ||
$groups = $retry; | ||
} | ||
if (!empty($groups) && !$output->isQuiet()) { | ||
$output->writeln(sprintf( | ||
'<comment>Members not or incompletely transferred for groups: %s</comment>', | ||
implode(', ', $groups) | ||
)); | ||
} | ||
return empty($groups) && !$errorOccurred; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
/** | ||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors | ||
* SPDX-License-Identifier: AGPL-3.0-or-later | ||
*/ | ||
namespace OCA\User_SAML\Migration; | ||
|
||
use OCA\User_SAML\Service\GroupMigration; | ||
use OCP\Migration\IOutput; | ||
use OCP\Migration\IRepairStep; | ||
use Psr\Log\LoggerInterface; | ||
use Throwable; | ||
|
||
class TransferGroupMembers implements IRepairStep { | ||
|
||
public function __construct( | ||
private GroupMigration $groupMigration, | ||
private LoggerInterface $logger, | ||
) { | ||
} | ||
|
||
public function getName(): string { | ||
return 'Move potential left members from old local groups to SAML groups'; | ||
} | ||
|
||
public function run(IOutput $output): void { | ||
$groupsToTreat = $this->groupMigration->findGroupsWithLocalMembers(); | ||
if (empty($groupsToTreat)) { | ||
return; | ||
} | ||
$hasError = false; | ||
$output->startProgress(count($groupsToTreat)); | ||
foreach ($groupsToTreat as $gid) { | ||
try { | ||
if ($this->groupMigration->migrateGroupUsers($gid)) { | ||
$this->groupMigration->cleanUpOldGroupUsers($gid); | ||
} | ||
} catch (Throwable $e) { | ||
$hasError = true; | ||
$this->logger->warning('Error while transferring group members of {gid}', ['gid' => $gid, 'exception' => $e]); | ||
} finally { | ||
$output->advance(); | ||
} | ||
} | ||
$output->finishProgress(); | ||
if ($hasError) { | ||
$output->warning('There were errors while transferring group members to SAML groups. You may try later `occ saml:group-migration:copy-incomplete-members` later and check your nextcloud.log.'); | ||
} | ||
} | ||
} |
Oops, something went wrong.