From 5116bf146f3e21805d42997ca9b1f713474bfb6d Mon Sep 17 00:00:00 2001 From: Julius Härtl Date: Fri, 26 Nov 2021 14:42:31 +0100 Subject: Allow to pass note when creating a share and send it with directly in the share mail when set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- .../lib/Controller/ShareAPIController.php | 5 + apps/sharebymail/lib/ShareByMailProvider.php | 19 +++- apps/sharebymail/tests/ShareByMailProviderTest.php | 101 +++++++++++++++++++++ 3 files changed, 120 insertions(+), 5 deletions(-) (limited to 'apps') diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index c9853f1e12c..96b105aae49 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -449,6 +449,7 @@ class ShareAPIController extends OCSController { string $password = '', string $sendPasswordByTalk = null, string $expireDate = '', + string $note = '', string $label = '' ): DataResponse { $share = $this->shareManager->newShare(); @@ -653,6 +654,10 @@ class ShareAPIController extends OCSController { $share->setShareType($shareType); $share->setSharedBy($this->currentUser); + if ($note !== '') { + $share->setNote($note); + } + try { $share = $this->shareManager->createShare($share); } catch (GenericShareException $e) { diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php index 6fb60216031..62ba9d35f3f 100644 --- a/apps/sharebymail/lib/ShareByMailProvider.php +++ b/apps/sharebymail/lib/ShareByMailProvider.php @@ -330,7 +330,8 @@ class ShareByMailProvider implements IShareProvider { $share->getSendPasswordByTalk(), $share->getHideDownload(), $share->getLabel(), - $share->getExpirationDate() + $share->getExpirationDate(), + $share->getNote() ); try { @@ -341,7 +342,8 @@ class ShareByMailProvider implements IShareProvider { $link, $share->getSharedBy(), $share->getSharedWith(), - $share->getExpirationDate() + $share->getExpirationDate(), + $share->getNote() ); } catch (HintException $hintException) { $this->logger->logException($hintException, [ @@ -377,7 +379,9 @@ class ShareByMailProvider implements IShareProvider { $link, $initiator, $shareWith, - \DateTime $expiration = null) { + \DateTime $expiration = null, + $note = '' + ) { $initiatorUser = $this->userManager->get($initiator); $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator; $message = $this->mailer->createMessage(); @@ -388,6 +392,7 @@ class ShareByMailProvider implements IShareProvider { 'initiator' => $initiatorDisplayName, 'expiration' => $expiration, 'shareWith' => $shareWith, + 'note' => $note ]); $emailTemplate->setSubject($this->l->t('%1$s shared »%2$s« with you', [$initiatorDisplayName, $filename])); @@ -395,6 +400,9 @@ class ShareByMailProvider implements IShareProvider { $emailTemplate->addHeading($this->l->t('%1$s shared »%2$s« with you', [$initiatorDisplayName, $filename]), false); $text = $this->l->t('%1$s shared »%2$s« with you.', [$initiatorDisplayName, $filename]); + if ($note !== '') { + $emailTemplate->addBodyText(htmlspecialchars($note), $note); + } $emailTemplate->addBodyText( htmlspecialchars($text . ' ' . $this->l->t('Click the button below to open it.')), $text @@ -671,7 +679,7 @@ class ShareByMailProvider implements IShareProvider { * @param \DateTime|null $expirationTime * @return int */ - protected function addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $uidOwner, $permissions, $token, $password, $sendPasswordByTalk, $hideDownload, $label, $expirationTime) { + protected function addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $uidOwner, $permissions, $token, $password, $sendPasswordByTalk, $hideDownload, $label, $expirationTime, $note = '') { $qb = $this->dbConnection->getQueryBuilder(); $qb->insert('share') ->setValue('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL)) @@ -687,7 +695,8 @@ class ShareByMailProvider implements IShareProvider { ->setValue('password_by_talk', $qb->createNamedParameter($sendPasswordByTalk, IQueryBuilder::PARAM_BOOL)) ->setValue('stime', $qb->createNamedParameter(time())) ->setValue('hide_download', $qb->createNamedParameter((int)$hideDownload, IQueryBuilder::PARAM_INT)) - ->setValue('label', $qb->createNamedParameter($label)); + ->setValue('label', $qb->createNamedParameter($label)) + ->setValue('note', $qb->createNamedParameter($note)); if ($expirationTime !== null) { $qb->setValue('expiration', $qb->createNamedParameter($expirationTime, IQueryBuilder::PARAM_DATE)); diff --git a/apps/sharebymail/tests/ShareByMailProviderTest.php b/apps/sharebymail/tests/ShareByMailProviderTest.php index a82da164b78..bbe5516408d 100644 --- a/apps/sharebymail/tests/ShareByMailProviderTest.php +++ b/apps/sharebymail/tests/ShareByMailProviderTest.php @@ -1187,6 +1187,107 @@ class ShareByMailProviderTest extends TestCase { 'OwnerUser', 'john@doe.com', null, + '' + ]); + } + + public function testSendMailNotificationWithSameUserAndUserEmailAndNote() { + $provider = $this->getInstance(); + $user = $this->createMock(IUser::class); + $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('OwnerUser') + ->willReturn($user); + $user + ->expects($this->once()) + ->method('getDisplayName') + ->willReturn('Mrs. Owner User'); + $message = $this->createMock(Message::class); + $this->mailer + ->expects($this->once()) + ->method('createMessage') + ->willReturn($message); + $template = $this->createMock(IEMailTemplate::class); + $this->mailer + ->expects($this->once()) + ->method('createEMailTemplate') + ->willReturn($template); + $template + ->expects($this->once()) + ->method('addHeader'); + $template + ->expects($this->once()) + ->method('addHeading') + ->with('Mrs. Owner User shared »file.txt« with you'); + $template + ->expects($this->exactly(2)) + ->method('addBodyText') + ->withConsecutive( + ['This is a note to the recipient', 'This is a note to the recipient'], + ['Mrs. Owner User shared »file.txt« with you. Click the button below to open it.', 'Mrs. Owner User shared »file.txt« with you.'], + ); + $template + ->expects($this->once()) + ->method('addBodyButton') + ->with( + 'Open »file.txt«', + 'https://example.com/file.txt' + ); + $message + ->expects($this->once()) + ->method('setTo') + ->with(['john@doe.com']); + $this->defaults + ->expects($this->once()) + ->method('getName') + ->willReturn('UnitTestCloud'); + $message + ->expects($this->once()) + ->method('setFrom') + ->with([ + \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'Mrs. Owner User via UnitTestCloud' + ]); + $user + ->expects($this->once()) + ->method('getEMailAddress') + ->willReturn('owner@example.com'); + $message + ->expects($this->once()) + ->method('setReplyTo') + ->with(['owner@example.com' => 'Mrs. Owner User']); + $this->defaults + ->expects($this->exactly(2)) + ->method('getSlogan') + ->willReturn('Testing like 1990'); + $template + ->expects($this->once()) + ->method('addFooter') + ->with('UnitTestCloud - Testing like 1990'); + $template + ->expects($this->once()) + ->method('setSubject') + ->with('Mrs. Owner User shared »file.txt« with you'); + $message + ->expects($this->once()) + ->method('useTemplate') + ->with($template); + $this->mailer + ->expects($this->once()) + ->method('send') + ->with($message); + + self::invokePrivate( + $provider, + 'sendMailNotification', + [ + 'file.txt', + 'https://example.com/file.txt', + 'OwnerUser', + 'john@doe.com', + null, + 'This is a note to the recipient' ]); } -- cgit v1.2.3