Remote Synchronization (CardDAV) improvements:

now it supports address book url auto detection (and works with Google contacts, icloud and etc.)
This commit is contained in:
RainLoop Team 2015-05-09 02:43:56 +04:00
parent 92f2caf700
commit 1fb553e77e
249 changed files with 1338 additions and 1453 deletions

View file

@ -53,7 +53,7 @@
this.contactsIsAllowed = ko.observable(false); this.contactsIsAllowed = ko.observable(false);
this.attahcmentsActions = ko.observableArray([]); this.attachmentsActions = ko.observableArray([]);
this.devEmail = ''; this.devEmail = '';
this.devPassword = ''; this.devPassword = '';
@ -70,8 +70,8 @@
this.contactsIsAllowed(!!Settings.settingsGet('ContactsIsAllowed')); this.contactsIsAllowed(!!Settings.settingsGet('ContactsIsAllowed'));
var mAttahcmentsActions = Settings.settingsGet('AttahcmentsActions'); var mAttachmentsActions = Settings.settingsGet('AttachmentsActions');
this.attahcmentsActions(Utils.isNonEmptyArray(mAttahcmentsActions) ? mAttahcmentsActions : []); this.attachmentsActions(Utils.isNonEmptyArray(mAttachmentsActions) ? mAttachmentsActions : []);
this.devEmail = Settings.settingsGet('DevEmail'); this.devEmail = Settings.settingsGet('DevEmail');
this.devPassword = Settings.settingsGet('DevPassword'); this.devPassword = Settings.settingsGet('DevPassword');

View file

@ -65,7 +65,7 @@
this.pswp = null; this.pswp = null;
this.attahcmentsActions = AppStore.attahcmentsActions; this.attachmentsActions = AppStore.attachmentsActions;
this.message = MessageStore.message; this.message = MessageStore.message;
this.messageListChecked = MessageStore.messageListChecked; this.messageListChecked = MessageStore.messageListChecked;
@ -90,18 +90,18 @@
this.showAttachmnetControls = ko.observable(false); this.showAttachmnetControls = ko.observable(false);
this.allowAttachmnetControls = ko.computed(function () { this.allowAttachmnetControls = ko.computed(function () {
return 0 < this.attahcmentsActions().length; return 0 < this.attachmentsActions().length;
}, this); }, this);
this.downloadAsZipAllowed = ko.computed(function () { this.downloadAsZipAllowed = ko.computed(function () {
return -1 < Utils.inArray('zip', this.attahcmentsActions()); return -1 < Utils.inArray('zip', this.attachmentsActions());
}, this); }, this);
this.downloadAsZipLoading = ko.observable(false); this.downloadAsZipLoading = ko.observable(false);
this.downloadAsZipError = ko.observable(false).extend({'falseTimeout': 7000}); this.downloadAsZipError = ko.observable(false).extend({'falseTimeout': 7000});
this.saveToOwnCloudAllowed = ko.computed(function () { this.saveToOwnCloudAllowed = ko.computed(function () {
return -1 < Utils.inArray('owncloud', this.attahcmentsActions()); return -1 < Utils.inArray('owncloud', this.attachmentsActions());
}, this); }, this);
this.saveToOwnCloudLoading = ko.observable(false); this.saveToOwnCloudLoading = ko.observable(false);
@ -123,7 +123,7 @@
}, this); }, this);
this.saveToDropboxAllowed = ko.computed(function () { this.saveToDropboxAllowed = ko.computed(function () {
return -1 < Utils.inArray('dropbox', this.attahcmentsActions()); return -1 < Utils.inArray('dropbox', this.attachmentsActions());
}, this); }, this);
this.saveToDropboxLoading = ko.observable(false); this.saveToDropboxLoading = ko.observable(false);

View file

@ -2,7 +2,7 @@
"name": "RainLoop", "name": "RainLoop",
"title": "RainLoop Webmail", "title": "RainLoop Webmail",
"version": "1.9.0", "version": "1.9.0",
"release": "323", "release": "324",
"description": "Simple, modern & fast web-based email client", "description": "Simple, modern & fast web-based email client",
"homepage": "http://rainloop.net", "homepage": "http://rainloop.net",
"main": "gulpfile.js", "main": "gulpfile.js",

View file

@ -22,7 +22,7 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH'))
function rainLoopSplAutoloadNamespaces() function rainLoopSplAutoloadNamespaces()
{ {
return RAINLOOP_INCLUDE_AS_API_DEF ? array('RainLoop') : return RAINLOOP_INCLUDE_AS_API_DEF ? array('RainLoop') :
array('RainLoop', 'Facebook', 'GuzzleHttp', 'Symfony', 'PHPThumb', 'Sabre'); array('RainLoop', 'Facebook', 'GuzzleHttp', 'PHPThumb', 'SabreForRainLoop');
} }
/** /**
@ -41,7 +41,7 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH'))
{ {
if (0 === \strpos($sClassName, $sNamespaceName.'\\')) if (0 === \strpos($sClassName, $sNamespaceName.'\\'))
{ {
if ('Sabre' === $sNamespaceName && !RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED')) if ('SabreForRainLoop' === $sNamespaceName && !RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED'))
{ {
\define('RL_MB_FIXED', true); \define('RL_MB_FIXED', true);
include_once RAINLOOP_APP_LIBRARIES_PATH.'RainLoop/Common/MbStringFix.php'; include_once RAINLOOP_APP_LIBRARIES_PATH.'RainLoop/Common/MbStringFix.php';

View file

@ -86,4 +86,21 @@ class DateTimeHelper
$oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', \trim($sDateTime), \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', \trim($sDateTime), \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject());
return $oDateTime ? $oDateTime->getTimestamp() : 0; return $oDateTime ? $oDateTime->getTimestamp() : 0;
} }
/**
* Parse date string formated as "2015-05-08T14:32:18.483-07:00"
*
* @param string $sDateTime
*
* @return int
*/
public static function TryToParseSpecEtagFormat($sDateTime)
{
$sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime)));
$sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime)));
$sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime)));
$sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime)));
return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime);
}
} }

View file

@ -165,7 +165,7 @@ class Logger extends \MailSo\Base\Collection
*/ */
public function AddSecret($sWord) public function AddSecret($sWord)
{ {
if (0 < \strlen(\trim($sWord))) if (\is_string($sWord) && 0 < \strlen(\trim($sWord)))
{ {
$this->aSecretWords[] = $sWord; $this->aSecretWords[] = $sWord;
$this->aSecretWords = \array_unique($this->aSecretWords); $this->aSecretWords = \array_unique($this->aSecretWords);

View file

@ -27,11 +27,6 @@ abstract class PHPThumb
*/ */
protected $fileName; protected $fileName;
/**
* @var \Symfony\Component\Filesystem\Filesystem
*/
protected $filesystem;
/** /**
* What the file format is (mime-type) * What the file format is (mime-type)
* *
@ -59,7 +54,6 @@ abstract class PHPThumb
*/ */
public function __construct($fileName, array $options = array(), array $plugins = array()) public function __construct($fileName, array $options = array(), array $plugins = array())
{ {
$this->filesystem = new \Symfony\Component\Filesystem\Filesystem();
$this->fileName = $fileName; $this->fileName = $fileName;
$this->remoteImage = false; $this->remoteImage = false;
@ -89,9 +83,9 @@ abstract class PHPThumb
return true; return true;
} }
if($this->filesystem->exists($filename)) { if (file_exists($filename)) {
return true; return true;
} }
return false; return false;
} }

View file

@ -1276,6 +1276,14 @@ class Actions
return $this->GetAccountFromCustomToken($this->getAuthToken(), $bThrowExceptionOnFalse); return $this->GetAccountFromCustomToken($this->getAuthToken(), $bThrowExceptionOnFalse);
} }
/**
* @return bool
*/
public function IsOpen()
{
return !$this->PremProvider();
}
/** /**
* @param bool $bAdmin * @param bool $bAdmin
* @param string $sAuthAccountHash = '' * @param string $sAuthAccountHash = ''
@ -1349,7 +1357,7 @@ class Actions
'PremType' => false, 'PremType' => false,
'Admin' => array(), 'Admin' => array(),
'Capa' => array(), 'Capa' => array(),
'AttahcmentsActions' => array(), 'AttachmentsActions' => array(),
'Plugins' => array() 'Plugins' => array()
); );
@ -1357,17 +1365,17 @@ class Actions
{ {
if (!!\class_exists('ZipArchive')) if (!!\class_exists('ZipArchive'))
{ {
$aResult['AttahcmentsActions'][] = 'zip'; $aResult['AttachmentsActions'][] = 'zip';
} }
if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files')) if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files'))
{ {
$aResult['AttahcmentsActions'][] = 'owncloud'; $aResult['AttachmentsActions'][] = 'owncloud';
} }
if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', '')))) if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', ''))))
{ {
$aResult['AttahcmentsActions'][] = 'dropbox'; $aResult['AttachmentsActions'][] = 'dropbox';
} }
} }
@ -2833,7 +2841,7 @@ class Actions
if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files')) if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('\\OCP\\Files'))
{ {
$sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', ''); $sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', '');
if (!empty($sSaveFolder)) if (empty($sSaveFolder))
{ {
$sSaveFolder = 'Attachments'; $sSaveFolder = 'Attachments';
} }
@ -6776,6 +6784,8 @@ class Actions
$oContact->Etag = \md5($oContact->ToVCard()); $oContact->Etag = \md5($oContact->ToVCard());
} }
$oContact->PopulateDisplayAndFullNameValue(true);
$bResult = $oAddressBookProvider->ContactSave($oAccount->ParentEmailHelper(), $oContact); $bResult = $oAddressBookProvider->ContactSave($oAccount->ParentEmailHelper(), $oContact);
} }

View file

@ -318,7 +318,7 @@ class AddressBook extends \RainLoop\Providers\AbstractProvider
{ {
$iCount = 0; $iCount = 0;
if (\class_exists('Sabre\DAV\Client') && $this->IsActive() && \is_string($sVcfData)) if (\class_exists('SabreForRainLoop\DAV\Client') && $this->IsActive() && \is_string($sVcfData))
{ {
$sVcfData = \trim($sVcfData); $sVcfData = \trim($sVcfData);
if ("\xef\xbb\xbf" === \substr($sVcfData, 0, 3)) if ("\xef\xbb\xbf" === \substr($sVcfData, 0, 3))
@ -329,7 +329,7 @@ class AddressBook extends \RainLoop\Providers\AbstractProvider
$oVCardSplitter = null; $oVCardSplitter = null;
try try
{ {
$oVCardSplitter = new \Sabre\VObject\Splitter\VCard($sVcfData); $oVCardSplitter = new \SabreForRainLoop\VObject\Splitter\VCard($sVcfData);
} }
catch (\Exception $oExc) catch (\Exception $oExc)
{ {
@ -344,13 +344,13 @@ class AddressBook extends \RainLoop\Providers\AbstractProvider
while ($oVCard = $oVCardSplitter->getNext()) while ($oVCard = $oVCardSplitter->getNext())
{ {
if ($oVCard instanceof \Sabre\VObject\Component\VCard) if ($oVCard instanceof \SabreForRainLoop\VObject\Component\VCard)
{ {
\MailSo\Base\Utils::ResetTimeLimit(); \MailSo\Base\Utils::ResetTimeLimit();
if (empty($oVCard->UID)) if (empty($oVCard->UID))
{ {
$oVCard->UID = \Sabre\DAV\UUIDUtil::getUUID(); $oVCard->UID = \SabreForRainLoop\DAV\UUIDUtil::getUUID();
} }
$oContact->PopulateByVCard($oVCard->UID, $oVCard->serialize()); $oContact->PopulateByVCard($oVCard->UID, $oVCard->serialize());

View file

@ -66,8 +66,9 @@ class Contact
$this->Etag = ''; $this->Etag = '';
} }
public function UpdateDependentValues() public function PopulateDisplayAndFullNameValue($bForceFullNameReplace = false)
{ {
$sFullName = '';
$sLastName = ''; $sLastName = '';
$sFirstName = ''; $sFirstName = '';
$sEmail = ''; $sEmail = '';
@ -100,8 +101,12 @@ class Contact
{ {
$sFirstName = $oProperty->Value; $sFirstName = $oProperty->Value;
} }
else if (\in_array($oProperty->Type, array( else if ('' === $sFullName && PropertyType::FULLNAME === $oProperty->Type)
PropertyType::FULLNAME, PropertyType::PHONE {
$sFullName = $oProperty->Value;
}
else if ('' === $sOther && \in_array($oProperty->Type, array(
PropertyType::PHONE
))) )))
{ {
$sOther = $oProperty->Value; $sOther = $oProperty->Value;
@ -110,25 +115,26 @@ class Contact
} }
} }
if (empty($this->IdContactStr)) $sDisplay = $bForceFullNameReplace ? '' : \trim($sFullName);
{
$this->RegenerateContactStr();
}
$sDisplay = ''; if ('' === $sDisplay && (0 < \strlen($sLastName) || 0 < \strlen($sFirstName)))
if (0 < \strlen($sLastName) || 0 < \strlen($sFirstName))
{ {
$sDisplay = \trim($sFirstName.' '.$sLastName); $sDisplay = \trim($sFirstName.' '.$sLastName);
} }
if ('' === $sDisplay && 0 < \strlen($sEmail)) if ('' === $sDisplay)
{
$sDisplay = \trim($sFullName);
}
if ('' === $sDisplay)
{ {
$sDisplay = \trim($sEmail); $sDisplay = \trim($sEmail);
} }
if ('' === $sDisplay) if ('' === $sDisplay)
{ {
$sDisplay = $sOther; $sDisplay = \trim($sOther);
} }
$this->Display = \trim($sDisplay); $this->Display = \trim($sDisplay);
@ -145,13 +151,23 @@ class Contact
} }
} }
public function UpdateDependentValues()
{
if (empty($this->IdContactStr))
{
$this->RegenerateContactStr();
}
$this->PopulateDisplayAndFullNameValue();
}
/** /**
* @return array * @return array
*/ */
public function RegenerateContactStr() public function RegenerateContactStr()
{ {
$this->IdContactStr = \class_exists('Sabre\DAV\Client') ? $this->IdContactStr = \class_exists('SabreForRainLoop\DAV\Client') ?
\Sabre\DAV\UUIDUtil::getUUID() : \MailSo\Base\Utils::Md5Rand(); \SabreForRainLoop\DAV\UUIDUtil::getUUID() : \MailSo\Base\Utils::Md5Rand();
} }
/** /**
@ -186,7 +202,7 @@ class Contact
{ {
$this->UpdateDependentValues(); $this->UpdateDependentValues();
if (!\class_exists('Sabre\DAV\Client')) if (!\class_exists('SabreForRainLoop\DAV\Client'))
{ {
return ''; return '';
} }
@ -201,7 +217,7 @@ class Contact
{ {
try try
{ {
$oVCard = \Sabre\VObject\Reader::read($sPreVCard); $oVCard = \SabreForRainLoop\VObject\Reader::read($sPreVCard);
} }
catch (\Exception $oExc) catch (\Exception $oExc)
{ {
@ -213,9 +229,14 @@ class Contact
} }
} }
// if ($oLogger)
// {
// $oLogger->WriteDump($sPreVCard);
// }
if (!$oVCard) if (!$oVCard)
{ {
$oVCard = new \Sabre\VObject\Component\VCard(); $oVCard = new \SabreForRainLoop\VObject\Component\VCard();
} }
$oVCard->VERSION = '3.0'; $oVCard->VERSION = '3.0';
@ -223,7 +244,7 @@ class Contact
unset($oVCard->FN, $oVCard->EMAIL, $oVCard->TEL, $oVCard->URL, $oVCard->NICKNAME); unset($oVCard->FN, $oVCard->EMAIL, $oVCard->TEL, $oVCard->URL, $oVCard->NICKNAME);
$sFirstName = $sLastName = $sMiddleName = $sSuffix = $sPrefix = ''; $sUid = $sFirstName = $sLastName = $sMiddleName = $sSuffix = $sPrefix = '';
foreach ($this->Properties as /* @var $oProperty \RainLoop\Providers\AddressBook\Classes\Property */ &$oProperty) foreach ($this->Properties as /* @var $oProperty \RainLoop\Providers\AddressBook\Classes\Property */ &$oProperty)
{ {
if ($oProperty) if ($oProperty)
@ -240,6 +261,9 @@ class Contact
case PropertyType::NOTE: case PropertyType::NOTE:
$oVCard->NOTE = $oProperty->Value; $oVCard->NOTE = $oProperty->Value;
break; break;
case PropertyType::UID:
$sUid = $oProperty->Value;
break;
case PropertyType::FIRST_NAME: case PropertyType::FIRST_NAME:
$sFirstName = $oProperty->Value; $sFirstName = $oProperty->Value;
break; break;
@ -278,7 +302,7 @@ class Contact
} }
} }
$oVCard->UID = $this->IdContactStr; $oVCard->UID = empty($sUid) ? $this->IdContactStr : $sUid;
$oVCard->N = array($sLastName, $sFirstName, $sMiddleName, $sPrefix, $sSuffix); $oVCard->N = array($sLastName, $sFirstName, $sMiddleName, $sPrefix, $sSuffix);
$oVCard->REV = \gmdate('Ymd', $this->Changed).'T'.\gmdate('His', $this->Changed).'Z'; $oVCard->REV = \gmdate('Ymd', $this->Changed).'T'.\gmdate('His', $this->Changed).'Z';
@ -505,7 +529,7 @@ class Contact
$this->Properties = array(); $this->Properties = array();
if (!\class_exists('Sabre\DAV\Client')) if (!\class_exists('SabreForRainLoop\DAV\Client'))
{ {
return false; return false;
} }
@ -515,9 +539,11 @@ class Contact
$this->Etag = $sEtag; $this->Etag = $sEtag;
} }
$this->IdContactStr = $sUid;
try try
{ {
$oVCard = \Sabre\VObject\Reader::read($sVCard); $oVCard = \SabreForRainLoop\VObject\Reader::read($sVCard);
} }
catch (\Exception $oExc) catch (\Exception $oExc)
{ {
@ -526,18 +552,24 @@ class Contact
$oLogger->WriteException($oExc); $oLogger->WriteException($oExc);
$oLogger->WriteDump($sVCard); $oLogger->WriteDump($sVCard);
} }
$this->IdContactStr = $sUid;
} }
// if ($oLogger)
// {
// $oLogger->WriteDump($sVCard);
// }
$bOwnCloud = false;
$aProperties = array(); $aProperties = array();
if ($oVCard) if ($oVCard)
{ {
$bOwnCloud = empty($oVCard->PRODID) ? false :
false !== \strpos(\strtolower($oVCard->PRODID), 'owncloud');
$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'));
$this->IdContactStr = $oVCard->UID ? (string) $oVCard->UID : \Sabre\DAV\UUIDUtil::getUUID();
if (isset($oVCard->FN) && '' !== \trim($oVCard->FN)) if (isset($oVCard->FN) && '' !== \trim($oVCard->FN))
{ {
$sValue = $this->getPropertyValueHelper($oVCard->FN, $bOldVersion); $sValue = $this->getPropertyValueHelper($oVCard->FN, $bOldVersion);
@ -612,6 +644,14 @@ class Contact
$this->addArrayPropertyHelper($aProperties, $oVCard->TEL, PropertyType::PHONE); $this->addArrayPropertyHelper($aProperties, $oVCard->TEL, PropertyType::PHONE);
} }
$sUidValue = $oVCard->UID ? (string) $oVCard->UID : \SabreForRainLoop\DAV\UUIDUtil::getUUID();
$aProperties[] = new Property(PropertyType::UID, $sUidValue);
if (empty($this->IdContactStr))
{
$this->IdContactStr = $sUidValue;
}
$this->Properties = $aProperties; $this->Properties = $aProperties;
} }

View file

@ -59,6 +59,15 @@ class Property
$this->Frec = 0; $this->Frec = 0;
} }
/**
* @return bool
*/
public function IsName()
{
return \in_array($this->Type, array(PropertyType::FULLNAME, PropertyType::FIRST_NAME,
PropertyType::LAST_NAME, PropertyType::MIDDLE_NAME, PropertyType::NICK_NAME));
}
/** /**
* @return bool * @return bool
*/ */
@ -120,6 +129,11 @@ class Property
$this->Value = \MailSo\Base\Utils::StrToLowerIfAscii($this->Value); $this->Value = \MailSo\Base\Utils::StrToLowerIfAscii($this->Value);
} }
if ($this->IsName())
{
$this->Value = \preg_replace('/[\s]+/u', ' ', $this->Value);
}
// phones clear value for searching // phones clear value for searching
if ($this->IsPhone()) if ($this->IsPhone())
{ {

View file

@ -6,6 +6,7 @@ class PropertyType
{ {
const UNKNOWN = 0; const UNKNOWN = 0;
const UID = 9;
const FULLNAME = 10; const FULLNAME = 10;
const FIRST_NAME = 15; const FIRST_NAME = 15;

View file

@ -117,11 +117,14 @@ class PdoAddressBook
try try
{ {
$this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV'); $this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
$aResponse = $oClient->propFind($sPath, array( $aResponse = $oClient->propFind($sPath, array(
'{DAV:}getlastmodified', '{DAV:}getlastmodified',
'{DAV:}resourcetype',
'{DAV:}getetag' '{DAV:}getetag'
), 1); ), 1);
// $this->oLogger->WriteDump($aResponse);
} }
catch (\Exception $oException) catch (\Exception $oException)
{ {
@ -137,10 +140,11 @@ class PdoAddressBook
if (!empty($sKey) && is_array($aItem)) if (!empty($sKey) && is_array($aItem))
{ {
$aItem = \array_change_key_case($aItem, \CASE_LOWER); $aItem = \array_change_key_case($aItem, \CASE_LOWER);
if (isset($aItem['{dav:}getetag'], $aItem['{dav:}getlastmodified'])) if (isset($aItem['{dav:}getetag']))
{ {
$aMatch = array(); $aMatch = array();
if (\preg_match('/\/([^\/?]+)$/', $sKey, $aMatch) && !empty($aMatch[1])) if (\preg_match('/\/([^\/?]+)$/', $sKey, $aMatch) && !empty($aMatch[1]) &&
(!$aItem['{dav:}resourcetype'] || !$aItem['{dav:}resourcetype']->is('{DAV:}collection')))
{ {
$sVcfFileName = \urldecode(\urldecode($aMatch[1])); $sVcfFileName = \urldecode(\urldecode($aMatch[1]));
$sKeyID = \preg_replace('/\.vcf$/i', '', $sVcfFileName); $sKeyID = \preg_replace('/\.vcf$/i', '', $sVcfFileName);
@ -150,10 +154,23 @@ class PdoAddressBook
'uid' => $sKeyID, 'uid' => $sKeyID,
'vcf' => $sVcfFileName, 'vcf' => $sVcfFileName,
'etag' => \trim(\trim($aItem['{dav:}getetag']), '"\''), 'etag' => \trim(\trim($aItem['{dav:}getetag']), '"\''),
'lastmodified' => $aItem['{dav:}getlastmodified'], 'lastmodified' => '',
'changed' => \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($aItem['{dav:}getlastmodified']) 'changed' => 0
); );
if (isset($aItem['{dav:}getlastmodified']))
{
$mResult[$sKeyID]['lastmodified'] = $aItem['{dav:}getlastmodified'];
$mResult[$sKeyID]['changed'] = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString(
$aItem['{dav:}getlastmodified']);
}
else
{
$mResult[$sKeyID]['changed'] = \MailSo\Base\DateTimeHelper::TryToParseSpecEtagFormat($mResult[$sKeyID]['etag']);
$mResult[$sKeyID]['lastmodified'] = 0 < $mResult[$sKeyID]['changed'] ?
\gmdate('c', $mResult[$sKeyID]['changed']) : '';
}
$mResult[$sKeyID]['changed_'] = \gmdate('c', $mResult[$sKeyID]['changed']); $mResult[$sKeyID]['changed_'] = \gmdate('c', $mResult[$sKeyID]['changed']);
} }
} }
@ -168,10 +185,10 @@ class PdoAddressBook
{ {
\MailSo\Base\Utils::ResetTimeLimit(); \MailSo\Base\Utils::ResetTimeLimit();
$this->oLogger->Write($sCmd.' '.$sUrl.('PUT' === $sCmd && null !== $mData ? ' ('.\strlen($mData).')' : ''), $this->oLogger->Write($sCmd.' '.$sUrl.(('PUT' === $sCmd || 'POST' === $sCmd) && null !== $mData ? ' ('.\strlen($mData).')' : ''),
\MailSo\Log\Enumerations\Type::INFO, 'DAV'); \MailSo\Log\Enumerations\Type::INFO, 'DAV');
if ('PUT' === $sCmd) if ('PUT' === $sCmd || 'POST' === $sCmd)
{ {
$this->oLogger->Write($mData, \MailSo\Log\Enumerations\Type::INFO, 'DAV'); $this->oLogger->Write($mData, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
} }
@ -179,13 +196,21 @@ class PdoAddressBook
$oResponse = false; $oResponse = false;
try try
{ {
$oResponse = 'PUT' === $sCmd && null !== $mData ? if (('PUT' === $sCmd || 'POST' === $sCmd) && null !== $mData)
$oClient->request($sCmd, $sUrl, $mData) : $oClient->request($sCmd, $sUrl);
if ('GET' === $sCmd && false)
{ {
$this->oLogger->WriteDump($oResponse, \MailSo\Log\Enumerations\Type::INFO, 'DAV'); $oResponse = $oClient->request($sCmd, $sUrl, $mData, array(
'Content-Type' => 'text/vcard; charset=utf-8'
));
} }
else
{
$oResponse = $oClient->request($sCmd, $sUrl);
}
// if ('GET' === $sCmd)
// {
// $this->oLogger->WriteDump($oResponse, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
// }
} }
catch (\Exception $oException) catch (\Exception $oException)
{ {
@ -196,24 +221,297 @@ class PdoAddressBook
} }
/** /**
* @param string $sEmail * @param \SabreForRainLoop\DAV\Client $oClient
* @param string $sUrl * @param string $sPath
*
* @return bool
*/
private function detectionPropFind($oClient, $sPath)
{
$aResponse = null;
try
{
$this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
$aResponse = $oClient->propFind($sPath, array(
'{DAV:}current-user-principal',
'{DAV:}resourcetype',
'{DAV:}displayname',
'{urn:ietf:params:xml:ns:carddav}addressbook-home-set'
), 1);
// $this->oLogger->WriteDump($aResponse);
}
catch (\Exception $oException)
{
$this->oLogger->WriteException($oException);
}
return $aResponse;
}
/**
* @param \SabreForRainLoop\DAV\Client $oClient
* @param string $sUser * @param string $sUser
* @param string $sPassword * @param string $sPassword
* @param string $sProxy = '' * @param string $sProxy = ''
* *
* @return array
*/
private function getContactsPaths(&$oClient, $sUser, $sPassword, $sProxy = '')
{
$aContactsPaths = array();
$sCurrentUserPrincipal = '';
$sAddressbookHomeSet = '';
// [{DAV:}current-user-principal] => /cloud/remote.php/carddav/principals/admin/
// [{urn:ietf:params:xml:ns:carddav}addressbook-home-set] => /cloud/remote.php/carddav/addressbooks/admin/
if (!$oClient)
{
return $aContactsPaths;
}
$aResponse = $this->detectionPropFind($oClient, '/.well-known/carddav');
$sNextPath = '';
$sFirstNextPath = '';
if (\is_array($aResponse))
{
foreach ($aResponse as $sKey => $aItem)
{
if (empty($sAddressbookHomeSet) && !empty($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set']) &&
false === \strpos($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'], '/calendar-proxy'))
{
$sAddressbookHomeSet = $aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'];
continue;
}
if (empty($sCurrentUserPrincipal) && !empty($aItem['{DAV:}current-user-principal']))
{
$sCurrentUserPrincipal = $aItem['{DAV:}current-user-principal'];
continue;
}
if (!empty($sKey))
{
$sFirstNextPath = $sKey;
$oResourceType = isset($aItem['{DAV:}resourcetype']) ? $aItem['{DAV:}resourcetype'] : null;
/* @var $oResourceType \SabreForRainLoop\DAV\Property\ResourceType */
if ($oResourceType && $oResourceType->is('{DAV:}collection'))
{
$sNextPath = $sKey;
continue;
}
}
}
if (empty($sNextPath) && empty($sCurrentUserPrincipal) && empty($sAddressbookHomeSet) && !empty($sFirstNextPath))
{
$sNextPath = $sFirstNextPath;
}
}
if (empty($sCurrentUserPrincipal) && empty($sAddressbookHomeSet))
{
if (empty($sNextPath))
{
return $aContactsPaths;
}
else
{
if (\preg_match('/^http[s]?:\/\//i', $sNextPath))
{
$oClient = $this->getDavClientFromUrl($sNextPath, $sUser, $sPassword, $sProxy);
if ($oClient)
{
$sNextPath = $oClient->__UrlPath__;
}
else
{
return $aContactsPaths;
}
}
$aResponse = $this->detectionPropFind($oClient, $sNextPath);
if (\is_array($aResponse))
{
foreach ($aResponse as $sKey => $aItem)
{
if (empty($sAddressbookHomeSet) && !empty($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set']) &&
false === \strpos($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'], '/calendar-proxy'))
{
$sAddressbookHomeSet = $aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'];
continue;
}
if (empty($sCurrentUserPrincipal) && !empty($aItem['{DAV:}current-user-principal']))
{
$sCurrentUserPrincipal = $aItem['{DAV:}current-user-principal'];
continue;
}
}
}
}
}
if (empty($sAddressbookHomeSet))
{
if (empty($sCurrentUserPrincipal))
{
return $aContactsPaths;
}
else
{
if (\preg_match('/^http[s]?:\/\//i', $sCurrentUserPrincipal))
{
$oClient = $this->getDavClientFromUrl($sCurrentUserPrincipal, $sUser, $sPassword, $sProxy);
if ($oClient)
{
$sCurrentUserPrincipal = $oClient->__UrlPath__;
}
else
{
return $aContactsPaths;
}
}
$aResponse = $this->detectionPropFind($oClient, $sCurrentUserPrincipal);
if (\is_array($aResponse))
{
foreach ($aResponse as $sKey => $aItem)
{
if (empty($sAddressbookHomeSet) && !empty($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set']) &&
false === \strpos($aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'], '/calendar-proxy'))
{
$sAddressbookHomeSet = $aItem['{urn:ietf:params:xml:ns:carddav}addressbook-home-set'];
continue;
}
}
}
}
}
if (empty($sAddressbookHomeSet))
{
return $aContactsPaths;
}
else
{
if (\preg_match('/^http[s]?:\/\//i', $sAddressbookHomeSet))
{
$oClient = $this->getDavClientFromUrl($sAddressbookHomeSet, $sUser, $sPassword, $sProxy);
if ($oClient)
{
$sAddressbookHomeSet = $oClient->__UrlPath__;
}
else
{
return $aContactsPaths;
}
}
$aResponse = $this->detectionPropFind($oClient, $sAddressbookHomeSet);
if (\is_array($aResponse))
{
foreach ($aResponse as $sKey => $aItem)
{
if (!empty($sKey) && $aItem && isset($aItem['{DAV:}resourcetype']))
{
$oResourceType = $aItem['{DAV:}resourcetype'];
/* @var $oResourceType \SabreForRainLoop\DAV\Property\ResourceType */
if ($oResourceType && $oResourceType->is('{DAV:}collection'))
{
if ($oResourceType->is('{urn:ietf:params:xml:ns:carddav}addressbook'))
{
$aContactsPaths[$sKey] = isset($aItem['{DAV:}displayname']) ? \trim($aItem['{DAV:}displayname']) : '';
}
}
}
}
}
}
return $aContactsPaths;
}
/**
* @param \SabreForRainLoop\DAV\Client $oClient
* @param string $sPath
*
* @return bool * @return bool
*/ */
public function Sync($sEmail, $sUrl, $sUser, $sPassword, $sProxy = '') private function checkContactsPath(&$oClient, $sPath)
{ {
$this->SyncDatabase(); if (!$oClient)
$iUserID = $this->getUserId($sEmail);
if (0 >= $iUserID)
{ {
return false; return false;
} }
$this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
try
{
$aResponse = $oClient->propFind($sPath, array(
'{DAV:}resourcetype'
), 1);
// $this->oLogger->WriteDump($aResponse);
}
catch (\Exception $oException)
{
$this->oLogger->WriteException($oException);
}
$bGood = false;
if (\is_array($aResponse))
{
foreach ($aResponse as $sKey => $aItem)
{
if (!empty($sKey) && isset($aItem['{DAV:}resourcetype']))
{
$oResourceType = $aItem['{DAV:}resourcetype'];
/* @var $oResourceType \SabreForRainLoop\DAV\Property\ResourceType */
if ($oResourceType && $oResourceType->is('{DAV:}collection') &&
$oResourceType->is('{urn:ietf:params:xml:ns:carddav}addressbook'))
{
$bGood = true;
}
}
}
}
if ($bGood)
{
$oClient->__UrlPath__ = $sPath;
}
return $bGood;
}
public function getDavClientFromUrl($sUrl, $sUser, $sPassword, $sProxy = '')
{
if (!\preg_match('/^http[s]?:\/\//i', $sUrl))
{
$sUrl = \preg_replace('/^fruux\.com/i', 'dav.fruux.com', $sUrl);
$sUrl = \preg_replace('/^icloud\.com/i', 'contacts.icloud.com', $sUrl);
$sUrl = \preg_replace('/^gmail\.com/i', 'google.com', $sUrl);
if (\preg_match('/^(google\.|dav\.fruux\.com|contacts\.icloud\.com)/i', $sUrl))
{
$sUrl = 'https://'.$sUrl;
}
else
{
$sUrl = 'http://'.$sUrl;
}
}
$aUrl = \parse_url($sUrl); $aUrl = \parse_url($sUrl);
if (!\is_array($aUrl)) if (!\is_array($aUrl))
{ {
@ -238,17 +536,117 @@ class PdoAddressBook
$aSettings['proxy'] = $sProxy; $aSettings['proxy'] = $sProxy;
} }
$sPath = $aUrl['path']; $oClient = new \SabreForRainLoop\DAV\Client($aSettings);
$oClient->setVerifyPeer(false);
if (!\class_exists('Sabre\DAV\Client')) $oClient->__UrlPath__ = $aUrl['path'];
$this->oLogger->Write('DavClient: User: '.$aSettings['userName'].', Url: '.$sUrl, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
return $oClient;
}
/**
* @param string $sEmail
* @param string $sUrl
* @param string $sUser
* @param string $sPassword
* @param string $sProxy = ''
*
* @return bool
*/
public function getDavClient($sUrl, $sUser, $sPassword, $sProxy = '')
{
if (!\class_exists('SabreForRainLoop\DAV\Client'))
{ {
return false; return false;
} }
$oClient = new \Sabre\DAV\Client($aSettings); $oClient = $this->getDavClientFromUrl($sUrl, $sUser, $sPassword, $sProxy);
$oClient->setVerifyPeer(false); if (!$oClient)
{
return false;
}
$this->oLogger->Write('User: '.$aSettings['userName'].', Url: '.$sUrl, \MailSo\Log\Enumerations\Type::INFO, 'DAV'); $bGood = false;
$sPath = $oClient->__UrlPath__;
$bGood = false;
if ('' === $sPath || '/' === $sPath || !$this->checkContactsPath($oClient, $sPath))
{
$sNewPath = '';
$aPaths = $this->getContactsPaths($oClient, $sUser, $sPassword, $sProxy);
$this->oLogger->WriteDump($aPaths);
if (\is_array($aPaths))
{
if (1 < \count($aPaths))
{
foreach ($aPaths as $sKey => $sValue)
{
if (\in_array(\strtolower($sValue), array('contacts', 'default', 'addressbook', 'address book')))
{
$sNewPath = $sKey;
break;
}
}
}
if (empty($sNewPath))
{
foreach ($aPaths as $sKey => $sValue)
{
$sNewPath = $sKey;
break;
}
}
}
$sPath = $sNewPath;
$bGood = $this->checkContactsPath($oClient, $sPath);
}
else
{
$bGood = true;
}
if (!$bGood)
{
$oClient = false;
}
return $oClient;
}
/**
* @param string $sEmail
* @param string $sUrl
* @param string $sUser
* @param string $sPassword
* @param string $sProxy = ''
*
* @return bool
*/
public function Sync($sEmail, $sUrl, $sUser, $sPassword, $sProxy = '')
{
$this->SyncDatabase();
$iUserID = $this->getUserId($sEmail);
if (0 >= $iUserID)
{
return false;
}
$oClient = $this->getDavClient($sUrl, $sUser, $sPassword, $sProxy);
if (!$oClient)
{
return false;
}
$sPath = $oClient->__UrlPath__;
$aRemoteSyncData = $this->prepearRemoteSyncData($oClient, $sPath); $aRemoteSyncData = $this->prepearRemoteSyncData($oClient, $sPath);
if (false === $aRemoteSyncData) if (false === $aRemoteSyncData)
@ -258,8 +656,8 @@ class PdoAddressBook
$aDatabaseSyncData = $this->prepearDatabaseSyncData($iUserID); $aDatabaseSyncData = $this->prepearDatabaseSyncData($iUserID);
// $this->oLogger->WriteDump($aDatabaseSyncData);
// $this->oLogger->WriteDump($aRemoteSyncData); // $this->oLogger->WriteDump($aRemoteSyncData);
// $this->oLogger->WriteDump($aDatabaseSyncData);
//+++del (from carddav) //+++del (from carddav)
foreach ($aDatabaseSyncData as $sKey => $aData) foreach ($aDatabaseSyncData as $sKey => $aData)
@ -315,10 +713,13 @@ class PdoAddressBook
{ {
$sExsistensBody = \trim($oResponse['body']); $sExsistensBody = \trim($oResponse['body']);
} }
// $this->oLogger->WriteDump($sExsistensBody);
} }
$oResponse = $this->davClientRequest($oClient, 'PUT', $oResponse = $this->davClientRequest($oClient, 'PUT',
$sPath.$oContact->CardDavNameUri(), $oContact->ToVCard($sExsistensBody, $this->oLogger)."\r\n\r\n"); $sPath.(0 < \strlen($mExsistenRemoteID) ? $mExsistenRemoteID : $oContact->CardDavNameUri()),
$oContact->ToVCard($sExsistensBody, $this->oLogger)."\r\n\r\n");
if ($oResponse && isset($oResponse['headers'], $oResponse['headers']['etag'])) if ($oResponse && isset($oResponse['headers'], $oResponse['headers']['etag']))
{ {

View file

@ -193,6 +193,7 @@ class Service
$sResult .= '<!--'; $sResult .= '<!--';
$sResult .= ' [version:'.APP_VERSION; $sResult .= ' [version:'.APP_VERSION;
$sResult .= '][lic:'.($this->oActions->IsOpen() ? 'agpl' : 'cc');
$sResult .= '][time:'.\substr(\microtime(true) - APP_START, 0, 6); $sResult .= '][time:'.\substr(\microtime(true) - APP_START, 0, 6);
$sResult .= '][cached:'.($bCached ? 'true' : 'false'); $sResult .= '][cached:'.($bCached ? 'true' : 'false');
$sResult .= '][hash:'.$aTemplateParameters['{{BaseHash}}']; $sResult .= '][hash:'.$aTemplateParameters['{{BaseHash}}'];

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Backend; namespace SabreForRainLoop\CalDAV\Backend;
use Sabre\VObject; use SabreForRainLoop\VObject;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* Abstract Calendaring backend. Extend this class to create your own backends. * Abstract Calendaring backend. Extend this class to create your own backends.
@ -70,7 +70,7 @@ abstract class AbstractBackend implements BackendInterface {
* query. * query.
* *
* The list of filters are specified as an array. The exact array is * The list of filters are specified as an array. The exact array is
* documented by \Sabre\CalDAV\CalendarQueryParser. * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser.
* *
* Note that it is extremely likely that getCalendarObject for every path * Note that it is extremely likely that getCalendarObject for every path
* returned from this method will be called almost immediately after. You * returned from this method will be called almost immediately after. You
@ -99,7 +99,7 @@ abstract class AbstractBackend implements BackendInterface {
* time-range filter specified on a VEVENT must for instance also handle * time-range filter specified on a VEVENT must for instance also handle
* recurrence rules correctly. * recurrence rules correctly.
* A good example of how to interprete all these filters can also simply * A good example of how to interprete all these filters can also simply
* be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct
* as possible, so it gives you a good idea on what type of stuff you need * as possible, so it gives you a good idea on what type of stuff you need
* to think of. * to think of.
* *
@ -112,7 +112,7 @@ abstract class AbstractBackend implements BackendInterface {
$result = array(); $result = array();
$objects = $this->getCalendarObjects($calendarId); $objects = $this->getCalendarObjects($calendarId);
$validator = new \Sabre\CalDAV\CalendarQueryValidator(); $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator();
foreach($objects as $object) { foreach($objects as $object) {

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV\Backend; namespace SabreForRainLoop\CalDAV\Backend;
/** /**
* Every CalDAV backend must at least implement this interface. * Every CalDAV backend must at least implement this interface.
@ -191,7 +191,7 @@ interface BackendInterface {
* query. * query.
* *
* The list of filters are specified as an array. The exact array is * The list of filters are specified as an array. The exact array is
* documented by Sabre\CalDAV\CalendarQueryParser. * documented by SabreForRainLoop\CalDAV\CalendarQueryParser.
* *
* Note that it is extremely likely that getCalendarObject for every path * Note that it is extremely likely that getCalendarObject for every path
* returned from this method will be called almost immediately after. You * returned from this method will be called almost immediately after. You
@ -220,7 +220,7 @@ interface BackendInterface {
* time-range filter specified on a VEVENT must for instance also handle * time-range filter specified on a VEVENT must for instance also handle
* recurrence rules correctly. * recurrence rules correctly.
* A good example of how to interprete all these filters can also simply * A good example of how to interprete all these filters can also simply
* be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct * be found in SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct
* as possible, so it gives you a good idea on what type of stuff you need * as possible, so it gives you a good idea on what type of stuff you need
* to think of. * to think of.
* *

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV\Backend; namespace SabreForRainLoop\CalDAV\Backend;
/** /**
* Adds caldav notification support to a backend. * Adds caldav notification support to a backend.
@ -26,7 +26,7 @@ interface NotificationSupport extends BackendInterface {
* Returns a list of notifications for a given principal url. * Returns a list of notifications for a given principal url.
* *
* The returned array should only consist of implementations of * The returned array should only consist of implementations of
* \Sabre\CalDAV\Notifications\INotificationType. * \SabreForRainLoop\CalDAV\Notifications\INotificationType.
* *
* @param string $principalUri * @param string $principalUri
* @return array * @return array
@ -39,9 +39,9 @@ interface NotificationSupport extends BackendInterface {
* This may be called by a client once it deems a notification handled. * This may be called by a client once it deems a notification handled.
* *
* @param string $principalUri * @param string $principalUri
* @param \Sabre\CalDAV\Notifications\INotificationType $notification * @param \SabreForRainLoop\CalDAV\Notifications\INotificationType $notification
* @return void * @return void
*/ */
public function deleteNotification($principalUri, \Sabre\CalDAV\Notifications\INotificationType $notification); public function deleteNotification($principalUri, \SabreForRainLoop\CalDAV\Notifications\INotificationType $notification);
} }

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV\Backend; namespace SabreForRainLoop\CalDAV\Backend;
use Sabre\VObject; use SabreForRainLoop\VObject;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* PDO CalDAV backend * PDO CalDAV backend
@ -175,7 +175,7 @@ class PDO extends AbstractBackend {
$values[':components'] = 'VEVENT,VTODO'; $values[':components'] = 'VEVENT,VTODO';
} else { } else {
if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) { if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) {
throw new DAV\Exception('The ' . $sccs . ' property must be of type: \Sabre\CalDAV\Property\SupportedCalendarComponentSet'); throw new DAV\Exception('The ' . $sccs . ' property must be of type: \SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet');
} }
$values[':components'] = implode(',',$properties[$sccs]->getValue()); $values[':components'] = implode(',',$properties[$sccs]->getValue());
} }
@ -497,7 +497,7 @@ class PDO extends AbstractBackend {
} }
} }
if (!$componentType) { if (!$componentType) {
throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
} }
if ($componentType === 'VEVENT') { if ($componentType === 'VEVENT') {
$firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
@ -572,7 +572,7 @@ class PDO extends AbstractBackend {
* query. * query.
* *
* The list of filters are specified as an array. The exact array is * The list of filters are specified as an array. The exact array is
* documented by \Sabre\CalDAV\CalendarQueryParser. * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser.
* *
* Note that it is extremely likely that getCalendarObject for every path * Note that it is extremely likely that getCalendarObject for every path
* returned from this method will be called almost immediately after. You * returned from this method will be called almost immediately after. You
@ -601,7 +601,7 @@ class PDO extends AbstractBackend {
* time-range filter specified on a VEVENT must for instance also handle * time-range filter specified on a VEVENT must for instance also handle
* recurrence rules correctly. * recurrence rules correctly.
* A good example of how to interprete all these filters can also simply * A good example of how to interprete all these filters can also simply
* be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct
* as possible, so it gives you a good idea on what type of stuff you need * as possible, so it gives you a good idea on what type of stuff you need
* to think of. * to think of.
* *
@ -615,7 +615,7 @@ class PDO extends AbstractBackend {
public function calendarQuery($calendarId, array $filters) { public function calendarQuery($calendarId, array $filters) {
$result = array(); $result = array();
$validator = new \Sabre\CalDAV\CalendarQueryValidator(); $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator();
$componentType = null; $componentType = null;
$requirePostFilter = true; $requirePostFilter = true;

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV\Backend; namespace SabreForRainLoop\CalDAV\Backend;
/** /**
* Adds support for sharing features to a CalDAV server. * Adds support for sharing features to a CalDAV server.
@ -65,12 +65,12 @@ namespace Sabre\CalDAV\Backend;
* change. * change.
* This notification is always represented by: * This notification is always represented by:
* *
* Sabre\CalDAV\Notifications\Notification\Invite * SabreForRainLoop\CalDAV\Notifications\Notification\Invite
* *
* In the case of an invite, the sharee may reply with an 'accept' or * In the case of an invite, the sharee may reply with an 'accept' or
* 'decline'. These are always represented by: * 'decline'. These are always represented by:
* *
* Sabre\CalDAV\Notifications\Notification\Invite * SabreForRainLoop\CalDAV\Notifications\Notification\Invite
* *
* *
* Calendar access by sharees * Calendar access by sharees
@ -156,7 +156,7 @@ namespace Sabre\CalDAV\Backend;
* Selectively disabling publish or share feature * Selectively disabling publish or share feature
* ============================================== * ==============================================
* *
* If Sabre\CalDAV\Property\AllowedSharingModes is returned from * If SabreForRainLoop\CalDAV\Property\AllowedSharingModes is returned from
* getCalendarsByUser, this allows the server to specify whether either sharing, * getCalendarsByUser, this allows the server to specify whether either sharing,
* or publishing is supported. * or publishing is supported.
* *
@ -202,7 +202,7 @@ interface SharingSupport extends NotificationSupport {
* Every element in this array should have the following properties: * Every element in this array should have the following properties:
* * href - Often a mailto: address * * href - Often a mailto: address
* * commonName - Optional, for example a first + last name * * commonName - Optional, for example a first + last name
* * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants.
* * readOnly - boolean * * readOnly - boolean
* * summary - Optional, a description for the share * * summary - Optional, a description for the share
* *

View file

@ -1,15 +1,15 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* This object represents a CalDAV calendar. * This object represents a CalDAV calendar.
* *
* A calendar can contain multiple TODO and or Events. These are represented * A calendar can contain multiple TODO and or Events. These are represented
* as \Sabre\CalDAV\CalendarObject objects. * as \SabreForRainLoop\CalDAV\CalendarObject objects.
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
@ -103,7 +103,7 @@ class Calendar implements ICalendar, DAV\IProperties, DAVACL\IACL {
* The contained calendar objects are for example Events or Todo's. * The contained calendar objects are for example Events or Todo's.
* *
* @param string $name * @param string $name
* @return \Sabre\CalDAV\ICalendarObject * @return \SabreForRainLoop\CalDAV\ICalendarObject
*/ */
public function getChild($name) { public function getChild($name) {
@ -323,7 +323,7 @@ class Calendar implements ICalendar, DAV\IProperties, DAVACL\IACL {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,
@ -362,7 +362,7 @@ class Calendar implements ICalendar, DAV\IProperties, DAVACL\IACL {
* query. * query.
* *
* The list of filters are specified as an array. The exact array is * The list of filters are specified as an array. The exact array is
* documented by Sabre\CalDAV\CalendarQueryParser. * documented by SabreForRainLoop\CalDAV\CalendarQueryParser.
* *
* @param array $filters * @param array $filters
* @return array * @return array

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
/** /**
* The CalendarObject represents a single VEVENT or VTODO within a Calendar. * The CalendarObject represents a single VEVENT or VTODO within a Calendar.
@ -9,12 +9,12 @@ namespace Sabre\CalDAV;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\DAVACL\IACL { class CalendarObject extends \SabreForRainLoop\DAV\File implements ICalendarObject, \SabreForRainLoop\DAVACL\IACL {
/** /**
* Sabre\CalDAV\Backend\BackendInterface * SabreForRainLoop\CalDAV\Backend\BackendInterface
* *
* @var Sabre\CalDAV\Backend\AbstractBackend * @var SabreForRainLoop\CalDAV\Backend\AbstractBackend
*/ */
protected $caldavBackend; protected $caldavBackend;
@ -253,7 +253,7 @@ class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\
*/ */
public function setACL(array $acl) { public function setACL(array $acl) {
throw new \Sabre\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); throw new \SabreForRainLoop\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
} }
@ -261,7 +261,7 @@ class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\VObject; use SabreForRainLoop\VObject;
/** /**
* Parses the calendar-query report request body. * Parses the calendar-query report request body.
@ -84,16 +84,16 @@ class CalendarQueryParser {
$filter = $this->xpath->query('/cal:calendar-query/cal:filter'); $filter = $this->xpath->query('/cal:calendar-query/cal:filter');
if ($filter->length !== 1) { if ($filter->length !== 1) {
throw new \Sabre\DAV\Exception\BadRequest('Only one filter element is allowed'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('Only one filter element is allowed');
} }
$compFilters = $this->parseCompFilters($filter->item(0)); $compFilters = $this->parseCompFilters($filter->item(0));
if (count($compFilters)!==1) { if (count($compFilters)!==1) {
throw new \Sabre\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.');
} }
$this->filters = $compFilters[0]; $this->filters = $compFilters[0];
$this->requestedProperties = array_keys(\Sabre\DAV\XMLUtil::parseProperties($this->dom->firstChild)); $this->requestedProperties = array_keys(\SabreForRainLoop\DAV\XMLUtil::parseProperties($this->dom->firstChild));
$expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand'); $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand');
if ($expand->length>0) { if ($expand->length>0) {
@ -132,7 +132,7 @@ class CalendarQueryParser {
'VFREEBUSY', 'VFREEBUSY',
'VALARM', 'VALARM',
))) { ))) {
throw new \Sabre\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component');
}; };
$result[] = $compFilter; $result[] = $compFilter;
@ -253,7 +253,7 @@ class CalendarQueryParser {
} }
if (!is_null($start) && !is_null($end) && $end <= $start) { if (!is_null($start) && !is_null($end) && $end <= $start) {
throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter');
} }
return array( return array(
@ -273,19 +273,19 @@ class CalendarQueryParser {
$start = $parentNode->getAttribute('start'); $start = $parentNode->getAttribute('start');
if(!$start) { if(!$start) {
throw new \Sabre\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element');
} }
$start = VObject\DateTimeParser::parseDateTime($start); $start = VObject\DateTimeParser::parseDateTime($start);
$end = $parentNode->getAttribute('end'); $end = $parentNode->getAttribute('end');
if(!$end) { if(!$end) {
throw new \Sabre\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element');
} }
$end = VObject\DateTimeParser::parseDateTime($end); $end = VObject\DateTimeParser::parseDateTime($end);
if ($end <= $start) { if ($end <= $start) {
throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.');
} }
return array( return array(

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\VObject; use SabreForRainLoop\VObject;
use DateTime; use DateTime;
/** /**
@ -23,7 +23,7 @@ class CalendarQueryValidator {
/** /**
* Verify if a list of filters applies to the calendar data object * Verify if a list of filters applies to the calendar data object
* *
* The list of filters must be formatted as parsed by \Sabre\CalDAV\CalendarQueryParser * The list of filters must be formatted as parsed by \SabreForRainLoop\CalDAV\CalendarQueryParser
* *
* @param VObject\Component $vObject * @param VObject\Component $vObject
* @param array $filters * @param array $filters
@ -273,7 +273,7 @@ class CalendarQueryValidator {
$check = (string)$check; $check = (string)$check;
} }
$isMatching = \Sabre\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']); $isMatching = \SabreForRainLoop\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']);
return ($textMatch['negate-condition'] xor $isMatching); return ($textMatch['negate-condition'] xor $isMatching);
@ -369,7 +369,7 @@ class CalendarQueryValidator {
} }
case 'VFREEBUSY' : case 'VFREEBUSY' :
throw new \Sabre\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components'); throw new \SabreForRainLoop\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components');
case 'COMPLETED' : case 'COMPLETED' :
case 'CREATED' : case 'CREATED' :
@ -383,7 +383,7 @@ class CalendarQueryValidator {
default : default :
throw new \Sabre\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component'); throw new \SabreForRainLoop\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component');
} }

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAVACL\PrincipalBackend; use SabreForRainLoop\DAVACL\PrincipalBackend;
/** /**
* Calendars collection * Calendars collection
@ -14,12 +14,12 @@ use Sabre\DAVACL\PrincipalBackend;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection { class CalendarRootNode extends \SabreForRainLoop\DAVACL\AbstractPrincipalCollection {
/** /**
* CalDAV backend * CalDAV backend
* *
* @var Sabre\CalDAV\Backend\BackendInterface * @var SabreForRainLoop\CalDAV\Backend\BackendInterface
*/ */
protected $caldavBackend; protected $caldavBackend;
@ -48,7 +48,7 @@ class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
* Returns the nodename * Returns the nodename
* *
* We're overriding this, because the default will be the 'principalPrefix', * We're overriding this, because the default will be the 'principalPrefix',
* and we want it to be Sabre\CalDAV\Plugin::CALENDAR_ROOT * and we want it to be SabreForRainLoop\CalDAV\Plugin::CALENDAR_ROOT
* *
* @return string * @return string
*/ */
@ -66,7 +66,7 @@ class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
* supplied by the authentication backend. * supplied by the authentication backend.
* *
* @param array $principal * @param array $principal
* @return \Sabre\DAV\INode * @return \SabreForRainLoop\DAV\INode
*/ */
public function getChildForPrincipal(array $principal) { public function getChildForPrincipal(array $principal) {

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Exception; namespace SabreForRainLoop\CalDAV\Exception;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* InvalidComponentType * InvalidComponentType

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\VObject; use SabreForRainLoop\VObject;
/** /**
* ICS Exporter * ICS Exporter
@ -21,14 +21,14 @@ class ICSExportPlugin extends DAV\ServerPlugin {
/** /**
* Reference to Server class * Reference to Server class
* *
* @var \Sabre\DAV\Server * @var \SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;
/** /**
* Initializes the plugin and registers event handlers * Initializes the plugin and registers event handlers
* *
* @param \Sabre\DAV\Server $server * @param \SabreForRainLoop\DAV\Server $server
* @return void * @return void
*/ */
public function initialize(DAV\Server $server) { public function initialize(DAV\Server $server) {

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* Calendar interface * Calendar interface
@ -26,7 +26,7 @@ interface ICalendar extends DAV\ICollection {
* query. * query.
* *
* The list of filters are specified as an array. The exact array is * The list of filters are specified as an array. The exact array is
* documented by \Sabre\CalDAV\CalendarQueryParser. * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser.
* *
* @param array $filters * @param array $filters
* @return array * @return array

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* CalendarObject interface * CalendarObject interface

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
/** /**
* This interface represents a Calendar that can be shared with other users. * This interface represents a Calendar that can be shared with other users.
@ -37,7 +37,7 @@ interface IShareableCalendar extends ICalendar {
* Every element in this array should have the following properties: * Every element in this array should have the following properties:
* * href - Often a mailto: address * * href - Often a mailto: address
* * commonName - Optional, for example a first + last name * * commonName - Optional, for example a first + last name
* * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants.
* * readOnly - boolean * * readOnly - boolean
* * summary - Optional, a description for the share * * summary - Optional, a description for the share
* *

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
/** /**
* This interface represents a Calendar that is shared by a different user. * This interface represents a Calendar that is shared by a different user.
@ -25,7 +25,7 @@ interface ISharedCalendar extends ICalendar {
* Every element in this array should have the following properties: * Every element in this array should have the following properties:
* * href - Often a mailto: address * * href - Often a mailto: address
* * commonName - Optional, for example a first + last name * * commonName - Optional, for example a first + last name
* * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants.
* * readOnly - boolean * * readOnly - boolean
* * summary - Optional, a description for the share * * summary - Optional, a description for the share
* *

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV\Notifications; namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* This node represents a list of notifications. * This node represents a list of notifications.
@ -13,7 +13,7 @@ use Sabre\DAVACL;
* interface to allow the Notifications plugin to mark the collection * interface to allow the Notifications plugin to mark the collection
* as a notifications collection. * as a notifications collection.
* *
* This collection should only return Sabre\CalDAV\Notifications\INode nodes as * This collection should only return SabreForRainLoop\CalDAV\Notifications\INode nodes as
* its children. * its children.
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
@ -25,7 +25,7 @@ class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
/** /**
* The notification backend * The notification backend
* *
* @var Sabre\CalDAV\Backend\NotificationSupport * @var SabreForRainLoop\CalDAV\Backend\NotificationSupport
*/ */
protected $caldavBackend; protected $caldavBackend;
@ -156,7 +156,7 @@ class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Notifications; namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This node represents a list of notifications. * This node represents a list of notifications.
@ -11,7 +11,7 @@ use Sabre\DAV;
* interface to allow the Notifications plugin to mark the collection * interface to allow the Notifications plugin to mark the collection
* as a notifications collection. * as a notifications collection.
* *
* This collection should only return Sabre\CalDAV\Notifications\INode nodes as * This collection should only return SabreForRainLoop\CalDAV\Notifications\INode nodes as
* its children. * its children.
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).

View file

@ -1,11 +1,11 @@
<?php <?php
namespace Sabre\CalDAV\Notifications; namespace SabreForRainLoop\CalDAV\Notifications;
/** /**
* This node represents a single notification. * This node represents a single notification.
* *
* The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method * The signature is mostly identical to that of SabreForRainLoop\DAV\IFile, but the get() method
* MUST return an xml document that matches the requirements of the * MUST return an xml document that matches the requirements of the
* 'caldav-notifications.txt' spec. * 'caldav-notifications.txt' spec.
* *
@ -20,7 +20,7 @@ interface INode {
/** /**
* This method must return an xml element, using the * This method must return an xml element, using the
* Sabre\CalDAV\Notifications\INotificationType classes. * SabreForRainLoop\CalDAV\Notifications\INotificationType classes.
* *
* @return INotificationType * @return INotificationType
*/ */

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\CalDAV\Notifications; namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This interface reflects a single notification type. * This interface reflects a single notification type.

View file

@ -1,15 +1,15 @@
<?php <?php
namespace Sabre\CalDAV\Notifications; namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* This node represents a single notification. * This node represents a single notification.
* *
* The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method * The signature is mostly identical to that of SabreForRainLoop\DAV\IFile, but the get() method
* MUST return an xml document that matches the requirements of the * MUST return an xml document that matches the requirements of the
* 'caldav-notifications.txt' spec. * 'caldav-notifications.txt' spec.
@ -22,14 +22,14 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/** /**
* The notification backend * The notification backend
* *
* @var Sabre\CalDAV\Backend\NotificationSupport * @var SabreForRainLoop\CalDAV\Backend\NotificationSupport
*/ */
protected $caldavBackend; protected $caldavBackend;
/** /**
* The actual notification * The actual notification
* *
* @var Sabre\CalDAV\Notifications\INotificationType * @var SabreForRainLoop\CalDAV\Notifications\INotificationType
*/ */
protected $notification; protected $notification;
@ -81,7 +81,7 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/** /**
* This method must return an xml element, using the * This method must return an xml element, using the
* Sabre\CalDAV\Notifications\INotificationType classes. * SabreForRainLoop\CalDAV\Notifications\INotificationType classes.
* *
* @return INotificationType * @return INotificationType
*/ */
@ -175,7 +175,7 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV\Notifications\Notification; namespace SabreForRainLoop\CalDAV\Notifications\Notification;
use Sabre\CalDAV\SharingPlugin as SharingPlugin; use SabreForRainLoop\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* This class represents the cs:invite-notification notification element. * This class represents the cs:invite-notification notification element.
@ -103,7 +103,7 @@ class Invite extends DAV\Property implements CalDAV\Notifications\INotificationT
/** /**
* The list of supported components * The list of supported components
* *
* @var Sabre\CalDAV\Property\SupportedCalendarComponentSet * @var SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet
*/ */
protected $supportedComponents; protected $supportedComponents;
@ -127,7 +127,7 @@ class Invite extends DAV\Property implements CalDAV\Notifications\INotificationT
* * summary - Description of the share, can be the same as the * * summary - Description of the share, can be the same as the
* calendar, but may also be modified (optional). * calendar, but may also be modified (optional).
* * supportedComponents - An instance of * * supportedComponents - An instance of
* Sabre\CalDAV\Property\SupportedCalendarComponentSet. * SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet.
* This allows the client to determine which components * This allows the client to determine which components
* will be supported in the shared calendar. This is * will be supported in the shared calendar. This is
* also optional. * also optional.

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV\Notifications\Notification; namespace SabreForRainLoop\CalDAV\Notifications\Notification;
use Sabre\CalDAV\SharingPlugin as SharingPlugin; use SabreForRainLoop\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* This class represents the cs:invite-reply notification element. * This class represents the cs:invite-reply notification element.

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Notifications\Notification; namespace SabreForRainLoop\CalDAV\Notifications\Notification;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* SystemStatus notification * SystemStatus notification

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
use Sabre\VObject; use SabreForRainLoop\VObject;
/** /**
* CalDAV plugin * CalDAV plugin
@ -171,14 +171,14 @@ class Plugin extends DAV\ServerPlugin {
$server->xmlNamespaces[self::NS_CALDAV] = 'cal'; $server->xmlNamespaces[self::NS_CALDAV] = 'cal';
$server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs';
$server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre\\CalDAV\\Property\\SupportedCalendarComponentSet'; $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'SabreForRainLoop\\CalDAV\\Property\\SupportedCalendarComponentSet';
$server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre\\CalDAV\\Property\\ScheduleCalendarTransp'; $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'SabreForRainLoop\\CalDAV\\Property\\ScheduleCalendarTransp';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification';
array_push($server->protectedProperties, array_push($server->protectedProperties,
@ -286,7 +286,7 @@ class Plugin extends DAV\ServerPlugin {
// for clients matching iCal in the user agent // for clients matching iCal in the user agent
//$ua = $this->server->httpRequest->getHeader('User-Agent'); //$ua = $this->server->httpRequest->getHeader('User-Agent');
//if (strpos($ua,'iCal/')!==false) { //if (strpos($ua,'iCal/')!==false) {
// throw new \Sabre\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); // throw new \SabreForRainLoop\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.');
//} //}
$body = $this->server->httpRequest->getBody(true); $body = $this->server->httpRequest->getBody(true);

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* Principal collection * Principal collection

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* ProxyRead principal interface * ProxyRead principal interface

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* ProxyWrite principal interface * ProxyWrite principal interface

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* ProxyRead principal * ProxyRead principal

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* ProxyWrite principal * ProxyWrite principal

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Principal; namespace SabreForRainLoop\CalDAV\Principal;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* CalDAV principal * CalDAV principal

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* AllowedSharingModes * AllowedSharingModes

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\CalDAV\SharingPlugin as SharingPlugin; use SabreForRainLoop\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* Invite property * Invite property

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* schedule-calendar-transp property. * schedule-calendar-transp property.

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
/** /**
* Supported component set property * Supported component set property

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV\Plugin; use SabreForRainLoop\CalDAV\Plugin;
/** /**
* Supported-calendar-data property * Supported-calendar-data property

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\CalDAV\Property; namespace SabreForRainLoop\CalDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* supported-collation-set property * supported-collation-set property

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Schedule; namespace SabreForRainLoop\CalDAV\Schedule;
use Sabre\VObject; use SabreForRainLoop\VObject;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* iMIP handler. * iMIP handler.

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV\Schedule; namespace SabreForRainLoop\CalDAV\Schedule;
/** /**
* Implement this interface to have a node be recognized as a CalDAV scheduling * Implement this interface to have a node be recognized as a CalDAV scheduling
@ -10,7 +10,7 @@ namespace Sabre\CalDAV\Schedule;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
interface IOutbox extends \Sabre\DAV\ICollection, \Sabre\DAVACL\IACL { interface IOutbox extends \SabreForRainLoop\DAV\ICollection, \SabreForRainLoop\DAVACL\IACL {
} }

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV\Schedule; namespace SabreForRainLoop\CalDAV\Schedule;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CalDAV; use SabreForRainLoop\CalDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* The CalDAV scheduling outbox * The CalDAV scheduling outbox
@ -52,7 +52,7 @@ class Outbox extends DAV\Collection implements IOutbox {
/** /**
* Returns an array with all the child nodes * Returns an array with all the child nodes
* *
* @return \Sabre\DAV\INode[] * @return \SabreForRainLoop\DAV\INode[]
*/ */
public function getChildren() { public function getChildren() {
@ -138,7 +138,7 @@ class Outbox extends DAV\Collection implements IOutbox {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
/** /**
* This object represents a CalDAV calendar that can be shared with other * This object represents a CalDAV calendar that can be shared with other
@ -42,7 +42,7 @@ class ShareableCalendar extends Calendar implements IShareableCalendar {
* Every element in this array should have the following properties: * Every element in this array should have the following properties:
* * href - Often a mailto: address * * href - Often a mailto: address
* * commonName - Optional, for example a first + last name * * commonName - Optional, for example a first + last name
* * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants.
* * readOnly - boolean * * readOnly - boolean
* * summary - Optional, a description for the share * * summary - Optional, a description for the share
* *

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* This object represents a CalDAV calendar that is shared by a different user. * This object represents a CalDAV calendar that is shared by a different user.
@ -101,7 +101,7 @@ class SharedCalendar extends Calendar implements ISharedCalendar {
* Every element in this array should have the following properties: * Every element in this array should have the following properties:
* * href - Often a mailto: address * * href - Often a mailto: address
* * commonName - Optional, for example a first + last name * * commonName - Optional, for example a first + last name
* * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants.
* * readOnly - boolean * * readOnly - boolean
* * summary - Optional, a description for the share * * summary - Optional, a description for the share
* *

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This plugin implements support for caldav sharing. * This plugin implements support for caldav sharing.
@ -11,7 +11,7 @@ use Sabre\DAV;
* http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt * http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt
* *
* See: * See:
* Sabre\CalDAV\Backend\SharingSupport for all the documentation. * SabreForRainLoop\CalDAV\Backend\SharingSupport for all the documentation.
* *
* Note: This feature is experimental, and may change in between different * Note: This feature is experimental, and may change in between different
* SabreDAV versions. * SabreDAV versions.
@ -34,7 +34,7 @@ class SharingPlugin extends DAV\ServerPlugin {
/** /**
* Reference to SabreDAV server object. * Reference to SabreDAV server object.
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;
@ -56,7 +56,7 @@ class SharingPlugin extends DAV\ServerPlugin {
* Returns a plugin name. * Returns a plugin name.
* *
* Using this name other plugins will be able to access other plugins * Using this name other plugins will be able to access other plugins
* using Sabre\DAV\Server::getPlugin * using SabreForRainLoop\DAV\Server::getPlugin
* *
* @return string * @return string
*/ */
@ -69,7 +69,7 @@ class SharingPlugin extends DAV\ServerPlugin {
/** /**
* This initializes the plugin. * This initializes the plugin.
* *
* This function is called by Sabre\DAV\Server, after * This function is called by SabreForRainLoop\DAV\Server, after
* addPlugin is called. * addPlugin is called.
* *
* This method should set up the required event subscriptions. * This method should set up the required event subscriptions.
@ -80,7 +80,7 @@ class SharingPlugin extends DAV\ServerPlugin {
public function initialize(DAV\Server $server) { public function initialize(DAV\Server $server) {
$this->server = $server; $this->server = $server;
$server->resourceTypeMapping['Sabre\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared'; $server->resourceTypeMapping['SabreForRainLoop\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared';
array_push( array_push(
$this->server->protectedProperties, $this->server->protectedProperties,

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* The UserCalenders class contains all calendars associated to one user * The UserCalenders class contains all calendars associated to one user
@ -17,7 +17,7 @@ class UserCalendars implements DAV\IExtendedCollection, DAVACL\IACL {
/** /**
* CalDAV backend * CalDAV backend
* *
* @var Sabre\CalDAV\Backend\BackendInterface * @var SabreForRainLoop\CalDAV\Backend\BackendInterface
*/ */
protected $caldavBackend; protected $caldavBackend;
@ -302,7 +302,7 @@ class UserCalendars implements DAV\IExtendedCollection, DAVACL\IACL {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CalDAV; namespace SabreForRainLoop\CalDAV;
/** /**
* This class contains the Sabre\CalDAV version constants. * This class contains the SabreForRainLoop\CalDAV version constants.
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* The AddressBook class represents a CardDAV addressbook, owned by a specific user * The AddressBook class represents a CardDAV addressbook, owned by a specific user
@ -298,7 +298,7 @@ class AddressBook extends DAV\Collection implements IAddressBook, DAV\IPropertie
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* Parses the addressbook-query report request body. * Parses the addressbook-query report request body.

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* AddressBook rootnode * AddressBook rootnode
@ -18,7 +18,7 @@ class AddressBookRoot extends DAVACL\AbstractPrincipalCollection {
/** /**
* Principal Backend * Principal Backend
* *
* @var Sabre\DAVACL\PrincipalBackend\BackendInteface * @var SabreForRainLoop\DAVACL\PrincipalBackend\BackendInteface
*/ */
protected $principalBackend; protected $principalBackend;
@ -69,7 +69,7 @@ class AddressBookRoot extends DAVACL\AbstractPrincipalCollection {
* supplied by the authentication backend. * supplied by the authentication backend.
* *
* @param array $principal * @param array $principal
* @return \Sabre\DAV\INode * @return \SabreForRainLoop\DAV\INode
*/ */
public function getChildForPrincipal(array $principal) { public function getChildForPrincipal(array $principal) {

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CardDAV\Backend; namespace SabreForRainLoop\CardDAV\Backend;
/** /**
* CardDAV abstract Backend * CardDAV abstract Backend

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CardDAV\Backend; namespace SabreForRainLoop\CardDAV\Backend;
/** /**
* CardDAV Backend Interface * CardDAV Backend Interface
@ -39,12 +39,12 @@ interface BackendInterface {
/** /**
* Updates an addressbook's properties * Updates an addressbook's properties
* *
* See Sabre\DAV\IProperties for a description of the mutations array, as * See SabreForRainLoop\DAV\IProperties for a description of the mutations array, as
* well as the return value. * well as the return value.
* *
* @param mixed $addressBookId * @param mixed $addressBookId
* @param array $mutations * @param array $mutations
* @see Sabre\DAV\IProperties::updateProperties * @see SabreForRainLoop\DAV\IProperties::updateProperties
* @return bool|array * @return bool|array
*/ */
public function updateAddressBook($addressBookId, array $mutations); public function updateAddressBook($addressBookId, array $mutations);

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV\Backend; namespace SabreForRainLoop\CardDAV\Backend;
use Sabre\CardDAV; use SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* PDO CardDAV backend * PDO CardDAV backend
@ -84,12 +84,12 @@ class PDO extends AbstractBackend {
/** /**
* Updates an addressbook's properties * Updates an addressbook's properties
* *
* See Sabre\DAV\IProperties for a description of the mutations array, as * See SabreForRainLoop\DAV\IProperties for a description of the mutations array, as
* well as the return value. * well as the return value.
* *
* @param mixed $addressBookId * @param mixed $addressBookId
* @param array $mutations * @param array $mutations
* @see Sabre\DAV\IProperties::updateProperties * @see SabreForRainLoop\DAV\IProperties::updateProperties
* @return bool|array * @return bool|array
*/ */
public function updateAddressBook($addressBookId, array $mutations) { public function updateAddressBook($addressBookId, array $mutations) {

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
@ -242,7 +242,7 @@ class Card extends DAV\File implements ICard, DAVACL\IACL {
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* AddressBook interface * AddressBook interface

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* Card interface * Card interface

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
/** /**
* IDirectory interface * IDirectory interface

View file

@ -1,10 +1,10 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
use Sabre\VObject; use SabreForRainLoop\VObject;
/** /**
* CardDAV plugin * CardDAV plugin
@ -38,7 +38,7 @@ class Plugin extends DAV\ServerPlugin {
/** /**
* Server class * Server class
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;
@ -64,8 +64,8 @@ class Plugin extends DAV\ServerPlugin {
$server->xmlNamespaces[self::NS_CARDDAV] = 'card'; $server->xmlNamespaces[self::NS_CARDDAV] = 'card';
/* Mapping Interfaces to {DAV:}resourcetype values */ /* Mapping Interfaces to {DAV:}resourcetype values */
$server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook';
$server->resourceTypeMapping['Sabre\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory';
/* Adding properties that may never be changed */ /* Adding properties that may never be changed */
$server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data';
@ -73,7 +73,7 @@ class Plugin extends DAV\ServerPlugin {
$server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set';
$server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set';
$server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'Sabre\\DAV\\Property\\Href'; $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'SabreForRainLoop\\DAV\\Property\\Href';
$this->server = $server; $this->server = $server;
@ -654,7 +654,7 @@ class Plugin extends DAV\ServerPlugin {
/** /**
* This method is used to generate HTML output for the * This method is used to generate HTML output for the
* Sabre\DAV\Browser\Plugin. This allows us to generate an interface users * SabreForRainLoop\DAV\Browser\Plugin. This allows us to generate an interface users
* can use to create new calendars. * can use to create new calendars.
* *
* @param DAV\INode $node * @param DAV\INode $node

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV\Property; namespace SabreForRainLoop\CardDAV\Property;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\CardDAV; use SabreForRainLoop\CardDAV;
/** /**
* Supported-address-data property * Supported-address-data property

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\DAVACL; use SabreForRainLoop\DAVACL;
/** /**
* UserAddressBooks class * UserAddressBooks class
@ -243,7 +243,7 @@ class UserAddressBooks extends DAV\Collection implements DAV\IExtendedCollection
* Returns the list of supported privileges for this node. * Returns the list of supported privileges for this node.
* *
* The returned data structure is a list of nested privileges. * The returned data structure is a list of nested privileges.
* See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
* standard structure. * standard structure.
* *
* If null is returned from this method, the default privilege set is used, * If null is returned from this method, the default privilege set is used,

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\VObject; use SabreForRainLoop\VObject;
/** /**
* VCF Exporter * VCF Exporter
@ -22,7 +22,7 @@ class VCFExportPlugin extends DAV\ServerPlugin {
/** /**
* Reference to Server class * Reference to Server class
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;

View file

@ -1,11 +1,11 @@
<?php <?php
namespace Sabre\CardDAV; namespace SabreForRainLoop\CardDAV;
/** /**
* Version Class * Version Class
* *
* This class contains the Sabre\CardDAV version information * This class contains the SabreForRainLoop\CardDAV version information
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
use Sabre\DAV; use SabreForRainLoop\DAV;
use Sabre\HTTP; use SabreForRainLoop\HTTP;
/** /**
* HTTP Basic authentication backend class * HTTP Basic authentication backend class

View file

@ -1,9 +1,9 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
use Sabre\HTTP; use SabreForRainLoop\HTTP;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* HTTP Digest authentication backend class * HTTP Digest authentication backend class

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* Apache authenticator * Apache authenticator

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
/** /**
* This is the base class for any authentication object. * This is the base class for any authentication object.
@ -17,11 +17,11 @@ interface BackendInterface {
* If authentication is successful, true must be returned. * If authentication is successful, true must be returned.
* If authentication fails, an exception must be thrown. * If authentication fails, an exception must be thrown.
* *
* @param \Sabre\DAV\Server $server * @param \SabreForRainLoop\DAV\Server $server
* @param string $realm * @param string $realm
* @return bool * @return bool
*/ */
function authenticate(\Sabre\DAV\Server $server,$realm); function authenticate(\SabreForRainLoop\DAV\Server $server,$realm);
/** /**
* Returns information about the currently logged in username. * Returns information about the currently logged in username.

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This is an authentication backend that uses a file to manage passwords. * This is an authentication backend that uses a file to manage passwords.

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV\Auth\Backend; namespace SabreForRainLoop\DAV\Auth\Backend;
/** /**
* This is an authentication backend that uses a file to manage passwords. * This is an authentication backend that uses a file to manage passwords.

View file

@ -1,7 +1,7 @@
<?php <?php
namespace Sabre\DAV\Auth; namespace SabreForRainLoop\DAV\Auth;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This plugin provides Authentication for a WebDAV server. * This plugin provides Authentication for a WebDAV server.
@ -21,7 +21,7 @@ class Plugin extends DAV\ServerPlugin {
/** /**
* Reference to main server object * Reference to main server object
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;
@ -100,7 +100,7 @@ class Plugin extends DAV\ServerPlugin {
* *
* @param string $method * @param string $method
* @param string $uri * @param string $uri
* @throws Sabre\DAV\Exception\NotAuthenticated * @throws SabreForRainLoop\DAV\Exception\NotAuthenticated
* @return bool * @return bool
*/ */
public function beforeMethod($method, $uri) { public function beforeMethod($method, $uri) {

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\DAV\Browser; namespace SabreForRainLoop\DAV\Browser;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* GuessContentType plugin * GuessContentType plugin

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\DAV\Browser; namespace SabreForRainLoop\DAV\Browser;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* This is a simple plugin that will map any GET request for non-files to * This is a simple plugin that will map any GET request for non-files to
@ -19,7 +19,7 @@ class MapGetToPropFind extends DAV\ServerPlugin {
/** /**
* reference to server class * reference to server class
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\DAV\Browser; namespace SabreForRainLoop\DAV\Browser;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* Browser Plugin * Browser Plugin
@ -31,12 +31,12 @@ class Plugin extends DAV\ServerPlugin {
* @var array * @var array
*/ */
public $iconMap = array( public $iconMap = array(
'Sabre\\DAV\\IFile' => 'icons/file', 'SabreForRainLoop\\DAV\\IFile' => 'icons/file',
'Sabre\\DAV\\ICollection' => 'icons/collection', 'SabreForRainLoop\\DAV\\ICollection' => 'icons/collection',
'Sabre\\DAVACL\\IPrincipal' => 'icons/principal', 'SabreForRainLoop\\DAVACL\\IPrincipal' => 'icons/principal',
'Sabre\\CalDAV\\ICalendar' => 'icons/calendar', 'SabreForRainLoop\\CalDAV\\ICalendar' => 'icons/calendar',
'Sabre\\CardDAV\\IAddressBook' => 'icons/addressbook', 'SabreForRainLoop\\CardDAV\\IAddressBook' => 'icons/addressbook',
'Sabre\\CardDAV\\ICard' => 'icons/card', 'SabreForRainLoop\\CardDAV\\ICard' => 'icons/card',
); );
/** /**
@ -49,7 +49,7 @@ class Plugin extends DAV\ServerPlugin {
/** /**
* reference to server class * reference to server class
* *
* @var Sabre\DAV\Server * @var SabreForRainLoop\DAV\Server
*/ */
protected $server; protected $server;
@ -400,7 +400,7 @@ class Plugin extends DAV\ServerPlugin {
// We also know fairly certain that if an object is a non-extended // We also know fairly certain that if an object is a non-extended
// SimpleCollection, we won't need to show the panel either. // SimpleCollection, we won't need to show the panel either.
if (get_class($node)==='Sabre\\DAV\\SimpleCollection') if (get_class($node)==='SabreForRainLoop\\DAV\\SimpleCollection')
return; return;
$output.= '<tr><td colspan="2"><form method="post" action=""> $output.= '<tr><td colspan="2"><form method="post" action="">

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV; namespace SabreForRainLoop\DAV;
/** /**
* SabreDAV DAV client * SabreDAV DAV client
@ -24,7 +24,7 @@ class Client {
* respective class. * respective class.
* *
* The {DAV:}resourcetype property is automatically added. This maps to * The {DAV:}resourcetype property is automatically added. This maps to
* Sabre\DAV\Property\ResourceType * SabreForRainLoop\DAV\Property\ResourceType
* *
* @var array * @var array
*/ */
@ -103,7 +103,7 @@ class Client {
$this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST;
} }
$this->propertyMap['{DAV:}resourcetype'] = 'Sabre\\DAV\\Property\\ResourceType'; $this->propertyMap['{DAV:}resourcetype'] = 'SabreForRainLoop\\DAV\\Property\\ResourceType';
} }
@ -376,6 +376,9 @@ class Client {
$curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password;
} }
// var_dump($url);
// var_dump($curlSettings);
list( list(
$response, $response,
$curlInfo, $curlInfo,
@ -383,9 +386,12 @@ class Client {
$curlError $curlError
) = $this->curlRequest($url, $curlSettings); ) = $this->curlRequest($url, $curlSettings);
// var_dump($response);
$headerBlob = substr($response, 0, $curlInfo['header_size']); $headerBlob = substr($response, 0, $curlInfo['header_size']);
$response = substr($response, $curlInfo['header_size']); $response = substr($response, $curlInfo['header_size']);
// In the case of 100 Continue, or redirects we'll have multiple lists // In the case of 100 Continue, or redirects we'll have multiple lists
// of headers for each separate HTTP response. We can easily split this // of headers for each separate HTTP response. We can easily split this
// because they are separated by \r\n\r\n // because they are separated by \r\n\r\n

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV; namespace SabreForRainLoop\DAV;
/** /**
* Collection class * Collection class
@ -21,7 +21,7 @@ abstract class Collection extends Node implements ICollection {
* nodes, and compares the name. * nodes, and compares the name.
* Generally its wise to override this, as this can usually be optimized * Generally its wise to override this, as this can usually be optimized
* *
* This method must throw Sabre\DAV\Exception\NotFound if the node does not * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not
* exist. * exist.
* *
* @param string $name * @param string $name

View file

@ -10,7 +10,7 @@
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
namespace Sabre\DAV; namespace SabreForRainLoop\DAV;
/** /**
* Main Exception class. * Main Exception class.

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV\Exception; namespace SabreForRainLoop\DAV\Exception;
/** /**
* BadRequest * BadRequest
@ -12,7 +12,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class BadRequest extends \Sabre\DAV\Exception { class BadRequest extends \SabreForRainLoop\DAV\Exception {
/** /**
* Returns the HTTP statuscode for this exception * Returns the HTTP statuscode for this exception

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV\Exception; namespace SabreForRainLoop\DAV\Exception;
/** /**
* Conflict * Conflict
@ -12,7 +12,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class Conflict extends \Sabre\DAV\Exception { class Conflict extends \SabreForRainLoop\DAV\Exception {
/** /**
* Returns the HTTP statuscode for this exception * Returns the HTTP statuscode for this exception

View file

@ -1,8 +1,8 @@
<?php <?php
namespace Sabre\DAV\Exception; namespace SabreForRainLoop\DAV\Exception;
use Sabre\DAV; use SabreForRainLoop\DAV;
/** /**
* ConflictingLock * ConflictingLock

View file

@ -1,16 +1,16 @@
<?php <?php
namespace Sabre\DAV\Exception; namespace SabreForRainLoop\DAV\Exception;
/** /**
* FileNotFound * FileNotFound
* *
* Deprecated: Warning, this class is deprecated and will be removed in a * Deprecated: Warning, this class is deprecated and will be removed in a
* future version of SabreDAV. Please use Sabre\DAV\Exception\NotFound instead. * future version of SabreDAV. Please use SabreForRainLoop\DAV\Exception\NotFound instead.
* *
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @deprecated Use Sabre\DAV\Exception\NotFound instead * @deprecated Use SabreForRainLoop\DAV\Exception\NotFound instead
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class FileNotFound extends NotFound { class FileNotFound extends NotFound {

View file

@ -1,6 +1,6 @@
<?php <?php
namespace Sabre\DAV\Exception; namespace SabreForRainLoop\DAV\Exception;
/** /**
* Forbidden * Forbidden
@ -11,7 +11,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/) * @author Evert Pot (http://evertpot.com/)
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class Forbidden extends \Sabre\DAV\Exception { class Forbidden extends \SabreForRainLoop\DAV\Exception {
/** /**
* Returns the HTTP statuscode for this exception * Returns the HTTP statuscode for this exception

Some files were not shown because too many files have changed in this diff Show more