/** * Update the cache information for a calendar. * * @param Horde_Kolab_FreeBusy_Access $access The object holding the * relevant access * parameters. * * @return boolean|PEAR_Error True if successful. */ function store($access) { global $conf; /* Now we really need the free/busy library */ require_once 'Horde/Kolab/FreeBusy/Imap.php'; $fb = new Horde_Kolab_FreeBusy_Imap(); $result = $fb->connect($access->imap_folder); if (is_a($result, 'PEAR_Error')) { return $result; } $fbpast = $fbfuture = null; try { if (!empty($access->server_object)) { $result = $access->server_object->get(Horde_Kolab_Server_Object_Kolab_Server::ATTRIBUTE_FBPAST); if (!is_a($result, 'PEAR_Error')) { $fbpast = $result; } } } catch (Horde_Kolab_Server_Exception $e) { Horde::log(sprintf("Failed fetching the k=kolab configuration object. Error was: %s", $e->getMessage()), 'ERR'); if (isset($conf['kolab']['freebusy']['past'])) { $fbpast = $conf['kolab']['freebusy']['past']; } else { $fbpast = 10; } } if (!empty($access->owner_object)) { $result = $access->owner_object->get(Horde_Kolab_Server_Object_Kolab_User::ATTRIBUTE_FBFUTURE); if (!is_a($result, 'PEAR_Error')) { $fbfuture = $result; } } $vCal = $fb->generate(null, null, !empty($fbpast) ? $fbpast : 0, !empty($fbfuture) ? $fbfuture : 60, $access->owner, $access->owner_object->get(Horde_Kolab_Server_Object_Kolab_User::ATTRIBUTE_CN)); if (is_a($vCal, 'PEAR_Error')) { $vCal; } $fbfilename = $this->_getFilename($access->folder, $access->owner); $c_pvcal = new Horde_Kolab_FreeBusy_Cache_File_pvcal($this->_cache_dir, $fbfilename); if (!empty($conf['fb']['use_acls'])) { $c_acl = new Horde_Kolab_FreeBusy_Cache_File_acl($this->_cache_dir, $fbfilename); $c_xacl = new Horde_Kolab_FreeBusy_Cache_File_xacl($this->_cache_dir, $fbfilename); } /* missing data means delete the cache files */ if (empty($vCal)) { Horde::log(sprintf("No events. Purging cache %s.", $fbfilename), 'DEBUG'); $result = $c_pvcal->purge(); if (is_a($result, 'PEAR_Error')) { return $result; } if (!empty($conf['fb']['use_acls'])) { $result = $c_acl->purge(); if (is_a($result, 'PEAR_Error')) { return $result; } $result = $c_xacl->purge(); if (is_a($result, 'PEAR_Error')) { return $result; } } } else { $result = $c_pvcal->storePVcal($vCal); if (is_a($result, 'PEAR_Error')) { return $result; } $relevance = $fb->getRelevance(); if (is_a($relevance, 'PEAR_Error')) { return $relevance; } if (!empty($conf['fb']['use_acls'])) { $acl = $fb->getACL(); if (is_a($acl, 'PEAR_Error')) { return $acl; } /** * Only store the acl information if the current user * has admin rights on the folder and can actually * retrieve the full ACL information. * * A folder that does not have admin rights for a user * will not be considered relvant for that user unless * it has been triggered by the folder owner before. */ $append = false; if (isset($acl[$access->user])) { $myacl = $acl[$access->user]; if (strpos($myacl, 'a') !== false) { $append = true; } } $result = $c_acl->storeACL($acl, $relevance, $append); if (is_a($result, 'PEAR_Error')) { return $result; } $xacl = $fb->getExtendedACL(); if (is_a($xacl, 'PEAR_Error')) { return $xacl; } $result = $c_xacl->storeXACL($xacl, $acl); if (is_a($result, 'PEAR_Error')) { return $result; } } else { $acl = null; } Horde::log(sprintf("Horde_Kolab_FreeBusy_Cache::store(file=%s, relevance=%s, acl=%s, xacl=%s)", $fbfilename, $relevance, $acl, $xacl), 'DEBUG'); } return true; }