%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/SendMailService.php |
<?php declare(strict_types=1); /** * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Circles\Service; use Exception; use OCA\Circles\Model\Circle; use OCA\Circles\Model\Member; use OCA\Circles\Model\ShareWrapper; use OCA\Circles\Tools\Traits\TArrayTools; use OCA\Circles\Tools\Traits\TStringTools; use OCP\Defaults; use OCP\IL10N; use OCP\Mail\IEMailTemplate; use OCP\Mail\IMailer; use OCP\Security\IHasher; use OCP\Util; class SendMailService { use TArrayTools; use TStringTools; /** @var IL10N */ private $l10n; /** @var IHasher */ private $hasher; /** @var IMailer */ private $mailer; /** @var Defaults */ private $defaults; /** @var ConfigService */ private $configService; /** * SendMailService constructor. * * @param IL10N $l10n * @param IMailer $mailer * @param Defaults $defaults * @param ConfigService $configService */ public function __construct( IL10N $l10n, IHasher $hasher, IMailer $mailer, Defaults $defaults, ConfigService $configService ) { $this->l10n = $l10n; $this->hasher = $hasher; $this->mailer = $mailer; $this->defaults = $defaults; $this->configService = $configService; } /** * @param string $author * @param Circle $circle * @param Member $member * @param ShareWrapper[] $shares * @param array $mails * @param string $password */ public function generateMail( string $author, Circle $circle, Member $member, array $shares, array $mails, string $password = '' ): void { if (empty($shares)) { return; } if ($member->getUserType() === Member::TYPE_MAIL) { $mails = [$member->getUserId()]; } if (empty($mails)) { return; } $links = []; foreach ($shares as $share) { $links[] = [ 'filename' => $share->getFileTarget(), 'link' => $share->getShareToken()->getLink() ]; } $template = $this->generateMailExitingShares( $author, $circle->getDisplayName(), sizeof($links) > 1 ); $this->fillMailExistingShares($template, $links); foreach ($mails as $mail) { try { $this->sendMailExistingShares($template, $author, $mail, sizeof($links) > 1); } catch (Exception $e) { } $this->sendMailPassword($circle, $author, $mail, $password); } } /** * @param string $author * @param string $circleName * @param bool $multiple * * @return IEMailTemplate */ private function generateMailExitingShares( string $author, string $circleName, bool $multiple = false ): IEMailTemplate { $emailTemplate = $this->mailer->createEMailTemplate('circles.ExistingShareNotification', []); $emailTemplate->addHeader(); if ($multiple) { $text = $this->l10n->t('%s shared multiple files with "%s".', [$author, $circleName]); } else { $text = $this->l10n->t('%s shared a file with "%s".', [$author, $circleName]); } $text = $this->l10n->t('%s shared multiple files with "%s".', [$author, $circleName]); $emailTemplate->addBodyText(htmlspecialchars($text), $text); return $emailTemplate; } /** * @param IEMailTemplate $emailTemplate * @param array $links */ private function fillMailExistingShares(IEMailTemplate $emailTemplate, array $links) { foreach ($links as $item) { $emailTemplate->addBodyButton( $this->l10n->t('Open »%s«', [htmlspecialchars($item['filename'])]), $item['link'] ); } } /** * @param IEMailTemplate $emailTemplate * @param string $author * @param string $recipient * @param bool $multiple * * @throws Exception */ private function sendMailExistingShares( IEMailTemplate $emailTemplate, string $author, string $recipient, bool $multiple = false ) { if ($multiple) { $subject = $this->l10n->t('%s shared multiple files with you.', [$author]); } else { $subject = $this->l10n->t('%s shared a file with you.', [$author]); } $instanceName = $this->defaults->getName(); $senderName = $this->l10n->t('%s on %s', [$author, $instanceName]); $message = $this->mailer->createMessage(); $message->setFrom([Util::getDefaultEmailAddress($instanceName) => $senderName]); $message->setSubject($subject); $message->setPlainBody($emailTemplate->renderText()); $message->setHtmlBody($emailTemplate->renderHtml()); $message->setTo([$recipient]); $this->mailer->send($message); } /** * @param Circle $circle * @param string $author * @param string $email * @param string $password * * @throws Exception */ private function sendMailPassword( Circle $circle, string $author, string $email, string $password ): void { if (!$this->configService->sendPasswordByMail($circle) || $password === '') { return; } $message = $this->mailer->createMessage(); $plainBodyPart = $this->l10n->t( "%1\$s shared some content with you.\nYou should have already received a separate email with a link to access it.\n", [$author] ); $htmlBodyPart = $this->l10n->t( '%1$s shared some content with you. You should have already received a separate email with a link to access it.', [$author] ); $emailTemplate = $this->mailer->createEMailTemplate( 'sharebymail.RecipientPasswordNotification', [ 'filename' => '', 'password' => $password, 'initiator' => $author, // 'initiatorEmail' => Util::getDefaultEmailAddress(''), 'initiatorEmail' => '', 'shareWith' => $circle->getDisplayName() ] ); $emailTemplate->setSubject( $this->l10n->t('Password to access content shared with you by %1$s', [$author]) ); $emailTemplate->addHeader(); $emailTemplate->addHeading($this->l10n->t('Password to access content'), false); $emailTemplate->addBodyText(htmlspecialchars($htmlBodyPart), $plainBodyPart); $emailTemplate->addBodyText($this->l10n->t('It is protected with the following password:')); $emailTemplate->addBodyText($password); // The "From" contains the sharers name $instanceName = $this->defaults->getName(); $senderName = $this->l10n->t( '%1$s via %2$s', [ $author, $instanceName ] ); $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]); // if ($initiatorEmailAddress !== null) { // $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]); // $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan()); // } else { $emailTemplate->addFooter(); // } $message->setTo([$email]); $message->useTemplate($emailTemplate); $this->mailer->send($message); } /** * @param Circle $circle * * @return array */ public function getPassword(Circle $circle): array { $clearPassword = $hashedPassword = ''; if (!$this->configService->sendPasswordByMail($circle)) { $hashedPassword = $this->get('password_single', $circle->getSettings()); } if ($hashedPassword === '') { $clearPassword = $this->token(14); $hashedPassword = $this->hasher->hash($clearPassword); } return [$clearPassword, $hashedPassword]; } }