*/ class CreatingShareSendMail implements IEventListener { use TStringTools; use TNCLogger; /** @var ShareWrapperService */ private $shareWrapperService; /** @var ShareTokenService */ private $shareTokenService; /** @var ConfigService */ private $configService; /** @var ContactService */ private $contactService; public function __construct( ShareWrapperService $shareWrapperService, ShareTokenService $shareTokenService, ContactService $contactService, ConfigService $configService, ) { $this->shareWrapperService = $shareWrapperService; $this->shareTokenService = $shareTokenService; $this->contactService = $contactService; $this->configService = $configService; $this->setup('app', Application::APP_ID); } /** * @throws FederatedItemException * @throws RemoteInstanceException * @throws RemoteNotFoundException * @throws RemoteResourceNotFoundException * @throws RequestBuilderException * @throws UnknownRemoteException */ public function handle(Event $event): void { if (!$event instanceof CreatingFileShareEvent) { return; } $circle = $event->getCircle(); $federatedEvent = $event->getFederatedEvent(); $hashedPasswords = $federatedEvent->getParams()->gArray('hashedPasswords'); $result = []; foreach ($circle->getInheritedMembers(false, true) as $member) { if ($member->getUserType() !== Member::TYPE_MAIL && $member->getUserType() !== Member::TYPE_CONTACT) { continue; } $share = null; if ($this->configService->isLocalInstance($federatedEvent->getOrigin())) { try { /** @var ShareWrapper $share */ $share = $federatedEvent->getParams()->gObj('wrappedShare', ShareWrapper::class); $this->shareWrapperService->getShareById((int)$share->getId()); // we confirm share is not spoofed by the main instance of the Circle if ($share->getSharedWith() !== $circle->getSingleId()) { throw new ShareWrapperNotFoundException(); } $shareToken = $this->shareTokenService->generateShareToken( $share, $member, $this->get($member->getSingleId(), $hashedPasswords) ); $share->setShareToken($shareToken); } catch (Exception $e) { $share = null; } } $result[$member->getId()] = [ 'share' => $share, 'mails' => $this->contactService->getMailAddressesFromMember($member) ]; } $federatedEvent->setResultEntry('info', $result); } }