diff --git a/plugins/kolab/KolabAddressBook.php b/plugins/kolab/KolabAddressBook.php index 83b225ed5..8c7df9316 100644 --- a/plugins/kolab/KolabAddressBook.php +++ b/plugins/kolab/KolabAddressBook.php @@ -133,12 +133,16 @@ class KolabAddressBook implements \RainLoop\Providers\AddressBook\AddressBookInt $oParams->iLimit = 999; // Is the max $oMessageList = $this->MailClient()->MessageList($oParams); foreach ($oMessageList as $oMessage) { - if ($rCsv) { - $oContact = $this->MessageAsContact($oMessage); - \RainLoop\Providers\AddressBook\Utils::VCardToCsv($rCsv, $oContact, $bCsvHeader); - $bCsvHeader = false; - } else if ($xCard = $this->fetchXCardFromMessage($oMessage)) { - echo $xCard->serialize(); + try { + if ($rCsv) { + $oContact = $this->MessageAsContact($oMessage); + \RainLoop\Providers\AddressBook\Utils::VCardToCsv($rCsv, $oContact->vCard, $bCsvHeader); + $bCsvHeader = false; + } else if ($xCard = $this->fetchXCardFromMessage($oMessage)) { + echo $xCard->serialize(); + } + } catch (\Throwable $oExc) { + $this->oLogger && $this->oLogger->WriteException($oExc); } } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php index 74401b81c..e57dd5894 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/PdoAddressBook.php @@ -52,11 +52,17 @@ class PdoAddressBook $sDsn = 'sqlite:' . APP_PRIVATE_DATA . 'AddressBook.sqlite'; /* // TODO: use local db? - $homedir = \RainLoop\Api::Actions()->StorageProvider()->GenerateFilePath( - $oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::ROOT - ); - $sDsn = 'sqlite:' . $homedir . '/AddressBook.sqlite'; + $oAccount = \RainLoop\Api::Actions()->getMainAccountFromToken(false); + if ($oAccount) { + $homedir = \RainLoop\Api::Actions()->StorageProvider()->GenerateFilePath( + $oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::ROOT + ); + if (!\is_file($homedir . 'AddressBook.sqlite') && \is_file(APP_PRIVATE_DATA . '/AddressBook.sqlite')) { + \copy(APP_PRIVATE_DATA . '/AddressBook.sqlite', $homedir . 'AddressBook.sqlite'); + } + $sDsn = 'sqlite:' . $homedir . 'AddressBook.sqlite'; + } */ } else { $sDsn = \trim($oConfig->Get('contacts', 'pdo_dsn', '')); @@ -308,6 +314,7 @@ class PdoAddressBook public function Export(string $sType = 'vcf') : bool { if (1 > $this->iUserID) { + \SnappyMail\Log::warning('PdoAddressBook', 'Export() invalid $iUserID'); return false; } @@ -317,16 +324,21 @@ class PdoAddressBook $aDatabaseSyncData = $this->prepareDatabaseSyncData(); if (\count($aDatabaseSyncData)) { foreach ($aDatabaseSyncData as $mData) { - if ($mData && isset($mData['id_contact'], $mData['deleted']) && !$mData['deleted']) { - $oContact = $this->GetContactByID($mData['id_contact']); - if ($oContact) { - if ($rCsv) { - Utils::VCardToCsv($rCsv, $oContact, $bCsvHeader); - $bCsvHeader = false; - } else { - echo $oContact->vCard->serialize(); + try { +// if ($mData && isset($mData['id_contact'], $mData['deleted']) && !$mData['deleted']) { + if ($mData && !empty($mData['id_contact'])) { + $oContact = $this->GetContactByID($mData['id_contact']); + if ($oContact) { + if ($rCsv) { + Utils::VCardToCsv($rCsv, $oContact->vCard, $bCsvHeader); + $bCsvHeader = false; + } else { + echo $oContact->vCard->serialize(); + } } } + } catch (\Throwable $oExc) { + $this->oLogger && $this->oLogger->WriteException($oExc); } } } @@ -337,6 +349,7 @@ class PdoAddressBook public function ContactSave(Contact $oContact) : bool { if (1 > $this->iUserID) { + \SnappyMail\Log::warning('PdoAddressBook', 'ContactSave() invalid $iUserID'); return false; } @@ -436,6 +449,7 @@ class PdoAddressBook public function DeleteContacts(array $aContactIds) : bool { if (1 > $this->iUserID) { + \SnappyMail\Log::warning('PdoAddressBook', 'DeleteContacts() invalid $iUserID'); return false; } @@ -744,7 +758,7 @@ class PdoAddressBook p.prop_value as jcard FROM rainloop_ab_contacts AS c LEFT JOIN rainloop_ab_properties AS p ON (p.id_contact = c.id_contact AND p.prop_type = :prop_type) - WHERE c.deleted = 0 AND c.id_user = :id_user'; + WHERE c.id_user = :id_user AND c.deleted = 0'; $aParams = array( ':id_user' => array($this->iUserID, \PDO::PARAM_INT), diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Utils.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Utils.php index 709a729bb..983e67aa7 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Utils.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/AddressBook/Utils.php @@ -2,6 +2,8 @@ namespace RainLoop\Providers\AddressBook; +use Sabre\VObject\Component\VCard; + class Utils { private static $aMap = array( @@ -98,7 +100,7 @@ class Utils foreach ($aHeaders as $iIndex => $sItemName) { $sItemName = \MailSo\Base\Utils::Utf8Clear($sItemName); $sItemName = \strtoupper(\trim(\preg_replace('/[\s\-]+/', '', $sItemName))); - if (!\array_key_exists($sItemName, \Sabre\VObject\Component\VCard::$propertyMap)) { + if (!\array_key_exists($sItemName, VCard::$propertyMap)) { $sItemName = \strtolower($sItemName); $sItemName = isset(static::$aMap[$sItemName]) ? static::$aMap[$sItemName] : null; } @@ -108,7 +110,7 @@ class Utils while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) { \MailSo\Base\Utils::ResetTimeLimit(); $iCount = 0; - $oVCard = new \Sabre\VObject\Component\VCard; + $oVCard = new VCard; $aName = ['','','','','']; foreach ($mRow as $iIndex => $sItemValue) { $sItemName = $aHeaders[$iIndex]; @@ -138,7 +140,7 @@ class Utils } } - public static function VCardToCsv($stream, Classes\Contact $oContact, bool $bWithHeader = false)/* : int|false*/ + public static function VCardToCsv($stream, VCard $oVCard, bool $bWithHeader = false)/* : int|false*/ { $aData = array(); if ($bWithHeader) { @@ -153,8 +155,6 @@ class Utils )); } - $oVCard = $oContact->vCard; - $aName = isset($oVCard->N) ? $oVCard->N->getParts() : ['','','','','']; $adrHome = $oVCard->getByType('ADR', 'HOME'); @@ -203,7 +203,7 @@ class Utils $oVCardSplitter = new \Sabre\VObject\Splitter\VCard($rFile); if ($oVCardSplitter) { while ($oVCard = $oVCardSplitter->getNext()) { - if ($oVCard instanceof \Sabre\VObject\Component\VCard) { + if ($oVCard instanceof VCard) { \MailSo\Base\Utils::ResetTimeLimit(); $oContact = new Classes\Contact(); $oContact->setVCard($oVCard);