/**
  * factory function to return a selected account/imap backend class
  *
  * @param   string|Expressomail_Model_Account $_accountId
  * @return  Expressomail_Backend_ImapProxy
  * @throws  Expressomail_Exception_IMAPInvalidCredentials
  */
 public static function factory($_accountId, $_readOnly = FALSE)
 {
     $accountId = $_accountId instanceof Expressomail_Model_Account ? $_accountId->getId() : $_accountId;
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Getting IMAP backend for account id ' . $accountId);
     }
     if (!isset(self::$_backends[$accountId])) {
         // get imap config from account
         $account = $_accountId instanceof Expressomail_Model_Account ? $_accountId : Expressomail_Controller_Account::getInstance()->get($_accountId);
         $imapConfig = $account->getImapConfig();
         // we need to instantiate a new imap backend
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Connecting to server ' . $imapConfig['host'] . ':' . $imapConfig['port'] . ' (' . (array_key_exists('ssl', $imapConfig) ? $imapConfig['ssl'] : 'none') . ')' . ' with username ' . $imapConfig['user']);
         }
         try {
             self::$_backends[$accountId] = new Expressomail_Backend_ImapProxy($imapConfig, $_readOnly);
             if (Tinebase_Core::get(Tinebase_Core::SERVER_CLASS_NAME) !== 'ActiveSync_Server_Http') {
                 Expressomail_Controller_Account::getInstance()->updateCapabilities($account, self::$_backends[$accountId]);
             }
         } catch (Expressomail_Exception_IMAPInvalidCredentials $feiic) {
             // add account and username to Expressomail_Exception_IMAPInvalidCredentials
             $feiic->setAccount($account)->setUsername($imapConfig['user']);
             throw $feiic;
         }
     }
     return self::$_backends[$accountId];
 }
 /**
  * factory function to return a selected account/imap backend class
  *
  * @param   string|Expressomail_Model_Account $_accountId
  * @return  Expressomail_Backend_Sieve
  */
 public static function factory($_accountId)
 {
     $accountId = $_accountId instanceof Expressomail_Model_Account ? $_accountId->getId() : $_accountId;
     if (!isset(self::$_backends[$accountId])) {
         $account = $_accountId instanceof Expressomail_Model_Account ? $_accountId : Expressomail_Controller_Account::getInstance()->get($accountId);
         // get imap config from account to connect with sieve server
         $sieveConfig = $account->getSieveConfig();
         // we need to instantiate a new sieve backend
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Connecting to server ' . $sieveConfig['host'] . ':' . $sieveConfig['port'] . ' (secure: ' . (array_key_exists('ssl', $sieveConfig) && $sieveConfig['ssl'] !== FALSE ? $sieveConfig['ssl'] : 'none') . ') with user ' . $sieveConfig['username']);
         }
         $expressomailConfig = Expressomail_Config::getInstance();
         $sieveBackendDefinition = $expressomailConfig->getDefinition(Expressomail_Config::SIEVEBACKEND);
         $backendClassName = self::$_availableBackends[$sieveBackendDefinition['default']];
         $expressomailSettings = $expressomailConfig->get(Expressomail_Config::EXPRESSOMAIL_SETTINGS);
         $backendName = isset($expressomailSettings[Expressomail_Config::SIEVEBACKEND]) ? $expressomailSettings[Expressomail_Config::SIEVEBACKEND] : $sieveBackendDefinition['default'];
         if ($sieveBackendName != $sieveBackendDefinition['default']) {
             if (Tinebase_Helper::checkClassExistence(self::$_availableBackends[$backendName], true)) {
                 $backendClassName = self::$_availableBackends[$backendName];
             }
         }
         self::$_backends[$accountId] = new $backendClassName($sieveConfig);
     }
     return self::$_backends[$accountId];
 }
 /**
  * Sets up the fixture.
  * This method is called before a test is executed.
  *
  * @access protected
  */
 protected function setUp()
 {
     $this->_account = Expressomail_Controller_Account::getInstance()->search()->getFirstRecord();
     $this->_controller = Expressomail_Controller_Folder::getInstance();
     $this->_imap = Expressomail_Backend_ImapFactory::factory($this->_account);
     // fill folder cache first
     $this->_controller->search($this->_getFolderFilter(''));
 }
 /**
  * event handler function
  * 
  * all events get routed through this function
  *
  * @param Tinebase_Event_Abstract $_eventObject the eventObject
  */
 protected function _handleEvent(Tinebase_Event_Abstract $_eventObject)
 {
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . ' (' . __LINE__ . ') handle event of type ' . get_class($_eventObject));
     }
     switch (get_class($_eventObject)) {
         case 'Tinebase_Event_User_ChangeCredentialCache':
             Expressomail_Controller_Account::getInstance()->updateCredentialsOfAllUserAccounts($_eventObject->oldCredentialCache);
             break;
     }
 }
 /**
  * factory function to return a selected account/imap backend class
  *
  * @param   string|Expressomail_Model_Account $_accountId
  * @return  Expressomail_Backend_Sieve
  */
 public static function factory($_accountId)
 {
     $accountId = $_accountId instanceof Expressomail_Model_Account ? $_accountId->getId() : $_accountId;
     if (!isset(self::$_backends[$accountId])) {
         $account = $_accountId instanceof Expressomail_Model_Account ? $_accountId : Expressomail_Controller_Account::getInstance()->get($accountId);
         // get imap config from account to connect with sieve server
         $sieveConfig = $account->getSieveConfig();
         // we need to instantiate a new sieve backend
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Connecting to server ' . $sieveConfig['host'] . ':' . $sieveConfig['port'] . ' (secure: ' . (array_key_exists('ssl', $sieveConfig) && $sieveConfig['ssl'] !== FALSE ? $sieveConfig['ssl'] : 'none') . ') with user ' . $sieveConfig['username']);
         }
         self::$_backends[$accountId] = new Expressomail_Backend_Sieve($sieveConfig);
     }
     return self::$_backends[$accountId];
 }
 /**
  * Sets up the fixture.
  * This method is called before a test is executed.
  *
  * @access protected
  */
 protected function setUp()
 {
     // get (or create) test accout
     $this->_account = Expressomail_Controller_Account::getInstance()->search()->getFirstRecord();
     // init controller and imap backend
     $this->_controller = Felamimail_Controller_Cache_Message::getInstance();
     $this->_imap = Expressomail_Backend_ImapFactory::factory($this->_account);
     try {
         $this->_imap->createFolder($this->_testFolderName, '', $this->_account->delimiter);
     } catch (Zend_Mail_Storage_Exception $zmse) {
         // exists
     }
     $this->_imap->selectFolder($this->_testFolderName);
     // init folder cache and get INBOX
     //Expressomail_Controller_Cache_Folder::getInstance()->update($this->_account->getId());
     $this->_folder = $this->_getFolder($this->_testFolderName);
     $this->_emailTestClass = new Expressomail_Controller_MessageTest();
     $this->_emailTestClass->setup();
 }
 /**
  * send Zend_Mail message via smtp
  *
  * @param  mixed      $accountId
  * @param  Zend_Mail  $mail
  * @param  boolean    $saveInSent
  * @param  Expressomail_Model_Message $originalMessage
  * @return Zend_Mail
  */
 public function sendZendMail($accountId, Zend_Mail $mail, $saveInSent = false, $originalMessage = NULL)
 {
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Sending message with subject ' . $mail->getSubject());
     }
     if ($originalMessage !== NULL) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Original Message subject: ' . $originalMessage->subject . ' / Flag to set: ' . var_export($originalMessage->flags, TRUE));
         }
         // this is required for adding the reply/forward flag in _sendMailViaTransport()
         $originalMessage->original_id = $originalMessage;
     }
     // increase execution time (sending message with attachments can take a long time)
     $oldMaxExcecutionTime = Tinebase_Core::setExecutionLifeTime(300);
     // 5 minutes
     // get account
     $account = $accountId instanceof Expressomail_Model_Account ? $accountId : Expressomail_Controller_Account::getInstance()->get($accountId);
     $this->_setMailFrom($mail, $account);
     $this->_setMailHeaders($mail, $account);
     $this->_sendMailViaTransport($mail, $account, $originalMessage, $saveInSent);
     // reset max execution time to old value
     Tinebase_Core::setExecutionLifeTime($oldMaxExcecutionTime);
     return $mail;
 }
 /**
  * get all folders for ActiveSync
  *
  * @param string|Expressomail_Model_Account $_account
  * @return array
  */
 public function getFoldersAS($_account)
 {
     $account = $_account instanceof Expressomail_Model_Account ? $_account : Expressomail_Controller_Account::getInstance()->get($_account);
     return $this->_backend->getAllFoldersAS($account);
 }
 /**
  * set and get vacation sieve script
  * 
  * @see 0007768: Sieve - Vacation notify frequency not being set (Cyrus)
  */
 public function testGetSetVacation()
 {
     $vacationData = $this->_getVacationData();
     $this->_sieveTestHelper($vacationData);
     // check if script was activated
     $activeScriptName = Expressomail_Controller_Sieve::getInstance()->getActiveScriptName($this->_account->getId());
     $this->assertEquals($this->_testSieveScriptName, $activeScriptName);
     $updatedAccount = Expressomail_Controller_Account::getInstance()->get($this->_account->getId());
     $this->assertTrue((bool) $updatedAccount->sieve_vacation_active);
     $result = $this->_json->getVacation($this->_account->getId());
     $this->assertEquals($this->_account->email, $result['addresses'][0]);
     $sieveBackend = Expressomail_Backend_SieveFactory::factory($this->_account->getId());
     if (preg_match('/dbmail/i', $sieveBackend->getImplementation())) {
         $translate = Tinebase_Translation::getTranslation('Felamimail');
         $vacationData['subject'] = sprintf($translate->_('Out of Office reply from %1$s'), Tinebase_Core::getUser()->accountFullName);
     }
     foreach (array('reason', 'enabled', 'subject', 'days') as $field) {
         $this->assertEquals($vacationData[$field], $result[$field], 'vacation data mismatch: ' . $field);
     }
 }
 /**
  * get expressomail account
  *
  * @return Expressomail_Model_Account|NULL
  */
 protected function _getAccount()
 {
     if ($this->_account === NULL) {
         $defaultAccountId = Tinebase_Core::getPreference('Expressomail')->{Expressomail_Preference::DEFAULTACCOUNT};
         if (empty($defaultAccountId)) {
             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
                 Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " no default account set. Can't sync any folders.");
             }
             return NULL;
         }
         try {
             $this->_account = Expressomail_Controller_Account::getInstance()->get($defaultAccountId);
         } catch (Tinebase_Exception_NotFound $ten) {
             return NULL;
         }
     }
     return $this->_account;
 }
 /**
  * Returns registry data of expressomail.
  * 
  * @see Tinebase_Application_Json_Abstract
  *
  * @return mixed array 'variable name' => 'data'
  *        
  * @todo get default account data (host, port, ...) from preferences?
  */
 public function getRegistryData()
 {
     try {
         $accounts = $this->searchAccounts('');
     } catch (Exception $e) {
         Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not get accounts: ' . $e->getMessage());
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $e->getTraceAsString());
         }
         $accounts = array('results' => array(), 'totalcount' => 0);
     }
     $supportedFlags = Expressomail_Controller_Message_Flags::getInstance()->getSupportedFlags();
     $extraSenderAccounts = array();
     foreach ($accounts['results'] as $key => $account) {
         try {
             // build a imap backend so the system folder can be created if necessary
             $accountModel = Expressomail_Controller_Account::getInstance()->get($account['id']);
             $accountModel->resolveCredentials(FALSE);
             // force update the user credentials
             $imapConfig = $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP, new Tinebase_Config_Struct());
             $config = new stdClass();
             $config->{'host'} = $imapConfig->{'host'};
             $config->{'port'} = $imapConfig->{'port'};
             $config->{'ssl'} = $imapConfig->{'ssl'};
             $config->{'user'} = $accountModel->getUsername();
             $config->{'password'} = $accountModel->{'password'};
             $imap = Expressomail_Backend_ImapFactory::factory($account['id']);
             if ($imap->createDefaultImapSystemFoldersIfNecessary($config)) {
                 try {
                     // add the namespace 'INBOX/' to the new folders
                     $capabilities = $imap->getCapabilityAndNamespace();
                     Expressomail_Controller_Account::getInstance()->updateNamespacesAndDelimiter($accountModel, $capabilities);
                     // update account info in backend and session
                     if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
                         Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Updating capabilities for account: ' . $accountModel->name);
                     }
                     Expressomail_Controller_Account::getInstance()->getBackend()->update($accountModel);
                     // save capabilities in SESSION
                     Expressomail_Session::getSessionNamespace()->account[$accountModel->getId()] = $capabilities;
                 } catch (Exception $zdse) {
                     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $zdse->getTraceAsString());
                     }
                 }
             }
         } catch (Exception $e) {
             if (Tinebase_Core::isLogLevel(Zend_Log::ERR)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Exception: ' . $e->getMessage());
             }
         }
         try {
             $extraSenderAccounts = Expressomail_Controller_Folder::getInstance()->getUsersWithSendAsAcl($account['id']);
         } catch (Expressomail_Exception_IMAPFolderNotFound $ex) {
             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
                 Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . $ex->getMessage());
             }
             // Ignore this exception here, it happens when INBOX folder is unaccessible.
         } catch (Expressomail_Exception_IMAPServiceUnavailable $ex) {
             // Ignoring this Exception here.
         }
         unset($account['host']);
         unset($account['port']);
         unset($account['ssl']);
         unset($account['smtp_hostname']);
         unset($account['smtp_port']);
         unset($account['smtp_ssl']);
         unset($account['smtp_auth']);
         $accounts['results'][$key] = $account;
     }
     $result = array('extraSenderAccounts' => $extraSenderAccounts, 'accounts' => $accounts, 'supportedFlags' => array('results' => $supportedFlags, 'totalcount' => count($supportedFlags)), 'aspellDicts' => Tinebase_Core::getConfig()->aspellDicts);
     // TODO: get balanceid cookie name from config
     $balanceIdCookieName = 'BALANCEID';
     if (isset($_COOKIE[$balanceIdCookieName])) {
         $result['balanceId'] = array('cookieName' => $balanceIdCookieName, 'cookieValue' => $_COOKIE[$balanceIdCookieName]);
     }
     $result['vacationTemplates'] = $this->getVacationMessageTemplates();
     $config = Tinebase_Core::getConfig();
     $result['useKeyEscrow'] = $config->certificate->active && $config->certificate->useKeyEscrow;
     $config = Expressomail_Controller::getInstance()->getConfigSettings(false);
     // add autoSaveDraftsInterval to client registry
     $result['autoSaveDraftsInterval'] = $config->autoSaveDraftsInterval;
     // add reportPhishingEmail to client registry
     $result['reportPhishingEmail'] = $config->reportPhishingEmail;
     return $result;
 }
 /**
  * get folder ids of all inboxes for accounts of current user
  *
  * @return array
  */
 public function getAllInboxes()
 {
     $return = array();
     $accounts = Expressomail_Controller_Account::getInstance()->search();
     //        $folderFilter = new Expressomail_Model_FolderFilter(array(
     //            array('field' => 'account_id', 'operator' => 'in', 'value' => $accounts->getArrayOfIds()),
     //            array('field' => 'globalname', 'operator' => 'equals', 'value' => 'INBOX')
     //        ));
     //        $folderIds = Expressomail_Controller_Folder::getInstance()->search($folderFilter, NULL, TRUE);
     foreach ($accounts as $account) {
         // Should be true to every imap server
         $return[] = '/' . $account->id . '/' . $this->encodeFolderUid('INBOX', $account->id);
     }
     //        //get array of /account_id/id
     //        for ($it = $folderIds->getIterator(), $it->rewind(); $it->valid(); $it->next())
     //        {
     //            $folder = $it->current();
     //            $return[] = self::IMAPDELIMITER.$folder->account_id.self::IMAPDELIMITER.$folder->id;
     //        }
     return $return;
 }
 /**
  * check the rules
  * 
  * @param Expressomail_Model_Sieve_Rule $_rule
  * @param string|Expressomail_Model_Account $_accountId
  * @throws Expressomail_Exception_Sieve
  */
 protected function _checkRule($_rule, $_accountId)
 {
     $account = $_accountId instanceof Expressomail_Model_Account ? $_accountId : Expressomail_Controller_Account::getInstance()->get($_accountId);
     if ($_rule->action_type === Expressomail_Sieve_Rule_Action::REDIRECT && $_rule->enabled) {
         if ($account->email === $_rule->action_argument) {
             throw new Expressomail_Exception_Sieve('It is not allowed to redirect emails to self (' . $account->email . ')! Please change the recipient.');
         }
     }
 }
 /**
  * get special options
  *
  * @param string $_value
  * @return array
  */
 protected function _getSpecialOptions($_value)
 {
     $result = array();
     switch ($_value) {
         case self::DEFAULTACCOUNT:
             // get all user accounts
             $accounts = Expressomail_Controller_Account::getInstance()->search();
             foreach ($accounts as $account) {
                 $result[] = array($account->getId(), $account->name);
             }
             break;
         default:
             $result = parent::_getSpecialOptions($_value);
     }
     return $result;
 }
 /**
  * get message content (body, headers and attachments)
  *
  * @param Expressomail_Model_Message $_message
  * @param Expressomail_Model_Account $_account
  * @param string $_partId
  */
 protected function _getCompleteMessageContent(Expressomail_Model_Message $_message, Expressomail_Model_Account $_account, $_partId = NULL)
 {
     $mimeType = $_account->display_format == Expressomail_Model_Account::DISPLAY_HTML || $_account->display_format == Expressomail_Model_Account::DISPLAY_CONTENT_TYPE ? Zend_Mime::TYPE_HTML : Zend_Mime::TYPE_TEXT;
     $headers = $this->getMessageHeaders($_message, $_partId, true);
     $attachments = $this->getAttachments($_message, $_partId);
     $this->_attachments = $attachments;
     $body = $this->getMessageBody($_message, $_partId, $mimeType, $_account, true);
     $signature = $this->getDigitalSignature($_message, $_partId);
     if ($signature['ret_type'] == 'cipher') {
         $smimeEml = $signature['content'];
         unset($signature);
     } else {
         $smimeEml = '';
     }
     if ($_partId === null) {
         $message = $_message;
         $message->body = $body;
         $message->headers = $headers;
         $message->attachments = $attachments;
         // make sure the structure is present
         $message->structure = $message->structure;
         $message->signature_info = $signature;
         $message->smimeEml = $smimeEml;
     } else {
         // create new object for rfc822 message
         $structure = $_message->getPartStructure($_partId, FALSE);
         $message = new Expressomail_Model_Message(array('messageuid' => $_message->messageuid, 'folder_id' => $_message->folder_id, 'received' => $_message->received, 'size' => array_key_exists('size', $structure) ? $structure['size'] : 0, 'partid' => $_partId, 'body' => $body, 'headers' => $headers, 'attachments' => $attachments, 'signature_info' => $signature, 'smimeEml' => $smimeEml, 'structure' => $structure));
         $message->parseHeaders($headers);
         $message->parseSmime($message->structure);
         $structure = array_key_exists('messageStructure', $structure) ? $structure['messageStructure'] : $structure;
         $message->parseStructure($structure);
     }
     if (!$_partId) {
         $message->sendReadingConfirmation();
     }
     if (isset($message['signature_info']) && $message['signature_info']) {
         if ($message['signature_info']['ret_type'] == 'signature') {
             $signature['smime'] = Expressomail_Smime::TYPE_ENVELOPED_DATA_VALUE;
             $extract1_headers = 'application/pkcs7';
             $extract1a_headers = 'name="smime.p7m"';
             $extract1b_headers = 'MIME-Version: 1.0';
             $extract2_headers = $message['headers']['content-disposition'];
             $extract3_headers = $message['headers']['content-transfer-encoding'];
             $imapBackend = $this->_getBackendAndSelectFolder($_message->folder_id);
             $contentHeaders = preg_replace("/(?<!\\r)\\n/", "\r\n", $imapBackend->getRawContent($_message->messageuid, 'HEADER'));
             $header_lines = explode(chr(0xd) . chr(0xa), $contentHeaders);
             $newHeaders = '';
             foreach ($header_lines as $line) {
                 if (strpos($line, $extract1_headers) === false && strpos($line, $extract1a_headers) === false && strpos($line, $extract1b_headers) === false && strpos($line, $extract2_headers) === false && strpos($line, $extract3_headers) === false) {
                     $newHeaders = $newHeaders . $line . chr(0xd) . chr(0xa);
                 }
             }
             $newHeaders = substr($newHeaders, 0, -4) . 'MIME-Version: 1.0' . chr(0xd) . chr(0xa);
             $msg = $newHeaders . $message['signature_info']['content'];
             $msg = preg_replace("/(?<!\\r)\\n/", "\r\n", $msg);
             $account = Expressomail_Controller_Account::getInstance()->get($message->account_id);
             $folder = Expressomail_Controller_Folder::getInstance()->getByBackendAndGlobalName($message->account_id, $account['trash_folder']);
             $_messageUid = Expressomail_Controller_Message::getInstance()->appendMessage($folder, $msg);
             $_messageid = Expressomail_Backend_Message::createMessageId($account['id'], $folder['id'], $_messageUid);
             $messageB = Expressomail_Controller_Message::getInstance()->getCompleteMessage($_messageid, Null, false);
             $messageB['signature_info'] = $message['signature_info'];
             return $messageB;
         }
     }
     return $message;
 }
 /**
  * Check folder account
  *
  * @param   string $_usrAccountId
  * @param   string $_folderId
  * @return  bool
  */
 private function _checkFolderAccount($_usrAccountId, $_folderAccount)
 {
     $_expressomailId = Expressomail_Controller_Account::getInstance()->get($_folderAccount);
     Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . '- Fetched ACCOUNT for Expressomail account: ' . $_expressomailId);
     if ($_expressomailId->user_id === $_usrAccountId) {
         return true;
     } else {
         return false;
     }
 }
 /**
  * check the rules
  * 
  * @param Expressomail_Model_Sieve_Rule $_rule
  * @param string|Expressomail_Model_Account $_accountId
  * @throws Expressomail_Exception_Sieve
  */
 protected function _checkRule($_rule, $_accountId)
 {
     $account = $_accountId instanceof Expressomail_Model_Account ? $_accountId : Expressomail_Controller_Account::getInstance()->get($_accountId);
     if ($_rule->action_type === Expressomail_Sieve_Rule_Action::REDIRECT && $_rule->enabled) {
         if ($account->email === $_rule->action_argument) {
             throw new Expressomail_Exception_Sieve('It is not allowed to redirect emails to self (' . $account->email . ')! Please change the recipient.');
         }
         $domains = $this->getAllowedSieveRedirectDomains();
         if ($domains) {
             $domain = substr($_rule->action_argument, strpos($_rule->action_argument, '@') + 1);
             $domains = str_replace(' ', '', $domains);
             $domains = str_replace('.', '\\.', $domains);
             $domains = str_replace(',', '|', $domains);
             if (preg_match('/' . $domains . '/', $domain) != 1) {
                 throw new Expressomail_Exception_Sieve('It is not allowed to redirect to this domain  ' . $_rule->action_argument);
             }
         }
     }
 }
 /**
  * returns TRUE if account has capability (i.e. QUOTA, CONDSTORE, ...)
  * 
  * @param $_capability
  * @return boolean
  */
 public function hasCapability($_capability)
 {
     $capabilities = Expressomail_Controller_Account::getInstance()->updateCapabilities($this);
     return in_array($_capability, $capabilities['capabilities']);
 }
 protected function _getAllFolders()
 {
     $return = array();
     $accounts = Expressomail_Controller_Account::getInstance()->search()->getArrayOfIds();
     $controllerFolder = Expressomail_Controller_Folder::getInstance();
     foreach ($accounts as $account) {
         $return = array_merge($return, $controllerFolder->getFoldersAS($account));
     }
     return $return;
 }
 /**
  * move messages to trash
  * 
  * @param Tinebase_Record_RecordSet $_messagesInFolder
  * @param string $_folderId
  * @return boolean did we move messages?
  */
 protected function _moveMessagesToTrash(Tinebase_Record_RecordSet $_messagesInFolder, $_folderId)
 {
     // messages should be moved to trash -> need to determine the trash folder for the account of the folder that contains the messages
     $targetFolder = Expressomail_Controller_Account::getInstance()->getSystemFolder($_messagesInFolder->getFirstRecord()->account_id, Expressomail_Model_Folder::FOLDER_TRASH);
     if ($_folderId === $targetFolder->id) {
         return FALSE;
     }
     try {
         $this->_moveMessagesInFolderOnSameAccount($_messagesInFolder, $targetFolder);
     } catch (Tinebase_Exception_NotFound $tenf) {
         if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
             Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' No trash folder found - skipping messages in this folder.');
         }
         return FALSE;
     }
     return TRUE;
 }
 /**
  * get folder ids of all inboxes for accounts of current user
  *
  * @return array
  */
 protected function _getFolderIdsOfAllInboxes()
 {
     $accounts = Expressomail_Controller_Account::getInstance()->search();
     $folderFilter = new Expressomail_Model_FolderFilter(array(array('field' => 'account_id', 'operator' => 'in', 'value' => $accounts->getArrayOfIds()), array('field' => 'localname', 'operator' => 'equals', 'value' => 'INBOX')));
     $folderBackend = new Expressomail_Backend_Folder();
     $folderIds = $folderBackend->search($folderFilter, NULL, TRUE);
     return $folderIds;
 }
 /**
  * clones the account
  *
  * @return Felamimail_Model_Account
  */
 protected function _cloneAccount()
 {
     $account = clone $this->_account;
     unset($account->id);
     $this->_accountsToDelete[] = $account;
     $account = Expressomail_Controller_Account::getInstance()->create($account);
     return $account;
 }
 /**
  * Compare order of Expressomail_Model_Message acording to Tinebase_Model_Pagination
  * @param Expressomail_Model_Message $msg1
  * @param Expressomail_Model_Message $msg2
  * @return int
  *
  * @todo Convert int security value in Expressomail_Smime to corresponding string type
  */
 public function compare($msg1, $msg2)
 {
     switch ($this->_pagination->sort) {
         case 'received':
             // Integer
             $value1 = $msg1[$this->_pagination->sort];
             $value2 = $msg2[$this->_pagination->sort];
         case 'sent':
             // Integer
             $value1 = isset($value1) ? $value1 : $msg1['header']['date'];
             $value2 = isset($value2) ? $value2 : $msg2['header']['date'];
             $value1 = intval(Expressomail_Message::convertDate($value1)->format("U"));
             $value2 = intval(Expressomail_Message::convertDate($value2)->format("U"));
         case 'size':
             // Integer
             $value1 = isset($value1) ? $value1 : intval($msg1[$this->_pagination->sort]);
             $value2 = isset($value2) ? $value2 : intval($msg2[$this->_pagination->sort]);
             return $this->compareIntegers($value1, $value2);
         case 'folder_id':
             // Strings
             $folders = array();
             $translate = Tinebase_Translation::getTranslation('Expressomail');
             foreach (array($msg1, $msg2) as $msg) {
                 $folder = Expressomail_Backend_Folder::decodeFolderUid($msg[$this->_pagination->sort]);
                 // Optimization! Only create the account object once for every sort operation.
                 $account = array_key_exists($folder['accountId'], $this->_accountMap) ? $this->_accountMap[$folder['accountId']] : ($this->_accountMap[$folder['accountId']] = Expressomail_Controller_Account::getInstance()->get($folder['accountId']));
                 $aux1 = explode('/', $folder['globalName']);
                 $aux2 = '';
                 foreach ($aux1 as $value) {
                     $aux2 .= $translate->_($value) . '/';
                 }
                 $folders[] = $account->name . '/' . substr($aux2, 0, strlen($aux2) - 1);
             }
             list($value1, $value2) = $folders;
             //TODO: Should use a static method implemented on Model_Message or Expressomail_Smime
         //TODO: Should use a static method implemented on Model_Message or Expressomail_Smime
         case 'smime':
             $value1 = isset($value1) ? $value1 : $this->processSmimeValue($msg1['structure']);
             $value2 = isset($value2) ? $value2 : $this->processSmimeValue($msg2['structure']);
         case 'flags':
             // Strings
             if (!isset($value1)) {
                 sort($msg1['flags']);
                 $value1 = implode(',', $msg1['flags']);
             }
             if (!isset($value2)) {
                 sort($msg2['flags']);
                 $value2 = implode(',', $msg2['flags']);
             }
         case 'subject':
             // Strings
             $value1 = isset($value1) ? $value1 : $msg1['header'][$this->_pagination->sort];
             $value2 = isset($value2) ? $value2 : $msg2['header'][$this->_pagination->sort];
         case 'id':
             // Strings
             $value1 = isset($value1) ? $value1 : $msg1[$this->_pagination->sort];
             $value2 = isset($value2) ? $value2 : $msg2[$this->_pagination->sort];
             return $this->compareStrings($value1, $value2);
         case 'sender':
         case 'to':
         case 'from_name':
         case 'from_email':
             // Strings
             list($header, $field) = explode('_', $this->_pagination->sort);
             $field = empty($field) ? 'email' : $field;
             $address1 = Expressomail_Message::convertAddresses($msg1['header'][$header]);
             $address2 = Expressomail_Message::convertAddresses($msg2['header'][$header]);
             return $this->compareStrings(isset($address1[0]) && array_key_exists($field, $address1[0]) ? $address1[0][$field] : '', isset($address2[0]) && array_key_exists($field, $address2[0]) ? $address2[0][$field] : '');
     }
 }
 /**
  * Send the reading confirmation in a message who has the correct header and is not seen yet
  *
  * @return void
  */
 public function sendReadingConfirmation()
 {
     if (!is_array($this->headers)) {
         $this->headers = Expressomail_Controller_Message::getInstance()->getMessageHeaders($this->getId(), NULL, TRUE);
     }
     if (array_key_exists('disposition-notification-to', $this->headers) && $this->headers['disposition-notification-to'] && !$this->hasSeenFlag() && !$this->hasReadFlag() && !$this->hasDraftFlag()) {
         $translate = Tinebase_Translation::getTranslation($this->_application);
         $from = Expressomail_Controller_Account::getInstance()->get($this->account_id);
         $arrRet = array();
         preg_match(Tinebase_Mail::EMAIL_ADDRESS_REGEXP, $this->headers['disposition-notification-to'], $arrRet);
         $to = $arrRet[0];
         if ($from->email === $to) {
             return;
         }
         // calculate timezone in "GMT-HH:MM" format
         $dtz = new DateTimeZone(Tinebase_Core::get(Tinebase_Core::USERTIMEZONE));
         $time = new DateTime('now', $dtz);
         $offset = $dtz->getOffset($time);
         $sign = $offset < 0 ? "-" : "+";
         $offset = abs($offset);
         $hours = floor($offset / 3600);
         $hours = $hours < 10 ? '0' . $hours : $hours;
         $minutes = offset % 60;
         $minutes = $minutes < 10 ? '0' . $minutes : $minutes;
         $gmt = '(GMT' . $sign . $hours . ":" . $minutes . ')';
         $subject = $translate->_('Reading Confirmation:') . ' ' . $this->subject;
         $readTime = date('Y-m-d H:i:s');
         $tzReadTime = Tinebase_Translation::dateToStringInTzAndLocaleFormat(Expressomail_Message::convertDate($readTime));
         $tzReceived = Tinebase_Translation::dateToStringInTzAndLocaleFormat(Expressomail_Message::convertDate($this->received));
         $messageBody = $translate->_('Your message:') . ' ' . $this->subject . "\n" . $translate->_('Received on') . ' ' . $tzReceived . ' ' . $gmt . "\n" . $translate->_('Was read by:') . ' ' . $from->from . ' <' . $from->email . '> ' . $translate->_('on') . ' ' . $tzReadTime . ' ' . $gmt;
         //$messageBody         = Expressomail_Message::convertFromTextToHTML($messageBody);
         $readconf = array('to' => $to, 'subject' => $this->subject, 'received' => $this->received, 'from_name' => $from->from, 'from_email' => $from->email, 'read_time' => $readTime);
         $mailPart = new Zend_Mime_Part(serialize($readconf));
         $mailPart->charset = 'UTF-8';
         $mailPart->type = 'text/readconf;';
         $mailPart->encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE;
         $contact = new Addressbook_Model_Contact(array('email' => $to, 'n_fn' => $from->from), true);
         $result = Tinebase_Notification::getInstance()->send(Tinebase_Core::getUser(), array($contact), $subject, $messageBody, $mailPart, NULL);
         Expressomail_Controller_Message_Flags::getInstance()->addFlags($this->getId(), (array) 'Read');
     }
 }
 /**
  * Sets up the fixture.
  * This method is called before a test is executed.
  *
  * @access protected
  */
 protected function setUp()
 {
     Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
     $this->_controller = Expressomail_Controller_Account::getInstance();
     $this->_account = $this->_controller->search()->getFirstRecord();
 }