Skip to content

Commit 000d62a

Browse files
authored
Merge pull request #20366 from nextcloud/backport/20360/stable18
[stable18] Try to use the display name of file transfers
2 parents 8f90f4d + 69faf60 commit 000d62a

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

apps/files/lib/Notification/Notifier.php

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
use OCP\AppFramework\Http\DataResponse;
3535
use OCP\AppFramework\Utility\ITimeFactory;
3636
use OCP\IURLGenerator;
37+
use OCP\IUser;
38+
use OCP\IUserManager;
3739
use OCP\L10N\IFactory;
3840
use OCP\Notification\IAction;
3941
use OCP\Notification\IDismissableNotifier;
@@ -52,22 +54,22 @@ class Notifier implements INotifier, IDismissableNotifier {
5254
private $mapper;
5355
/** @var IManager */
5456
private $notificationManager;
57+
/** @var IUserManager */
58+
private $userManager;
5559
/** @var ITimeFactory */
5660
private $timeFactory;
5761

58-
/**
59-
* @param IFactory $l10nFactory
60-
* @param IURLGenerator $urlGenerator
61-
*/
6262
public function __construct(IFactory $l10nFactory,
6363
IURLGenerator $urlGenerator,
6464
TransferOwnershipMapper $mapper,
6565
IManager $notificationManager,
66+
IUserManager $userManager,
6667
ITimeFactory $timeFactory) {
6768
$this->l10nFactory = $l10nFactory;
6869
$this->urlGenerator = $urlGenerator;
6970
$this->mapper = $mapper;
7071
$this->notificationManager = $notificationManager;
72+
$this->userManager = $userManager;
7173
$this->timeFactory = $timeFactory;
7274
}
7375

@@ -140,18 +142,19 @@ public function handleTransferownershipRequest(INotification $notification, stri
140142
IAction::TYPE_DELETE
141143
);
142144

145+
$sourceUser = $this->getUser($param['sourceUser']);
143146
$notification->addParsedAction($approveAction)
144147
->addParsedAction($disapproveAction)
145148
->setRichSubject(
146149
$l->t('Incoming ownership transfer from {user}'),
147150
[
148151
'user' => [
149152
'type' => 'user',
150-
'id' => $param['sourceUser'],
151-
'name' => $param['sourceUser'],
153+
'id' => $sourceUser->getUID(),
154+
'name' => $sourceUser->getDisplayName(),
152155
],
153156
])
154-
->setParsedSubject(str_replace('{user}', $param['sourceUser'], $l->t('Incoming ownership transfer from {user}')))
157+
->setParsedSubject(str_replace('{user}', $sourceUser->getDisplayName(), $l->t('Incoming ownership transfer from {user}')))
155158
->setRichMessage(
156159
$l->t("Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour."),
157160
[
@@ -170,6 +173,7 @@ public function handleTransferOwnershipFailedSource(INotification $notification,
170173
$l = $this->l10nFactory->get('files', $languageCode);
171174
$param = $notification->getSubjectParameters();
172175

176+
$targetUser = $this->getUser($param['targetUser']);
173177
$notification->setRichSubject($l->t('Ownership transfer failed'))
174178
->setParsedSubject($l->t('Ownership transfer failed'))
175179

@@ -183,18 +187,19 @@ public function handleTransferOwnershipFailedSource(INotification $notification,
183187
],
184188
'user' => [
185189
'type' => 'user',
186-
'id' => $param['targetUser'],
187-
'name' => $param['targetUser'],
190+
'id' => $targetUser->getUID(),
191+
'name' => $targetUser->getDisplayName(),
188192
],
189193
])
190-
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $param['targetUser']], $l->t('Your ownership transfer of {path} to {user} failed.')));
194+
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $targetUser->getDisplayName()], $l->t('Your ownership transfer of {path} to {user} failed.')));
191195
return $notification;
192196
}
193197

194198
public function handleTransferOwnershipFailedTarget(INotification $notification, string $languageCode): INotification {
195199
$l = $this->l10nFactory->get('files', $languageCode);
196200
$param = $notification->getSubjectParameters();
197201

202+
$sourceUser = $this->getUser($param['sourceUser']);
198203
$notification->setRichSubject($l->t('Ownership transfer failed'))
199204
->setParsedSubject($l->t('Ownership transfer failed'))
200205

@@ -208,11 +213,11 @@ public function handleTransferOwnershipFailedTarget(INotification $notification,
208213
],
209214
'user' => [
210215
'type' => 'user',
211-
'id' => $param['sourceUser'],
212-
'name' => $param['sourceUser'],
216+
'id' => $sourceUser->getUID(),
217+
'name' => $sourceUser->getDisplayName(),
213218
],
214219
])
215-
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $param['sourceUser']], $l->t('The ownership transfer of {path} from {user} failed.')));
220+
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $sourceUser->getDisplayName()], $l->t('The ownership transfer of {path} from {user} failed.')));
216221

217222
return $notification;
218223
}
@@ -221,6 +226,7 @@ public function handleTransferOwnershipDoneSource(INotification $notification,
221226
$l = $this->l10nFactory->get('files', $languageCode);
222227
$param = $notification->getSubjectParameters();
223228

229+
$targetUser = $this->getUser($param['targetUser']);
224230
$notification->setRichSubject($l->t('Ownership transfer done'))
225231
->setParsedSubject($l->t('Ownership transfer done'))
226232

@@ -234,11 +240,11 @@ public function handleTransferOwnershipDoneSource(INotification $notification,
234240
],
235241
'user' => [
236242
'type' => 'user',
237-
'id' => $param['targetUser'],
238-
'name' => $param['targetUser'],
243+
'id' => $targetUser->getUID(),
244+
'name' => $targetUser->getDisplayName(),
239245
],
240246
])
241-
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $param['targetUser']], $l->t('Your ownership transfer of {path} to {user} has completed.')));
247+
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $targetUser->getDisplayName()], $l->t('Your ownership transfer of {path} to {user} has completed.')));
242248

243249
return $notification;
244250
}
@@ -247,6 +253,7 @@ public function handleTransferOwnershipDoneTarget(INotification $notification,
247253
$l = $this->l10nFactory->get('files', $languageCode);
248254
$param = $notification->getSubjectParameters();
249255

256+
$sourceUser = $this->getUser($param['sourceUser']);
250257
$notification->setRichSubject($l->t('Ownership transfer done'))
251258
->setParsedSubject($l->t('Ownership transfer done'))
252259

@@ -260,11 +267,11 @@ public function handleTransferOwnershipDoneTarget(INotification $notification,
260267
],
261268
'user' => [
262269
'type' => 'user',
263-
'id' => $param['sourceUser'],
264-
'name' => $param['sourceUser'],
270+
'id' => $sourceUser->getUID(),
271+
'name' => $sourceUser->getDisplayName(),
265272
],
266273
])
267-
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $param['sourceUser']], $l->t('The ownership transfer of {path} from {user} has completed.')));
274+
->setParsedMessage(str_replace(['{path}', '{user}'], [$param['nodeName'], $sourceUser->getDisplayName()], $l->t('The ownership transfer of {path} from {user} has completed.')));
268275

269276
return $notification;
270277
}
@@ -295,4 +302,12 @@ public function dismissNotification(INotification $notification): void {
295302

296303
$this->mapper->delete($transferOwnership);
297304
}
305+
306+
protected function getUser(string $userId): IUser {
307+
$user = $this->userManager->get($userId);
308+
if ($user instanceof IUser) {
309+
return $user;
310+
}
311+
throw new \InvalidArgumentException('User not found');
312+
}
298313
}

apps/files/lib/Service/OwnershipTransferService.php

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use OCP\Encryption\IManager as IEncryptionManager;
3535
use OCP\Files\FileInfo;
3636
use OCP\Files\IHomeStorage;
37+
use OCP\Files\InvalidPathException;
3738
use OCP\Files\Mount\IMountManager;
3839
use OCP\IUser;
3940
use OCP\Share\IManager as IShareManager;
@@ -92,18 +93,31 @@ public function transfer(IUser $sourceUser,
9293
throw new TransferOwnershipException("The target user is not ready to accept files. The user has at least to have logged in once.", 2);
9394
}
9495

96+
// setup filesystem
97+
Filesystem::initMountPoints($sourceUid);
98+
Filesystem::initMountPoints($destinationUid);
99+
100+
$view = new View();
101+
95102
if ($move) {
96103
$finalTarget = "$destinationUid/files/";
97104
} else {
98105
$date = date('Y-m-d H-i-s');
99-
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
100-
}
101106

102-
// setup filesystem
103-
Filesystem::initMountPoints($sourceUid);
104-
Filesystem::initMountPoints($destinationUid);
107+
// Remove some characters which are prone to cause errors
108+
$cleanUserName = str_replace(['\\', '/', ':', '.', '?', '#', '\'', '"'], '-', $sourceUser->getDisplayName());
109+
// Replace multiple dashes with one dash
110+
$cleanUserName = preg_replace('/-{2,}/s', '-', $cleanUserName);
111+
$cleanUserName = $cleanUserName ?: $sourceUid;
112+
113+
$finalTarget = "$destinationUid/files/transferred from $cleanUserName on $date";
114+
try {
115+
$view->verifyPath(dirname($finalTarget), basename($finalTarget));
116+
} catch (InvalidPathException $e) {
117+
$finalTarget = "$destinationUid/files/transferred from $sourceUid on $date";
118+
}
119+
}
105120

106-
$view = new View();
107121
if (!($view->is_dir($sourcePath) || $view->is_file($sourcePath))) {
108122
throw new TransferOwnershipException("Unknown path provided: $path", 1);
109123
}

lib/private/Files/Filesystem.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ public static function normalizePath($path, $stripTrailingSlash = true, $isAbsol
829829
$patterns = [
830830
'/\\\\/s', // no windows style slashes
831831
'/\/\.(\/\.)?\//s', // remove '/./'
832-
'/\/{2,}/s', // remove squence of slashes
832+
'/\/{2,}/s', // remove sequence of slashes
833833
'/\/\.$/s', // remove trailing /.
834834
];
835835

0 commit comments

Comments
 (0)