Resolved and improved #79

This commit is contained in:
djmaze 2021-04-19 14:11:02 +02:00
parent d528a523ad
commit 30727b0e29
4 changed files with 127 additions and 142 deletions

View file

@ -253,12 +253,7 @@ class AddressBook extends \RainLoop\Providers\AbstractProvider
{ {
\MailSo\Base\Utils::ResetTimeLimit(); \MailSo\Base\Utils::ResetTimeLimit();
if (empty($oVCard->UID)) $oContact->PopulateByVCard($oVCard);
{
$oVCard->UID = \SnappyMail\UUID::generate();
}
$oContact->PopulateByVCard($oVCard->UID, $oVCard->serialize());
if (0 < \count($oContact->Properties)) if (0 < \count($oContact->Properties))
{ {

View file

@ -155,17 +155,12 @@ class Contact implements \JsonSerializable
{ {
if (empty($this->IdContactStr)) if (empty($this->IdContactStr))
{ {
$this->RegenerateContactStr(); $this->IdContactStr = \SnappyMail\UUID::generate();
} }
$this->PopulateDisplayAndFullNameValue(); $this->PopulateDisplayAndFullNameValue();
} }
public function RegenerateContactStr() : void
{
$this->IdContactStr = \SnappyMail\UUID::generate();
}
public function GetEmails() : array public function GetEmails() : array
{ {
$aResult = array(); $aResult = array();
@ -495,13 +490,8 @@ class Contact implements \JsonSerializable
} }
} }
public function PopulateByVCard(string $sUid, string $sVCard, string $sEtag = '', $oLogger = null) : bool public function PopulateByVCard(\Sabre\VObject\Component\VCard $oVCard, string $sEtag = '') : bool
{ {
if ("\xef\xbb\xbf" === \substr($sVCard, 0, 3))
{
$sVCard = \substr($sVCard, 3);
}
$this->Properties = array(); $this->Properties = array();
if (!empty($sEtag)) if (!empty($sEtag))
@ -509,30 +499,8 @@ class Contact implements \JsonSerializable
$this->Etag = $sEtag; $this->Etag = $sEtag;
} }
$this->IdContactStr = $sUid;
try
{
$oVCard = \Sabre\VObject\Reader::read($sVCard);
}
catch (\Throwable $oExc)
{
if ($oLogger)
{
$oLogger->WriteException($oExc);
$oLogger->WriteDump($sVCard);
}
}
// if ($oLogger)
// {
// $oLogger->WriteDump($sVCard);
// }
$aProperties = array(); $aProperties = array();
if ($oVCard)
{
$bOldVersion = empty($oVCard->VERSION) ? false : $bOldVersion = empty($oVCard->VERSION) ? false :
\in_array((string) $oVCard->VERSION, array('2.1', '2.0', '1.0')); \in_array((string) $oVCard->VERSION, array('2.1', '2.0', '1.0'));
@ -610,16 +578,10 @@ class Contact implements \JsonSerializable
$this->addArrayPropertyHelper($aProperties, $oVCard->TEL, PropertyType::PHONE); $this->addArrayPropertyHelper($aProperties, $oVCard->TEL, PropertyType::PHONE);
} }
$sUidValue = $oVCard->UID ? (string) $oVCard->UID : \SnappyMail\UUID::generate(); $this->IdContactStr = $oVCard->UID ? (string) $oVCard->UID : \SnappyMail\UUID::generate();
$aProperties[] = new Property(PropertyType::UID, $sUidValue); $aProperties[] = new Property(PropertyType::UID, $this->IdContactStr);
if (empty($this->IdContactStr))
{
$this->IdContactStr = $sUidValue;
}
$this->Properties = $aProperties; $this->Properties = $aProperties;
}
$this->UpdateDependentValues(); $this->UpdateDependentValues();

View file

@ -229,25 +229,53 @@ class PdoAddressBook
if ($oResponse) if ($oResponse)
{ {
$sBody = \trim($oResponse->body); $sBody = \trim($oResponse->body);
// Remove UTF-8 BOM
if ("\xef\xbb\xbf" === \substr($sBody, 0, 3))
{
$sBody = \substr($sBody, 3);
}
if (!empty($sBody)) if (!empty($sBody))
{ {
$oVCard = null;
try
{
$oVCard = \Sabre\VObject\Reader::read($sBody);
}
catch (\Throwable $oExc)
{
if ($this->oLogger)
{
$this->oLogger->WriteException($oExc);
$this->oLogger->WriteDump($sBody);
}
}
if ($oVCard instanceof \Sabre\VObject\Component\VCard)
{
$oVCard->UID = $aData['uid'];
$oContact = null; $oContact = null;
if ($mExsistenContactID) if ($mExsistenContactID)
{ {
$oContact = $this->GetContactByID($sEmail, $mExsistenContactID); $oContact = $this->GetContactByID($sEmail, $mExsistenContactID);
} }
if (!$oContact) if (!$oContact)
{ {
$oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); $oContact = new Classes\Contact();
} }
$oContact->PopulateByVCard($aData['uid'], $sBody, $oContact->PopulateByVCard(
\trim(\trim($oResponse->getHeader('etag')), '"\''), $oVCard,
$this->oLogger); \trim(\trim($oResponse->getHeader('etag')), '"\'')
);
$this->ContactSave($sEmail, $oContact); $this->ContactSave($sEmail, $oContact);
unset($oContact); unset($oContact);
// } else if ($this->oLogger) {
// $this->oLogger->WriteDump($sBody);
}
} }
} }
} }
@ -296,7 +324,7 @@ class PdoAddressBook
return true; return true;
} }
public function ContactSave(string $sEmail, \RainLoop\Providers\AddressBook\Classes\Contact $oContact, bool $bSyncDb = true) : bool public function ContactSave(string $sEmail, Classes\Contact $oContact, bool $bSyncDb = true) : bool
{ {
if ($bSyncDb) if ($bSyncDb)
{ {
@ -370,7 +398,7 @@ class PdoAddressBook
if (0 < $iIdContact) if (0 < $iIdContact)
{ {
$aParams = array(); $aParams = array();
foreach ($oContact->Properties as /* @var $oProp \RainLoop\Providers\AddressBook\Classes\Property */ $oProp) foreach ($oContact->Properties as /* @var $oProp Classes\Property */ $oProp)
{ {
$iFreq = $oProp->Frec; $iFreq = $oProp->Frec;
if ($oProp->IsEmail() && isset($aFreq[$oProp->Value])) if ($oProp->IsEmail() && isset($aFreq[$oProp->Value]))
@ -580,7 +608,7 @@ class PdoAddressBook
if (0 < $iIdContact) if (0 < $iIdContact)
{ {
$aIdContacts[] = $iIdContact; $aIdContacts[] = $iIdContact;
$oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); $oContact = new Classes\Contact();
$oContact->IdContact = (string) $iIdContact; $oContact->IdContact = (string) $iIdContact;
$oContact->IdContactStr = isset($aItem['id_contact_str']) ? (string) $aItem['id_contact_str'] : ''; $oContact->IdContactStr = isset($aItem['id_contact_str']) ? (string) $aItem['id_contact_str'] : '';
@ -617,7 +645,7 @@ class PdoAddressBook
$iId = (int) $aItem['id_contact']; $iId = (int) $aItem['id_contact'];
if (0 < $iId && isset($aContacts[$iId])) if (0 < $iId && isset($aContacts[$iId]))
{ {
$oProperty = new \RainLoop\Providers\AddressBook\Classes\Property(); $oProperty = new Classes\Property();
$oProperty->IdProperty = (int) $aItem['id_prop']; $oProperty->IdProperty = (int) $aItem['id_prop'];
$oProperty->Type = (int) $aItem['prop_type']; $oProperty->Type = (int) $aItem['prop_type'];
$oProperty->TypeStr = isset($aItem['prop_type_str']) ? (string) $aItem['prop_type_str'] : ''; $oProperty->TypeStr = isset($aItem['prop_type_str']) ? (string) $aItem['prop_type_str'] : '';
@ -651,7 +679,7 @@ class PdoAddressBook
/** /**
* @param mixed $mID * @param mixed $mID
*/ */
public function GetContactByID(string $sEmail, $mID, bool $bIsStrID = false) : ?\RainLoop\Providers\AddressBook\Classes\Contact public function GetContactByID(string $sEmail, $mID, bool $bIsStrID = false) : ?Classes\Contact
{ {
$mID = \trim($mID); $mID = \trim($mID);
@ -691,7 +719,7 @@ class PdoAddressBook
$iIdContact = $aItem && isset($aItem['id_contact']) ? (int) $aItem['id_contact'] : 0; $iIdContact = $aItem && isset($aItem['id_contact']) ? (int) $aItem['id_contact'] : 0;
if (0 < $iIdContact) if (0 < $iIdContact)
{ {
$oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); $oContact = new Classes\Contact();
$oContact->IdContact = (string) $iIdContact; $oContact->IdContact = (string) $iIdContact;
$oContact->IdContactStr = isset($aItem['id_contact_str']) ? (string) $aItem['id_contact_str'] : ''; $oContact->IdContactStr = isset($aItem['id_contact_str']) ? (string) $aItem['id_contact_str'] : '';
@ -723,7 +751,7 @@ class PdoAddressBook
{ {
if ((string) $oContact->IdContact === (string) $aItem['id_contact']) if ((string) $oContact->IdContact === (string) $aItem['id_contact'])
{ {
$oProperty = new \RainLoop\Providers\AddressBook\Classes\Property(); $oProperty = new Classes\Property();
$oProperty->IdProperty = (int) $aItem['id_prop']; $oProperty->IdProperty = (int) $aItem['id_prop'];
$oProperty->Type = (int) $aItem['prop_type']; $oProperty->Type = (int) $aItem['prop_type'];
$oProperty->TypeStr = isset($aItem['prop_type_str']) ? (string) $aItem['prop_type_str'] : ''; $oProperty->TypeStr = isset($aItem['prop_type_str']) ? (string) $aItem['prop_type_str'] : '';
@ -1031,13 +1059,13 @@ class PdoAddressBook
if (0 < \count($aEmailsToCreate)) if (0 < \count($aEmailsToCreate))
{ {
$oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); $oContact = new Classes\Contact();
foreach ($aEmailsToCreate as $oEmail) foreach ($aEmailsToCreate as $oEmail)
{ {
if ('' !== \trim($oEmail->GetEmail())) if ('' !== \trim($oEmail->GetEmail()))
{ {
$oPropEmail = new \RainLoop\Providers\AddressBook\Classes\Property(); $oPropEmail = new Classes\Property();
$oPropEmail->Type = \RainLoop\Providers\AddressBook\Enumerations\PropertyType::EMAIl; $oPropEmail->Type = Enumerations\PropertyType::EMAIl;
$oPropEmail->Value = \trim($oEmail->GetEmail(true)); $oPropEmail->Value = \trim($oEmail->GetEmail(true));
$oContact->Properties[] = $oPropEmail; $oContact->Properties[] = $oPropEmail;
@ -1060,8 +1088,8 @@ class PdoAddressBook
if (0 < \strlen($sFirst)) if (0 < \strlen($sFirst))
{ {
$oPropName = new \RainLoop\Providers\AddressBook\Classes\Property(); $oPropName = new Classes\Property();
$oPropName->Type = \RainLoop\Providers\AddressBook\Enumerations\PropertyType::FIRST_NAME; $oPropName->Type = Enumerations\PropertyType::FIRST_NAME;
$oPropName->Value = \trim($sFirst); $oPropName->Value = \trim($sFirst);
$oContact->Properties[] = $oPropName; $oContact->Properties[] = $oPropName;
@ -1069,8 +1097,8 @@ class PdoAddressBook
if (0 < \strlen($sLast)) if (0 < \strlen($sLast))
{ {
$oPropName = new \RainLoop\Providers\AddressBook\Classes\Property(); $oPropName = new Classes\Property();
$oPropName->Type = \RainLoop\Providers\AddressBook\Enumerations\PropertyType::LAST_NAME; $oPropName->Type = Enumerations\PropertyType::LAST_NAME;
$oPropName->Value = \trim($sLast); $oPropName->Value = \trim($sLast);
$oContact->Properties[] = $oPropName; $oContact->Properties[] = $oPropName;

View file

@ -69,7 +69,7 @@ class Client
$url = $this->baseUri . $url; $url = $this->baseUri . $url;
} }
} }
$response = $this->HTTP->doRequest('PROPFIND', $url, $body, $headers); $response = $this->HTTP->doRequest($method, $url, $body, $headers);
if (301 == $response->status) { if (301 == $response->status) {
// Like: RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav [R=301,L] // Like: RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav [R=301,L]
$location = $response->getRedirectLocation(); $location = $response->getRedirectLocation();
@ -77,10 +77,10 @@ class Client
$url = \preg_replace('@^(https?:)?//[^/]+[/$]@', '/', $location); $url = \preg_replace('@^(https?:)?//[^/]+[/$]@', '/', $location);
$parts = \parse_url($this->baseUri); $parts = \parse_url($this->baseUri);
$url = $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; $url = $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url;
$response = $this->HTTP->doRequest('PROPFIND', $url, $body, $headers); $response = $this->HTTP->doRequest($method, $url, $body, $headers);
} }
if (300 <= $response->status) { if (300 <= $response->status) {
throw new \SnappyMail\HTTP\Exception("PROPFIND {$url}", $response->status, $response); throw new \SnappyMail\HTTP\Exception("{$method} {$url}", $response->status, $response);
} }
return $response; return $response;