%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Command/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Command/UserMoveCommand.php |
<?php /** * This file is part of the Passwords App * created by Marius David Wieschollek * and licensed under the AGPL. */ namespace OCA\Passwords\Command; use Exception; use OCA\Passwords\Helper\User\DeleteUserDataHelper; use OCA\Passwords\Helper\User\MoveUserDataHelper; use OCA\Passwords\Services\ConfigurationService; use OCP\IUser; use OCP\IUserManager; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * Class UserMoveCommand * * @package OCA\Passwords\Command */ class UserMoveCommand extends AbstractInteractiveCommand { /** * @var ConfigurationService */ protected ConfigurationService $config; /** * @var IUserManager */ protected IUserManager $userManager; /** * @var MoveUserDataHelper */ protected MoveUserDataHelper $moveUserData; /** * @var DeleteUserDataHelper */ protected DeleteUserDataHelper $deleteUserData; /** * UserMoveCommand constructor. * * @param IUserManager $userManager * @param ConfigurationService $config * @param DeleteUserDataHelper $deleteUserData * @param MoveUserDataHelper $moveUserData * @param string|null $name */ public function __construct(IUserManager $userManager, ConfigurationService $config, DeleteUserDataHelper $deleteUserData, MoveUserDataHelper $moveUserData, string $name = null) { parent::__construct($name); $this->userManager = $userManager; $this->config = $config; $this->deleteUserData = $deleteUserData; $this->moveUserData = $moveUserData; } /** * */ protected function configure() { $this->setName('passwords:user:move') ->setDescription('Moves all data from one user account to another') ->addArgument('source_user', InputArgument::REQUIRED, 'The id of the user to move from') ->addArgument('target_user', InputArgument::REQUIRED, 'The id of the user to move to'); parent::configure(); } /** * @param InputInterface $input * @param OutputInterface $output * * @return int * @throws Exception */ protected function execute(InputInterface $input, OutputInterface $output): int { parent::execute($input, $output); $users = $this->getUsers($input, $output); if($users === null) return 1; [$sourceUser, $targetUser] = $users; if(!$this->confirmMove($input, $output, $sourceUser->getDisplayName(), $targetUser->getDisplayName())) return 2; if(!$this->checkSourceHasData($output, $sourceUser)) return 3; if(!$this->checkTargetOverwrite($input, $output, $targetUser)) return 4; $output->write('Moving data ...'); $this->moveUserData->moveUserData($sourceUser->getUID(), $targetUser->getUID()); $output->write(' done'); $output->writeln(''); return 0; } /** * @param InputInterface $input * @param OutputInterface $output * @param string $sourceName * @param string $targetName * * @return bool */ protected function confirmMove(InputInterface $input, OutputInterface $output, string $sourceName, string $targetName): bool { return $this->requestConfirmation($input, $output, 'This command will move all data from "'.$sourceName.'" to "'.$targetName.'"'); } /** * @param InputInterface $input * @param OutputInterface $output * * @return IUser[]|null */ protected function getUsers(InputInterface $input, OutputInterface $output): ?array { $sourceUserId = $input->getArgument('source_user'); $sourceUser = $this->userManager->get($sourceUserId); if($sourceUser === null) { $output->writeln('The source user does not exist'); return null; } $targetUserId = $input->getArgument('target_user'); $targetUser = $this->userManager->get($targetUserId); if($targetUser === null) { $output->writeln('The source user does not exist'); return null; } if($targetUser === $sourceUser) { $output->writeln('The source user and the target user are the same'); return null; } return [$sourceUser, $targetUser]; } /** * @param InputInterface $input * @param OutputInterface $output * @param IUser $targetUser * * @return bool * @throws Exception */ protected function checkTargetOverwrite(InputInterface $input, OutputInterface $output, IUser $targetUser): bool { $userId = $targetUser->getUID(); if(!$this->userHasData($userId)) return true; if(!$this->requestConfirmation($input, $output, 'The existing data of "'.$targetUser->getDisplayName().'" will be deleted permanently')) { return false; } $output->write('Deleting data ...'); $this->deleteUserData->deleteUserData($userId); $output->write(' done'); $output->writeln(''); return true; } /** * @param OutputInterface $output * @param IUser $sourceUser * * @return bool * @throws Exception */ protected function checkSourceHasData(OutputInterface $output, IUser $sourceUser): bool { $userId = $sourceUser->getUID(); if($this->userHasData($userId)) return true; $output->writeln('The user "'.$sourceUser->getDisplayName().'" has no data.'); $output->writeln('aborting'); return false; } /** * @param string $userId * * @return bool * @throws Exception */ protected function userHasData(string $userId): bool { return $this->config->hasUserValue('SSEv1UserKey', $userId) || $this->config->hasUserValue('user/challenge/id', $userId); } }