Skip to content

Commit

Permalink
Merge pull request #45884 from nextcloud/fix/files-ownership-deny
Browse files Browse the repository at this point in the history
fix(files): Properly handle denied ownership transfers
  • Loading branch information
come-nc authored Jun 17, 2024
2 parents 5baaea7 + 1550af8 commit e01fbff
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 29 deletions.
14 changes: 2 additions & 12 deletions apps/files/lib/Controller/TransferOwnershipController.php
Original file line number Diff line number Diff line change
Expand Up @@ -189,20 +189,10 @@ public function reject(int $id): DataResponse {
->setObject('transfer', (string)$id);
$this->notificationManager->markProcessed($notification);

$notification = $this->notificationManager->createNotification();
$notification->setUser($transferOwnership->getSourceUser())
->setApp($this->appName)
->setDateTime($this->timeFactory->getDateTime())
->setSubject('transferownershipRequestDenied', [
'sourceUser' => $transferOwnership->getSourceUser(),
'targetUser' => $transferOwnership->getTargetUser(),
'nodeName' => $transferOwnership->getNodeName()
])
->setObject('transfer', (string)$transferOwnership->getId());
$this->notificationManager->notify($notification);

$this->mapper->delete($transferOwnership);

// A "request denied" notification will be created by Notifier::dismissNotification

return new DataResponse([], Http::STATUS_OK);
}
}
49 changes: 32 additions & 17 deletions apps/files/lib/Notification/Notifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,23 +69,15 @@ public function prepare(INotification $notification, string $languageCode): INot
throw new \InvalidArgumentException('Unhandled app');
}

if ($notification->getSubject() === 'transferownershipRequest') {
return $this->handleTransferownershipRequest($notification, $languageCode);
}
if ($notification->getSubject() === 'transferOwnershipFailedSource') {
return $this->handleTransferOwnershipFailedSource($notification, $languageCode);
}
if ($notification->getSubject() === 'transferOwnershipFailedTarget') {
return $this->handleTransferOwnershipFailedTarget($notification, $languageCode);
}
if ($notification->getSubject() === 'transferOwnershipDoneSource') {
return $this->handleTransferOwnershipDoneSource($notification, $languageCode);
}
if ($notification->getSubject() === 'transferOwnershipDoneTarget') {
return $this->handleTransferOwnershipDoneTarget($notification, $languageCode);
}

throw new \InvalidArgumentException('Unhandled subject');
return match($notification->getSubject()) {
'transferownershipRequest' => $this->handleTransferownershipRequest($notification, $languageCode),
'transferownershipRequestDenied' => $this->handleTransferOwnershipRequestDenied($notification, $languageCode),
'transferOwnershipFailedSource' => $this->handleTransferOwnershipFailedSource($notification, $languageCode),
'transferOwnershipFailedTarget' => $this->handleTransferOwnershipFailedTarget($notification, $languageCode),
'transferOwnershipDoneSource' => $this->handleTransferOwnershipDoneSource($notification, $languageCode),
'transferOwnershipDoneTarget' => $this->handleTransferOwnershipDoneTarget($notification, $languageCode),
default => throw new \InvalidArgumentException('Unhandled subject')
};
}

public function handleTransferownershipRequest(INotification $notification, string $languageCode): INotification {
Expand Down Expand Up @@ -144,6 +136,29 @@ public function handleTransferownershipRequest(INotification $notification, stri
return $notification;
}

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

$targetUser = $this->getUser($param['targetUser']);
$notification->setRichSubject($l->t('Ownership transfer denied'))
->setRichMessage(
$l->t('Your ownership transfer of {path} was denied by {user}.'),
[
'path' => [
'type' => 'highlight',
'id' => $param['targetUser'] . '::' . $param['nodeName'],
'name' => $param['nodeName'],
],
'user' => [
'type' => 'user',
'id' => $targetUser->getUID(),
'name' => $targetUser->getDisplayName(),
],
]);
return $notification;
}

public function handleTransferOwnershipFailedSource(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('files', $languageCode);
$param = $notification->getSubjectParameters();
Expand Down

0 comments on commit e01fbff

Please sign in to comment.