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

View file

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

View file

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

View file

@ -22,7 +22,7 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH'))
function rainLoopSplAutoloadNamespaces()
{
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 ('Sabre' === $sNamespaceName && !RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED'))
if ('SabreForRainLoop' === $sNamespaceName && !RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED'))
{
\define('RL_MB_FIXED', true);
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());
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)
{
if (0 < \strlen(\trim($sWord)))
if (\is_string($sWord) && 0 < \strlen(\trim($sWord)))
{
$this->aSecretWords[] = $sWord;
$this->aSecretWords = \array_unique($this->aSecretWords);

View file

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

View file

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

View file

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

View file

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

View file

@ -10,7 +10,7 @@ class Property
* @var int
*/
public $IdProperty;
/**
* @var int
*/
@ -49,7 +49,7 @@ class Property
public function Clear()
{
$this->IdProperty = 0;
$this->Type = PropertyType::UNKNOWN;
$this->TypeStr = '';
@ -59,6 +59,15 @@ class Property
$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
*/
@ -66,7 +75,7 @@ class Property
{
return PropertyType::EMAIl === $this->Type;
}
/**
* @return bool
*/
@ -111,7 +120,7 @@ class Property
$this->Value = \trim($this->Value);
$this->ValueCustom = \trim($this->ValueCustom);
$this->TypeStr = \trim($this->TypeStr);
if (0 < \strlen($this->Value))
{
// lower
@ -120,6 +129,11 @@ class Property
$this->Value = \MailSo\Base\Utils::StrToLowerIfAscii($this->Value);
}
if ($this->IsName())
{
$this->Value = \preg_replace('/[\s]+/u', ' ', $this->Value);
}
// phones clear value for searching
if ($this->IsPhone())
{

View file

@ -6,8 +6,9 @@ class PropertyType
{
const UNKNOWN = 0;
const UID = 9;
const FULLNAME = 10;
const FIRST_NAME = 15;
const LAST_NAME = 16;
const MIDDLE_NAME = 17;
@ -21,7 +22,7 @@ class PropertyType
// const MOBILE = 32;
// const FAX = 33;
const WEB_PAGE = 32;
const BIRTHDAY = 40;
const FACEBOOK = 90;

View file

@ -117,11 +117,14 @@ class PdoAddressBook
try
{
$this->oLogger->Write('PROPFIND '.$sPath, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
$aResponse = $oClient->propFind($sPath, array(
'{DAV:}getlastmodified',
'{DAV:}resourcetype',
'{DAV:}getetag'
), 1);
// $this->oLogger->WriteDump($aResponse);
}
catch (\Exception $oException)
{
@ -137,10 +140,11 @@ class PdoAddressBook
if (!empty($sKey) && is_array($aItem))
{
$aItem = \array_change_key_case($aItem, \CASE_LOWER);
if (isset($aItem['{dav:}getetag'], $aItem['{dav:}getlastmodified']))
if (isset($aItem['{dav:}getetag']))
{
$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]));
$sKeyID = \preg_replace('/\.vcf$/i', '', $sVcfFileName);
@ -150,10 +154,23 @@ class PdoAddressBook
'uid' => $sKeyID,
'vcf' => $sVcfFileName,
'etag' => \trim(\trim($aItem['{dav:}getetag']), '"\''),
'lastmodified' => $aItem['{dav:}getlastmodified'],
'changed' => \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($aItem['{dav:}getlastmodified'])
'lastmodified' => '',
'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']);
}
}
@ -168,10 +185,10 @@ class PdoAddressBook
{
\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');
if ('PUT' === $sCmd)
if ('PUT' === $sCmd || 'POST' === $sCmd)
{
$this->oLogger->Write($mData, \MailSo\Log\Enumerations\Type::INFO, 'DAV');
}
@ -179,13 +196,21 @@ class PdoAddressBook
$oResponse = false;
try
{
$oResponse = 'PUT' === $sCmd && null !== $mData ?
$oClient->request($sCmd, $sUrl, $mData) : $oClient->request($sCmd, $sUrl);
if ('GET' === $sCmd && false)
if (('PUT' === $sCmd || 'POST' === $sCmd) && null !== $mData)
{
$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)
{
@ -196,24 +221,297 @@ class PdoAddressBook
}
/**
* @param string $sEmail
* @param string $sUrl
* @param \SabreForRainLoop\DAV\Client $oClient
* @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 $sPassword
* @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
*/
public function Sync($sEmail, $sUrl, $sUser, $sPassword, $sProxy = '')
private function checkContactsPath(&$oClient, $sPath)
{
$this->SyncDatabase();
$iUserID = $this->getUserId($sEmail);
if (0 >= $iUserID)
if (!$oClient)
{
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);
if (!\is_array($aUrl))
{
@ -238,17 +536,117 @@ class PdoAddressBook
$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;
}
$oClient = new \Sabre\DAV\Client($aSettings);
$oClient->setVerifyPeer(false);
$oClient = $this->getDavClientFromUrl($sUrl, $sUser, $sPassword, $sProxy);
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);
if (false === $aRemoteSyncData)
@ -258,8 +656,8 @@ class PdoAddressBook
$aDatabaseSyncData = $this->prepearDatabaseSyncData($iUserID);
// $this->oLogger->WriteDump($aDatabaseSyncData);
// $this->oLogger->WriteDump($aRemoteSyncData);
// $this->oLogger->WriteDump($aDatabaseSyncData);
//+++del (from carddav)
foreach ($aDatabaseSyncData as $sKey => $aData)
@ -315,10 +713,13 @@ class PdoAddressBook
{
$sExsistensBody = \trim($oResponse['body']);
}
// $this->oLogger->WriteDump($sExsistensBody);
}
$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']))
{

View file

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

View file

@ -1,9 +1,9 @@
<?php
namespace Sabre\CalDAV\Backend;
namespace SabreForRainLoop\CalDAV\Backend;
use Sabre\VObject;
use Sabre\CalDAV;
use SabreForRainLoop\VObject;
use SabreForRainLoop\CalDAV;
/**
* Abstract Calendaring backend. Extend this class to create your own backends.
@ -70,7 +70,7 @@ abstract class AbstractBackend implements BackendInterface {
* query.
*
* 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
* 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
* recurrence rules correctly.
* 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
* to think of.
*
@ -112,7 +112,7 @@ abstract class AbstractBackend implements BackendInterface {
$result = array();
$objects = $this->getCalendarObjects($calendarId);
$validator = new \Sabre\CalDAV\CalendarQueryValidator();
$validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator();
foreach($objects as $object) {

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV\Backend;
namespace SabreForRainLoop\CalDAV\Backend;
/**
* Every CalDAV backend must at least implement this interface.
@ -191,7 +191,7 @@ interface BackendInterface {
* query.
*
* 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
* 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
* recurrence rules correctly.
* 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
* to think of.
*

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV\Backend;
namespace SabreForRainLoop\CalDAV\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.
*
* The returned array should only consist of implementations of
* \Sabre\CalDAV\Notifications\INotificationType.
* \SabreForRainLoop\CalDAV\Notifications\INotificationType.
*
* @param string $principalUri
* @return array
@ -39,9 +39,9 @@ interface NotificationSupport extends BackendInterface {
* This may be called by a client once it deems a notification handled.
*
* @param string $principalUri
* @param \Sabre\CalDAV\Notifications\INotificationType $notification
* @param \SabreForRainLoop\CalDAV\Notifications\INotificationType $notification
* @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
namespace Sabre\CalDAV\Backend;
namespace SabreForRainLoop\CalDAV\Backend;
use Sabre\VObject;
use Sabre\CalDAV;
use Sabre\DAV;
use SabreForRainLoop\VObject;
use SabreForRainLoop\CalDAV;
use SabreForRainLoop\DAV;
/**
* PDO CalDAV backend
@ -175,7 +175,7 @@ class PDO extends AbstractBackend {
$values[':components'] = 'VEVENT,VTODO';
} else {
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());
}
@ -497,7 +497,7 @@ class PDO extends AbstractBackend {
}
}
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') {
$firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
@ -572,7 +572,7 @@ class PDO extends AbstractBackend {
* query.
*
* 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
* 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
* recurrence rules correctly.
* 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
* to think of.
*
@ -615,7 +615,7 @@ class PDO extends AbstractBackend {
public function calendarQuery($calendarId, array $filters) {
$result = array();
$validator = new \Sabre\CalDAV\CalendarQueryValidator();
$validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator();
$componentType = null;
$requirePostFilter = true;

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV\Backend;
namespace SabreForRainLoop\CalDAV\Backend;
/**
* Adds support for sharing features to a CalDAV server.
@ -65,12 +65,12 @@ namespace Sabre\CalDAV\Backend;
* change.
* 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
* 'decline'. These are always represented by:
*
* Sabre\CalDAV\Notifications\Notification\Invite
* SabreForRainLoop\CalDAV\Notifications\Notification\Invite
*
*
* Calendar access by sharees
@ -156,7 +156,7 @@ namespace Sabre\CalDAV\Backend;
* 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,
* or publishing is supported.
*
@ -202,7 +202,7 @@ interface SharingSupport extends NotificationSupport {
* Every element in this array should have the following properties:
* * href - Often a mailto: address
* * 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
* * summary - Optional, a description for the share
*

View file

@ -1,15 +1,15 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\DAV;
use Sabre\DAVACL;
use SabreForRainLoop\DAV;
use SabreForRainLoop\DAVACL;
/**
* This object represents a CalDAV calendar.
*
* 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/).
* @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.
*
* @param string $name
* @return \Sabre\CalDAV\ICalendarObject
* @return \SabreForRainLoop\CalDAV\ICalendarObject
*/
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.
*
* 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.
*
* 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.
*
* 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
* @return array

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
/**
* The CalendarObject represents a single VEVENT or VTODO within a Calendar.
@ -9,12 +9,12 @@ namespace Sabre\CalDAV;
* @author Evert Pot (http://evertpot.com/)
* @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;
@ -253,7 +253,7 @@ class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\
*/
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.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\VObject;
use SabreForRainLoop\VObject;
/**
* Parses the calendar-query report request body.
@ -84,16 +84,16 @@ class CalendarQueryParser {
$filter = $this->xpath->query('/cal:calendar-query/cal:filter');
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));
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->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');
if ($expand->length>0) {
@ -132,7 +132,7 @@ class CalendarQueryParser {
'VFREEBUSY',
'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;
@ -253,7 +253,7 @@ class CalendarQueryParser {
}
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(
@ -273,19 +273,19 @@ class CalendarQueryParser {
$start = $parentNode->getAttribute('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);
$end = $parentNode->getAttribute('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);
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(

View file

@ -1,8 +1,8 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\VObject;
use SabreForRainLoop\VObject;
use DateTime;
/**
@ -23,7 +23,7 @@ class CalendarQueryValidator {
/**
* 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 array $filters
@ -273,7 +273,7 @@ class CalendarQueryValidator {
$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);
@ -369,7 +369,7 @@ class CalendarQueryValidator {
}
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 'CREATED' :
@ -383,7 +383,7 @@ class CalendarQueryValidator {
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
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\DAVACL\PrincipalBackend;
use SabreForRainLoop\DAVACL\PrincipalBackend;
/**
* Calendars collection
@ -14,12 +14,12 @@ use Sabre\DAVACL\PrincipalBackend;
* @author Evert Pot (http://evertpot.com/)
* @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
*
* @var Sabre\CalDAV\Backend\BackendInterface
* @var SabreForRainLoop\CalDAV\Backend\BackendInterface
*/
protected $caldavBackend;
@ -48,7 +48,7 @@ class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
* Returns the nodename
*
* 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
*/
@ -66,7 +66,7 @@ class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
* supplied by the authentication backend.
*
* @param array $principal
* @return \Sabre\DAV\INode
* @return \SabreForRainLoop\DAV\INode
*/
public function getChildForPrincipal(array $principal) {

View file

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

View file

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

View file

@ -1,7 +1,7 @@
<?php
namespace Sabre\CalDAV;
use Sabre\DAV;
namespace SabreForRainLoop\CalDAV;
use SabreForRainLoop\DAV;
/**
* Calendar interface
@ -26,7 +26,7 @@ interface ICalendar extends DAV\ICollection {
* query.
*
* 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
* @return array

View file

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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
/**
* 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:
* * href - Often a mailto: address
* * 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
* * summary - Optional, a description for the share
*

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
/**
* 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:
* * href - Often a mailto: address
* * 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
* * summary - Optional, a description for the share
*

View file

@ -1,10 +1,10 @@
<?php
namespace Sabre\CalDAV\Notifications;
namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV;
use Sabre\CalDAV;
use Sabre\DAVACL;
use SabreForRainLoop\DAV;
use SabreForRainLoop\CalDAV;
use SabreForRainLoop\DAVACL;
/**
* This node represents a list of notifications.
@ -13,7 +13,7 @@ use Sabre\DAVACL;
* interface to allow the Notifications plugin to mark the 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.
*
* @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
*
* @var Sabre\CalDAV\Backend\NotificationSupport
* @var SabreForRainLoop\CalDAV\Backend\NotificationSupport
*/
protected $caldavBackend;
@ -156,7 +156,7 @@ class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
* Returns the list of supported privileges for this node.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

@ -1,8 +1,8 @@
<?php
namespace Sabre\CalDAV\Notifications;
namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV;
use SabreForRainLoop\DAV;
/**
* This node represents a list of notifications.
@ -11,7 +11,7 @@ use Sabre\DAV;
* interface to allow the Notifications plugin to mark the 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.
*
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).

View file

@ -1,11 +1,11 @@
<?php
namespace Sabre\CalDAV\Notifications;
namespace SabreForRainLoop\CalDAV\Notifications;
/**
* 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
* 'caldav-notifications.txt' spec.
*
@ -20,7 +20,7 @@ interface INode {
/**
* This method must return an xml element, using the
* Sabre\CalDAV\Notifications\INotificationType classes.
* SabreForRainLoop\CalDAV\Notifications\INotificationType classes.
*
* @return INotificationType
*/

View file

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

View file

@ -1,15 +1,15 @@
<?php
namespace Sabre\CalDAV\Notifications;
namespace SabreForRainLoop\CalDAV\Notifications;
use Sabre\DAV;
use Sabre\CalDAV;
use Sabre\DAVACL;
use SabreForRainLoop\DAV;
use SabreForRainLoop\CalDAV;
use SabreForRainLoop\DAVACL;
/**
* 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
* 'caldav-notifications.txt' spec.
@ -22,14 +22,14 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/**
* The notification backend
*
* @var Sabre\CalDAV\Backend\NotificationSupport
* @var SabreForRainLoop\CalDAV\Backend\NotificationSupport
*/
protected $caldavBackend;
/**
* The actual notification
*
* @var Sabre\CalDAV\Notifications\INotificationType
* @var SabreForRainLoop\CalDAV\Notifications\INotificationType
*/
protected $notification;
@ -81,7 +81,7 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/**
* This method must return an xml element, using the
* Sabre\CalDAV\Notifications\INotificationType classes.
* SabreForRainLoop\CalDAV\Notifications\INotificationType classes.
*
* @return INotificationType
*/
@ -175,7 +175,7 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
* Returns the list of supported privileges for this node.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

@ -1,10 +1,10 @@
<?php
namespace Sabre\CalDAV\Notifications\Notification;
namespace SabreForRainLoop\CalDAV\Notifications\Notification;
use Sabre\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\DAV;
use Sabre\CalDAV;
use SabreForRainLoop\CalDAV\SharingPlugin as SharingPlugin;
use SabreForRainLoop\DAV;
use SabreForRainLoop\CalDAV;
/**
* 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
*
* @var Sabre\CalDAV\Property\SupportedCalendarComponentSet
* @var SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet
*/
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
* calendar, but may also be modified (optional).
* * supportedComponents - An instance of
* Sabre\CalDAV\Property\SupportedCalendarComponentSet.
* SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet.
* This allows the client to determine which components
* will be supported in the shared calendar. This is
* also optional.

View file

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

View file

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

View file

@ -1,10 +1,10 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\DAV;
use Sabre\DAVACL;
use Sabre\VObject;
use SabreForRainLoop\DAV;
use SabreForRainLoop\DAVACL;
use SabreForRainLoop\VObject;
/**
* CalDAV plugin
@ -171,14 +171,14 @@ class Plugin extends DAV\ServerPlugin {
$server->xmlNamespaces[self::NS_CALDAV] = 'cal';
$server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs';
$server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre\\CalDAV\\Property\\SupportedCalendarComponentSet';
$server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre\\CalDAV\\Property\\ScheduleCalendarTransp';
$server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'SabreForRainLoop\\CalDAV\\Property\\SupportedCalendarComponentSet';
$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['\\Sabre\\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['\\Sabre\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write';
$server->resourceTypeMapping['\\Sabre\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification';
$server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar';
$server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox';
$server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read';
$server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write';
$server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification';
array_push($server->protectedProperties,
@ -286,7 +286,7 @@ class Plugin extends DAV\ServerPlugin {
// for clients matching iCal in the user agent
//$ua = $this->server->httpRequest->getHeader('User-Agent');
//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);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
/**
* 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:
* * href - Often a mailto: address
* * 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
* * summary - Optional, a description for the share
*

View file

@ -1,8 +1,8 @@
<?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.
@ -101,7 +101,7 @@ class SharedCalendar extends Calendar implements ISharedCalendar {
* Every element in this array should have the following properties:
* * href - Often a mailto: address
* * 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
* * summary - Optional, a description for the share
*

View file

@ -1,8 +1,8 @@
<?php
namespace Sabre\CalDAV;
namespace SabreForRainLoop\CalDAV;
use Sabre\DAV;
use SabreForRainLoop\DAV;
/**
* 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
*
* 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
* SabreDAV versions.
@ -34,7 +34,7 @@ class SharingPlugin extends DAV\ServerPlugin {
/**
* Reference to SabreDAV server object.
*
* @var Sabre\DAV\Server
* @var SabreForRainLoop\DAV\Server
*/
protected $server;
@ -56,7 +56,7 @@ class SharingPlugin extends DAV\ServerPlugin {
* Returns a plugin name.
*
* Using this name other plugins will be able to access other plugins
* using Sabre\DAV\Server::getPlugin
* using SabreForRainLoop\DAV\Server::getPlugin
*
* @return string
*/
@ -69,7 +69,7 @@ class SharingPlugin extends DAV\ServerPlugin {
/**
* 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.
*
* This method should set up the required event subscriptions.
@ -80,7 +80,7 @@ class SharingPlugin extends DAV\ServerPlugin {
public function initialize(DAV\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(
$this->server->protectedProperties,

View file

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

View file

@ -1,9 +1,9 @@
<?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/).
* @author Evert Pot (http://evertpot.com/)

View file

@ -1,9 +1,9 @@
<?php
namespace Sabre\CardDAV;
namespace SabreForRainLoop\CardDAV;
use Sabre\DAV;
use Sabre\DAVACL;
use SabreForRainLoop\DAV;
use SabreForRainLoop\DAVACL;
/**
* 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.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\CardDAV\Backend;
namespace SabreForRainLoop\CardDAV\Backend;
/**
* CardDAV Backend Interface
@ -39,12 +39,12 @@ interface BackendInterface {
/**
* 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.
*
* @param mixed $addressBookId
* @param array $mutations
* @see Sabre\DAV\IProperties::updateProperties
* @see SabreForRainLoop\DAV\IProperties::updateProperties
* @return bool|array
*/
public function updateAddressBook($addressBookId, array $mutations);

View file

@ -1,9 +1,9 @@
<?php
namespace Sabre\CardDAV\Backend;
namespace SabreForRainLoop\CardDAV\Backend;
use Sabre\CardDAV;
use Sabre\DAV;
use SabreForRainLoop\CardDAV;
use SabreForRainLoop\DAV;
/**
* PDO CardDAV backend
@ -84,12 +84,12 @@ class PDO extends AbstractBackend {
/**
* 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.
*
* @param mixed $addressBookId
* @param array $mutations
* @see Sabre\DAV\IProperties::updateProperties
* @see SabreForRainLoop\DAV\IProperties::updateProperties
* @return bool|array
*/
public function updateAddressBook($addressBookId, array $mutations) {

View file

@ -1,9 +1,9 @@
<?php
namespace Sabre\CardDAV;
namespace SabreForRainLoop\CardDAV;
use Sabre\DAVACL;
use Sabre\DAV;
use SabreForRainLoop\DAVACL;
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.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

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

View file

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

View file

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

View file

@ -1,10 +1,10 @@
<?php
namespace Sabre\CardDAV;
namespace SabreForRainLoop\CardDAV;
use Sabre\DAV;
use Sabre\DAVACL;
use Sabre\VObject;
use SabreForRainLoop\DAV;
use SabreForRainLoop\DAVACL;
use SabreForRainLoop\VObject;
/**
* CardDAV plugin
@ -38,7 +38,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Server class
*
* @var Sabre\DAV\Server
* @var SabreForRainLoop\DAV\Server
*/
protected $server;
@ -64,8 +64,8 @@ class Plugin extends DAV\ServerPlugin {
$server->xmlNamespaces[self::NS_CARDDAV] = 'card';
/* Mapping Interfaces to {DAV:}resourcetype values */
$server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook';
$server->resourceTypeMapping['Sabre\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory';
$server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook';
$server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory';
/* Adding properties that may never be changed */
$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 . '}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;
@ -654,7 +654,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* 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.
*
* @param DAV\INode $node

View file

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

View file

@ -1,9 +1,9 @@
<?php
namespace Sabre\CardDAV;
namespace SabreForRainLoop\CardDAV;
use Sabre\DAV;
use Sabre\DAVACL;
use SabreForRainLoop\DAV;
use SabreForRainLoop\DAVACL;
/**
* UserAddressBooks class
@ -243,7 +243,7 @@ class UserAddressBooks extends DAV\Collection implements DAV\IExtendedCollection
* Returns the list of supported privileges for this node.
*
* 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.
*
* If null is returned from this method, the default privilege set is used,

View file

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

View file

@ -1,11 +1,11 @@
<?php
namespace Sabre\CardDAV;
namespace SabreForRainLoop\CardDAV;
/**
* 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/).
* @author Evert Pot (http://evertpot.com/)

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV\Auth\Backend;
namespace SabreForRainLoop\DAV\Auth\Backend;
/**
* 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 fails, an exception must be thrown.
*
* @param \Sabre\DAV\Server $server
* @param \SabreForRainLoop\DAV\Server $server
* @param string $realm
* @return bool
*/
function authenticate(\Sabre\DAV\Server $server,$realm);
function authenticate(\SabreForRainLoop\DAV\Server $server,$realm);
/**
* Returns information about the currently logged in username.

View file

@ -1,8 +1,8 @@
<?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.

View file

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

View file

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

View file

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

View file

@ -1,8 +1,8 @@
<?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
@ -19,7 +19,7 @@ class MapGetToPropFind extends DAV\ServerPlugin {
/**
* reference to server class
*
* @var Sabre\DAV\Server
* @var SabreForRainLoop\DAV\Server
*/
protected $server;

View file

@ -1,8 +1,8 @@
<?php
namespace Sabre\DAV\Browser;
namespace SabreForRainLoop\DAV\Browser;
use Sabre\DAV;
use SabreForRainLoop\DAV;
/**
* Browser Plugin
@ -31,12 +31,12 @@ class Plugin extends DAV\ServerPlugin {
* @var array
*/
public $iconMap = array(
'Sabre\\DAV\\IFile' => 'icons/file',
'Sabre\\DAV\\ICollection' => 'icons/collection',
'Sabre\\DAVACL\\IPrincipal' => 'icons/principal',
'Sabre\\CalDAV\\ICalendar' => 'icons/calendar',
'Sabre\\CardDAV\\IAddressBook' => 'icons/addressbook',
'Sabre\\CardDAV\\ICard' => 'icons/card',
'SabreForRainLoop\\DAV\\IFile' => 'icons/file',
'SabreForRainLoop\\DAV\\ICollection' => 'icons/collection',
'SabreForRainLoop\\DAVACL\\IPrincipal' => 'icons/principal',
'SabreForRainLoop\\CalDAV\\ICalendar' => 'icons/calendar',
'SabreForRainLoop\\CardDAV\\IAddressBook' => 'icons/addressbook',
'SabreForRainLoop\\CardDAV\\ICard' => 'icons/card',
);
/**
@ -49,7 +49,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* reference to server class
*
* @var Sabre\DAV\Server
* @var SabreForRainLoop\DAV\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
// 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;
$output.= '<tr><td colspan="2"><form method="post" action="">

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV;
namespace SabreForRainLoop\DAV;
/**
* SabreDAV DAV client
@ -24,7 +24,7 @@ class Client {
* respective class.
*
* The {DAV:}resourcetype property is automatically added. This maps to
* Sabre\DAV\Property\ResourceType
* SabreForRainLoop\DAV\Property\ResourceType
*
* @var array
*/
@ -103,7 +103,7 @@ class Client {
$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;
}
// var_dump($url);
// var_dump($curlSettings);
list(
$response,
$curlInfo,
@ -383,9 +386,12 @@ class Client {
$curlError
) = $this->curlRequest($url, $curlSettings);
// var_dump($response);
$headerBlob = substr($response, 0, $curlInfo['header_size']);
$response = substr($response, $curlInfo['header_size']);
// 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
// because they are separated by \r\n\r\n

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV;
namespace SabreForRainLoop\DAV;
/**
* Collection class
@ -21,7 +21,7 @@ abstract class Collection extends Node implements ICollection {
* nodes, and compares the name.
* 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.
*
* @param string $name

View file

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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV\Exception;
namespace SabreForRainLoop\DAV\Exception;
/**
* BadRequest
@ -12,7 +12,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/)
* @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

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV\Exception;
namespace SabreForRainLoop\DAV\Exception;
/**
* Conflict
@ -12,7 +12,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/)
* @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

View file

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

View file

@ -1,16 +1,16 @@
<?php
namespace Sabre\DAV\Exception;
namespace SabreForRainLoop\DAV\Exception;
/**
* FileNotFound
*
* 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/).
* @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
*/
class FileNotFound extends NotFound {

View file

@ -1,6 +1,6 @@
<?php
namespace Sabre\DAV\Exception;
namespace SabreForRainLoop\DAV\Exception;
/**
* Forbidden
@ -11,7 +11,7 @@ namespace Sabre\DAV\Exception;
* @author Evert Pot (http://evertpot.com/)
* @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

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