From d93a31dda0308ab02d2cf0ae93900187f8757fe8 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 18 May 2022 22:51:32 +0200 Subject: [PATCH] Improved Kolab detection --- plugins/kolab/KolabAddressBook.php | 53 +++++++++++++----------------- plugins/kolab/index.php | 15 +++++---- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/plugins/kolab/KolabAddressBook.php b/plugins/kolab/KolabAddressBook.php index e0e1b8fb0..6a05bc0cd 100644 --- a/plugins/kolab/KolabAddressBook.php +++ b/plugins/kolab/KolabAddressBook.php @@ -12,6 +12,17 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt $oImapClient, $sFolderName; + function __construct(string $sFolderName) + { + $metadata = $this->ImapClient()->FolderGetMetadata($sFolderName, [\MailSo\Imap\Enumerations\MetadataKeys::KOLAB_CTYPE]); + if (!$metadata || 'contact' !== \array_shift($metadata)) { + $sFolderName = ''; +// throw new \Exception("Invalid kolab contact folder: {$sFolderName}"); + } + + $this->sFolderName = $sFolderName; + } + protected function MailClient() : \MailSo\Mail\MailClient { $oActions = \RainLoop\Api::Actions(); @@ -30,39 +41,21 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt return $this->oImapClient; } - protected function FolderName() : string - { - if (!\is_string($this->sFolderName)) { - $oActions = \RainLoop\Api::Actions(); - $oAccount = $oActions->getAccountFromToken(); - $sFolderName = (string) $oActions->SettingsProvider(true)->Load($oAccount)->GetConf('KolabContactFolder', ''); - - $metadata = $this->ImapClient()->FolderGetMetadata($sFolderName, [\MailSo\Imap\Enumerations\MetadataKeys::KOLAB_CTYPE]); - if (!$metadata || 'contact' !== \array_shift($metadata)) { - $sFolderName = ''; -// throw new \Exception("Invalid kolab contact folder: {$sFolderName}"); - } - - $this->sFolderName = $sFolderName; - } - return $this->sFolderName; - } - protected function SelectFolder() : bool { - try { - $sFolderName = $this->FolderName(); - if ($sFolderName) { + $sFolderName = $this->sFolderName; + if ($sFolderName) { + try { $this->ImapClient()->FolderSelect($sFolderName); return true; + } catch (\Throwable $e) { + \trigger_error("KolabAddressBook {$sFolderName} error: {$e->getMessage()}"); } - } catch (\Throwable $e) { - \trigger_error("KolabAddressBook {$sFolderName} error: {$e->getMessage()}"); } return false; } - public function fetchXCardFromMessage(\MailSo\Mail\Message $oMessage) : ?\Sabre\VObject\Component\VCard + protected function fetchXCardFromMessage(\MailSo\Mail\Message $oMessage) : ?\Sabre\VObject\Component\VCard { $xCard = null; foreach ($oMessage->Attachments() ?: [] as $oAttachment) { @@ -71,7 +64,7 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt if (\is_resource($rResource)) { $xCard = \Sabre\VObject\Reader::readXML($rResource); } - }, $this->FolderName(), $oMessage->Uid(), $oAttachment->MimeIndex()); + }, $this->sFolderName, $oMessage->Uid(), $oAttachment->MimeIndex()); break; } } @@ -142,7 +135,7 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt $iUID = $oContact->IdContact; - $oPrevMessage = $this->MailClient()->Message($this->FolderName(), $iUID); + $oPrevMessage = $this->MailClient()->Message($this->sFolderName, $iUID); if ($oPrevMessage) { $oVCard = $this->fetchXCardFromMessage($oPrevMessage); } else { @@ -205,7 +198,7 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt { try { $this->MailClient()->MessageDelete( - $this->FolderName(), + $this->sFolderName, new \MailSo\Imap\SequenceSet($aContactIds) ); return true; @@ -218,14 +211,14 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt { // Called by \RainLoop\Api::ClearUserData() // Not needed as the contacts are inside IMAP mailbox -// $this->MailClient()->FolderClear($this->FolderName()); +// $this->MailClient()->FolderClear($this->sFolderName); return false; } public function GetContacts(string $sEmail, int $iOffset = 0, int $iLimit = 20, string $sSearch = '', int &$iResultCount = 0) : array { $oParams = new \MailSo\Mail\MessageListParams; - $oParams->sFolderName = $this->FolderName(); + $oParams->sFolderName = $this->sFolderName; $oParams->iOffset = $iOffset; $oParams->iLimit = $iLimit; if ($sSearch) { @@ -265,7 +258,7 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt if ($bIsStrID) { $oMessage = null; } else { - $oMessage = $this->MailClient()->Message($this->FolderName(), $mID); + $oMessage = $this->MailClient()->Message($this->sFolderName, $mID); } return $oMessage ? $this->MessageAsContact($oMessage) : null; } diff --git a/plugins/kolab/index.php b/plugins/kolab/index.php index 8b5c5aef1..5f3c9c535 100644 --- a/plugins/kolab/index.php +++ b/plugins/kolab/index.php @@ -4,10 +4,10 @@ class KolabPlugin extends \RainLoop\Plugins\AbstractPlugin { const NAME = 'Kolab', - VERSION = '0.1', - RELEASE = '2022-05-13', - CATEGORY = 'Security', - DESCRIPTION = 'Get contacts suggestions from Kolab.', + VERSION = '0.2', + RELEASE = '2022-05-18', + CATEGORY = 'Contacts', + DESCRIPTION = 'Use an Address Book of Kolab.', REQUIRED = '2.15.4'; public function Init() : void @@ -82,8 +82,11 @@ class KolabPlugin extends \RainLoop\Plugins\AbstractPlugin } */ if ('address-book' === $sName) { - require_once __DIR__ . '/KolabAddressBook.php'; - $mResult = new KolabAddressBook(); + $sFolderName = $this->Settings()->GetConf('KolabContactFolder', ''); + if ($sFolderName) { + require_once __DIR__ . '/KolabAddressBook.php'; + $mResult = new KolabAddressBook($sFolderName); + } } } }