]> git.mxchange.org Git - friendica-addons.git/blob - dav/main.php
Libertree: Posting works again (new "source" field)
[friendica-addons.git] / dav / main.php
1 <?php
2
3 require_once('include/security.php');
4
5 function dav_install()
6 {
7         register_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
8         register_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
9         register_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
10 }
11
12
13 function dav_uninstall()
14 {
15         unregister_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
16         unregister_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
17         unregister_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
18 }
19
20
21 function dav_module()
22 {
23 }
24
25 function dav_include_files()
26 {
27         require_once (__DIR__ . "/common/dbclasses/dbclass_animexx.class.php");
28         require_once (__DIR__ . "/common/dbclasses/dbclass.friendica.calendars.class.php");
29         require_once (__DIR__ . "/common/dbclasses/dbclass.friendica.jqcalendar.class.php");
30         require_once (__DIR__ . "/common/dbclasses/dbclass.friendica.notifications.class.php");
31         require_once (__DIR__ . "/common/dbclasses/dbclass.friendica.calendarobjects.class.php");
32
33         /*
34                         require_once (__DIR__ . "/SabreDAV/lib/Sabre.includes.php");
35                         require_once (__DIR__ . "/SabreDAV/lib/Sabre/VObject/includes.php");
36                         require_once (__DIR__ . "/SabreDAV/lib/Sabre/DAVACL/includes.php");
37                         require_once (__DIR__ . "/SabreDAV/lib/Sabre/CalDAV/includes.php");
38                         */
39         require_once (__DIR__ . "/SabreDAV/lib/Sabre/autoload.php");
40
41         $tz_before = date_default_timezone_get();
42         require_once (__DIR__ . "/iCalcreator/iCalcreator.class.php");
43         date_default_timezone_set($tz_before);
44
45         require_once (__DIR__ . "/common/calendar.fnk.php");
46         require_once (__DIR__ . "/common/dav_caldav_backend_common.inc.php");
47         require_once (__DIR__ . "/common/dav_caldav_backend.inc.php");
48         require_once (__DIR__ . "/common/dav_caldav_root.inc.php");
49         require_once (__DIR__ . "/common/dav_user_calendars.inc.php");
50         require_once (__DIR__ . "/common/dav_carddav_root.inc.php");
51         require_once (__DIR__ . "/common/dav_carddav_backend_std.inc.php");
52         require_once (__DIR__ . "/common/dav_user_addressbooks.inc.php");
53         require_once (__DIR__ . "/common/virtual_cal_source_backend.inc.php");
54         require_once (__DIR__ . "/common/wdcal_configuration.php");
55         require_once (__DIR__ . "/common/wdcal_cal_source.inc.php");
56         require_once (__DIR__ . "/common/wdcal_cal_source_private.inc.php");
57
58         require_once (__DIR__ . "/dav_friendica_principal.inc.php");
59         require_once (__DIR__ . "/dav_friendica_auth.inc.php");
60         require_once (__DIR__ . "/dav_carddav_backend_friendica_community.inc.php");
61         require_once (__DIR__ . "/dav_caldav_backend_friendica.inc.php");
62         require_once (__DIR__ . "/virtual_cal_source_friendica.inc.php");
63         require_once (__DIR__ . "/wdcal_cal_source_friendicaevents.inc.php");
64         require_once (__DIR__ . "/FriendicaACLPlugin.inc.php");
65
66         require_once (__DIR__ . "/calendar.friendica.fnk.php");
67         require_once (__DIR__ . "/layout.fnk.php");
68 }
69
70
71 /**
72  * @param App $a
73  */
74 function dav_init(&$a)
75 {
76
77         /*
78          * Recommended settings:
79          * ALTER TABLE `photo` ADD INDEX ( `contact-id` )
80          */
81
82         dav_include_files();
83
84         if (false) {
85                 dbg(true);
86                 error_reporting(E_ALL);
87                 ini_set("display_errors", 1);
88         }
89
90         wdcal_create_std_calendars();
91
92
93         if ($a->argc >= 2 && $a->argv[1] == "wdcal") {
94
95                 if ($a->argc >= 3 && $a->argv[2] == "feed") {
96                         wdcal_print_feed($a->get_baseurl() . "/dav/wdcal/");
97                         killme();
98                 } elseif ($a->argc >= 3 && strlen($a->argv[2]) > 0) {
99                         wdcal_addRequiredHeadersEdit();
100                 } else {
101                         wdcal_addRequiredHeaders();
102                 }
103                 return;
104         }
105
106         if ($a->argc >= 2 && $a->argv[1] == "settings") {
107                 return;
108         }
109
110         $authBackend              = new Sabre_DAV_Auth_Backend_Friendica();
111         $principalBackend         = new Sabre_DAVACL_PrincipalBackend_Friendica($authBackend);
112         $caldavBackend_std        = new Sabre_CalDAV_Backend_Std();
113         $caldavBackend_community  = new Sabre_CalDAV_Backend_Friendica();
114         $carddavBackend_std       = new Sabre_CardDAV_Backend_Std();
115         $carddavBackend_community = new Sabre_CardDAV_Backend_FriendicaCommunity();
116
117         if (isset($_SERVER["PHP_AUTH_USER"])) {
118                 $tree = new Sabre_DAV_SimpleCollection('root', array(
119                         new Sabre_DAV_SimpleCollection('principals', array(
120                                 new Sabre_CalDAV_Principal_Collection($principalBackend, "principals/users"),
121                         )),
122                         new Sabre_CalDAV_AnimexxCalendarRootNode($principalBackend, array(
123                                 $caldavBackend_std,
124                                 $caldavBackend_community,
125                         )),
126                         new Sabre_CardDAV_AddressBookRootFriendica($principalBackend, array(
127                                 $carddavBackend_std,
128                                 $carddavBackend_community,
129                         )),
130                 ));
131         } else {
132                 $tree = new Sabre_DAV_SimpleCollection('root', array());
133         }
134
135 // The object tree needs in turn to be passed to the server class
136         $server = new Sabre_DAV_Server($tree);
137
138         $url = parse_url($a->get_baseurl());
139         $server->setBaseUri(CALDAV_URL_PREFIX);
140
141         $authPlugin = new Sabre_DAV_Auth_Plugin($authBackend, 'SabreDAV');
142         $server->addPlugin($authPlugin);
143
144         $aclPlugin                      = new Sabre_DAVACL_Plugin_Friendica();
145         $aclPlugin->defaultUsernamePath = "principals/users";
146         $server->addPlugin($aclPlugin);
147
148         $caldavPlugin = new Sabre_CalDAV_Plugin();
149         $server->addPlugin($caldavPlugin);
150
151         $carddavPlugin = new Sabre_CardDAV_Plugin();
152         $server->addPlugin($carddavPlugin);
153
154         $browser = new Sabre_DAV_Browser_Plugin();
155         $server->addPlugin($browser);
156
157         $server->exec();
158
159         killme();
160 }
161
162 /**
163  * @return string
164  */
165 function dav_content()
166 {
167         $a = get_app();
168         if (!isset($a->user["uid"]) || $a->user["uid"] == 0) {
169                 return login();
170         }
171
172         $x = "";
173
174         if ($a->argv[1] == "settings") {
175                 return wdcal_getSettingsPage($a);
176         } elseif ($a->argv[1] == "wdcal") {
177                 if ($a->argc >= 3 && strlen($a->argv[2]) > 0) {
178                         $uri = $a->argv[2];
179
180                         if ($uri == "new") {
181                                 $o = "";
182                                 if (isset($_REQUEST["save"])) {
183                                         check_form_security_token_redirectOnErr($a->get_baseurl() . "/dav/wdcal/", "caledit");
184                                         $o .= wdcal_postEditPage("new", "", $a->user["uid"], $a->timezone, $a->get_baseurl() . "/dav/wdcal/");
185                                 }
186                                 $o .= wdcal_getEditPage("new");
187                                 return $o;
188                         } else {
189                                 $recurr_uri = ""; // @TODO
190                                 if (isset($a->argv[3]) && $a->argv[3] == "edit") {
191                                         $o = "";
192                                         if (isset($_REQUEST["save"])) {
193                                                 check_form_security_token_redirectOnErr($a->get_baseurl() . "/dav/wdcal/", "caledit");
194                                                 $o .= wdcal_postEditPage($uri, $recurr_uri, $a->user["uid"], $a->timezone, $a->get_baseurl() . "/dav/wdcal/");
195                                         }
196                                         $o .= wdcal_getEditPage($uri, $recurr_uri);
197                                         return $o;
198                                 } else {
199                                         return wdcal_getDetailPage($uri, $recurr_uri);
200                                 }
201                         }
202                 } else {
203                         $cals      = dav_getMyCals($a->user["uid"]);
204                         $cals_show = array();
205                         foreach ($cals as $e) $cals_show[] = array("ns" => $e->namespace, "id" => $e->namespace_id, "displayname" => $e->displayname);
206                         $x = wdcal_printCalendar($cals, $cals_show, $a->get_baseurl() . "/dav/wdcal/feed/", "week", 0, 200);
207                 }
208         }
209         return $x;
210 }
211
212
213 /**
214  * @param App $a
215  * @param object $b
216  */
217 function dav_event_created_hook(&$a, &$b)
218 {
219         dav_include_files();
220         // @TODO Updating the cache instead of completely invalidating and rebuilding it
221         FriendicaVirtualCalSourceBackend::invalidateCache($a->user["uid"], CALDAV_FRIENDICA_CONTACTS);
222         FriendicaVirtualCalSourceBackend::invalidateCache($a->user["uid"], CALDAV_FRIENDICA_MINE);
223 }
224
225 /**
226  * @param App $a
227  * @param object $b
228  */
229 function dav_event_updated_hook(&$a, &$b)
230 {
231         dav_include_files();
232         // @TODO Updating the cache instead of completely invalidating and rebuilding it
233         FriendicaVirtualCalSourceBackend::invalidateCache($a->user["uid"], CALDAV_FRIENDICA_CONTACTS);
234         FriendicaVirtualCalSourceBackend::invalidateCache($a->user["uid"], CALDAV_FRIENDICA_MINE);
235 }
236
237 /**
238  * @param App $a
239  * @param object $b
240  */
241 function dav_profile_tabs_hook(&$a, &$b)
242 {
243         $b["tabs"][] = array(
244                 "label" => t('Calendar'),
245                 "url"   => $a->get_baseurl() . "/dav/wdcal/",
246                 "sel"   => "",
247                 "title" => t('Extended calendar with CalDAV-support'),
248         );
249 }
250
251 /**
252  * @param App $a
253  * @param null|object $o
254  */
255 function dav_plugin_admin_post(&$a = null, &$o = null)
256 {
257         check_form_security_token_redirectOnErr('/admin/plugins/dav', 'dav_admin_save');
258
259         require_once(__DIR__ . "/database-init.inc.php");
260
261         if (isset($_REQUEST["install"])) {
262                 $errs = dav_create_tables();
263                 if (count($errs) == 0) info(t('The database tables have been installed.') . EOL);
264                 else notice(t("An error occurred during the installation.") . EOL);
265         }
266 }
267
268 /**
269  * @param App $a
270  * @param null|object $o
271  */
272 function dav_plugin_admin(&$a, &$o)
273 {
274
275         require_once(__DIR__ . "/database-init.inc.php");
276
277         $dbstatus = dav_check_tables();
278
279         $o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("dav_admin_save") . '">';
280         $o .= '<i>' . t("No system-wide settings yet.") . '</i><br><br>';
281
282
283         $o .= '<h3>' . t('Database status') . '</h3>';
284         switch ($dbstatus) {
285                 case 0:
286                         $o .= t('Installed');
287                         break;
288                 case 1:
289                         $o .= t('Upgrade needed') . "<br><br><input type='submit' name='upgrade' value='" . t('Upgrade') . "'>";
290                         break;
291                 case -1:
292                         $o .= t('Not installed') . "<br><br><input type='submit' name='install' value='" . t('Install') . "'>";
293                         break;
294         }
295         $o .= "<br><br>";
296
297         $o .= "<h3>" . t("Troubleshooting") . "</h3>";
298         $o .= "<h4>" . t("Manual creation of the database tables:") . "</h4>";
299         $o .= "<a href='#' onClick='\$(\"#sqlstatements\").show(); return false;'>" . t("Show SQL-statements") . "</a><blockquote style='display: none;' id='sqlstatements'><pre>";
300         $tables = dav_get_create_statements();
301         foreach ($tables as $t) $o .= escape_tags($t . "\n\n");
302         $o .= "</pre></blockquote>";
303 }