Skip to content

Commit

Permalink
Merge pull request #44906 from nextcloud/feat/localized-ownership-tra…
Browse files Browse the repository at this point in the history
…nsfer-target

feat(files): Use receiving users language for the ownership transfer target folder
  • Loading branch information
susnux authored May 30, 2024
2 parents b8856e2 + 4bd9bc7 commit 57a7f09
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 11 deletions.
21 changes: 13 additions & 8 deletions apps/files/lib/Service/OwnershipTransferService.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use OCP\Files\Mount\IMountManager;
use OCP\IUser;
use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Share\IManager as IShareManager;
use OCP\Share\IShare;
use Symfony\Component\Console\Helper\ProgressBar;
Expand All @@ -45,6 +46,7 @@ public function __construct(
private IMountManager $mountManager,
private IUserMountCache $userMountCache,
private IUserManager $userManager,
private IFactory $l10nFactory,
) {
$this->encryptionManager = $encryptionManager;
}
Expand Down Expand Up @@ -93,19 +95,15 @@ public function transfer(
if ($move) {
$finalTarget = "$destinationUid/files/";
} else {
$l = $this->l10nFactory->get('files', $this->l10nFactory->getUserLanguage($destinationUser));
$date = date('Y-m-d H-i-s');

// Remove some characters which are prone to cause errors
$cleanUserName = str_replace(['\\', '/', ':', '.', '?', '#', '\'', '"'], '-', $sourceUser->getDisplayName());
// Replace multiple dashes with one dash
$cleanUserName = preg_replace('/-{2,}/s', '-', $cleanUserName);
$cleanUserName = $cleanUserName ?: $sourceUid;

$finalTarget = "$destinationUid/files/transferred from $cleanUserName on $date";
$cleanUserName = $this->sanitizeFolderName($sourceUser->getDisplayName()) ?: $sourceUid;
$finalTarget = "$destinationUid/files/" . $this->sanitizeFolderName($l->t('Transferred from %1$s on %2$s', [$cleanUserName, $date]));
try {
$view->verifyPath(dirname($finalTarget), basename($finalTarget));
} catch (InvalidPathException $e) {
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
$finalTarget = "$destinationUid/files/" . $this->sanitizeFolderName($l->t('Transferred from %1$s on %2$s', [$sourceUid, $date]));
}
}

Expand Down Expand Up @@ -185,6 +183,13 @@ public function transfer(
}
}

private function sanitizeFolderName(string $name): string {
// Remove some characters which are prone to cause errors
$name = str_replace(['\\', '/', ':', '.', '?', '#', '\'', '"'], '-', $name);
// Replace multiple dashes with one dash
return preg_replace('/-{2,}/s', '-', $name);
}

private function walkFiles(View $view, $path, Closure $callBack) {
foreach ($view->getDirectoryContent($path) as $fileInfo) {
if (!$callBack($fileInfo)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ private function findLastTransferFolderForUser($sourceUser, $targetUser) {
foreach ($results as $path => $data) {
$path = rawurldecode($path);
$parts = explode(' ', $path);
if (basename($parts[0]) !== 'transferred') {
if (basename($parts[0]) !== 'Transferred') {
continue;
}
if (isset($parts[2]) && $parts[2] === $sourceUser) {
Expand Down
4 changes: 2 additions & 2 deletions build/integration/files_features/transfer-ownership.feature
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Feature: transfer-ownership
And As an "user1"
And using received transfer folder of "user1" as dav path
Then Downloaded content when downloading file "/test/somefile.txt" with range "bytes=0-6" should be "This is"
And transfer folder name contains "transferred from user0 -risky- ヂspḷay -na|-|e- on"
And transfer folder name contains "Transferred from user0 -risky- ヂspḷay -na|-|e- on"
And using old dav path
And as "user0" the folder "/test" does not exist
And using received transfer folder of "user1" as dav path
Expand Down Expand Up @@ -345,7 +345,7 @@ Feature: transfer-ownership
And As an "user1"
And using received transfer folder of "user1" as dav path
Then Downloaded content when downloading file "/test/somefile.txt" with range "bytes=0-6" should be "This is"
And transfer folder name contains "transferred from user0 -risky- ヂspḷay -na|-|e- on"
And transfer folder name contains "Transferred from user0 -risky- ヂspḷay -na|-|e- on"
And using old dav path
And as "user0" the folder "/test" does not exist
And using received transfer folder of "user1" as dav path
Expand Down

0 comments on commit 57a7f09

Please sign in to comment.