public function loginCallback() { $attributes = phpCAS::getAttributes(); $this->updateLocalUserFromBackend($attributes); $usr_id = User::getUserIDByEmail($attributes['mail'], true); $user = User::getDetails($usr_id); AuthCookie::setAuthCookie($user['usr_email'], true); }
/** * NOTE: this needs to be public for PHP 5.3 compatibility * * @param ReflectionMethod $method * @param array $params Method parameters in already decoded into PHP types * @param bool $public true if method should not be protected with login/password * @param array $pdesc Parameter descriptions * @return string */ public function handle($method, $params, $public, $pdesc) { // there's method to set this via $client->setAutoBase64(true); // but nothing at server side. where we actually need it $GLOBALS['XML_RPC_auto_base64'] = true; try { if (!$public) { list($email, $password) = $this->getAuthParams($params); if (!Auth::isCorrectPassword($email, $password) && !APIAuthToken::isTokenValidForEmail($password, $email)) { // FIXME: role is not checked here throw new RemoteApiException("Authentication failed for {$email}. Your login/password/api key is invalid or you do not have the proper role."); } AuthCookie::setAuthCookie($email); } if ($pdesc) { $this->decodeParams($params, $pdesc); } $res = $method->invokeArgs($this->api, $params); } catch (Exception $e) { global $XML_RPC_erruser; $code = $e->getCode() ?: 1; $res = new XML_RPC_Response(0, $XML_RPC_erruser + $code, $e->getMessage()); } if (!$res instanceof XML_RPC_Response) { $res = new XML_RPC_Response(XML_RPC_Encode($res)); } return $res; }
/** * Creates a new issue from an email if appropriate. Also returns if this message is related * to a previous message. * * @param array $info An array of info about the email account. * @param string $headers The headers of the email. * @param string $message_body The body of the message. * @param string $date The date this message was sent * @param string $from The name and email address of the sender. * @param string $subject The subject of this message. * @param array $to An array of to addresses * @param array $cc An array of cc addresses * @return array An array of information about the message */ public function createIssueFromEmail($info, $headers, $message_body, $date, $from, $subject, $to, $cc) { $should_create_issue = false; $issue_id = ''; $associate_email = ''; $type = 'email'; $parent_id = ''; $customer_id = false; $contact_id = false; $contract_id = false; $severity = false; // we can't trust the in-reply-to from the imap c-client, so let's // try to manually parse that value from the full headers $references = Mail_Helper::getAllReferences($headers); $message_id = Mail_Helper::getMessageID($headers, $message_body); $workflow = Workflow::getIssueIDforNewEmail($info['ema_prj_id'], $info, $headers, $message_body, $date, $from, $subject, $to, $cc); if (is_array($workflow)) { if (isset($workflow['customer_id'])) { $customer_id = $workflow['customer_id']; } if (isset($workflow['contract_id'])) { $contract_id = $workflow['contract_id']; } if (isset($workflow['contact_id'])) { $contact_id = $workflow['contact_id']; } if (isset($workflow['severity'])) { $severity = $workflow['severity']; } if (isset($workflow['should_create_issue'])) { $should_create_issue = $workflow['should_create_issue']; } else { $should_create_issue = true; } } elseif ($workflow == 'new') { $should_create_issue = true; } elseif (is_numeric($workflow)) { $issue_id = $workflow; } else { $setup = Setup::get(); if ($setup['subject_based_routing']['status'] == 'enabled') { // Look for issue ID in the subject line // look for [#XXXX] in the subject line if (preg_match("/\\[#(\\d+)\\]( Note| BLOCKED)*/", $subject, $matches)) { $should_create_issue = false; $issue_id = $matches[1]; if (!Issue::exists($issue_id, false)) { $issue_id = ''; } elseif (!empty($matches[2])) { $type = 'note'; } } else { $should_create_issue = true; } } else { // - if this email is a reply: if (count($references) > 0) { foreach ($references as $reference_msg_id) { // -> check if the replied email exists in the database: if (Note::exists($reference_msg_id)) { // note exists // get what issue it belongs too. $issue_id = Note::getIssueByMessageID($reference_msg_id); $should_create_issue = false; $type = 'note'; $parent_id = Note::getIDByMessageID($reference_msg_id); break; } elseif (self::exists($reference_msg_id) || Issue::getIssueByRootMessageID($reference_msg_id) != false) { // email or issue exists $issue_id = self::getIssueByMessageID($reference_msg_id); if (empty($issue_id)) { $issue_id = Issue::getIssueByRootMessageID($reference_msg_id); } if (empty($issue_id)) { // parent email isn't associated with issue. // --> create new issue, associate current email and replied email to this issue $should_create_issue = true; $associate_email = $reference_msg_id; } else { // parent email is associated with issue: // --> associate current email with existing issue $should_create_issue = false; } break; } else { // no matching note, email or issue: // => create new issue and associate current email with it $should_create_issue = true; } } } else { // - if this email is not a reply: // -> create new issue and associate current email with it $should_create_issue = true; } } } $sender_email = Mail_Helper::getEmailAddress($from); if (Misc::isError($sender_email)) { $sender_email = 'Error Parsing Email <>'; } // only create a new issue if this email is coming from a known customer if ($should_create_issue && $info['ema_issue_auto_creation_options']['only_known_customers'] == 'yes' && CRM::hasCustomerIntegration($info['ema_prj_id']) && !$customer_id) { try { $crm = CRM::getInstance($info['ema_prj_id']); $should_create_issue = true; } catch (CRMException $e) { $should_create_issue = false; } } // check whether we need to create a new issue or not if ($info['ema_issue_auto_creation'] == 'enabled' && $should_create_issue && !Notification::isBounceMessage($sender_email)) { $options = Email_Account::getIssueAutoCreationOptions($info['ema_id']); AuthCookie::setAuthCookie(APP_SYSTEM_USER_ID); AuthCookie::setProjectCookie($info['ema_prj_id']); $issue_id = Issue::createFromEmail($info['ema_prj_id'], APP_SYSTEM_USER_ID, $from, Mime_Helper::decodeQuotedPrintable($subject), $message_body, @$options['category'], @$options['priority'], @$options['users'], $date, $message_id, $severity, $customer_id, $contact_id, $contract_id); // add sender to authorized repliers list if they are not a real user $sender_usr_id = User::getUserIDByEmail($sender_email, true); if (empty($sender_usr_id)) { Authorized_Replier::manualInsert($issue_id, $sender_email, false); } // associate any existing replied-to email with this new issue if (!empty($associate_email) && !empty($reference_issue_id)) { $reference_sup_id = self::getIDByMessageID($associate_email); self::associate(APP_SYSTEM_USER_ID, $issue_id, array($reference_sup_id)); } } // need to check crm for customer association if (!empty($from)) { if (CRM::hasCustomerIntegration($info['ema_prj_id']) && !$customer_id) { // check for any customer contact association try { $crm = CRM::getInstance($info['ema_prj_id']); $contact = $crm->getContactByEmail($sender_email); $contact_id = $contact->getContactID(); $contracts = $contact->getContracts(array(CRM_EXCLUDE_EXPIRED)); $contract = $contracts[0]; $customer_id = $contract->getCustomerID(); } catch (CRMException $e) { $customer_id = null; $contact_id = null; } } } return array('should_create_issue' => $should_create_issue, 'associate_email' => $associate_email, 'issue_id' => $issue_id, 'customer_id' => $customer_id, 'contact_id' => $contact_id, 'type' => $type, 'parent_id' => $parent_id); }
/** * Performs standard checks when a user logins */ public static function login($login) { // handle aliases since the user is now authenticated $login = User::getEmail(self::getUserIDByLogin($login)); // check if this user did already confirm his account if (self::isPendingUser($login)) { self::saveLoginAttempt($login, 'failure', 'pending user'); self::redirect('index.php?err=9'); } // check if this user is really an active one if (!self::isActiveUser($login)) { self::saveLoginAttempt($login, 'failure', 'inactive user'); self::redirect('index.php?err=7'); } self::saveLoginAttempt($login, 'success'); $remember = !empty($_POST['remember']); AuthCookie::setAuthCookie($login, $remember); Session::init(User::getUserIDByEmail($login)); }
/** * Routes a draft to the correct issue. * * @param string $full_message The complete draft. * @return mixed true or array(ERROR_CODE, ERROR_STRING) in case of failure */ public static function route_drafts($full_message) { // save the full message for logging purposes Draft::saveRoutedMessage($full_message); if (preg_match('/^(boundary=).*/m', $full_message)) { $pattern = "/(Content-Type: multipart\\/)(.+); ?\r?\n(boundary=)(.*)\$/im"; $replacement = '$1$2; $3$4'; $full_message = preg_replace($pattern, $replacement, $full_message); } // need some validation here if (empty($full_message)) { return array(self::EX_NOINPUT, ev_gettext('Error: The email message was empty.') . "\n"); } // remove the reply-to: header if (preg_match('/^(reply-to:).*/im', $full_message)) { $full_message = preg_replace("/^(reply-to:).*\n/im", '', $full_message, 1); } // check if the draft interface is even supposed to be enabled $setup = Setup::get(); if ($setup['draft_routing']['status'] != 'enabled') { return array(self::EX_CONFIG, ev_gettext('Error: The email draft interface is disabled.') . "\n"); } if (empty($setup['draft_routing']['address_prefix'])) { return array(self::EX_CONFIG, ev_gettext('Error: Please configure the email address prefix.') . "\n"); } if (empty($setup['draft_routing']['address_host'])) { return array(self::EX_CONFIG, ev_gettext('Error: Please configure the email address domain.') . "\n"); } $structure = Mime_Helper::decode($full_message, true, false); // find which issue ID this email refers to if (isset($structure->headers['to'])) { $issue_id = self::getMatchingIssueIDs($structure->headers['to'], 'draft'); } // validation is always a good idea if (empty($issue_id) and isset($structure->headers['cc'])) { // we need to try the Cc header as well $issue_id = self::getMatchingIssueIDs($structure->headers['cc'], 'draft'); } if (empty($issue_id)) { return array(self::EX_DATAERR, ev_gettext('Error: The routed email had no associated Eventum issue ID or had an invalid recipient address.') . "\n"); } $prj_id = Issue::getProjectID($issue_id); // check if the sender is allowed in this issue' project and if it is an internal user $sender_email = strtolower(Mail_Helper::getEmailAddress($structure->headers['from'])); $sender_usr_id = User::getUserIDByEmail($sender_email, true); if (!empty($sender_usr_id)) { $sender_role = User::getRoleByUser($sender_usr_id, $prj_id); if ($sender_role < User::ROLE_USER) { return array(self::EX_NOPERM, ev_gettext("Error: The sender of this email is not allowed in the project associated with issue #{$issue_id}.") . "\n"); } } AuthCookie::setAuthCookie(User::getUserIDByEmail($sender_email)); AuthCookie::setProjectCookie($prj_id); $body = $structure->body; Draft::saveEmail($issue_id, @$structure->headers['to'], @$structure->headers['cc'], @$structure->headers['subject'], $body, false, false, false); // XXX: need to handle attachments coming from drafts as well? $usr_id = Auth::getUserID(); History::add($issue_id, $usr_id, 'draft_routed', 'Draft routed from {from}', array('from' => $structure->headers['from'])); return true; }