Skip to content
Snippets Groups Projects
Unverified Commit 906348ca authored by Roeland Jago Douma's avatar Roeland Jago Douma Committed by GitHub
Browse files

Merge pull request #19233 from nextcloud/enh/transferownership_move

Add move (and firstlogin) option to transferownership service
parents 8fcd1d14 5bc09512
No related branches found
No related tags found
No related merge requests found
...@@ -77,7 +77,12 @@ class TransferOwnership extends Command { ...@@ -77,7 +77,12 @@ class TransferOwnership extends Command {
InputOption::VALUE_REQUIRED, InputOption::VALUE_REQUIRED,
'selectively provide the path to transfer. For example --path="folder_name"', 'selectively provide the path to transfer. For example --path="folder_name"',
'' ''
); )->addOption(
'move',
null,
InputOption::VALUE_NONE,
'move data from source user to root directory of destination user, which must be empty'
);
} }
protected function execute(InputInterface $input, OutputInterface $output) { protected function execute(InputInterface $input, OutputInterface $output) {
...@@ -99,7 +104,8 @@ class TransferOwnership extends Command { ...@@ -99,7 +104,8 @@ class TransferOwnership extends Command {
$sourceUserObject, $sourceUserObject,
$destinationUserObject, $destinationUserObject,
ltrim($input->getOption('path'), '/'), ltrim($input->getOption('path'), '/'),
$output $output,
$input->getOption('move') === true
); );
} catch (TransferOwnershipException $e) { } catch (TransferOwnershipException $e) {
$output->writeln("<error>" . $e->getMessage() . "</error>"); $output->writeln("<error>" . $e->getMessage() . "</error>");
......
...@@ -71,24 +71,33 @@ class OwnershipTransferService { ...@@ -71,24 +71,33 @@ class OwnershipTransferService {
* @param IUser $destinationUser * @param IUser $destinationUser
* @param string $path * @param string $path
* *
* @param OutputInterface|null $output
* @param bool $move
* @throws TransferOwnershipException * @throws TransferOwnershipException
* @throws \OC\User\NoUserException
*/ */
public function transfer(IUser $sourceUser, public function transfer(IUser $sourceUser,
IUser $destinationUser, IUser $destinationUser,
string $path, string $path,
?OutputInterface $output = null): void { ?OutputInterface $output = null,
bool $move = false,
bool $firstLogin = false): void {
$output = $output ?? new NullOutput(); $output = $output ?? new NullOutput();
$sourceUid = $sourceUser->getUID(); $sourceUid = $sourceUser->getUID();
$destinationUid = $destinationUser->getUID(); $destinationUid = $destinationUser->getUID();
$sourcePath = rtrim($sourceUid . '/files/' . $path, '/'); $sourcePath = rtrim($sourceUid . '/files/' . $path, '/');
// target user has to be ready // target user has to be ready
if (!$this->encryptionManager->isReadyForUser($destinationUid)) { if ($destinationUser->getLastLogin() === 0 || !$this->encryptionManager->isReadyForUser($destinationUid)) {
throw new TransferOwnershipException("The target user is not ready to accept files. The user has at least to have logged in once.", 2); throw new TransferOwnershipException("The target user is not ready to accept files. The user has at least to have logged in once.", 2);
} }
$date = date('Y-m-d H-i-s'); if ($move) {
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date"; $finalTarget = "$destinationUid/files/";
} else {
$date = date('Y-m-d H-i-s');
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
}
// setup filesystem // setup filesystem
Filesystem::initMountPoints($sourceUid); Filesystem::initMountPoints($sourceUid);
...@@ -99,6 +108,17 @@ class OwnershipTransferService { ...@@ -99,6 +108,17 @@ class OwnershipTransferService {
throw new TransferOwnershipException("Unknown path provided: $path", 1); throw new TransferOwnershipException("Unknown path provided: $path", 1);
} }
if ($move && (
!$view->is_dir($finalTarget) || (
!$firstLogin &&
count($view->getDirectoryContent($finalTarget)) > 0
)
)
) {
throw new TransferOwnershipException("Destination path does not exists or is not empty", 1);
}
// analyse source folder // analyse source folder
$this->analyse( $this->analyse(
$sourceUid, $sourceUid,
...@@ -273,7 +293,7 @@ class OwnershipTransferService { ...@@ -273,7 +293,7 @@ class OwnershipTransferService {
} }
} catch (\OCP\Files\NotFoundException $e) { } catch (\OCP\Files\NotFoundException $e) {
$output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>'); $output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>');
} catch (\Exception $e) { } catch (\Throwable $e) {
$output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getTraceAsString() . '</error>'); $output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getTraceAsString() . '</error>');
} }
$progress->advance(); $progress->advance();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment