Skip to content

Commit 60f9cf0

Browse files
committed
displayname on federated shares
Signed-off-by: Maxence Lange <[email protected]>
1 parent 1b119e1 commit 60f9cf0

File tree

8 files changed

+230
-45
lines changed

8 files changed

+230
-45
lines changed

apps/dav/lib/Connector/Sabre/FilesPlugin.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node)
343343
if (!$owner) {
344344
return null;
345345
} else {
346-
return $owner->getDisplayName();
346+
return $this->getUserDisplayName($owner);
347347
}
348348
});
349349

@@ -598,4 +598,35 @@ public function sendFileIdHeader($filePath, \Sabre\DAV\INode $node = null) {
598598
}
599599
}
600600
}
601+
602+
/**
603+
* returns displayName based on IUser:
604+
* - if user exists locally, get user display name
605+
* - if federatedfilesharing is not available, returns set display name
606+
* - else get display name from LUS (globalscale)
607+
*
608+
* @param IUser $owner
609+
*
610+
* @return string
611+
*/
612+
private function getUserDisplayName(IUser $owner): string {
613+
try {
614+
$userManager = \OCP\Server::get(IUserManager::class);
615+
$user = $userManager->get($owner->getUID());
616+
if ($user !== null) {
617+
return $user->getDisplayName();
618+
}
619+
620+
$appManager = \OCP\Server::get(IAppManager::class);
621+
if (!$appManager->isInstalled('federatedfilesharing')) {
622+
return $owner->getDisplayName();
623+
}
624+
625+
$cloudFederatedProviderFiles = \OCP\Server::get(CloudFederationProviderFiles::class);
626+
} catch (ContainerExceptionInterface $e) {
627+
return $owner->getDisplayName();
628+
}
629+
630+
return $cloudFederatedProviderFiles->getUserDisplayName($owner->getDisplayName());
631+
}
601632
}

apps/federatedfilesharing/lib/Notifier.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,9 @@ public function prepare(INotification $notification, string $languageCode): INot
102102
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/share.svg')));
103103

104104
$params = $notification->getSubjectParameters();
105+
$displayName = (count($params) > 3) ? $params[3] : '';
105106
if ($params[0] !== $params[1] && $params[1] !== null) {
106-
$remoteInitiator = $this->createRemoteUser($params[0]);
107+
$remoteInitiator = $this->createRemoteUser($params[0], $displayName);
107108
$remoteOwner = $this->createRemoteUser($params[1]);
108109
$params[3] = $remoteInitiator['name'] . '@' . $remoteInitiator['server'];
109110
$params[4] = $remoteOwner['name'] . '@' . $remoteOwner['server'];
@@ -121,7 +122,7 @@ public function prepare(INotification $notification, string $languageCode): INot
121122
]
122123
);
123124
} else {
124-
$remoteOwner = $this->createRemoteUser($params[0]);
125+
$remoteOwner = $this->createRemoteUser($params[0], $displayName);
125126
$params[3] = $remoteOwner['name'] . '@' . $remoteOwner['server'];
126127

127128
$notification->setRichSubject(
@@ -166,19 +167,21 @@ public function prepare(INotification $notification, string $languageCode): INot
166167

167168
/**
168169
* @param string $cloudId
170+
* @param string $displayName - overwrite display name
171+
*
169172
* @return array
170173
*/
171-
protected function createRemoteUser($cloudId, $displayName = null) {
174+
protected function createRemoteUser(string $cloudId, string $displayName = '') {
172175
try {
173176
$resolvedId = $this->cloudIdManager->resolveCloudId($cloudId);
174-
if ($displayName === null) {
177+
if ($displayName === '') {
175178
$displayName = $this->getDisplayName($resolvedId);
176179
}
177180
$user = $resolvedId->getUser();
178181
$server = $resolvedId->getRemote();
179182
} catch (HintException $e) {
180183
$user = $cloudId;
181-
$displayName = $cloudId;
184+
$displayName = ($displayName !== '') ? $displayName : $cloudId;
182185
$server = '';
183186
}
184187

apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@
5555
use OCP\IURLGenerator;
5656
use OCP\IUserManager;
5757
use OCP\Notification\IManager as INotificationManager;
58+
use OCP\Server;
5859
use OCP\Share\Exceptions\ShareNotFound;
5960
use OCP\Share\IManager;
6061
use OCP\Share\IShare;
6162
use OCP\Util;
63+
use Psr\Container\ContainerExceptionInterface;
64+
use Psr\Log\LoggerInterface;
6265

6366
class CloudFederationProviderFiles implements ICloudFederationProvider {
6467

@@ -250,26 +253,29 @@ public function shareReceived(ICloudFederationShare $share) {
250253
$this->externalShareManager->addShare($remote, $token, '', $name, $owner, $shareType,false, $shareWith, $remoteId);
251254
$shareId = \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*share_external');
252255

256+
// get DisplayName about the owner of the share
257+
$ownerDisplayName = $this->getUserDisplayName($ownerFederatedId);
258+
253259
if ($shareType === IShare::TYPE_USER) {
254260
$event = $this->activityManager->generateEvent();
255261
$event->setApp('files_sharing')
256262
->setType('remote_share')
257-
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/')])
263+
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/'), $ownerDisplayName])
258264
->setAffectedUser($shareWith)
259265
->setObject('remote_share', $shareId, $name);
260266
\OC::$server->getActivityManager()->publish($event);
261-
$this->notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name);
267+
$this->notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName);
262268
} else {
263269
$groupMembers = $this->groupManager->get($shareWith)->getUsers();
264270
foreach ($groupMembers as $user) {
265271
$event = $this->activityManager->generateEvent();
266272
$event->setApp('files_sharing')
267273
->setType('remote_share')
268-
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/')])
274+
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_RECEIVED, [$ownerFederatedId, trim($name, '/'), $ownerDisplayName])
269275
->setAffectedUser($user->getUID())
270276
->setObject('remote_share', $shareId, $name);
271277
\OC::$server->getActivityManager()->publish($event);
272-
$this->notifyAboutNewShare($user->getUID(), $shareId, $ownerFederatedId, $sharedByFederatedId, $name);
278+
$this->notifyAboutNewShare($user->getUID(), $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName);
273279
}
274280
}
275281
return $shareId;
@@ -335,13 +341,13 @@ private function mapShareTypeToNextcloud($shareType) {
335341
return $result;
336342
}
337343

338-
private function notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name): void {
344+
private function notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $displayName): void {
339345
$notification = $this->notificationManager->createNotification();
340346
$notification->setApp('files_sharing')
341347
->setUser($shareWith)
342348
->setDateTime(new \DateTime())
343349
->setObject('remote_share', $shareId)
344-
->setSubject('remote_share', [$ownerFederatedId, $sharedByFederatedId, trim($name, '/')]);
350+
->setSubject('remote_share', [$ownerFederatedId, $sharedByFederatedId, trim($name, '/'), $displayName]);
345351

346352
$declineAction = $notification->createAction();
347353
$declineAction->setLabel('decline')
@@ -579,6 +585,8 @@ private function unshare($id, array $notification) {
579585
->where($qb->expr()->eq('parent', $qb->createNamedParameter((int)$share['id'])));
580586
$qb->execute();
581587

588+
$ownerDisplayName = $this->getUserDisplayName($owner->getId());
589+
582590
if ((int)$share['share_type'] === IShare::TYPE_USER) {
583591
if ($share['accepted']) {
584592
$path = trim($mountpoint, '/');
@@ -594,7 +602,7 @@ private function unshare($id, array $notification) {
594602
$event = $this->activityManager->generateEvent();
595603
$event->setApp('files_sharing')
596604
->setType('remote_share')
597-
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_UNSHARED, [$owner->getId(), $path])
605+
->setSubject(RemoteShares::SUBJECT_REMOTE_SHARE_UNSHARED, [$owner->getId(), $path, $ownerDisplayName])
598606
->setAffectedUser($user)
599607
->setObject('remote_share', (int)$share['id'], $path);
600608
\OC::$server->getActivityManager()->publish($event);
@@ -824,4 +832,25 @@ private function isS2SEnabled($incoming = false) {
824832
public function getSupportedShareTypes() {
825833
return ['user', 'group'];
826834
}
835+
836+
837+
public function getUserDisplayName(string $userId): string {
838+
// check if gss is enabled and available
839+
if (!$this->appManager->isInstalled('globalsiteselector')
840+
|| !class_exists('\OCA\GlobalSiteSelector\Service\SlaveService')) {
841+
return '';
842+
}
843+
844+
try {
845+
$slaveService = Server::get(\OCA\GlobalSiteSelector\Service\SlaveService::class);
846+
} catch (\Throwable $e) {
847+
Server::get(LoggerInterface::class)->error(
848+
$e->getMessage(),
849+
['exception' => $e]
850+
);
851+
return '';
852+
}
853+
854+
return $slaveService->getUserDisplayName($this->cloudIdManager->removeProtocolFromUrl($userId), false);
855+
}
827856
}

apps/files_sharing/lib/Activity/Providers/Base.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,11 @@ protected function getFile($parameter, IEvent $event = null) {
157157

158158
/**
159159
* @param string $uid
160+
* @param string $overwriteDisplayName - overwrite display name, only if user is not local
161+
*
160162
* @return array
161163
*/
162-
protected function getUser($uid) {
164+
protected function getUser(string $uid, string $overwriteDisplayName = '') {
163165
// First try local user
164166
$displayName = $this->userManager->getDisplayName($uid);
165167
if ($displayName !== null) {
@@ -176,7 +178,7 @@ protected function getUser($uid) {
176178
return [
177179
'type' => 'user',
178180
'id' => $cloudId->getUser(),
179-
'name' => $this->getDisplayNameFromAddressBook($cloudId->getDisplayId()),
181+
'name' => (($overwriteDisplayName !== '') ? $overwriteDisplayName : $this->getDisplayNameFromAddressBook($cloudId->getDisplayId())),
180182
'server' => $cloudId->getRemote(),
181183
];
182184
}
@@ -185,7 +187,7 @@ protected function getUser($uid) {
185187
return [
186188
'type' => 'user',
187189
'id' => $uid,
188-
'name' => $uid,
190+
'name' => (($overwriteDisplayName !== '') ? $overwriteDisplayName : $uid),
189191
];
190192
}
191193

apps/files_sharing/lib/Activity/Providers/RemoteShares.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,14 @@ protected function getParsedParameters(IEvent $event) {
115115
switch ($subject) {
116116
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
117117
case self::SUBJECT_REMOTE_SHARE_UNSHARED:
118+
$displayName = (count($parameters) > 2) ? $parameters[2] : '';
118119
return [
119120
'file' => [
120121
'type' => 'pending-federated-share',
121122
'id' => $parameters[1],
122123
'name' => $parameters[1],
123124
],
124-
'user' => $this->getUser($parameters[0]),
125+
'user' => $this->getUser($parameters[0], $displayName)
125126
];
126127
case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
127128
case self::SUBJECT_REMOTE_SHARE_DECLINED:

0 commit comments

Comments
 (0)