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