mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-03 14:37:02 +03:00
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:
parent
92f2caf700
commit
1fb553e77e
249 changed files with 1338 additions and 1453 deletions
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
|
||||
use SabreForRainLoop\DAV;
|
||||
|
||||
/**
|
||||
* AllowedSharingModes
|
||||
*
|
||||
* This property encodes the 'allowed-sharing-modes' property, as defined by
|
||||
* the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
|
||||
* namespace.
|
||||
*
|
||||
* This property is a representation of the supported-calendar_component-set
|
||||
* property in the CalDAV namespace. It simply requires an array of components,
|
||||
* such as VEVENT, VTODO
|
||||
*
|
||||
* @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class AllowedSharingModes extends DAV\Property {
|
||||
|
||||
/**
|
||||
* Whether or not a calendar can be shared with another user
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $canBeShared;
|
||||
|
||||
/**
|
||||
* Whether or not the calendar can be placed on a public url.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $canBePublished;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param bool $canBeShared
|
||||
* @param bool $canBePublished
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($canBeShared, $canBePublished) {
|
||||
|
||||
$this->canBeShared = $canBeShared;
|
||||
$this->canBePublished = $canBePublished;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOMDocument
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server, \DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
if ($this->canBeShared) {
|
||||
$xcomp = $doc->createElement('cs:can-be-shared');
|
||||
$node->appendChild($xcomp);
|
||||
}
|
||||
if ($this->canBePublished) {
|
||||
$xcomp = $doc->createElement('cs:can-be-published');
|
||||
$node->appendChild($xcomp);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,227 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
|
||||
use SabreForRainLoop\CalDAV\SharingPlugin as SharingPlugin;
|
||||
use SabreForRainLoop\DAV;
|
||||
use SabreForRainLoop\CalDAV;
|
||||
|
||||
/**
|
||||
* Invite property
|
||||
*
|
||||
* This property encodes the 'invite' property, as defined by
|
||||
* the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
|
||||
* namespace.
|
||||
*
|
||||
* @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class Invite extends DAV\Property {
|
||||
|
||||
/**
|
||||
* The list of users a calendar has been shared to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $users;
|
||||
|
||||
/**
|
||||
* The organizer contains information about the person who shared the
|
||||
* object.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $organizer;
|
||||
|
||||
/**
|
||||
* Creates the property.
|
||||
*
|
||||
* Users is an array. Each element of the array has the following
|
||||
* properties:
|
||||
*
|
||||
* * href - Often a mailto: address
|
||||
* * commonName - Optional, for example a first and lastname for a user.
|
||||
* * status - One of the SharingPlugin::STATUS_* constants.
|
||||
* * readOnly - true or false
|
||||
* * summary - Optional, description of the share
|
||||
*
|
||||
* The organizer key is optional to specify. It's only useful when a
|
||||
* 'sharee' requests the sharing information.
|
||||
*
|
||||
* The organizer may have the following properties:
|
||||
* * href - Often a mailto: address.
|
||||
* * commonName - Optional human-readable name.
|
||||
* * firstName - Optional first name.
|
||||
* * lastName - Optional last name.
|
||||
*
|
||||
* If you wonder why these two structures are so different, I guess a
|
||||
* valid answer is that the current spec is still a draft.
|
||||
*
|
||||
* @param array $users
|
||||
*/
|
||||
public function __construct(array $users, array $organizer = null) {
|
||||
|
||||
$this->users = $users;
|
||||
$this->organizer = $organizer;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of users, as it was passed to the constructor.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getValue() {
|
||||
|
||||
return $this->users;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOMDocument
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server,\DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
|
||||
if (!is_null($this->organizer)) {
|
||||
|
||||
$xorganizer = $doc->createElement('cs:organizer');
|
||||
|
||||
$href = $doc->createElement('d:href');
|
||||
$href->appendChild($doc->createTextNode($this->organizer['href']));
|
||||
$xorganizer->appendChild($href);
|
||||
|
||||
if (isset($this->organizer['commonName']) && $this->organizer['commonName']) {
|
||||
$commonName = $doc->createElement('cs:common-name');
|
||||
$commonName->appendChild($doc->createTextNode($this->organizer['commonName']));
|
||||
$xorganizer->appendChild($commonName);
|
||||
}
|
||||
if (isset($this->organizer['firstName']) && $this->organizer['firstName']) {
|
||||
$firstName = $doc->createElement('cs:first-name');
|
||||
$firstName->appendChild($doc->createTextNode($this->organizer['firstName']));
|
||||
$xorganizer->appendChild($firstName);
|
||||
}
|
||||
if (isset($this->organizer['lastName']) && $this->organizer['lastName']) {
|
||||
$lastName = $doc->createElement('cs:last-name');
|
||||
$lastName->appendChild($doc->createTextNode($this->organizer['lastName']));
|
||||
$xorganizer->appendChild($lastName);
|
||||
}
|
||||
|
||||
$node->appendChild($xorganizer);
|
||||
|
||||
|
||||
}
|
||||
|
||||
foreach($this->users as $user) {
|
||||
|
||||
$xuser = $doc->createElement('cs:user');
|
||||
|
||||
$href = $doc->createElement('d:href');
|
||||
$href->appendChild($doc->createTextNode($user['href']));
|
||||
$xuser->appendChild($href);
|
||||
|
||||
if (isset($user['commonName']) && $user['commonName']) {
|
||||
$commonName = $doc->createElement('cs:common-name');
|
||||
$commonName->appendChild($doc->createTextNode($user['commonName']));
|
||||
$xuser->appendChild($commonName);
|
||||
}
|
||||
|
||||
switch($user['status']) {
|
||||
|
||||
case SharingPlugin::STATUS_ACCEPTED :
|
||||
$status = $doc->createElement('cs:invite-accepted');
|
||||
$xuser->appendChild($status);
|
||||
break;
|
||||
case SharingPlugin::STATUS_DECLINED :
|
||||
$status = $doc->createElement('cs:invite-declined');
|
||||
$xuser->appendChild($status);
|
||||
break;
|
||||
case SharingPlugin::STATUS_NORESPONSE :
|
||||
$status = $doc->createElement('cs:invite-noresponse');
|
||||
$xuser->appendChild($status);
|
||||
break;
|
||||
case SharingPlugin::STATUS_INVALID :
|
||||
$status = $doc->createElement('cs:invite-invalid');
|
||||
$xuser->appendChild($status);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
$xaccess = $doc->createElement('cs:access');
|
||||
|
||||
if ($user['readOnly']) {
|
||||
$xaccess->appendChild(
|
||||
$doc->createElement('cs:read')
|
||||
);
|
||||
} else {
|
||||
$xaccess->appendChild(
|
||||
$doc->createElement('cs:read-write')
|
||||
);
|
||||
}
|
||||
$xuser->appendChild($xaccess);
|
||||
|
||||
if (isset($user['summary']) && $user['summary']) {
|
||||
$summary = $doc->createElement('cs:summary');
|
||||
$summary->appendChild($doc->createTextNode($user['summary']));
|
||||
$xuser->appendChild($summary);
|
||||
}
|
||||
|
||||
$node->appendChild($xuser);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes the property.
|
||||
*
|
||||
* This static method should return a an instance of this object.
|
||||
*
|
||||
* @param \DOMElement $prop
|
||||
* @return DAV\IProperty
|
||||
*/
|
||||
static function unserialize(\DOMElement $prop) {
|
||||
|
||||
$xpath = new \DOMXPath($prop->ownerDocument);
|
||||
$xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER);
|
||||
$xpath->registerNamespace('d', 'urn:DAV');
|
||||
|
||||
$users = array();
|
||||
|
||||
foreach($xpath->query('cs:user', $prop) as $user) {
|
||||
|
||||
$status = null;
|
||||
if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) {
|
||||
$status = SharingPlugin::STATUS_ACCEPTED;
|
||||
} elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) {
|
||||
$status = SharingPlugin::STATUS_DECLINED;
|
||||
} elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) {
|
||||
$status = SharingPlugin::STATUS_NORESPONSE;
|
||||
} elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) {
|
||||
$status = SharingPlugin::STATUS_INVALID;
|
||||
} else {
|
||||
throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid');
|
||||
}
|
||||
$users[] = array(
|
||||
'href' => $xpath->evaluate('string(d:href)', $user),
|
||||
'commonName' => $xpath->evaluate('string(cs:common-name)', $user),
|
||||
'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user),
|
||||
'summary' => $xpath->evaluate('string(cs:summary)', $user),
|
||||
'status' => $status,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
return new self($users);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
|
||||
use SabreForRainLoop\DAV;
|
||||
use SabreForRainLoop\CalDAV;
|
||||
|
||||
/**
|
||||
* schedule-calendar-transp property.
|
||||
*
|
||||
* This property is a representation of the schedule-calendar-transp property.
|
||||
* This property is defined in RFC6638 (caldav scheduling).
|
||||
*
|
||||
* Its values are either 'transparent' or 'opaque'. If it's transparent, it
|
||||
* means that this calendar will not be taken into consideration when a
|
||||
* different user queries for free-busy information. If it's 'opaque', it will.
|
||||
*
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class ScheduleCalendarTransp extends DAV\Property {
|
||||
|
||||
const TRANSPARENT = 'transparent';
|
||||
const OPAQUE = 'opaque';
|
||||
|
||||
protected $value;
|
||||
|
||||
/**
|
||||
* Creates the property
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function __construct($value) {
|
||||
|
||||
if ($value !== self::TRANSPARENT && $value !== self::OPAQUE) {
|
||||
throw new \InvalidArgumentException('The value must either be specified as "transparent" or "opaque"');
|
||||
}
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getValue() {
|
||||
|
||||
return $this->value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOMDocument
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server,\DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
switch($this->value) {
|
||||
case self::TRANSPARENT :
|
||||
$xval = $doc->createElement('cal:transparent');
|
||||
break;
|
||||
case self::OPAQUE :
|
||||
$xval = $doc->createElement('cal:opaque');
|
||||
break;
|
||||
}
|
||||
|
||||
$node->appendChild($xval);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes the DOMElement back into a Property class.
|
||||
*
|
||||
* @param \DOMElement $node
|
||||
* @return ScheduleCalendarTransp
|
||||
*/
|
||||
static function unserialize(\DOMElement $node) {
|
||||
|
||||
$value = null;
|
||||
foreach($node->childNodes as $childNode) {
|
||||
switch(DAV\XMLUtil::toClarkNotation($childNode)) {
|
||||
case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' :
|
||||
$value = self::OPAQUE;
|
||||
break;
|
||||
case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' :
|
||||
$value = self::TRANSPARENT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (is_null($value))
|
||||
return null;
|
||||
|
||||
return new self($value);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
|
||||
use SabreForRainLoop\DAV;
|
||||
use SabreForRainLoop\CalDAV;
|
||||
|
||||
/**
|
||||
* Supported component set property
|
||||
*
|
||||
* This property is a representation of the supported-calendar_component-set
|
||||
* property in the CalDAV namespace. It simply requires an array of components,
|
||||
* such as VEVENT, VTODO
|
||||
*
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class SupportedCalendarComponentSet extends DAV\Property {
|
||||
|
||||
/**
|
||||
* List of supported components, such as "VEVENT, VTODO"
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $components;
|
||||
|
||||
/**
|
||||
* Creates the property
|
||||
*
|
||||
* @param array $components
|
||||
*/
|
||||
public function __construct(array $components) {
|
||||
|
||||
$this->components = $components;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of supported components
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getValue() {
|
||||
|
||||
return $this->components;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOMDocument
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server,\DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
foreach($this->components as $component) {
|
||||
|
||||
$xcomp = $doc->createElement('cal:comp');
|
||||
$xcomp->setAttribute('name',$component);
|
||||
$node->appendChild($xcomp);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Unserializes the DOMElement back into a Property class.
|
||||
*
|
||||
* @param \DOMElement $node
|
||||
* @return Property_SupportedCalendarComponentSet
|
||||
*/
|
||||
static function unserialize(\DOMElement $node) {
|
||||
|
||||
$components = array();
|
||||
foreach($node->childNodes as $childNode) {
|
||||
if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') {
|
||||
$components[] = $childNode->getAttribute('name');
|
||||
}
|
||||
}
|
||||
return new self($components);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
use SabreForRainLoop\DAV;
|
||||
use SabreForRainLoop\CalDAV\Plugin;
|
||||
|
||||
/**
|
||||
* Supported-calendar-data property
|
||||
*
|
||||
* This property is a representation of the supported-calendar-data property
|
||||
* in the CalDAV namespace. SabreDAV only has support for text/calendar;2.0
|
||||
* so the value is currently hardcoded.
|
||||
*
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class SupportedCalendarData extends DAV\Property {
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOMDocument
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server,\DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
|
||||
$prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal';
|
||||
|
||||
$caldata = $doc->createElement($prefix . ':calendar-data');
|
||||
$caldata->setAttribute('content-type','text/calendar');
|
||||
$caldata->setAttribute('version','2.0');
|
||||
|
||||
$node->appendChild($caldata);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace SabreForRainLoop\CalDAV\Property;
|
||||
use SabreForRainLoop\DAV;
|
||||
|
||||
/**
|
||||
* supported-collation-set property
|
||||
*
|
||||
* This property is a representation of the supported-collation-set property
|
||||
* in the CalDAV namespace.
|
||||
*
|
||||
* @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class SupportedCollationSet extends DAV\Property {
|
||||
|
||||
/**
|
||||
* Serializes the property in a DOM document
|
||||
*
|
||||
* @param DAV\Server $server
|
||||
* @param \DOMElement $node
|
||||
* @return void
|
||||
*/
|
||||
public function serialize(DAV\Server $server,\DOMElement $node) {
|
||||
|
||||
$doc = $node->ownerDocument;
|
||||
|
||||
$prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav');
|
||||
if (!$prefix) $prefix = 'cal';
|
||||
|
||||
$node->appendChild(
|
||||
$doc->createElement($prefix . ':supported-collation','i;ascii-casemap')
|
||||
);
|
||||
$node->appendChild(
|
||||
$doc->createElement($prefix . ':supported-collation','i;octet')
|
||||
);
|
||||
$node->appendChild(
|
||||
$doc->createElement($prefix . ':supported-collation','i;unicode-casemap')
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue