summaryrefslogtreecommitdiffstats
path: root/lib/private/Share20/DefaultShareProvider.php
diff options
context:
space:
mode:
authorBjoern Schiessle <bjoern@schiessle.org>2018-07-12 14:55:50 +0200
committerJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2018-07-21 15:02:18 +0200
commita93f2a648b2694dcebc3dffd9ca391c1303ce381 (patch)
tree17540bc009d2f4362bd17439e671b3174a20afa1 /lib/private/Share20/DefaultShareProvider.php
parentcce12f0ca3e2b2b158ffa43450b862053291b8d0 (diff)
downloadnextcloud-server-a93f2a648b2694dcebc3dffd9ca391c1303ce381.tar.gz
nextcloud-server-a93f2a648b2694dcebc3dffd9ca391c1303ce381.zip
allow to add a personal note to a share
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Diffstat (limited to 'lib/private/Share20/DefaultShareProvider.php')
-rw-r--r--lib/private/Share20/DefaultShareProvider.php131
1 files changed, 130 insertions, 1 deletions
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 5e52156d1d0..1d7dddcaf4a 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -30,8 +30,13 @@
namespace OC\Share20;
use OC\Files\Cache\Cache;
+use OCP\Defaults;
use OCP\Files\Folder;
+use OCP\IL10N;
+use OCP\IUser;
+use OCP\Mail\IMailer;
use OCP\Share\IShare;
+use OCP\Share\IShareHelper;
use OCP\Share\IShareProvider;
use OC\Share20\Exception\InvalidShare;
use OC\Share20\Exception\ProviderException;
@@ -67,6 +72,15 @@ class DefaultShareProvider implements IShareProvider {
/** @var IRootFolder */
private $rootFolder;
+ /** @var IMailer */
+ private $mailer;
+
+ /** @var Defaults */
+ private $defaults;
+
+ /** @var IL10N */
+ private $l;
+
/**
* DefaultShareProvider constructor.
*
@@ -74,16 +88,25 @@ class DefaultShareProvider implements IShareProvider {
* @param IUserManager $userManager
* @param IGroupManager $groupManager
* @param IRootFolder $rootFolder
+ * @param IMailer $mailer ;
+ * @param Defaults $defaults
+ * @param IL10N $l
*/
public function __construct(
IDBConnection $connection,
IUserManager $userManager,
IGroupManager $groupManager,
- IRootFolder $rootFolder) {
+ IRootFolder $rootFolder,
+ IMailer $mailer,
+ Defaults $defaults,
+ IL10N $l) {
$this->dbConn = $connection;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->rootFolder = $rootFolder;
+ $this->mailer = $mailer;
+ $this->defaults = $defaults;
+ $this->l = $l;
}
/**
@@ -197,6 +220,9 @@ class DefaultShareProvider implements IShareProvider {
* @return \OCP\Share\IShare The share object
*/
public function update(\OCP\Share\IShare $share) {
+
+ $originalShare = $this->getShareById($share->getId());
+
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
/*
* We allow updating the recipient on user shares.
@@ -211,6 +237,7 @@ class DefaultShareProvider implements IShareProvider {
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
$qb = $this->dbConn->getQueryBuilder();
@@ -222,6 +249,7 @@ class DefaultShareProvider implements IShareProvider {
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
/*
@@ -235,6 +263,7 @@ class DefaultShareProvider implements IShareProvider {
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
/*
@@ -259,9 +288,15 @@ class DefaultShareProvider implements IShareProvider {
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('token', $qb->createNamedParameter($share->getToken()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
+ ->set('note', $qb->createNamedParameter($share->getNote()))
->execute();
}
+ if ($originalShare->getNote() !== $share->getNote() && $share->getNote() !== '') {
+ $this->propagateNote($share);
+ }
+
+
return $share;
}
@@ -1227,4 +1262,98 @@ class DefaultShareProvider implements IShareProvider {
return $best;
}
+
+ /**
+ * propagate notes to the recipients
+ *
+ * @param IShare $share
+ * @throws \OCP\Files\NotFoundException
+ */
+ private function propagateNote(IShare $share) {
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
+ $user = $this->userManager->get($share->getSharedWith());
+ $this->sendNote([$user], $share);
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
+ $group = $this->groupManager->get($share->getSharedWith());
+ $groupMembers = $group->getUsers();
+ $this->sendNote($groupMembers, $share);
+ }
+ }
+
+ /**
+ * send note by mail
+ *
+ * @param array $recipients
+ * @param IShare $share
+ * @throws \OCP\Files\NotFoundException
+ */
+ private function sendNote(array $recipients, IShare $share) {
+
+ $toList = [];
+
+ foreach ($recipients as $recipient) {
+ /** @var IUser $recipient */
+ $email = $recipient->getEMailAddress();
+ if ($email) {
+ $toList[$email] = $recipient->getDisplayName();
+ }
+ }
+
+ if (!empty($toList)) {
+
+ $filename = $share->getNode()->getName();
+ $initiator = $share->getSharedBy();
+ $note = $share->getNote();
+
+ $initiatorUser = $this->userManager->get($initiator);
+ $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
+ $initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
+
+ $plainBodyPart = $this->l->t("%s shared »%s« with you and want to add:\n", [$initiatorDisplayName, $filename]);
+ $htmlBodyPart = $this->l->t('%s shared »%s« with you and want to add:', [$initiatorDisplayName, $filename]);
+
+ $message = $this->mailer->createMessage();
+
+ $emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote', [
+ 'filename' => $filename,
+ 'note' => $note,
+ 'initiator' => $initiatorDisplayName,
+ 'initiatorEmail' => $initiatorEmailAddress,
+ 'shareWith' => $recipient,
+ ]);
+
+ $emailTemplate->setSubject($this->l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
+ $emailTemplate->addHeader();
+ $emailTemplate->addHeading($this->l->t('Note regarding »%s«', [$filename]), false);
+ $emailTemplate->addBodyText(htmlspecialchars($htmlBodyPart), $plainBodyPart);
+ $emailTemplate->addBodyText($note);
+
+ // The "From" contains the sharers name
+ $instanceName = $this->defaults->getName();
+ $senderName = $this->l->t(
+ '%s via %s',
+ [
+ $initiatorDisplayName,
+ $instanceName
+ ]
+ );
+ $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]);
+ if ($initiatorEmailAddress !== null) {
+ $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]);
+ $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan());
+ } else {
+ $emailTemplate->addFooter();
+ }
+
+ if (count($toList) === 1) {
+ $message->setTo($toList);
+ } else {
+ $message->setTo([]);
+ $message->setBcc($toList);
+ }
+ $message->useTemplate($emailTemplate);
+ $this->mailer->send($message);
+ }
+
+ }
}