Add option to transfer-ownership to move data

This will move the home folder of own user to another user. Only allowed
if that other user's home folder is empty.
Can be used as workaround to rename users.

Signed-off-by: Tobia De Koninck <LEDfan@users.noreply.github.com>
This commit is contained in:
Tobia De Koninck 2020-01-03 08:43:39 +01:00 committed by Roeland Jago Douma
parent 411058e47c
commit 7c56144f49
No known key found for this signature in database
GPG Key ID: F941078878347C0C
2 changed files with 24 additions and 5 deletions

View File

@ -77,6 +77,11 @@ 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'
); );
} }
@ -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>");

View File

@ -71,12 +71,16 @@ 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): void {
$output = $output ?? new NullOutput(); $output = $output ?? new NullOutput();
$sourceUid = $sourceUser->getUID(); $sourceUid = $sourceUser->getUID();
$destinationUid = $destinationUser->getUID(); $destinationUid = $destinationUser->getUID();
@ -87,8 +91,12 @@ class OwnershipTransferService {
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);
} }
if ($move) {
$finalTarget = "$destinationUid/files/";
} else {
$date = date('Y-m-d H-i-s'); $date = date('Y-m-d H-i-s');
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date"; $finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
}
// setup filesystem // setup filesystem
Filesystem::initMountPoints($sourceUid); Filesystem::initMountPoints($sourceUid);
@ -99,6 +107,11 @@ class OwnershipTransferService {
throw new TransferOwnershipException("Unknown path provided: $path", 1); throw new TransferOwnershipException("Unknown path provided: $path", 1);
} }
if ($move && (!$view->is_dir($finalTarget) || 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,