Merge pull request #556 from tobiasd/20180321-nl
[friendica-addons.git] / dav / friendica / calendar.friendica.fnk.php
1 <?php
2
3 use Friendica\Core\L10n;
4
5 $a    = get_app();
6 $uri  = parse_url($a->get_baseurl());
7 $path = "/";
8 if (isset($uri["path"]) && strlen($uri["path"]) > 1) {
9         $path = $uri["path"] . "/";
10 }
11
12 define("CALDAV_SQL_DB", "");
13 define("CALDAV_SQL_PREFIX", "dav_");
14 define("CALDAV_URL_PREFIX", $path . "dav/");
15 define("DAV_APPNAME", "Friendica");
16
17 define("CALDAV_NAMESPACE_PRIVATE", 1);
18 define("CALDAV_FRIENDICA_MINE", "friendica-mine");
19 define("CALDAV_FRIENDICA_CONTACTS", "friendica-contacts");
20
21 $GLOBALS["CALDAV_PRIVATE_SYSTEM_CALENDARS"] = [CALDAV_FRIENDICA_MINE, CALDAV_FRIENDICA_CONTACTS];
22 $GLOBALS["CALDAV_PRIVATE_SYSTEM_BACKENDS"] = ["Sabre_CalDAV_Backend_Friendica"];
23
24 define("CARDDAV_NAMESPACE_PRIVATE", 1);
25 define("CARDDAV_FRIENDICA_CONTACT", "friendica");
26 $GLOBALS["CARDDAV_PRIVATE_SYSTEM_ADDRESSBOOKS"] = [CARDDAV_FRIENDICA_CONTACT];
27 $GLOBALS["CARDDAV_PRIVATE_SYSTEM_BACKENDS"] = ["Sabre_CardDAV_Backend_Friendica"];
28
29 $GLOBALS["CALDAV_ACL_PLUGIN_CLASS"] = "Sabre_DAVACL_Plugin_Friendica";
30
31 define("CALDAV_MAX_YEAR", date("Y") + 5);
32
33 /**
34  * @return int
35  */
36 function getCurMicrotime()
37 {
38         list($usec, $sec) = explode(" ", microtime());
39         return sprintf("%14.0f", $sec * 10000 + $usec * 10000);
40 } // function getCurMicrotime
41
42 /**
43  *
44  */
45 function debug_time()
46 {
47         $cur = getCurMicrotime();
48         if ($GLOBALS["debug_time_last"] > 0) {
49                 echo "Zeit: " . ($cur - $GLOBALS["debug_time_last"]) . "<br>\n";
50         }
51         $GLOBALS["debug_time_last"] = $cur;
52 }
53
54
55 /**
56  * @param string $username
57  * @return int|null
58  */
59 function dav_compat_username2id($username = "")
60 {
61         $x = q("SELECT `uid` FROM `user` WHERE `nickname`='%s' AND `account_removed` = 0 AND `account_expired` = 0", dbesc($username));
62         if (count($x) == 1) return $x[0]["uid"];
63         return null;
64 }
65
66 /**
67  * @param int $id
68  * @return string
69  */
70 function dav_compat_id2username($id = 0)
71 {
72         $x = q("SELECT `nickname` FROM `user` WHERE `uid` = %i AND `account_removed` = 0 AND `account_expired` = 0", IntVal($id));
73         if (count($x) == 1) return $x[0]["nickname"];
74         return "";
75 }
76
77 /**
78  * @return int
79  */
80 function dav_compat_get_curr_user_id()
81 {
82         $a = get_app();
83         return IntVal($a->user["uid"]);
84 }
85
86
87 /**
88  * @param string $principalUri
89  * @return int|null
90  */
91 function dav_compat_principal2uid($principalUri = "")
92 {
93         if (strlen($principalUri) == 0) return null;
94         if ($principalUri[0] == "/") $principalUri = substr($principalUri, 1);
95         if (strpos($principalUri, "principals/users/") !== 0) return null;
96         $username = substr($principalUri, strlen("principals/users/"));
97         return dav_compat_username2id($username);
98 }
99
100 /**
101  * @param string $principalUri
102  * @return array|null
103  */
104 function dav_compat_principal2namespace($principalUri = "")
105 {
106         if (strlen($principalUri) == 0) return null;
107         if ($principalUri[0] == "/") $principalUri = substr($principalUri, 1);
108
109         if (strpos($principalUri, "principals/users/") !== 0) return null;
110         $username = substr($principalUri, strlen("principals/users/"));
111         return ["namespace" => CALDAV_NAMESPACE_PRIVATE, "namespace_id" => dav_compat_username2id($username)];
112 }
113
114
115 /**
116  * @return string
117  */
118 function dav_compat_currentUserPrincipal()
119 {
120         $a = get_app();
121         return "principals/users/" . strtolower($a->user["nickname"]);
122 }
123
124
125 /**
126  * @param string $name
127  * @return null|string
128  */
129 function dav_compat_getRequestVar($name = "")
130 {
131         if (isset($_REQUEST[$name])) return $_REQUEST[$name];
132         else return null;
133 }
134
135 /**
136  * @param $text
137  * @return null|string
138  */
139 function dav_compat_parse_text_serverside($text)
140 {
141         return dav_compat_getRequestVar($text);
142 }
143
144 /**
145  * @param string $uri
146  */
147 function dav_compat_redirect($uri = "")
148 {
149         goaway($uri);
150 }
151
152
153 /**
154  * @return null|int
155  */
156 function dav_compat_get_max_private_calendars()
157 {
158         return null;
159 }
160
161 /**
162  * @return string
163  */
164 function dav_compat_get_hostname() {
165         $a = get_app();
166         return $a->get_hostname();
167 }
168
169 /**
170  * @param int $namespace
171  * @param int $namespace_id
172  * @param string $uri
173  * @param array $calendar
174  * @return Sabre_CalDAV_Backend_Common
175  * @throws Exception
176  */
177 function wdcal_calendar_factory($namespace, $namespace_id, $uri, $calendar = null)
178 {
179         switch ($namespace) {
180                 case CALDAV_NAMESPACE_PRIVATE:
181                         if ($uri == CALDAV_FRIENDICA_MINE || $uri == CALDAV_FRIENDICA_CONTACTS) return Sabre_CalDAV_Backend_Friendica::getInstance();
182                         else return Sabre_CalDAV_Backend_Private::getInstance();
183         }
184         throw new Exception("Calendar Namespace not found");
185 }
186
187 /**
188  * @param int $calendar_id
189  * @return Sabre_CalDAV_Backend_Common
190  * @throws Exception
191  */
192 function wdcal_calendar_factory_by_id($calendar_id)
193 {
194         $calendar = Sabre_CalDAV_Backend_Common::loadCalendarById($calendar_id);
195         return wdcal_calendar_factory($calendar["namespace"], $calendar["namespace_id"], $calendar["uri"], $calendar);
196 }
197
198 /**
199  * @param int $user_id
200  * @param bool $withcheck
201  * @return array
202  */
203 function wdcal_create_std_calendars_get_statements($user_id, $withcheck = true)
204 {
205         $stms = [];
206         $a = get_app();
207         $uris = [
208                 'private'                 => L10n::t("Private Calendar"),
209                 CALDAV_FRIENDICA_MINE     => L10n::t("Friendica Events: Mine"),
210                 CALDAV_FRIENDICA_CONTACTS => L10n::t("Friendica Events: Contacts"),
211         ];
212         foreach ($uris as $uri => $name) {
213                 $cals = q("SELECT * FROM %s%scalendars WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
214                         CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
215                 if (count($cals) == 0 || !$withcheck) $stms[] =
216                         sprintf("INSERT INTO %s%scalendars (`namespace`, `namespace_id`, `displayname`, `timezone`, `ctag`, `uri`, `has_vevent`, `has_vtodo`)
217                                 VALUES (%d, %d, '%s', '%s', 1, '%s', 1, 0)",
218                                 CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($name), dbesc($a->timezone), dbesc($uri));
219         }
220         return $stms;
221 }
222
223 /**
224  */
225 function wdcal_create_std_calendars()
226 {
227         $a = get_app();
228         if (!local_user()) return;
229
230         $privates = q("SELECT COUNT(*) num FROM %s%scalendars WHERE `namespace` = %d AND `namespace_id` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]));
231         if ($privates[0]["num"] > 0) return;
232
233         $stms = wdcal_create_std_calendars_get_statements($a->user["uid"]);
234         foreach ($stms as $stmt) q($stmt);
235 }
236
237
238
239
240 /**
241  * @param int $user_id
242  * @param bool $withcheck
243  * @return array
244  */
245 function wdcal_create_std_addressbooks_get_statements($user_id, $withcheck = true)
246 {
247         $stms = [];
248         $a = get_app();
249         $uris = [
250                 'private'                 => L10n::t("Private Addresses"),
251                 CARDDAV_FRIENDICA_CONTACT     => L10n::t("Friendica Contacts"),
252         ];
253         foreach ($uris as $uri => $name) {
254                 $cals = q("SELECT * FROM %s%saddressbooks WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
255                         CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
256                 if (count($cals) == 0 || !$withcheck) $stms[] =
257                         sprintf("INSERT INTO %s%saddressbooks (`namespace`, `namespace_id`, `displayname`, `ctag`, `uri`)
258                                 VALUES (%d, %d, '%s', 1, '%s')",
259                                 CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CARDDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($name), dbesc($uri));
260         }
261         return $stms;
262 }
263
264 /**
265  */
266 function wdcal_create_std_addressbooks()
267 {
268         $a = get_app();
269         if (!local_user()) return;
270
271         $privates = q("SELECT COUNT(*) num FROM %s%addressbooks WHERE `namespace` = %d AND `namespace_id` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CARDDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]));
272         if ($privates[0]["num"] > 0) return;
273
274         $stms = wdcal_create_std_addressbooks_get_statements($a->user["uid"]);
275         foreach ($stms as $stmt) q($stmt);
276 }