Merge pull request #19233 from nextcloud/enh/transferownership_move
Add move (and firstlogin) option to transferownership service
This commit is contained in:
commit
906348ca14
|
@ -77,7 +77,12 @@ class TransferOwnership extends Command {
|
|||
InputOption::VALUE_REQUIRED,
|
||||
'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) {
|
||||
|
@ -99,7 +104,8 @@ class TransferOwnership extends Command {
|
|||
$sourceUserObject,
|
||||
$destinationUserObject,
|
||||
ltrim($input->getOption('path'), '/'),
|
||||
$output
|
||||
$output,
|
||||
$input->getOption('move') === true
|
||||
);
|
||||
} catch (TransferOwnershipException $e) {
|
||||
$output->writeln("<error>" . $e->getMessage() . "</error>");
|
||||
|
|
|
@ -71,24 +71,33 @@ class OwnershipTransferService {
|
|||
* @param IUser $destinationUser
|
||||
* @param string $path
|
||||
*
|
||||
* @param OutputInterface|null $output
|
||||
* @param bool $move
|
||||
* @throws TransferOwnershipException
|
||||
* @throws \OC\User\NoUserException
|
||||
*/
|
||||
public function transfer(IUser $sourceUser,
|
||||
IUser $destinationUser,
|
||||
string $path,
|
||||
?OutputInterface $output = null): void {
|
||||
?OutputInterface $output = null,
|
||||
bool $move = false,
|
||||
bool $firstLogin = false): void {
|
||||
$output = $output ?? new NullOutput();
|
||||
$sourceUid = $sourceUser->getUID();
|
||||
$destinationUid = $destinationUser->getUID();
|
||||
$sourcePath = rtrim($sourceUid . '/files/' . $path, '/');
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
$date = date('Y-m-d H-i-s');
|
||||
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
|
||||
if ($move) {
|
||||
$finalTarget = "$destinationUid/files/";
|
||||
} else {
|
||||
$date = date('Y-m-d H-i-s');
|
||||
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
|
||||
}
|
||||
|
||||
// setup filesystem
|
||||
Filesystem::initMountPoints($sourceUid);
|
||||
|
@ -99,6 +108,17 @@ class OwnershipTransferService {
|
|||
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
|
||||
$this->analyse(
|
||||
$sourceUid,
|
||||
|
@ -273,7 +293,7 @@ class OwnershipTransferService {
|
|||
}
|
||||
} catch (\OCP\Files\NotFoundException $e) {
|
||||
$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>');
|
||||
}
|
||||
$progress->advance();
|
||||
|
|
Loading…
Reference in New Issue