%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/ContactService.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 OC; use OCA\Circles\Exceptions\ContactAddressBookNotFoundException; use OCA\Circles\Exceptions\ContactFormatException; use OCA\Circles\Exceptions\ContactNotFoundException; use OCA\Circles\Model\Member; use OCA\Circles\Tools\Traits\TArrayTools; use OCA\Circles\Tools\Traits\TNCLogger; use OCA\Circles\Tools\Traits\TStringTools; use OCA\DAV\CardDAV\ContactsManager; use OCP\Contacts\IManager; use OCP\IAddressBook; use OCP\IURLGenerator; /** * Class ContactService * * @package OCA\Circles\Service */ class ContactService { use TArrayTools; use TStringTools; use TNCLogger; /** @var IURLGenerator */ private $urlGenerator; /** @var ConfigService */ private $configService; /** * ContactService constructor. * * @param IURLGenerator $urlGenerator * @param ConfigService $configService */ public function __construct(IURLGenerator $urlGenerator, ConfigService $configService) { $this->urlGenerator = $urlGenerator; $this->configService = $configService; } /** * @param string $contactPath * * @return string * @throws ContactAddressBookNotFoundException * @throws ContactFormatException * @throws ContactNotFoundException */ public function getDisplayName(string $contactPath): string { $contact = $this->getContact($contactPath); if ($this->get('FN', $contact) !== '') { return $this->get('FN', $contact); } if ($this->get('EMAIL', $contact) !== '') { return $this->get('EMAIL', $contact); } if (!empty($this->getArray('EMAIL', $contact))) { return $this->getArray('EMAIL', $contact)[0]; } // TODO: no idea if this situation might exists or if displaying the full contactPath is safe, so md5() return md5($contactPath); } /** * @param string $contactPath * * @return array * @throws ContactAddressBookNotFoundException * @throws ContactFormatException * @throws ContactNotFoundException */ public function getMailAddresses(string $contactPath): array { $c = $this->getContact($contactPath); return ($this->get('EMAIL', $c) === '') ? [$this->get('EMAIL', $c)] : $this->getArray('EMAIL', $c); } /** * @throws ContactFormatException * @throws ContactNotFoundException * @throws ContactAddressBookNotFoundException */ private function getContact(string $contactPath): array { [$userId, $addressBookUri, $contactId] = explode('/', $contactPath, 3); if ($userId === '' || $contactId === '' || $addressBookUri === '' || is_null($contactId) ) { throw new ContactFormatException('issue with contact format USERID/ADDRESSBOOK/CONTACTID'); } $contactsManager = OC::$server->get(ContactsManager::class); $cm = OC::$server->get(IManager::class); $contactsManager->setupContactsProvider($cm, $userId, $this->urlGenerator); $addressBook = $this->getAddressBook($cm, $addressBookUri); $contacts = $addressBook->search( $contactId, ['UID'], [ 'types' => false, 'escape_like_param' => false ] ); if (sizeof($contacts) !== 1) { throw new ContactNotFoundException(); } return $contacts[0]; } /** * @param IManager $cm * @param string $addressBookUri * * @return IAddressBook * @throws ContactAddressBookNotFoundException */ private function getAddressBook(IManager $cm, string $addressBookUri): IAddressBook { foreach ($cm->getUserAddressBooks() as $addressBook) { if ($addressBook->getUri() === $addressBookUri) { return $addressBook; } } throw new ContactAddressBookNotFoundException(); } /** * @param IManager $cm * @param string $addressBookKey * * @return IAddressBook * @throws ContactAddressBookNotFoundException */ public function getAddressBoxById(IManager $cm, string $addressBookKey): IAddressBook { foreach ($cm->getUserAddressBooks() as $addressBook) { if ($addressBook->getKey() === $addressBookKey) { return $addressBook; } } throw new ContactAddressBookNotFoundException(); } /** * @param Member $member * * @return array */ public function getMailAddressesFromMember(Member $member): array { if ($member->getUserType() !== Member::TYPE_CONTACT || !$this->configService->isLocalInstance($member->getInstance())) { return []; } try { return $this->getMailAddresses($member->getUserId()); } catch (Exception $e) { return []; } } }