/** * Creates a Conjoon_Error object based on the passed arguments and * return the error object. * * @param string $message * @param string $level * @param string $code * @param string $file * @param string $line * * @return Conjoon_Error */ public static function createError($message = "[no message]", $level = null, $type = null, $code = null, $file = null, $line = null) { if ($level === null) { $level = Conjoon_Error::LEVEL_ERROR; } if ($type === null) { $type = Conjoon_Error::UNKNOWN; } $error = new Conjoon_Error(); $error->setMessage($message); $error->setLevel($level); $error->setType($type); $error->setCode($code); $error->setFile($file); $error->setLine($line); return $error; }
public function processAction() { require_once 'Conjoon/Auth/Adapter/Db.php'; /** * @todo Filter username and password! */ $username = $this->_getParam('username'); $password = $this->_getParam('password'); $rememberMe = (bool) $this->_getParam('rememberMe'); $lastUserRequest = (int) $this->_getParam('lastUserRequest'); // Special case - the app was started and the user wants to re-login // since his session was lost. Check if the user object as returned by the // data storage has a property lastLogin which may not be greater than // the "lastUserRequest"-parameter - if that is teh case, most likely another // user has logged in so the user has to completely restart the application - // a redirect to the base url will happen if ($lastUserRequest) { /** * @see Conjoon_Modules_Default_User_Model_User */ require_once 'Conjoon/Modules/Default/User/Model/User.php'; $userTable = new Conjoon_Modules_Default_User_Model_User(); /** * @see Conjoon_BeanContext_Decorator */ require_once 'Conjoon/BeanContext/Decorator.php'; $decorator = new Conjoon_BeanContext_Decorator($userTable); $userDto = $decorator->getUserForUserNameCredentialsAsDto($username, md5($password)); if ($userDto && $lastUserRequest <= $userDto->lastLogin) { // special case - send an auth token failure with the response $this->_response->setHttpResponseCode(401); /** * @see Conjoon_Error */ require_once 'Conjoon/Error.php'; $error = new Conjoon_Error(); $error->setCode(-1); $error->setLevel(Conjoon_Error::LEVEL_ERROR); $error->setFile(__FILE__); $error->setLine(__LINE__); $error->setMessage("Someone has signed in with your user credentials. Please sign in again."); $error->setType(Conjoon_Error::TOKEN_FAILURE); $this->view->tokenFailure = true; /** * @todo create filter */ unset($userDto->authToken); $this->view->user = $userDto; $this->view->success = false; $this->view->error = $error->getDto(); return; } } $auth = Zend_Registry::get(Conjoon_Keys::REGISTRY_AUTH_OBJECT); $authAdapter = new Conjoon_Auth_Adapter_Db(array('username' => $username, 'password' => $password, 'remember_me' => $rememberMe)); // if the result is valid, the return value of the adapter will // be stored automatically in the supplied storage object // from the auth object $result = $auth->authenticate($authAdapter); if ($result->isValid()) { $user = $result->getIdentity(); if ($rememberMe && $user->getRememberMeToken() != null) { $this->setAutoLoginCookies(md5($user->getUserName()), $user->getRememberMeToken(), time() + 2592000); } $this->view->success = true; } else { $this->view->error = 'Wrong username or password'; $this->view->success = false; } }
/** * Adds an email account to the database, assigning it to the currently * logged in user. * The following key/value pairs will be submitted via POST: * * <ul> * <li>name : The name of the account</li> * <li>address : The email address for this account</li> * <li>isStandard : <tt>true</tt>, if this should become the standard email account, * otherwise <tt>false</tt></li> * <li>server_inbox : The address of the inbox-server</li> * <li>server_outbox : The address of the outbox server</li> * <li>username_inbox : The username for the inbox-server</li> * <li>username_outbox: The username for the outbox-server. If <tt>outbox_auth</tt> * equals to <tt>false</tt>, the value will be empty</li> * <li>user_name : The full name of the user who owns this account</li> * <li>outbox_auth : <tt>true</tt> if the outbox-server needs authentication, * otherwise <tt>false</tt></li> * <li>password_inbox : The password for the inbox-server</li> * <li>password_outbox: The password for the outbox-server. If <tt>outbox_auth</tt> * equals to <tt>false</tt>, the value will be empty</li> * </ul> * <li>inbox_connection_type: Secure connection type for the incoming * mail server. Empty for unsecure connection, or SSL or TLS</li> * <li>outbox_connection_type: Secure connection type for the outgoing mail * server. Empty for unsecure connection, or SSL or TLS. If <tt>outbox_auth</tt> * equals to <tt>false</tt>, the value will be empty</li> * </ul> * * Upon success, the following view variables will be assigned: * <ul> * <li>success: <tt>true</tt>, if the account was added to the database, * otherwise <tt>false></tt></li> * <li>account: a fully configured instance of <tt>Conjoon_Groupware_Email_Account</tt>. * <br /><strong>NOTE:</strong> If the user submitted passwords, those will be replaced by strings * containing only blanks, matching the length of the originally submitted * passwords.</li> * <li>rootFolder: The root folder that saves the tree hierarchy for this * account.</li> * <li>error: An object of the type <tt>Conjoon_Groupware_ErrorObject</tt>, if any error * occured, otherwise <tt>null</tt></li> * <ul> * * <strong>Note:</strong> The properties <tt>account</tt> and <tt>error</tt> will * be returned in the format based on the passed context the action was called. * For example, if an array was assigned to <tt>account</tt> and the context is <tt>json</tt>, * this array will become json-encoded and returned as a string. This happens transparently. * * @todo FACADE! */ public function addEmailAccountAction() { require_once 'Conjoon/Util/Array.php'; require_once 'Conjoon/Keys.php'; require_once 'Conjoon/BeanContext/Inspector.php'; require_once 'Conjoon/Modules/Groupware/Email/Account/Model/Account.php'; require_once 'Conjoon/Modules/Groupware/Email/Account/Filter/Account.php'; $model = new Conjoon_Modules_Groupware_Email_Account_Model_Account(); $filter = new Conjoon_Modules_Groupware_Email_Account_Filter_Account(array(), Conjoon_Filter_Input::CONTEXT_CREATE); $auth = Zend_Registry::get(Conjoon_Keys::REGISTRY_AUTH_OBJECT); $userId = $auth->getIdentity()->getId(); /** * @see Conjoon_Builder_Factory */ require_once 'Conjoon/Builder/Factory.php'; // clean cache in any case Conjoon_Builder_Factory::getBuilder(Conjoon_Keys::CACHE_EMAIL_ACCOUNTS, Zend_Registry::get(Conjoon_Keys::REGISTRY_CONFIG_OBJECT)->toArray())->cleanCacheForTags(array('userId' => $userId)); $classToCreate = 'Conjoon_Modules_Groupware_Email_Account'; $this->view->success = true; $this->view->error = null; try { $filter->setData($_POST); $processedData = $filter->getProcessedData(); } catch (Zend_Filter_Exception $e) { /** * @see Conjoon_Error */ require_once 'Conjoon/Error.php'; $error = Conjoon_Error::fromFilter($filter, $e); $accountData = $_POST; $accountData['passwordOutbox'] = isset($accountData['passwordOutbox']) ? str_pad("", strlen($accountData['passwordOutbox']), '*') : ''; $accountData['passwordInbox'] = isset($accountData['passwordInbox']) ? str_pad("", strlen($accountData['passwordInbox']), '*') : ''; $this->view->account = Conjoon_BeanContext_Inspector::create($classToCreate, $accountData)->getDto(); $this->view->success = false; $this->view->error = $error->getDto(); return; } $data = $processedData; // check for duplicates $duplicates = $model->getAccountWithNameForUser($data['name'], $userId); if (!empty($duplicates)) { /** * @see Conjoon_Error */ require_once 'Conjoon/Error.php'; $error = new Conjoon_Error(); $error->setMessage("There is already an account with " . "the name \"" . $data['name'] . "\"!"); $error->setLevel(Conjoon_Error::LEVEL_WARNING); $this->view->success = false; $this->view->error = $error->getDto(); return; } // add account here Conjoon_Util_Array::underscoreKeys($data); $addedId = $model->addAccount($userId, $data); /** * @see Conjoon_BeanContext_Decorator */ require_once 'Conjoon/BeanContext/Decorator.php'; $decoratedModel = new Conjoon_BeanContext_Decorator('Conjoon_Modules_Groupware_Email_Account_Model_Account'); $dto = $decoratedModel->getAccountAsDto($addedId, $userId); $dto->folderMappings = array(); // ADD FOLDER MAPPINGS if ($dto->protocol == 'IMAP') { /** * @see \Conjoon\Data\Entity\Mail\DefaultFolderMappingEntity */ require_once 'Conjoon/Data/Entity/Mail/DefaultFolderMappingEntity.php'; $entityManager = Zend_Registry::get(Conjoon_Keys::DOCTRINE_ENTITY_MANAGER); $accRep = $entityManager->getRepository('\\Conjoon\\Data\\Entity\\Mail\\DefaultMailAccountEntity'); $fmRep = $entityManager->getRepository('\\Conjoon\\Data\\Entity\\Mail\\DefaultFolderMappingEntity'); $types = array('INBOX', 'SENT', 'JUNK', 'DRAFT', 'TRASH', 'OUTBOX'); $accountEnt = $accRep->findById($addedId); foreach ($types as $type) { $newEnt = new \Conjoon\Data\Entity\Mail\DefaultFolderMappingEntity(); $newEnt->setType($type); $newEnt->setGlobalName(""); $newEnt->setMailAccount($accountEnt); $fmRep->register($newEnt); $fmRep->flush(); $dto->folderMappings[] = array('id' => $newEnt->getId(), 'type' => $type, 'globalName' => "", 'path' => array()); } } if (!$dto->isOutboxAuth) { $dto->usernameOutbox = ""; $dto->passwordOutbox = ""; } $dto->passwordOutbox = str_pad("", strlen($dto->passwordOutbox), '*'); $dto->passwordInbox = str_pad("", strlen($dto->passwordInbox), '*'); // read out root folder for account require_once 'Conjoon/BeanContext/Decorator.php'; $decoratedFolderModel = new Conjoon_BeanContext_Decorator('Conjoon_Modules_Groupware_Email_Folder_Model_Folder', null, false); $rootId = $decoratedFolderModel->getAccountsRootOrRootFolderId($addedId, $userId); $dto->localRootMailFolder = array(); if ($rootId != 0) { $dto->localRootMailFolder = $decoratedFolderModel->getFolderBaseDataAsDto($rootId); } $this->view->account = $dto; }
/** * Bulk sends emails. Awaits the parameter ids as a numeric array with the ids of * the emails which should get send. * */ public function bulkSendAction() { /*@REMOVE@*/ if (!$this->_helper->connectionCheck()) { /** * @see Conjoon_Error_Factory */ require_once 'Conjoon/Error/Factory.php'; $this->view->success = false; $this->view->sentItems = array(); $this->view->error = null; $this->view->contextReferencedItems = array(); $this->view->error = Conjoon_Error_Factory::createError("Unexpected connection failure while trying to bulk-send emails. " . "Please try again.", Conjoon_Error::LEVEL_WARNING, Conjoon_Error::DATA)->getDto(); return; } /*@REMOVE@*/ $toSend = $_POST['ids']; if ($this->_helper->conjoonContext()->getCurrentContext() == self::CONTEXT_JSON) { require_once 'Zend/Json.php'; $toSend = Zend_Json::decode($toSend, Zend_Json::TYPE_ARRAY); } $date = null; if (isset($_POST['date'])) { require_once 'Conjoon/Filter/DateIso8601.php'; $dateFilter = new Conjoon_Filter_DateIso8601(); $date = $dateFilter->filter((int) $_POST['date']); } /** * @see Conjoon_Filter_EmailRecipients */ require_once 'Conjoon/Filter/EmailRecipients.php'; /** * @see Conjoon_Modules_Groupware_Email_Item_Filter_ItemResponse */ require_once 'Conjoon/Modules/Groupware/Email/Item/Filter/ItemResponse.php'; /** * @see Conjoon_Modules_Groupware_Email_Address */ require_once 'Conjoon/Modules/Groupware/Email/Address.php'; /** * @see Conjoon_Modules_Groupware_Email_Draft */ require_once 'Conjoon/Modules/Groupware/Email/Draft.php'; /** * @see Conjoon_BeanContext_Inspector */ require_once 'Conjoon/BeanContext/Inspector.php'; /** * @see Conjoon_BeanContext_Decorator */ require_once 'Conjoon/BeanContext/Decorator.php'; /** * @see Conjoon_Util_Array */ require_once 'Conjoon/Util/Array.php'; /** * @see Conjoon_Keys */ require_once 'Conjoon/Keys.php'; /** * @see Conjoon_Modules_Groupware_Email_Draft_Model_Draft */ require_once 'Conjoon/Modules/Groupware/Email/Draft/Model/Draft.php'; /** * @see Conjoon_Modules_Groupware_Email_Draft_Filter_DraftInput */ require_once 'Conjoon/Modules/Groupware/Email/Draft/Filter/DraftInput.php'; /** * @see Conjoon_Modules_Groupware_Email_Sender */ require_once 'Conjoon/Modules/Groupware/Email/Sender.php'; $auth = Zend_Registry::get(Conjoon_Keys::REGISTRY_AUTH_OBJECT); $userId = $auth->getIdentity()->getId(); $draftFilter = new Conjoon_Modules_Groupware_Email_Draft_Filter_DraftInput(array(), Conjoon_Filter_Input::CONTEXT_CREATE); $draftModel = new Conjoon_Modules_Groupware_Email_Draft_Model_Draft(); $accountDecorator = new Conjoon_BeanContext_Decorator('Conjoon_Modules_Groupware_Email_Account_Model_Account'); $recipientsFilter = new Conjoon_Filter_EmailRecipients(); $newVersions = array(); $sendItems = array(); $contextReferencedItems = array(); $errors = array(); foreach ($toSend as $pathInfo) { $remoteInfo = array(); $id = $pathInfo['id']; $path = $pathInfo['path']; $account = null; $remoteAttachments = array(); // check if path is remote! $isRemote = $this->isRemotePath($path, $userId); if ($isRemote) { $rawDraft = $this->getRawImapMessage($id, $path); if (empty($rawDraft)) { continue; } //we have to post the existing attachments of the remote draft // again when assembling the message to send. // Otherwise the sender would not know which attachments should get send // along with the message $remoteAttachments = $rawDraft['attachments']; foreach ($remoteAttachments as &$remoteAttachment) { $remoteAttachment['metaType'] = 'emailAttachment'; $remoteAttachment['name'] = $remoteAttachment['fileName']; } $remoteInfo = array('uid' => $id, 'account' => $isRemote, 'path' => $path); $rawDraft['groupwareEmailAccountsId'] = $isRemote->id; $account = $accountDecorator->getAccountAsEntity($rawDraft['groupwareEmailAccountsId'], $userId); } else { $rawDraft = $draftModel->getDraft($id, $userId); $account = $accountDecorator->getAccountAsEntity($rawDraft['groupware_email_accounts_id'], $userId); } // no account found? if (!$account) { /** * @todo think about using the standard account as a fallback or use at last * an error message to inform the user that the account used to write this email * is not available anymore */ continue; } $id = (int) $id; if ($id <= 0) { continue; } if (empty($rawDraft)) { continue; } Conjoon_Util_Array::camelizeKeys($rawDraft); $rawDraft['to'] = $recipientsFilter->filter($rawDraft['to']); $rawDraft['cc'] = $recipientsFilter->filter($rawDraft['cc']); $rawDraft['bcc'] = $recipientsFilter->filter($rawDraft['bcc']); // create the message object here $to = array(); $cc = array(); $bcc = array(); foreach ($rawDraft['cc'] as $dcc) { $add = new Conjoon_Modules_Groupware_Email_Address($dcc); $cc[] = $add; } foreach ($rawDraft['bcc'] as $dbcc) { $add = new Conjoon_Modules_Groupware_Email_Address($dbcc); $bcc[] = $add; } foreach ($rawDraft['to'] as $dto) { $add = new Conjoon_Modules_Groupware_Email_Address($dto); $to[] = $add; } $rawDraft['to'] = $to; $rawDraft['cc'] = $cc; $rawDraft['bcc'] = $bcc; $message = Conjoon_BeanContext_Inspector::create('Conjoon_Modules_Groupware_Email_Draft', $rawDraft, true); if ($date !== null) { $message->setDate($date); } try { $transport = $this->getTransportForAccount($account); $assembleInformation = Conjoon_Modules_Groupware_Email_Sender::getAssembledMail($message, $account, $remoteAttachments, array(), $this->getCurrentAppUser()->getId(), $transport); $assembledMail = $assembleInformation['message']; $postedAttachments = $assembleInformation['postedAttachments']; $mail = Conjoon_Modules_Groupware_Email_Sender::send($assembledMail); } catch (Exception $e) { $errors[] = array('subject' => $message->getSubject(), 'accountName' => $account->getName(), 'reason' => $e->getMessage()); continue; } if ($isRemote) { /** * @see Conjoon_Modules_Groupware_Email_ImapHelper */ require_once 'Conjoon/Modules/Groupware/Email/ImapHelper.php'; $uId = $remoteInfo['uid']; $account = $remoteInfo['account']; $path = $remoteInfo['path']; // check if folder is remote folder /** * @see Conjoon_Text_Parser_Mail_MailboxFolderPathJsonParser */ require_once 'Conjoon/Text/Parser/Mail/MailboxFolderPathJsonParser.php'; $parser = new Conjoon_Text_Parser_Mail_MailboxFolderPathJsonParser(); $pathInfo = $parser->parse(json_encode($path)); /** * @see Conjoon_Modules_Groupware_Email_Folder_Facade */ require_once 'Conjoon/Modules/Groupware/Email/Folder/Facade.php'; $facade = Conjoon_Modules_Groupware_Email_Folder_Facade::getInstance(); // get the account for the root folder first $imapAccount = $facade->getImapAccountForFolderIdAndUserId($pathInfo['rootId'], $userId); if ($imapAccount && !empty($pathInfo) && $facade->isRemoteFolder($pathInfo['rootId'])) { // if remote, where is the referenced mail stored? $globalName = $facade->getAssembledGlobalNameForAccountAndPath($imapAccount, $pathInfo['path']); /** * @see Conjoon_Modules_Groupware_Email_ImapHelper */ require_once 'Conjoon/Modules/Groupware/Email/ImapHelper.php'; /** * @see Conjoon_Mail_Storage_Imap */ require_once 'Conjoon/Mail/Storage/Imap.php'; $protocol = Conjoon_Modules_Groupware_Email_ImapHelper::reuseImapProtocolForAccount($imapAccount); $storage = new Conjoon_Mail_Storage_Imap($protocol); // get the number of the message by it's unique id $storage->selectFolder($globalName); $messageNumber = $storage->getNumberByUniqueId($uId); // move from sent folder $sentGlobalName = $this->getGlobalNameForFolderType($imapAccount, 'SENT'); if (!$sentGlobalName) { continue; } $storage->copyMessage($messageNumber, $sentGlobalName); $storage->selectFolder($sentGlobalName); $newMessageNumber = $storage->countMessages(); $storage->selectFolder($globalName); $storage->removeMessage($storage->getNumberByUniqueId($uId)); $storage->close(); } // put email into sent folder $protocol = Conjoon_Modules_Groupware_Email_ImapHelper::reuseImapProtocolForAccount($imapAccount); $storage = new Conjoon_Mail_Storage_Imap($protocol); // read out single item $item = $this->getSingleImapListItem($account, $userId, $newMessageNumber, $sentGlobalName); $newVersions[$uId] = $item['id']; $sendItems[] = $item; } else { // if the email was send successfully, save it into the db and // return the params savedId (id of the newly saved email) // and savedFolderId (id of the folder where the email was saved in) $itemDecorator = new Conjoon_BeanContext_Decorator('Conjoon_Modules_Groupware_Email_Item_Model_Item', new Conjoon_Modules_Groupware_Email_Item_Filter_ItemResponse(array(), Conjoon_Filter_Input::CONTEXT_RESPONSE), false); $item = $itemDecorator->saveSentEmailAsDto($message, $account, $userId, $mail, ''); if (!$item) { continue; } $sendItems[] = $item; $cri = $itemDecorator->getReferencedItemAsDto($item->id, $userId); if (!empty($cri)) { $contextReferencedItems[] = $cri; } } } if (!empty($errors)) { /** * @see Conjoon_Error */ require_once 'Conjoon/Error.php'; $m = array(); $m[] = "One or more messages could not be sent:"; for ($i = 0, $len = count($errors); $i < $len; $i++) { $m[] = "Message " . ($i + 1) . ":"; $m[] = "Subject: \"" . $errors[$i]['subject'] . "\""; $m[] = "Account: " . $errors[$i]['accountName']; $m[] = "Failure reason: " . $errors[$i]['reason']; } $errorMessage = implode("\n", $m); $error = new Conjoon_Error(); $error->setLevel(Conjoon_Error::LEVEL_WARNING); $error->setType(Conjoon_Error::DATA); $error->setMessage($errorMessage); } $this->view->newVersions = $newVersions; $this->view->success = true; $this->view->sentItems = $sendItems; $this->view->error = isset($error) ? $error->getDto() : null; $this->view->contextReferencedItems = $contextReferencedItems; }