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; }