]> git.mxchange.org Git - friendica-addons.git/blobdiff - dav/calendar.friendica.fnk.php
More refactoring, mainly of the addressbook/VCARD-part
[friendica-addons.git] / dav / calendar.friendica.fnk.php
index 38406e0b39e98f990581d52037dc5c98ef0c5f07..60dd9c6bd190a4e9f97ad5570218398d4a4405a4 100644 (file)
@@ -1,31 +1,52 @@
 <?php
 
+$a    = get_app();
+$uri  = parse_url($a->get_baseurl());
+$path = "/";
+if (isset($uri["path"]) && strlen($uri["path"]) > 1) {
+       $path = $uri["path"] . "/";
+}
+
 define("CALDAV_SQL_DB", "");
 define("CALDAV_SQL_PREFIX", "dav_");
-define("CALDAV_URL_PREFIX", "dav/");
+define("CALDAV_URL_PREFIX", $path . "dav/");
+define("DAV_APPNAME", "Friendica");
 
 define("CALDAV_NAMESPACE_PRIVATE", 1);
-define("CALDAV_NAMESPACE_FRIENDICA_NATIVE", 2);
+define("CALDAV_FRIENDICA_MINE", "friendica-mine");
+define("CALDAV_FRIENDICA_CONTACTS", "friendica-contacts");
+
+$GLOBALS["CALDAV_PRIVATE_SYSTEM_CALENDARS"] = array(CALDAV_FRIENDICA_MINE, CALDAV_FRIENDICA_CONTACTS);
+$GLOBALS["CALDAV_PRIVATE_SYSTEM_BACKENDS"] = array("Sabre_CalDAV_Backend_Friendica");
 
-define("CALDAV_FRIENDICA_MINE", 1);
-define("CALDAV_FRIENDICA_CONTACTS", 2);
+define("CARDDAV_NAMESPACE_PRIVATE", 1);
+define("CARDDAV_FRIENDICA_CONTACT", "friendica");
+$GLOBALS["CARDDAV_PRIVATE_SYSTEM_ADDRESSBOOKS"] = array(CARDDAV_FRIENDICA_CONTACT);
+$GLOBALS["CARDDAV_PRIVATE_SYSTEM_BACKENDS"] = array("Sabre_CardDAV_Backend_Friendica");
 
-define("CARDDAV_NAMESPACE_COMMUNITYCONTACTS", 1);
-define("CARDDAV_NAMESPACE_PHONECONTACTS", 2);
+$GLOBALS["CALDAV_ACL_PLUGIN_CLASS"] = "Sabre_DAVACL_Plugin_Friendica";
 
-define("CALDAV_DB_VERSION", 1);
+define("CALDAV_MAX_YEAR", date("Y") + 5);
 
-function getCurMicrotime () {
-        list($usec, $sec) = explode(" ", microtime());
-        return sprintf("%14.0f", $sec * 10000 + $usec * 10000);
+/**
+ * @return int
+ */
+function getCurMicrotime()
+{
+       list($usec, $sec) = explode(" ", microtime());
+       return sprintf("%14.0f", $sec * 10000 + $usec * 10000);
 } // function getCurMicrotime
 
-function debug_time() {
-        $cur = getCurMicrotime();
-        if ($GLOBALS["debug_time_last"] > 0) {
-                echo "Zeit: " . ($cur - $GLOBALS["debug_time_last"]) . "<br>\n";
-        }
-        $GLOBALS["debug_time_last"] = $cur;
+/**
+ *
+ */
+function debug_time()
+{
+       $cur = getCurMicrotime();
+       if ($GLOBALS["debug_time_last"] > 0) {
+               echo "Zeit: " . ($cur - $GLOBALS["debug_time_last"]) . "<br>\n";
+       }
+       $GLOBALS["debug_time_last"] = $cur;
 }
 
 
@@ -35,7 +56,7 @@ function debug_time() {
  */
 function dav_compat_username2id($username = "")
 {
-       $x = q("SELECT `uid` FROM user WHERE nickname='%s' AND account_removed = 0 AND account_expired = 0", dbesc($username));
+       $x = q("SELECT `uid` FROM `user` WHERE `nickname`='%s' AND `account_removed` = 0 AND `account_expired` = 0", dbesc($username));
        if (count($x) == 1) return $x[0]["uid"];
        return null;
 }
@@ -46,7 +67,7 @@ function dav_compat_username2id($username = "")
  */
 function dav_compat_id2username($id = 0)
 {
-       $x = q("SELECT `nickname` FROM user WHERE uid = %i AND account_removed = 0 AND account_expired = 0", IntVal($id));
+       $x = q("SELECT `nickname` FROM `user` WHERE `uid` = %i AND `account_removed` = 0 AND `account_expired` = 0", IntVal($id));
        if (count($x) == 1) return $x[0]["nickname"];
        return "";
 }
@@ -54,7 +75,8 @@ function dav_compat_id2username($id = 0)
 /**
  * @return int
  */
-function dav_compat_get_curr_user_id() {
+function dav_compat_get_curr_user_id()
+{
        $a = get_app();
        return IntVal($a->user["uid"]);
 }
@@ -73,33 +95,128 @@ function dav_compat_principal2uid($principalUri = "")
        return dav_compat_username2id($username);
 }
 
+/**
+ * @param string $principalUri
+ * @return array|null
+ */
+function dav_compat_principal2namespace($principalUri = "")
+{
+       if (strlen($principalUri) == 0) return null;
+       if ($principalUri[0] == "/") $principalUri = substr($principalUri, 1);
+
+       if (strpos($principalUri, "principals/users/") !== 0) return null;
+       $username = substr($principalUri, strlen("principals/users/"));
+       return array("namespace" => CALDAV_NAMESPACE_PRIVATE, "namespace_id" => dav_compat_username2id($username));
+}
+
+
+/**
+ * @return string
+ */
+function dav_compat_currentUserPrincipal()
+{
+       $a = get_app();
+       return "principals/users/" . strtolower($a->user["nickname"]);
+}
+
+
+/**
+ * @param string $name
+ * @return null|string
+ */
+function dav_compat_getRequestVar($name = "")
+{
+       if (isset($_REQUEST[$name])) return $_REQUEST[$name];
+       else return null;
+}
+
 /**
  * @param $text
- * @return mixed
+ * @return null|string
  */
-function wdcal_parse_text_serverside($text)
+function dav_compat_parse_text_serverside($text)
 {
-       return $text;
+       return dav_compat_getRequestVar($text);
+}
+
+/**
+ * @param string $uri
+ */
+function dav_compat_redirect($uri = "")
+{
+       goaway($uri);
+}
+
+
+/**
+ * @return null|int
+ */
+function dav_compat_get_max_private_calendars()
+{
+       return null;
+}
+
+/**
+ * @return string
+ */
+function dav_compat_get_hostname() {
+       $a = get_app();
+       return $a->get_hostname();
 }
 
 /**
- * @param int $user_id
  * @param int $namespace
  * @param int $namespace_id
- * @return AnimexxCalSource
+ * @param string $uri
+ * @param array $calendar
+ * @return Sabre_CalDAV_Backend_Common
  * @throws Exception
  */
-function wdcal_calendar_factory($user_id, $namespace, $namespace_id)
+function wdcal_calendar_factory($namespace, $namespace_id, $uri, $calendar = null)
 {
        switch ($namespace) {
                case CALDAV_NAMESPACE_PRIVATE:
-                       return new AnimexxCalSourcePrivate($user_id, $namespace_id);
-               case CALDAV_NAMESPACE_FRIENDICA_NATIVE:
-                       return new FriendicaCalSourceEvents($user_id, $namespace_id);
+                       if ($uri == CALDAV_FRIENDICA_MINE || $uri == CALDAV_FRIENDICA_CONTACTS) return Sabre_CalDAV_Backend_Friendica::getInstance();
+                       else return Sabre_CalDAV_Backend_Private::getInstance();
        }
        throw new Exception("Calendar Namespace not found");
 }
 
+/**
+ * @param int $calendar_id
+ * @return Sabre_CalDAV_Backend_Common
+ * @throws Exception
+ */
+function wdcal_calendar_factory_by_id($calendar_id)
+{
+       $calendar = Sabre_CalDAV_Backend_Common::loadCalendarById($calendar_id);
+       return wdcal_calendar_factory($calendar["namespace"], $calendar["namespace_id"], $calendar["uri"], $calendar);
+}
+
+/**
+ * @param int $user_id
+ * @param bool $withcheck
+ * @return array
+ */
+function wdcal_create_std_calendars_get_statements($user_id, $withcheck = true)
+{
+       $stms = array();
+       $a = get_app();
+       $uris = array(
+               'private'                 => t("Private Calendar"),
+               CALDAV_FRIENDICA_MINE     => t("Friendica Events: Mine"),
+               CALDAV_FRIENDICA_CONTACTS => t("Friendica Events: Contacts"),
+       );
+       foreach ($uris as $uri => $name) {
+               $cals = q("SELECT * FROM %s%scalendars WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
+                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
+               if (count($cals) == 0 || !$withcheck) $stms[] =
+                       sprintf("INSERT INTO %s%scalendars (`namespace`, `namespace_id`, `displayname`, `timezone`, `ctag`, `uri`, `has_vevent`, `has_vtodo`)
+                               VALUES (%d, %d, '%s', '%s', 1, '%s', 1, 0)",
+                               CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($name), dbesc($a->timezone), dbesc($uri));
+       }
+       return $stms;
+}
 
 /**
  */
@@ -108,27 +225,50 @@ function wdcal_create_std_calendars()
        $a = get_app();
        if (!local_user()) return;
 
-       $cals = q("SELECT * FROM %s%scalendars WHERE `uid` = %d AND `namespace` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $a->user["uid"], CALDAV_NAMESPACE_PRIVATE);
-       if (count($cals) == 0) {
-               $maxid = q("SELECT MAX(`namespace_id`) maxid FROM %s%scalendars WHERE `namespace` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE);
-               if (!$maxid) {
-                       notification("Something went wrong when trying to create your calendar.");
-                       goaway("/");
-                       killme();
-               }
-               $nextid = IntVal($maxid[0]["maxid"]) + 1;
-               q("INSERT INTO %s%scalendars (`namespace`, `namespace_id`, `uid`, `displayname`, `timezone`, `ctag`) VALUES (%d, %d, %d, '%s', '%s', 1)",
-                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, $nextid, $a->user["uid"], dbesc(t("Private Calendar")), dbesc($a->timezone)
-               );
-       }
+       $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"]));
+       if ($privates[0]["num"] > 0) return;
+
+       $stms = wdcal_create_std_calendars_get_statements($a->user["uid"]);
+       foreach ($stms as $stmt) q($stmt);
+}
+
 
-       $cals = q("SELECT * FROM %s%scalendars WHERE `uid` = %d AND `namespace` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $a->user["uid"], CALDAV_NAMESPACE_FRIENDICA_NATIVE);
-       if (count($cals) < 2) {
-               q("INSERT INTO %s%scalendars (`namespace`, `namespace_id`, `uid`, `displayname`, `timezone`, `ctag`) VALUES (%d, %d, %d, '%s', '%s', 1)",
-                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_FRIENDICA_NATIVE, CALDAV_FRIENDICA_MINE, $a->user["uid"], dbesc(t("Friendica Events: Mine")), dbesc($a->timezone)
-               );
-               q("INSERT INTO %s%scalendars (`namespace`, `namespace_id`, `uid`, `displayname`, `timezone`, `ctag`) VALUES (%d, %d, %d, '%s', '%s', 1)",
-                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_FRIENDICA_NATIVE, CALDAV_FRIENDICA_CONTACTS, $a->user["uid"], dbesc(t("Friendica Events: Contacts")), dbesc($a->timezone)
-               );
+
+
+/**
+ * @param int $user_id
+ * @param bool $withcheck
+ * @return array
+ */
+function wdcal_create_std_addressbooks_get_statements($user_id, $withcheck = true)
+{
+       $stms = array();
+       $a = get_app();
+       $uris = array(
+               'private'                 => t("Private Addresses"),
+               CARDDAV_FRIENDICA_CONTACT     => t("Friendica Contacts"),
+       );
+       foreach ($uris as $uri => $name) {
+               $cals = q("SELECT * FROM %s%saddressbooks WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
+                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
+               if (count($cals) == 0 || !$withcheck) $stms[] =
+                       sprintf("INSERT INTO %s%saddressbooks (`namespace`, `namespace_id`, `displayname`, `ctag`, `uri`)
+                               VALUES (%d, %d, '%s', 1, '%s')",
+                               CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CARDDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($name), dbesc($uri));
        }
+       return $stms;
+}
+
+/**
+ */
+function wdcal_create_std_addressbooks()
+{
+       $a = get_app();
+       if (!local_user()) return;
+
+       $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"]));
+       if ($privates[0]["num"] > 0) return;
+
+       $stms = wdcal_create_std_addressbooks_get_statements($a->user["uid"]);
+       foreach ($stms as $stmt) q($stmt);
 }