/**
  * tear down tests
  */
 protected function tearDown()
 {
     parent::tearDown();
     Tinebase_FileSystem::getInstance()->clearStatCache();
     Tinebase_FileSystem::getInstance()->clearDeletedFilesFromFilesystem();
     Tinebase_Cache_PerRequest::getInstance()->reset();
 }
 /**
  * get not disabled users
  *
  */
 public function testGetNotDisabledUsers()
 {
     $user1 = Tinebase_User::getInstance()->getUserByLoginName('jsmith');
     $user2 = Tinebase_User::getInstance()->getUserByLoginName('pwulf');
     Tinebase_User::getInstance()->setStatus($user2, 'enabled');
     $container = Tinebase_Container::getInstance()->getPersonalContainer($user1, 'Calendar', $user1, Tinebase_Model_Grants::GRANT_READ);
     $oldGrants = Tinebase_Container::getInstance()->getGrantsOfContainer($container->getFirstRecord()->id, TRUE);
     $newGrants = new Tinebase_Record_RecordSet('Tinebase_Model_Grants');
     $newGrants->addRecord(new Tinebase_Model_Grants(array('account_id' => $user1->accountId, 'account_type' => 'user', Tinebase_Model_Grants::GRANT_READ => true, Tinebase_Model_Grants::GRANT_ADD => true, Tinebase_Model_Grants::GRANT_EDIT => true, Tinebase_Model_Grants::GRANT_DELETE => true, Tinebase_Model_Grants::GRANT_ADMIN => true)));
     $newGrants->addRecord(new Tinebase_Model_Grants(array('account_id' => $user2->accountId, 'account_type' => 'user', Tinebase_Model_Grants::GRANT_READ => true, Tinebase_Model_Grants::GRANT_ADD => true, Tinebase_Model_Grants::GRANT_EDIT => true, Tinebase_Model_Grants::GRANT_DELETE => true, Tinebase_Model_Grants::GRANT_ADMIN => true)));
     Tinebase_Container::getInstance()->setGrants($container->getFirstRecord()->id, $newGrants, TRUE);
     $otherUsers = Tinebase_Container::getInstance()->getOtherUsers($user1, 'Calendar', array(Tinebase_Model_Grants::GRANT_READ));
     $this->assertEquals(1, $otherUsers->filter('accountId', $user2->accountId)->count());
     Tinebase_User::getInstance()->setStatus($user2, 'disabled');
     Tinebase_Cache_PerRequest::getInstance()->reset();
     $otherUsers = Tinebase_Container::getInstance()->getOtherUsers($user1, 'Calendar', array(Tinebase_Model_Grants::GRANT_READ));
     Tinebase_User::getInstance()->setStatus($user2, 'enabled');
     Tinebase_Container::getInstance()->setGrants($container->getFirstRecord()->id, $oldGrants, TRUE);
     $this->assertEquals(0, $otherUsers->filter('accountId', $user2->accountId)->count());
 }
 /**
  * tear down tests
  */
 protected function tearDown()
 {
     if (Tinebase_User::getConfiguredBackend() === Tinebase_User::LDAP) {
         $this->_deleteUsers();
         $this->_deleteGroups();
     }
     if ($this->_transactionId) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Rolling back test transaction');
         }
         Tinebase_TransactionManager::getInstance()->rollBack();
     }
     Addressbook_Controller_Contact::getInstance()->setGeoDataForContacts(true);
     if ($this->_originalTestUser instanceof Tinebase_Model_User) {
         Tinebase_Core::set(Tinebase_Core::USER, $this->_originalTestUser);
     }
     if ($this->_invalidateRolesCache) {
         Tinebase_Acl_Roles::getInstance()->resetClassCache();
     }
     Tinebase_Cache_PerRequest::getInstance()->reset();
     $this->_releaseDBLocks();
 }
 /**
  * reset class cache
  * 
  * @param string $method
  * @return Tinebase_Backend_Sql_Abstract
  */
 public function resetClassCache($method = null)
 {
     Tinebase_Cache_PerRequest::getInstance()->reset($this->_getInClassCacheIdentifier(), $method);
     return $this;
 }
 /**
  * get describe table from metadata cache
  * 
  * @param string $tableName
  * @param Zend_Db_Adapter_Abstract $db
  * @return array
  */
 public static function getTableDescriptionFromCache($tableName, $db = NULL)
 {
     if ($db === NULL) {
         $db = Tinebase_Core::getDb();
     }
     $dbConfig = $db->getConfig();
     $cacheId = md5($dbConfig['host'] . $dbConfig['dbname'] . $tableName);
     // try to get description from in-memory caches first
     try {
         return Tinebase_Cache_PerRequest::getInstance()->load(__CLASS__, __METHOD__, $cacheId, false);
     } catch (Tinebase_Exception_NotFound $tenf) {
         // try to get description from APC
         if (function_exists('apc_fetch')) {
             // prefix with applications hash, as this hash changes if an application got updated
             $apcCacheId = Tinebase_Application::getInstance()->getApplicationsHash() . $cacheId;
             if ($result = apc_fetch($apcCacheId)) {
                 Tinebase_Cache_PerRequest::getInstance()->save(__CLASS__, __METHOD__, $cacheId, $result, false);
                 return $result;
             }
         }
     }
     // try to get description from persistent cache
     try {
         return Tinebase_Cache_PerRequest::getInstance()->load(__CLASS__, __METHOD__, $cacheId, Tinebase_Cache_PerRequest::VISIBILITY_SHARED);
     } catch (Tinebase_Exception_NotFound $tenf) {
         // do nothing
     }
     // read description from database
     $result = $db->describeTable($tableName);
     // if table does not exist (yet), $result is an empty array
     if (count($result) > 0) {
         // save result for next request
         Tinebase_Cache_PerRequest::getInstance()->save(__CLASS__, __METHOD__, $cacheId, $result, Tinebase_Cache_PerRequest::VISIBILITY_SHARED);
         // if APC extension is installed also store in APC
         if (function_exists('apc_store')) {
             /** @noinspection PhpUndefinedVariableInspection */
             apc_store($apcCacheId, $result, 3600);
         }
     }
     return $result;
 }
 /**
  * reset class cache
  * 
  * @param string $method
  * @return Tinebase_Application
  */
 public function resetClassCache($method = null)
 {
     Tinebase_Cache_PerRequest::getInstance()->reset(__CLASS__, $method);
     return $this;
 }
 /**
  * the singleton pattern
  *
  * @return Tinebase_Cache_PerRequest
  */
 public static function getInstance()
 {
     if (self::$_instance === NULL) {
         self::$_instance = new Tinebase_Cache_PerRequest();
     }
     return self::$_instance;
 }
 /**
  * returns true if a certain feature is enabled
  * 
  * @param string $featureName
  * @return boolean
  */
 public function featureEnabled($featureName)
 {
     $cacheId = $this->_appName;
     try {
         $features = Tinebase_Cache_PerRequest::getInstance()->load(__CLASS__, __METHOD__, $cacheId);
     } catch (Tinebase_Exception_NotFound $tenf) {
         $features = $this->get(self::ENABLED_FEATURES);
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Features config of app ' . $this->_appName . ': ' . print_r($features->toArray(), true));
         }
         Tinebase_Cache_PerRequest::getInstance()->save(__CLASS__, __METHOD__, $cacheId, $features);
     }
     if (isset($features->{$featureName})) {
         return $features->{$featureName};
     }
     return false;
 }
 /**
  * Tears down the fixture
  * This method is called after a test is executed.
  *
  * @access protected
  */
 protected function tearDown()
 {
     parent::tearDown();
     Tinebase_Cache_PerRequest::getInstance()->setPersistentCacheMethods('Tinebase_Container', array());
     Tinebase_Cache_PerRequest::getInstance()->reset('Tinebase_Container');
 }
 /**
  * (non-PHPdoc)
  * @see Sabre\DAVACL\IPrincipalBackend::getGroupMembership()
  */
 public function getGroupMembership($principal)
 {
     $result = array();
     list($prefix, $contactId) = \Sabre\DAV\URLUtil::splitPath($principal);
     switch ($prefix) {
         case self::PREFIX_GROUPS:
             // @TODO implement?
             break;
         case self::PREFIX_USERS:
             if ($contactId !== self::SHARED) {
                 $classCacheId = $principal;
                 try {
                     return Tinebase_Cache_PerRequest::getInstance()->load(__CLASS__, __FUNCTION__, $classCacheId);
                 } catch (Tinebase_Exception_NotFound $tenf) {
                     // continue...
                 }
                 $cacheId = __FUNCTION__ . sha1($classCacheId);
                 // try to load from cache
                 $cache = Tinebase_Core::getCache();
                 $result = $cache->load($cacheId);
                 if ($result !== FALSE) {
                     Tinebase_Cache_PerRequest::getInstance()->save(__CLASS__, __FUNCTION__, $classCacheId, $result);
                     return $result;
                 }
                 $result = array();
                 $user = Tinebase_User::getInstance()->getUserByPropertyFromSqlBackend('contactId', $contactId);
                 $groupIds = Tinebase_Group::getInstance()->getGroupMemberships($user);
                 $groups = Tinebase_Group::getInstance()->getMultiple($groupIds);
                 foreach ($groups as $group) {
                     if ($group->list_id && $group->visibility == Tinebase_Model_Group::VISIBILITY_DISPLAYED) {
                         $result[] = self::PREFIX_GROUPS . '/' . $group->list_id;
                     }
                 }
                 if (Tinebase_Core::getUser()->hasRight('Calendar', Tinebase_Acl_Rights::RUN)) {
                     // return users only, if they have the sync AND read grant set
                     $otherUsers = Tinebase_Container::getInstance()->getOtherUsers($user, 'Calendar', array(Tinebase_Model_Grants::GRANT_SYNC, Tinebase_Model_Grants::GRANT_READ), false, true);
                     foreach ($otherUsers as $u) {
                         if ($u->contact_id && $u->visibility == Tinebase_Model_User::VISIBILITY_DISPLAYED) {
                             $result[] = self::PREFIX_USERS . '/' . $u->contact_id . '/calendar-proxy-write';
                         }
                     }
                     // return containers only, if the user has the sync AND read grant set
                     $sharedContainers = Tinebase_Container::getInstance()->getSharedContainer($user, 'Calendar', array(Tinebase_Model_Grants::GRANT_SYNC, Tinebase_Model_Grants::GRANT_READ), false, true);
                     if ($sharedContainers->count() > 0) {
                         $result[] = self::PREFIX_USERS . '/' . self::SHARED . '/calendar-proxy-write';
                     }
                 }
                 Tinebase_Cache_PerRequest::getInstance()->save(__CLASS__, __FUNCTION__, $classCacheId, $result);
                 $cache->save($result, $cacheId, array(), 60 * 3);
             }
             break;
     }
     return $result;
 }