4 define("DAV_ACL_READ", "{DAV:}read");
5 define("DAV_ACL_WRITE", "{DAV:}write");
6 define("DAV_DISPLAYNAME", "{DAV:}displayname");
7 define("DAV_CALENDARCOLOR", "{http://apple.com/ns/ical/}calendar-color");
10 class DAVVersionMismatchException extends Exception {}
13 class vcard_source_data_email
17 function __construct($type, $email)
19 $this->email = $email;
24 class vcard_source_data_homepage
26 public $homepage, $type;
28 function __construct($type, $homepage)
30 $this->homepage = $homepage;
35 class vcard_source_data_telephone
37 public $telephone, $type;
39 function __construct($type, $telephone)
41 $this->telephone = $telephone;
46 class vcard_source_data_socialnetwork
48 public $nick, $type, $url;
50 function __construct($type, $nick, $url)
58 class vcard_source_data_address
60 public $street, $street2, $zip, $city, $country, $type;
63 class vcard_source_data_photo
66 public $width, $height;
70 class vcard_source_data
72 function __construct($name_first, $name_middle, $name_last)
74 $this->name_first = $name_first;
75 $this->name_middle = $name_middle;
76 $this->name_last = $name_last;
79 public $name_first, $name_middle, $name_last;
83 /** @var array|vcard_source_data_telephone[] $telephones */
86 /** @var array|vcard_source_data_homepage[] $homepages */
89 /** @var array|vcard_source_data_socialnetwork[] $socialnetworks */
90 public $socialnetworks;
92 /** @var array|vcard_source_data_email[] $email */
95 /** @var array|vcard_source_data_address[] $addresses */
98 /** @var vcard_source_data_photo */
104 * @param int $phpDate (UTC)
105 * @return string (Lokalzeit)
107 function wdcal_php2MySqlTime($phpDate)
109 return date("Y-m-d H:i:s", $phpDate);
113 * @param string $sqlDate
116 function wdcal_mySql2PhpTime($sqlDate)
118 $ts = DateTime::createFromFormat("Y-m-d H:i:s", $sqlDate);
119 return $ts->format("U");
123 * @param string $myqlDate
126 function wdcal_mySql2icalTime($myqlDate)
128 $x = explode(" ", $myqlDate);
129 $y = explode("-", $x[0]);
130 $ret = array("year"=> $y[0], "month"=> $y[1], "day"=> $y[2]);
131 $y = explode(":", $x[1]);
132 $ret["hour"] = $y[0];
133 $ret["minute"] = $y[1];
134 $ret["second"] = $y[2];
143 function icalendar_sanitize_string($str = "")
145 return preg_replace("/[\\r\\n]+/siu", "\r\n", $str);
150 * @return Sabre_CalDAV_AnimexxCalendarRootNode
152 function dav_createRootCalendarNode()
154 $backends = array(Sabre_CalDAV_Backend_Private::getInstance());
155 foreach ($GLOBALS["CALDAV_PRIVATE_SYSTEM_BACKENDS"] as $backendclass) $backends[] = $backendclass::getInstance();
156 return new Sabre_CalDAV_AnimexxCalendarRootNode(Sabre_DAVACL_PrincipalBackend_Std::getInstance(), $backends);
160 * @return Sabre_CardDAV_AddressBookRootFriendica
162 function dav_createRootContactsNode()
164 $backends = array(Sabre_CardDAV_Backend_Std::getInstance());
165 foreach ($GLOBALS["CARDDAV_PRIVATE_SYSTEM_BACKENDS"] as $backendclass) $backends[] = $backendclass::getInstance();
167 return new Sabre_CardDAV_AddressBookRootFriendica(Sabre_DAVACL_PrincipalBackend_Std::getInstance(), $backends);
172 * @param bool $force_authentication
173 * @param bool $needs_caldav
174 * @param bool $needs_carddav
175 * @return Sabre_DAV_Server
177 function dav_create_server($force_authentication = false, $needs_caldav = true, $needs_carddav = true)
180 new Sabre_DAV_SimpleCollection('principals', array(
181 new Sabre_CalDAV_Principal_Collection(Sabre_DAVACL_PrincipalBackend_Std::getInstance(), "principals/users"),
184 if ($needs_caldav) $arr[] = dav_createRootCalendarNode();
185 if ($needs_carddav) $arr[] = dav_createRootContactsNode();
188 $tree = new Sabre_DAV_SimpleCollection('root', $arr);
190 // The object tree needs in turn to be passed to the server class
191 $server = new Sabre_DAV_Server($tree);
193 if (CALDAV_URL_PREFIX != "") $server->setBaseUri(CALDAV_URL_PREFIX);
195 $authPlugin = new Sabre_DAV_Auth_Plugin(Sabre_DAV_Auth_Backend_Std::getInstance(), DAV_APPNAME);
196 $server->addPlugin($authPlugin);
199 $caldavPlugin = new Sabre_CalDAV_Plugin();
200 $server->addPlugin($caldavPlugin);
202 if ($needs_carddav) {
203 $carddavPlugin = new Sabre_CardDAV_Plugin();
204 $server->addPlugin($carddavPlugin);
207 if ($GLOBALS["CALDAV_ACL_PLUGIN_CLASS"] != "") {
208 $aclPlugin = new $GLOBALS["CALDAV_ACL_PLUGIN_CLASS"]();
209 $aclPlugin->defaultUsernamePath = "principals/users";
210 $server->addPlugin($aclPlugin);
212 $aclPlugin = new Sabre_DAVACL_Plugin();
213 $aclPlugin->defaultUsernamePath = "principals/users";
214 $server->addPlugin($aclPlugin);
217 if ($force_authentication) $server->broadcastEvent('beforeMethod', array("GET", "/")); // Make it authenticate
224 * @param Sabre_DAV_Server $server
225 * @param string $with_privilege
226 * @return array|Sabre_CalDAV_Calendar[]
228 function dav_get_current_user_calendars(&$server, $with_privilege = "")
230 if ($with_privilege == "") $with_privilege = DAV_ACL_READ;
233 $calendar_path = "/calendars/" . strtolower($a->user["nickname"]) . "/";
235 /** @var Sabre_CalDAV_AnimexxUserCalendars $tree */
236 $tree = $server->tree->getNodeForPath($calendar_path);
237 /** @var array|Sabre_CalDAV_Calendar[] $calendars */
238 $children = $tree->getChildren();
240 $calendars = array();
241 /** @var Sabre_DAVACL_Plugin $aclplugin */
242 $aclplugin = $server->getPlugin("acl");
243 foreach ($children as $child) if (is_a($child, "Sabre_CalDAV_Calendar") || is_subclass_of($child, "Sabre_CalDAV_Calendar")) {
244 if ($with_privilege != "") {
245 $caluri = $calendar_path . $child->getName();
246 if ($aclplugin->checkPrivileges($caluri, $with_privilege, Sabre_DAVACL_Plugin::R_PARENT, false)) $calendars[] = $child;
248 $calendars[] = $child;
256 * @param Sabre_DAV_Server $server
257 * @param Sabre_CalDAV_Calendar $calendar
258 * @param string $calendarobject_uri
259 * @param string $with_privilege
260 * @return null|Sabre\VObject\Component\VCalendar
262 function dav_get_current_user_calendarobject(&$server, &$calendar, $calendarobject_uri, $with_privilege = "")
264 $obj = $calendar->getChild($calendarobject_uri);
266 if ($with_privilege == "") $with_privilege = DAV_ACL_READ;
269 $uri = "/calendars/" . strtolower($a->user["nickname"]) . "/" . $calendar->getName() . "/" . $calendarobject_uri;
271 /** @var Sabre_DAVACL_Plugin $aclplugin */
272 $aclplugin = $server->getPlugin("acl");
273 if (!$aclplugin->checkPrivileges($uri, $with_privilege, Sabre_DAVACL_Plugin::R_PARENT, false)) return null;
276 $vObject = Sabre\VObject\Reader::read($data);
283 * @param Sabre_DAV_Server $server
285 * @param string $with_privilege
286 * @return null|Sabre_CalDAV_Calendar
288 function dav_get_current_user_calendar_by_id(&$server, $id, $with_privilege = "")
290 $calendars = dav_get_current_user_calendars($server, $with_privilege);
293 foreach ($calendars as $cal) {
294 $prop = $cal->getProperties(array("id"));
295 if (isset($prop["id"]) && $prop["id"] == $id) $calendar = $cal;
304 * @return Sabre\VObject\Component\VCalendar $vObject
306 function dav_create_empty_vevent($uid = "")
308 if ($uid == "") $uid = uniqid();
309 return Sabre\VObject\Reader::read("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//" . DAV_APPNAME . "//DAV-Plugin//EN\r\nBEGIN:VEVENT\r\nUID:" . $uid . "@" . dav_compat_get_hostname() .
310 "\r\nDTSTAMP:" . date("Ymd") . "T" . date("His") . "Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
315 * @param Sabre\VObject\Component\VCalendar $vObject
316 * @return Sabre\VObject\Component\VEvent|null
318 function dav_get_eventComponent(&$vObject)
322 foreach ($vObject->getComponents() as $component) {
323 if ($component->name !== 'VTIMEZONE') {
324 $componentType = $component->name;
328 if ($componentType != "VEVENT") return null;