From 4ac636d252a3b652902a146ae611e31fb65f2a5f Mon Sep 17 00:00:00 2001 From: Nicolas SIMIDE <2083596+dems54@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:25:38 +0100 Subject: [PATCH] ReplyTo option for sharebymail Issue #24139 Signed-off-by: Nicolas SIMIDE <2083596+dems54@users.noreply.github.com> --- apps/sharebymail/js/settings-admin.js | 8 + apps/sharebymail/lib/Settings/Admin.php | 3 +- .../lib/Settings/SettingsManager.php | 12 ++ apps/sharebymail/lib/ShareByMailProvider.php | 57 +++--- apps/sharebymail/templates/settings-admin.php | 6 +- .../tests/ShareByMailProviderTest.php | 186 ++++++++++++++++++ 6 files changed, 246 insertions(+), 26 deletions(-) diff --git a/apps/sharebymail/js/settings-admin.js b/apps/sharebymail/js/settings-admin.js index 35a0e9855a..a26e687f13 100644 --- a/apps/sharebymail/js/settings-admin.js +++ b/apps/sharebymail/js/settings-admin.js @@ -35,4 +35,12 @@ $(function() { OCP.AppConfig.setValue('sharebymail', 'enforcePasswordProtection', status); }); + $('#replyToInitiator').on('change', function() { + var status = 'no'; + if ($(this).is(':checked')) { + status = 'yes'; + } + OCP.AppConfig.setValue('sharebymail', 'replyToInitiator', status); + }); + }); diff --git a/apps/sharebymail/lib/Settings/Admin.php b/apps/sharebymail/lib/Settings/Admin.php index 2388121269..bc766d59af 100644 --- a/apps/sharebymail/lib/Settings/Admin.php +++ b/apps/sharebymail/lib/Settings/Admin.php @@ -41,7 +41,8 @@ class Admin implements ISettings { public function getForm() { $parameters = [ 'sendPasswordMail' => $this->settingsManager->sendPasswordByMail(), - 'enforcePasswordProtection' => $this->settingsManager->enforcePasswordProtection() + 'enforcePasswordProtection' => $this->settingsManager->enforcePasswordProtection(), + 'replyToInitiator' => $this->settingsManager->replyToInitiator() ]; return new TemplateResponse('sharebymail', 'settings-admin', $parameters, ''); diff --git a/apps/sharebymail/lib/Settings/SettingsManager.php b/apps/sharebymail/lib/Settings/SettingsManager.php index e7937e4c60..fd351a2db7 100644 --- a/apps/sharebymail/lib/Settings/SettingsManager.php +++ b/apps/sharebymail/lib/Settings/SettingsManager.php @@ -38,6 +38,8 @@ class SettingsManager { private $enforcePasswordProtectionDefault = 'no'; + private $replyToInitiator = 'yes'; + public function __construct(IConfig $config) { $this->config = $config; } @@ -61,4 +63,14 @@ class SettingsManager { $enforcePassword = $this->config->getAppValue('sharebymail', 'enforcePasswordProtection', $this->enforcePasswordProtectionDefault); return $enforcePassword === 'yes'; } + + /** + * should add reply to with initiator mail + * + * @return bool + */ + public function replyToInitiator(): bool { + $replyToInitiator = $this->config->getAppValue('sharebymail', 'replyToInitiator', $this->replyToInitiator); + return $replyToInitiator === 'yes'; + } } diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php index 5977cbd18b..6f2b5de437 100644 --- a/apps/sharebymail/lib/ShareByMailProvider.php +++ b/apps/sharebymail/lib/ShareByMailProvider.php @@ -399,19 +399,22 @@ class ShareByMailProvider implements IShareProvider { // The "From" contains the sharers name $instanceName = $this->defaults->getName(); - $senderName = $this->l->t( - '%1$s via %2$s', - [ - $initiatorDisplayName, - $instanceName - ] - ); + $senderName = $instanceName; + if ($this->settingsManager->replyToInitiator()) { + $senderName = $this->l->t( + '%1$s via %2$s', + [ + $initiatorDisplayName, + $instanceName + ] + ); + } $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]); // The "Reply-To" is set to the sharer if an mail address is configured // also the default footer contains a "Do not reply" which needs to be adjusted. $initiatorEmail = $initiatorUser->getEMailAddress(); - if ($initiatorEmail !== null) { + if ($this->settingsManager->replyToInitiator() && $initiatorEmail !== null) { $message->setReplyTo([$initiatorEmail => $initiatorDisplayName]); $emailTemplate->addFooter($instanceName . ($this->defaults->getSlogan() !== '' ? ' - ' . $this->defaults->getSlogan() : '')); } else { @@ -464,15 +467,18 @@ class ShareByMailProvider implements IShareProvider { // The "From" contains the sharers name $instanceName = $this->defaults->getName(); - $senderName = $this->l->t( - '%1$s via %2$s', - [ - $initiatorDisplayName, - $instanceName - ] - ); + $senderName = $instanceName; + if ($this->settingsManager->replyToInitiator()) { + $senderName = $this->l->t( + '%1$s via %2$s', + [ + $initiatorDisplayName, + $instanceName + ] + ); + } $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]); - if ($initiatorEmailAddress !== null) { + if ($this->settingsManager->replyToInitiator() && $initiatorEmailAddress !== null) { $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]); $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan()); } else { @@ -521,15 +527,18 @@ class ShareByMailProvider implements IShareProvider { // The "From" contains the sharers name $instanceName = $this->defaults->getName(); - $senderName = $this->l->t( - '%1$s via %2$s', - [ - $initiatorDisplayName, - $instanceName - ] - ); + $senderName = $instanceName; + if ($this->settingsManager->replyToInitiator()) { + $senderName = $this->l->t( + '%1$s via %2$s', + [ + $initiatorDisplayName, + $instanceName + ] + ); + } $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]); - if ($initiatorEmailAddress !== null) { + if ($this->settingsManager->replyToInitiator() && $initiatorEmailAddress !== null) { $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]); $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan()); } else { diff --git a/apps/sharebymail/templates/settings-admin.php b/apps/sharebymail/templates/settings-admin.php index 52b9ea2959..8e3dff9076 100644 --- a/apps/sharebymail/templates/settings-admin.php +++ b/apps/sharebymail/templates/settings-admin.php @@ -17,7 +17,11 @@ style('sharebymail', 'settings-admin'); /> - +
+ /> +

diff --git a/apps/sharebymail/tests/ShareByMailProviderTest.php b/apps/sharebymail/tests/ShareByMailProviderTest.php index 6285de2188..61ad8ae3fd 100644 --- a/apps/sharebymail/tests/ShareByMailProviderTest.php +++ b/apps/sharebymail/tests/ShareByMailProviderTest.php @@ -1077,6 +1077,7 @@ class ShareByMailProviderTest extends TestCase { public function testSendMailNotificationWithSameUserAndUserEmail() { $provider = $this->getInstance(); $user = $this->createMock(IUser::class); + $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true); $this->userManager ->expects($this->once()) ->method('get') @@ -1175,6 +1176,7 @@ class ShareByMailProviderTest extends TestCase { public function testSendMailNotificationWithDifferentUserAndNoUserEmail() { $provider = $this->getInstance(); $initiatorUser = $this->createMock(IUser::class); + $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true); $this->userManager ->expects($this->once()) ->method('get') @@ -1260,4 +1262,188 @@ class ShareByMailProviderTest extends TestCase { null, ]); } + + public function testSendMailNotificationWithSameUserAndUserEmailAndReplyToDesactivate() { + $provider = $this->getInstance(); + $user = $this->createMock(IUser::class); + $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(false); + $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->once()) + ->method('addBodyText') + ->with( + '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') => 'UnitTestCloud' + ]); + $user + ->expects($this->once()) + ->method('getEMailAddress') + ->willReturn('owner@example.com'); + $message + ->expects($this->never()) + ->method('setReplyTo'); + $template + ->expects($this->once()) + ->method('addFooter') + ->with(''); + $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, + ]); + } + + public function testSendMailNotificationWithDifferentUserAndNoUserEmailAndReplyToDesactivate() { + $provider = $this->getInstance(); + $initiatorUser = $this->createMock(IUser::class); + $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(false); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('InitiatorUser') + ->willReturn($initiatorUser); + $initiatorUser + ->expects($this->once()) + ->method('getDisplayName') + ->willReturn('Mr. Initiator 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('Mr. Initiator User shared »file.txt« with you'); + $template + ->expects($this->once()) + ->method('addBodyText') + ->with( + 'Mr. Initiator User shared »file.txt« with you. Click the button below to open it.', + 'Mr. Initiator 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') => 'UnitTestCloud' + ]); + $message + ->expects($this->never()) + ->method('setReplyTo'); + $template + ->expects($this->once()) + ->method('addFooter') + ->with(''); + $template + ->expects($this->once()) + ->method('setSubject') + ->with('Mr. Initiator 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', + 'InitiatorUser', + 'john@doe.com', + null, + ]); + } }