]> git.mxchange.org Git - friendica-addons.git/blob - dav/common/calendar.fnk.php
10177b347bba7b3841bec3a917da3379aae08cf1
[friendica-addons.git] / dav / common / calendar.fnk.php
1 <?php
2
3
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");
8
9
10 class DAVVersionMismatchException extends Exception {}
11
12
13 class vcard_source_data_email
14 {
15         public $email, $type;
16
17         function __construct($type, $email)
18         {
19                 $this->email = $email;
20                 $this->type  = $type;
21         }
22 }
23
24 class vcard_source_data_homepage
25 {
26         public $homepage, $type;
27
28         function __construct($type, $homepage)
29         {
30                 $this->homepage = $homepage;
31                 $this->type     = $type;
32         }
33 }
34
35 class vcard_source_data_telephone
36 {
37         public $telephone, $type;
38
39         function __construct($type, $telephone)
40         {
41                 $this->telephone = $telephone;
42                 $this->type      = $type;
43         }
44 }
45
46 class vcard_source_data_socialnetwork
47 {
48         public $nick, $type, $url;
49
50         function __construct($type, $nick, $url)
51         {
52                 $this->nick = $nick;
53                 $this->type = $type;
54                 $this->url  = $url;
55         }
56 }
57
58 class vcard_source_data_address
59 {
60         public $street, $street2, $zip, $city, $country, $type;
61 }
62
63 class vcard_source_data_photo
64 {
65         public $binarydata;
66         public $width, $height;
67         public $type;
68 }
69
70 class vcard_source_data
71 {
72         function __construct($name_first, $name_middle, $name_last)
73         {
74                 $this->name_first  = $name_first;
75                 $this->name_middle = $name_middle;
76                 $this->name_last   = $name_last;
77         }
78
79         public $name_first, $name_middle, $name_last;
80         public $last_update;
81         public $picture_data;
82
83         /** @var array|vcard_source_data_telephone[] $telephones */
84         public $telephones;
85
86         /** @var array|vcard_source_data_homepage[] $homepages */
87         public $homepages;
88
89         /** @var array|vcard_source_data_socialnetwork[] $socialnetworks */
90         public $socialnetworks;
91
92         /** @var array|vcard_source_data_email[] $email */
93         public $emails;
94
95         /** @var array|vcard_source_data_address[] $addresses */
96         public $addresses;
97
98         /** @var vcard_source_data_photo */
99         public $photo;
100 }
101
102
103 /**
104  * @param int $phpDate (UTC)
105  * @return string (Lokalzeit)
106  */
107 function wdcal_php2MySqlTime($phpDate)
108 {
109         return date("Y-m-d H:i:s", $phpDate);
110 }
111
112 /**
113  * @param string $sqlDate
114  * @return int
115  */
116 function wdcal_mySql2PhpTime($sqlDate)
117 {
118         $ts = DateTime::createFromFormat("Y-m-d H:i:s", $sqlDate);
119         return $ts->format("U");
120 }
121
122 /**
123  * @param string $myqlDate
124  * @return array
125  */
126 function wdcal_mySql2icalTime($myqlDate)
127 {
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];
135         return $ret;
136 }
137
138
139 /**
140  * @param string $str
141  * @return string
142  */
143 function icalendar_sanitize_string($str = "")
144 {
145         return preg_replace("/[\\r\\n]+/siu", "\r\n", $str);
146 }
147
148
149 /**
150  * @return Sabre_CalDAV_AnimexxCalendarRootNode
151  */
152 function dav_createRootCalendarNode()
153 {
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);
157 }
158
159 /**
160  * @return Sabre_CardDAV_AddressBookRootFriendica
161  */
162 function dav_createRootContactsNode()
163 {
164         $backends = array(Sabre_CardDAV_Backend_Std::getInstance());
165         foreach ($GLOBALS["CARDDAV_PRIVATE_SYSTEM_BACKENDS"] as $backendclass) $backends[] = $backendclass::getInstance();
166
167         return new Sabre_CardDAV_AddressBookRootFriendica(Sabre_DAVACL_PrincipalBackend_Std::getInstance(), $backends);
168 }
169
170
171 /**
172  * @param bool $force_authentication
173  * @param bool $needs_caldav
174  * @param bool $needs_carddav
175  * @return Sabre_DAV_Server
176  */
177 function dav_create_server($force_authentication = false, $needs_caldav = true, $needs_carddav = true)
178 {
179         $arr = array(
180                 new Sabre_DAV_SimpleCollection('principals', array(
181                         new Sabre_CalDAV_Principal_Collection(Sabre_DAVACL_PrincipalBackend_Std::getInstance(), "principals/users"),
182                 )),
183         );
184         if ($needs_caldav) $arr[] = dav_createRootCalendarNode();
185         if ($needs_carddav) $arr[] = dav_createRootContactsNode();
186
187
188         $tree = new Sabre_DAV_SimpleCollection('root', $arr);
189
190 // The object tree needs in turn to be passed to the server class
191         $server = new Sabre_DAV_Server($tree);
192
193         if (CALDAV_URL_PREFIX != "") $server->setBaseUri(CALDAV_URL_PREFIX);
194
195         $authPlugin = new Sabre_DAV_Auth_Plugin(Sabre_DAV_Auth_Backend_Std::getInstance(), DAV_APPNAME);
196         $server->addPlugin($authPlugin);
197
198         if ($needs_caldav) {
199                 $caldavPlugin = new Sabre_CalDAV_Plugin();
200                 $server->addPlugin($caldavPlugin);
201         }
202         if ($needs_carddav) {
203                 $carddavPlugin = new Sabre_CardDAV_Plugin();
204                 $server->addPlugin($carddavPlugin);
205         }
206
207         if ($GLOBALS["CALDAV_ACL_PLUGIN_CLASS"] != "") {
208                 $aclPlugin                      = new $GLOBALS["CALDAV_ACL_PLUGIN_CLASS"]();
209                 $aclPlugin->defaultUsernamePath = "principals/users";
210                 $server->addPlugin($aclPlugin);
211         } else {
212                 $aclPlugin = new Sabre_DAVACL_Plugin();
213                 $aclPlugin->defaultUsernamePath = "principals/users";
214                 $server->addPlugin($aclPlugin);
215         }
216
217         if ($force_authentication) $server->broadcastEvent('beforeMethod', array("GET", "/")); // Make it authenticate
218
219         return $server;
220 }
221
222
223 /**
224  * @param Sabre_DAV_Server $server
225  * @param string $with_privilege
226  * @return array|Sabre_CalDAV_Calendar[]
227  */
228 function dav_get_current_user_calendars(&$server, $with_privilege = "")
229 {
230         if ($with_privilege == "") $with_privilege = DAV_ACL_READ;
231
232         $a             = get_app();
233         $calendar_path = "/calendars/" . strtolower($a->user["nickname"]) . "/";
234
235         /** @var Sabre_CalDAV_AnimexxUserCalendars $tree  */
236         $tree = $server->tree->getNodeForPath($calendar_path);
237         /** @var array|Sabre_CalDAV_Calendar[] $calendars  */
238         $children = $tree->getChildren();
239
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;
247                 } else {
248                         $calendars[] = $child;
249                 }
250         }
251         return $calendars;
252 }
253
254
255 /**
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
261  */
262 function dav_get_current_user_calendarobject(&$server, &$calendar, $calendarobject_uri, $with_privilege = "")
263 {
264         $obj = $calendar->getChild($calendarobject_uri);
265
266         if ($with_privilege == "") $with_privilege = DAV_ACL_READ;
267
268         $a   = get_app();
269         $uri = "/calendars/" . strtolower($a->user["nickname"]) . "/" . $calendar->getName() . "/" . $calendarobject_uri;
270
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;
274
275         $data    = $obj->get();
276         $vObject = Sabre\VObject\Reader::read($data);
277
278         return $vObject;
279 }
280
281
282 /**
283  * @param Sabre_DAV_Server $server
284  * @param int $id
285  * @param string $with_privilege
286  * @return null|Sabre_CalDAV_Calendar
287  */
288 function dav_get_current_user_calendar_by_id(&$server, $id, $with_privilege = "")
289 {
290         $calendars = dav_get_current_user_calendars($server, $with_privilege);
291
292         $calendar = null;
293         foreach ($calendars as $cal) {
294                 $prop = $cal->getProperties(array("id"));
295                 if (isset($prop["id"]) && $prop["id"] == $id) $calendar = $cal;
296         }
297
298         return $calendar;
299 }
300
301
302 /**
303  * @param string $uid
304  * @return Sabre\VObject\Component\VCalendar $vObject
305  */
306 function dav_create_empty_vevent($uid = "")
307 {
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");
311 }
312
313
314 /**
315  * @param Sabre\VObject\Component\VCalendar $vObject
316  * @return Sabre\VObject\Component\VEvent|null
317  */
318 function dav_get_eventComponent(&$vObject)
319 {
320         $component     = null;
321         $componentType = "";
322         foreach ($vObject->getComponents() as $component) {
323                 if ($component->name !== 'VTIMEZONE') {
324                         $componentType = $component->name;
325                         break;
326                 }
327         }
328         if ($componentType != "VEVENT") return null;
329
330         return $component;
331 }