Exemple #1
0
 public function loadTemplate($params)
 {
     if (GO::modules()->addressbook && !empty($params['template_id'])) {
         try {
             $template = \GO\Addressbook\Model\Template::model()->findByPk($params['template_id']);
             $templateContent = $template ? $template->content : '';
         } catch (\GO\Base\Exception\AccessDenied $e) {
             $templateContent = "";
         }
         $message = \GO\Email\Model\SavedMessage::model()->createFromMimeData($templateContent);
         $response['data'] = $message->toOutputArray(true, true);
         $presetbody = isset($params['body']) ? $params['body'] : '';
         if (!empty($presetbody) && strpos($response['data']['htmlbody'], '{body}') == false) {
             $response['data']['htmlbody'] = $params['body'] . '<br />' . $response['data']['htmlbody'];
         } else {
             $response['data']['htmlbody'] = str_replace('{body}', $presetbody, $response['data']['htmlbody']);
         }
         unset($response['data']['to'], $response['data']['cc'], $response['data']['bcc']);
         //			unset($response['data']['cc'], $response['data']['bcc'], $response['data']['subject']);
         $defaultTags = array('contact:salutation' => GO::t('default_salutation_unknown'));
         // Parse the link tag
         $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceLinkTag($response['data']['htmlbody'], $message);
         //keep template tags for mailings to addresslists
         if (empty($params['addresslist_id'])) {
             //if contact_id is not set but email is check if there's contact info available
             if (!empty($params['to']) || !empty($params['contact_id']) || !empty($params['company_id'])) {
                 if (!empty($params['contact_id'])) {
                     $contact = \GO\Addressbook\Model\Contact::model()->findByPk($params['contact_id']);
                 } else {
                     $email = \GO\Base\Util\String::get_email_from_string($params['to']);
                     $contact = \GO\Addressbook\Model\Contact::model()->findSingleByEmail($email);
                 }
                 $company = false;
                 if (!empty($params['company_id'])) {
                     $company = \GO\Addressbook\Model\Company::model()->findByPk($params['company_id']);
                 }
                 if ($company) {
                     $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceModelTags($response['data']['htmlbody'], $company, 'company:', true);
                 }
                 if ($contact) {
                     $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceContactTags($response['data']['htmlbody'], $contact);
                 } else {
                     $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceCustomTags($response['data']['htmlbody'], $defaultTags, true);
                     $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceUserTags($response['data']['htmlbody']);
                 }
             } else {
                 $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceCustomTags($response['data']['htmlbody'], $defaultTags, true);
                 $response['data']['htmlbody'] = \GO\Addressbook\Model\Template::model()->replaceUserTags($response['data']['htmlbody']);
             }
         }
         if ($params['content_type'] == 'plain') {
             $response['data']['plainbody'] = \GO\Base\Util\String::html_to_text($response['data']['htmlbody'], false);
             unset($response['data']['htmlbody']);
         }
     } else {
         $response['data'] = array();
         if ($params['content_type'] == 'plain') {
             $response['data']['plainbody'] = '';
         } else {
             $response['data']['htmlbody'] = '';
         }
     }
     $response['success'] = true;
     return $response;
 }
 public function actionVerify($params)
 {
     $response['success'] = true;
     $params['email'] = strtolower($params['email']);
     //if file was already stored somewhere after decryption
     if (!empty($params['cert_id'])) {
         $cert = \GO\Smime\Model\PublicCertificate::model()->findByPk($params['cert_id']);
         $certData = $cert->cert;
     } else {
         //			if (!empty($params['filepath'])) {
         //				$srcFile = new \GO\Base\Fs\File(\GO::config()->tmpdir.$params['filepath']);
         if (!empty($params['account_id'])) {
             $account = \GO\Email\Model\Account::model()->findByPk($params['account_id']);
             $imapMessage = \GO\Email\Model\ImapMessage::model()->findByUid($account, $params['mailbox'], $params['uid']);
             $srcFile = \GO\Base\Fs\File::tempFile();
             if (!$imapMessage->saveToFile($srcFile->path())) {
                 throw new \Exception("Could not fetch message from IMAP server");
             }
             $this->_decryptFile($srcFile, $account);
         }
         //			throw new \Exception($srcFile->path());
         $pubCertFile = \GO\Base\Fs\File::tempFile();
         //Command line:
         //openssl smime -verify -in msg.txt
         $valid = openssl_pkcs7_verify($srcFile->path(), null, $pubCertFile->path(), $this->_getRootCertificates());
         //Adding the PKCS7_NOVERIFY flag was used for testing some messages that could not be verified by openssl but did in Mozilla thunderbird.
         //Error msg: error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error
         //
         //			$valid = openssl_pkcs7_verify($srcFile->path(), PKCS7_NOVERIFY, $pubCertFile->path(), $this->_getRootCertificates());
         //			throw new \Exception($srcFile->path());
         $srcFile->delete();
         if ($valid) {
             if ($pubCertFile->exists()) {
                 $certData = $pubCertFile->getContents();
                 $arr = openssl_x509_parse($certData);
                 $senderEmailStr = !empty($arr['extensions']['subjectAltName']) ? $arr['extensions']['subjectAltName'] : $arr['subject']['emailAddress'];
                 $senderEmails = explode(',', $senderEmailStr);
                 $emails = array();
                 foreach ($senderEmails as $emailRaw) {
                     $email = strtolower(\GO\Base\Util\String::get_email_from_string($emailRaw));
                     if ($email) {
                         $emails[] = $email;
                     }
                 }
                 $pubCertFile->delete();
                 $this->_savePublicCertificate($certData, $emails);
             } else {
                 throw new \Exception('Certificate appears to be valid but could not get certificate from signature. SSL Error: ' . openssl_error_string());
             }
             if (empty($certData)) {
                 throw new \Exception('Certificate appears to be valid but could not get certificate from signature.');
             }
         }
     }
     if (!isset($arr) && isset($certData)) {
         $arr = openssl_x509_parse($certData);
         $senderEmailStr = !empty($arr['extensions']['subjectAltName']) ? $arr['extensions']['subjectAltName'] : $arr['subject']['emailAddress'];
         $emails = array();
         foreach ($senderEmails as $emailRaw) {
             $email = strtolower(\GO\Base\Util\String::get_email_from_string($emailRaw));
             if ($email) {
                 $emails[] = $email;
             }
         }
     } else {
         if (empty($emails)) {
             $emails = array('unknown');
         }
     }
     $response['html'] = '';
     $response['cls'] = '';
     $response['text'] = '';
     if (isset($params['account_id'])) {
         if (!$valid) {
             $response['cls'] = 'smi-invalid';
             $response['text'] = \GO::t('invalidCert', 'smime');
             $response['html'] .= '<h1 class="smi-invalid">' . \GO::t('invalidCert', 'smime') . '</h1>';
             $response['html'] .= '<p>';
             while ($msg = openssl_error_string()) {
                 $response['html'] .= $msg . "<br />\n";
             }
             $response['html'] .= '</p>';
         } else {
             if (!in_array($params['email'], $emails)) {
                 $response['cls'] = 'smi-certemailmismatch';
                 $response['text'] = \GO::t('certEmailMismatch', 'smime');
                 $response['html'] .= $response['short_html'] = '<h1 class="smi-certemailmismatch">' . \GO::t('certEmailMismatch', 'smime') . '</h1>';
             } else {
                 $response['cls'] = 'smi-valid';
                 $response['text'] = \GO::t('validCert', 'smime');
                 $response['html'] .= $response['short_html'] = '<h1 class="smi-valid">' . \GO::t('validCert', 'smime') . '</h1>';
             }
         }
     }
     if (!isset($params['account_id']) || $valid) {
         $response['html'] .= '<table>';
         $response['html'] .= '<tr><td width="100">' . \GO::t('name') . ':</td><td>' . $arr['name'] . '</td></tr>';
         $response['html'] .= '<tr><td width="100">' . \GO::t('email', 'smime') . ':</td><td>' . implode(', ', $emails) . '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('hash', 'smime') . ':</td><td>' . $arr['hash'] . '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('serial_number', 'smime') . ':</td><td>' . $arr['serialNumber'] . '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('version', 'smime') . ':</td><td>' . $arr['version'] . '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('issuer', 'smime') . ':</td><td>';
         foreach ($arr['issuer'] as $skey => $svalue) {
             if (is_array($svalue)) {
                 foreach ($svalue as $sv) {
                     $response['html'] .= $skey . ':' . $sv . '; ';
                 }
             } else {
                 $response['html'] .= $skey . ':' . $svalue . '; ';
             }
         }
         $response['html'] .= '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('valid_from', 'smime') . ':</td><td>' . \GO\Base\Util\Date::get_timestamp($arr['validFrom_time_t']) . '</td></tr>';
         $response['html'] .= '<tr><td>' . \GO::t('valid_to', 'smime') . ':</td><td>' . \GO\Base\Util\Date::get_timestamp($arr['validTo_time_t']) . '</td></tr>';
         $response['html'] .= '</table>';
     }
     return $response;
 }