Merge pull request #30055 from nextcloud/enh/note-share-api

pull/30108/head
Julius Härtl 2021-12-06 08:59:51 +07:00 committed by GitHub
commit 00549f7802
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 132 additions and 7 deletions

@ -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) {

@ -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));

@ -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'
]);
}

@ -202,6 +202,10 @@ class DefaultShareProvider implements IShareProvider {
// Set the file target
$qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
if ($share->getNote() !== '') {
$qb->setValue('note', $qb->createNamedParameter($share->getNote()));
}
// Set the time this share was created
$qb->setValue('stime', $qb->createNamedParameter(time()));

@ -852,7 +852,8 @@ class Manager implements IManager {
$this->urlGenerator->linkToRouteAbsolute('files_sharing.Accept.accept', ['shareId' => $share->getFullId()]),
$share->getSharedBy(),
$emailAddress,
$share->getExpirationDate()
$share->getExpirationDate(),
$share->getNote()
);
$this->logger->debug('Sent share notification to ' . $emailAddress . ' for share with ID ' . $share->getId(), ['app' => 'share']);
} else {
@ -886,7 +887,8 @@ class Manager implements IManager {
$link,
$initiator,
$shareWith,
\DateTime $expiration = null) {
\DateTime $expiration = null,
$note = '') {
$initiatorUser = $this->userManager->get($initiator);
$initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
@ -905,6 +907,10 @@ class Manager implements IManager {
$emailTemplate->addHeading($l->t('%1$s shared »%2$s« with you', [$initiatorDisplayName, $filename]), false);
$text = $l->t('%1$s shared »%2$s« with you.', [$initiatorDisplayName, $filename]);
if ($note !== '') {
$emailTemplate->addBodyText(htmlspecialchars($note), $note);
}
$emailTemplate->addBodyText(
htmlspecialchars($text . ' ' . $l->t('Click the button below to open it.')),
$text