Example #1
0
 /**
  * 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;
 }