/**
  * Parses text through Markdown.
  *
  * @param string $str
  *
  * @return \Twig_Markup
  */
 public function markdownFilter($str)
 {
     $html = StringHelper::parseMarkdown($str);
     return TemplateHelper::getRaw($html);
 }
 /**
  * @param string $unzipFolder
  *
  * @throws Exception
  * @return array
  */
 private function _validateNewRequirements($unzipFolder)
 {
     $requirementsFolderPath = $unzipFolder . '/app/etc/requirements/';
     $requirementsFile = $requirementsFolderPath . 'Requirements.php';
     $errors = array();
     if (!IOHelper::fileExists($requirementsFile)) {
         throw new Exception(Craft::t('The Requirements file is required and it does not exist at {path}.', array('path' => $requirementsFile)));
     }
     // Make sure we can write to craft/app/requirements
     if (!IOHelper::isWritable(craft()->path->getAppPath() . 'etc/requirements/')) {
         throw new Exception(StringHelper::parseMarkdown(Craft::t('Craft CMS needs to be able to write to your craft/app/etc/requirements folder and cannot. Please check your [permissions]({url}).', array('url' => 'http://craftcms.com/docs/updating#one-click-updating'))));
     }
     $tempFileName = StringHelper::UUID() . '.php';
     // Make a dupe of the requirements file and give it a random file name.
     IOHelper::copyFile($requirementsFile, $requirementsFolderPath . $tempFileName);
     $newTempFilePath = craft()->path->getAppPath() . 'etc/requirements/' . $tempFileName;
     // Copy the random file name requirements to the requirements folder.
     // We don't want to execute any PHP from the storage folder.
     IOHelper::copyFile($requirementsFolderPath . $tempFileName, $newTempFilePath);
     require_once $newTempFilePath;
     $checker = new RequirementsChecker();
     $checker->run();
     if ($checker->getResult() == RequirementResult::Failed) {
         foreach ($checker->getRequirements() as $requirement) {
             if ($requirement->getResult() == InstallStatus::Failed) {
                 Craft::log('Requirement "' . $requirement->getName() . '" failed with the message: ' . $requirement->getNotes(), LogLevel::Error, true);
                 $errors[] = $requirement->getNotes();
             }
         }
     }
     // Cleanup
     IOHelper::deleteFile($newTempFilePath);
     return $errors;
 }
 /**
  * @param UserModel  $user
  * @param EmailModel $emailModel
  * @param array      $variables
  *
  * @throws Exception
  * @return bool
  */
 private function _sendEmail(UserModel $user, EmailModel $emailModel, $variables = array())
 {
     // Get the saved email settings.
     $emailSettings = $this->getSettings();
     if (!isset($emailSettings['protocol'])) {
         throw new Exception(Craft::t('Could not determine how to send the email.  Check your email settings.'));
     }
     // Fire an 'onBeforeSendEmail' event
     $event = new Event($this, array('user' => $user, 'emailModel' => $emailModel, 'variables' => $variables));
     $this->onBeforeSendEmail($event);
     // Is the event giving us the go-ahead?
     if ($event->performAction) {
         // In case a plugin changed any variables in onBeforeSendEmail
         $variables = $event->params['variables'];
         $email = new \PHPMailer(true);
         // Default the charset to UTF-8
         $email->CharSet = 'UTF-8';
         // Add a reply to (if any).  Make sure it’s set before setting From, because email is dumb.
         if (!empty($emailModel->replyTo)) {
             $email->addReplyTo($emailModel->replyTo);
         }
         // Set the "from" information.
         $email->setFrom($emailModel->fromEmail, $emailModel->fromName);
         // Check which protocol we need to use.
         switch ($emailSettings['protocol']) {
             case EmailerType::Gmail:
             case EmailerType::Smtp:
                 $this->_setSmtpSettings($email, $emailSettings);
                 break;
             case EmailerType::Pop:
                 $pop = new \Pop3();
                 if (!isset($emailSettings['host']) || !isset($emailSettings['port']) || !isset($emailSettings['username']) || !isset($emailSettings['password']) || StringHelper::isNullOrEmpty($emailSettings['host']) || StringHelper::isNullOrEmpty($emailSettings['port']) || StringHelper::isNullOrEmpty($emailSettings['username']) || StringHelper::isNullOrEmpty($emailSettings['password'])) {
                     throw new Exception(Craft::t('Host, port, username and password must be configured under your email settings.'));
                 }
                 if (!isset($emailSettings['timeout'])) {
                     $emailSettings['timeout'] = $this->_defaultEmailTimeout;
                 }
                 $pop->authorize($emailSettings['host'], $emailSettings['port'], $emailSettings['timeout'], $emailSettings['username'], $emailSettings['password'], craft()->config->get('devMode') ? 1 : 0);
                 $this->_setSmtpSettings($email, $emailSettings);
                 break;
             case EmailerType::Sendmail:
                 $email->isSendmail();
                 break;
             case EmailerType::Php:
                 $email->isMail();
                 break;
             default:
                 $email->isMail();
         }
         if (!$this->_processTestToEmail($email, 'Address')) {
             $email->addAddress($user->email, $user->getFullName());
         }
         // Add any custom headers
         if (!empty($emailModel->customHeaders)) {
             foreach ($emailModel->customHeaders as $headerName => $headerValue) {
                 $email->addCustomHeader($headerName, $headerValue);
             }
         }
         // Add any BCC's
         if (!empty($emailModel->bcc)) {
             if (!$this->_processTestToEmail($email, 'BCC')) {
                 foreach ($emailModel->bcc as $bcc) {
                     if (!empty($bcc['email'])) {
                         $bccEmail = $bcc['email'];
                         $bccName = !empty($bcc['name']) ? $bcc['name'] : '';
                         $email->addBCC($bccEmail, $bccName);
                     }
                 }
             }
         }
         // Add any CC's
         if (!empty($emailModel->cc)) {
             if (!$this->_processTestToEmail($email, 'CC')) {
                 foreach ($emailModel->cc as $cc) {
                     if (!empty($cc['email'])) {
                         $ccEmail = $cc['email'];
                         $ccName = !empty($cc['name']) ? $cc['name'] : '';
                         $email->addCC($ccEmail, $ccName);
                     }
                 }
             }
         }
         // Add a sender header (if any)
         if (!empty($emailModel->sender)) {
             $email->Sender = $emailModel->sender;
         }
         // Add any string attachments
         if (!empty($emailModel->stringAttachments)) {
             foreach ($emailModel->stringAttachments as $stringAttachment) {
                 $email->addStringAttachment($stringAttachment['string'], $stringAttachment['fileName'], $stringAttachment['encoding'], $stringAttachment['type']);
             }
         }
         // Add any normal disc attachments
         if (!empty($emailModel->attachments)) {
             foreach ($emailModel->attachments as $attachment) {
                 $email->addAttachment($attachment['path'], $attachment['name'], $attachment['encoding'], $attachment['type']);
             }
         }
         $variables['user'] = $user;
         $oldLanguage = craft()->getLanguage();
         // If they have a preferredLocale, use that.
         if ($user->preferredLocale) {
             craft()->setLanguage($user->preferredLocale);
         }
         $email->Subject = craft()->templates->renderString($emailModel->subject, $variables);
         // If they populated an htmlBody, use it.
         if ($emailModel->htmlBody) {
             $renderedHtmlBody = craft()->templates->renderString($emailModel->htmlBody, $variables);
             $email->msgHTML($renderedHtmlBody);
             $email->AltBody = craft()->templates->renderString($emailModel->body, $variables);
         } else {
             // They didn't provide an htmlBody, so markdown the body.
             $renderedHtmlBody = craft()->templates->renderString(StringHelper::parseMarkdown($emailModel->body), $variables);
             $email->msgHTML($renderedHtmlBody);
             $email->AltBody = craft()->templates->renderString($emailModel->body, $variables);
         }
         craft()->setLanguage($oldLanguage);
         if (!$email->Send()) {
             // Fire an 'onSendEmailError' event
             $this->onSendEmailError(new Event($this, array('user' => $user, 'emailModel' => $emailModel, 'variables' => $variables, 'error' => $email->ErrorInfo)));
             throw new Exception(Craft::t('Email error: {error}', array('error' => $email->ErrorInfo)));
         }
         Craft::log('Successfully sent email with subject: ' . $email->Subject, LogLevel::Info);
         // Fire an 'onSendEmail' event
         $this->onSendEmail(new Event($this, array('user' => $user, 'emailModel' => $emailModel, 'variables' => $variables)));
         return true;
     }
     return false;
 }
 /**
  * Sends an email based on the posted params.
  *
  * @throws Exception
  */
 public function actionSendMessage()
 {
     $this->requirePostRequest();
     $settings = craft()->plugins->getPlugin('contactform')->getSettings();
     $message = new ContactFormModel();
     $savedBody = false;
     $message->fromEmail = craft()->request->getPost('fromEmail');
     $message->fromName = craft()->request->getPost('fromName');
     $message->subject = craft()->request->getPost('subject');
     if ($settings->allowAttachments) {
         if (isset($_FILES['attachment']) && isset($_FILES['attachment']['name'])) {
             if (is_array($_FILES['attachment']['name'])) {
                 $message->attachment = \CUploadedFile::getInstancesByName('attachment');
             } else {
                 $message->attachment = array(\CUploadedFile::getInstanceByName('attachment'));
             }
         }
     }
     // Set the message body
     $postedMessage = craft()->request->getPost('message');
     // Before compile event
     Craft::import('plugins.contactform.events.ContactFormMessageEvent');
     $event = new ContactFormMessageEvent($this, array('postedMessage' => $postedMessage));
     craft()->contactForm->onBeforeMessageCompile($event);
     if ($event->message && $event->messageFields) {
         $message->message = $event->message;
         $message->messageFields = $event->messageFields;
         if (!empty($event->htmlMessage)) {
             $message->htmlMessage = $event->htmlMessage;
         }
     } elseif ($postedMessage) {
         if (is_array($postedMessage)) {
             // Capture all of the message fields on the model in case there's a validation error
             $message->messageFields = $postedMessage;
             // Capture the original message body
             if (isset($postedMessage['body'])) {
                 // Save the message body in case we need to reassign it in the event there's a validation error
                 $savedBody = $postedMessage['body'];
             }
             // If it's false, then there was no messages[body] input submitted.  If it's '', then validation needs to fail.
             if ($savedBody === false || $savedBody !== '') {
                 // Compile the message from each of the individual values
                 $compiledMessage = '';
                 foreach ($postedMessage as $key => $value) {
                     if ($key != 'body') {
                         if ($compiledMessage) {
                             $compiledMessage .= "  \n";
                         }
                         $compiledMessage .= $key . ': ';
                         if (is_array($value)) {
                             $compiledMessage .= implode(', ', $value);
                         } else {
                             $compiledMessage .= $value;
                         }
                     }
                 }
                 if (!empty($postedMessage['body'])) {
                     if ($compiledMessage) {
                         $compiledMessage .= "\n\n";
                     }
                     $compiledMessage .= $postedMessage['body'];
                 }
                 $message->message = $compiledMessage;
             }
         } else {
             $message->message = $postedMessage;
             $message->messageFields = array('body' => $postedMessage);
         }
     }
     if (empty($message->htmlMessage)) {
         $message->htmlMessage = StringHelper::parseMarkdown($message->message);
     }
     if ($message->validate()) {
         // Only actually send it if the honeypot test was valid
         if (!$this->validateHoneypot($settings->honeypotField) || craft()->contactForm->sendMessage($message)) {
             if (craft()->request->isAjaxRequest()) {
                 $this->returnJson(array('success' => true));
             } else {
                 // Deprecated. Use 'redirect' instead.
                 $successRedirectUrl = craft()->request->getPost('successRedirectUrl');
                 if ($successRedirectUrl) {
                     $_POST['redirect'] = $successRedirectUrl;
                 }
                 craft()->userSession->setNotice($settings->successFlashMessage);
                 $this->redirectToPostedUrl($message);
             }
         }
     }
     // Something has gone horribly wrong.
     if (craft()->request->isAjaxRequest()) {
         return $this->returnErrorJson($message->getErrors());
     } else {
         craft()->userSession->setError('There was a problem with your submission, please check the form and try again!');
         if ($savedBody !== false) {
             $message->message = $savedBody;
         }
         craft()->urlManager->setRouteVariables(array('message' => $message));
     }
 }
 /**
  * @param UserModel  $user
  * @param EmailModel $emailModel
  * @param array      $variables
  * @throws Exception
  * @return bool
  */
 private function _sendEmail(UserModel $user, EmailModel $emailModel, $variables = array())
 {
     // Get the saved email settings.
     $emailSettings = $this->getSettings();
     if (!isset($emailSettings['protocol'])) {
         throw new Exception(Craft::t('Could not determine how to send the email.  Check your email settings.'));
     }
     $email = new \PhpMailer(true);
     // Default the charset to UTF-8
     $email->CharSet = 'UTF-8';
     // Add a reply to (if any).  Make sure it’s set before setting From, because email is dumb.
     if (!empty($emailModel->replyTo)) {
         $email->AddReplyTo($emailModel->replyTo);
     }
     // Set the "from" information.
     $email->SetFrom($emailModel->fromEmail, $emailModel->fromName);
     // Check which protocol we need to use.
     switch ($emailSettings['protocol']) {
         case EmailerType::Gmail:
         case EmailerType::Smtp:
             $this->_setSmtpSettings($email, $emailSettings);
             break;
         case EmailerType::Pop:
             $pop = new \Pop3();
             if (!isset($emailSettings['host']) || !isset($emailSettings['port']) || !isset($emailSettings['username']) || !isset($emailSettings['password']) || StringHelper::isNullOrEmpty($emailSettings['host']) || StringHelper::isNullOrEmpty($emailSettings['port']) || StringHelper::isNullOrEmpty($emailSettings['username']) || StringHelper::isNullOrEmpty($emailSettings['password'])) {
                 throw new Exception(Craft::t('Host, port, username and password must be configured under your email settings.'));
             }
             if (!isset($emailSettings['timeout'])) {
                 $emailSettings['timeout'] = $this->_defaultEmailTimeout;
             }
             $pop->authorize($emailSettings['host'], $emailSettings['port'], $emailSettings['timeout'], $emailSettings['username'], $emailSettings['password'], craft()->config->get('devMode') ? 1 : 0);
             $this->_setSmtpSettings($email, $emailSettings);
             break;
         case EmailerType::Sendmail:
             $email->IsSendmail();
             break;
         case EmailerType::Php:
             $email->IsMail();
             break;
         default:
             $email->IsMail();
     }
     // If they have the test email config var set to something, use it instead of the supplied email.
     if (($testToEmail = craft()->config->get('testToEmailAddress')) != '') {
         $email->AddAddress($testToEmail, 'Test Email');
     } else {
         $email->AddAddress($user->email, $user->getFullName());
     }
     // Add any BCC's
     if (!empty($emailModel->bcc)) {
         foreach ($emailModel->bcc as $bcc) {
             if (!empty($bcc['email'])) {
                 $bccEmail = $bcc['email'];
                 $bccName = !empty($bcc['name']) ? $bcc['name'] : '';
                 $email->AddBcc($bccEmail, $bccName);
             }
         }
     }
     // Add any CC's
     if (!empty($emailModel->cc)) {
         foreach ($emailModel->cc as $cc) {
             if (!empty($cc['email'])) {
                 $ccEmail = $cc['email'];
                 $ccName = !empty($cc['name']) ? $cc['name'] : '';
                 $email->AddCc($ccEmail, $ccName);
             }
         }
     }
     // Add a sender header (if any)
     if (!empty($emailModel->sender)) {
         $email->Sender = $emailModel->sender;
     }
     // Add any string attachments
     if (!empty($emailModel->stringAttachments)) {
         foreach ($emailModel->stringAttachments as $stringAttachment) {
             $email->AddStringAttachment($stringAttachment['string'], $stringAttachment['fileName'], $stringAttachment['encoding'], $stringAttachment['type']);
         }
     }
     // Add any normal disc attachments
     if (!empty($emailModel->attachments)) {
         foreach ($emailModel->attachments as $attachment) {
             $email->AddAttachment($attachment['path'], $attachment['name'], $attachment['encoding'], $attachment['type']);
         }
     }
     $variables['user'] = $user;
     $email->Subject = craft()->templates->renderString($emailModel->subject, $variables);
     // If they populated an htmlBody, use it.
     if ($emailModel->htmlBody) {
         $renderedHtmlBody = craft()->templates->renderString($emailModel->htmlBody, $variables);
         $email->MsgHTML($renderedHtmlBody);
         $email->AltBody = craft()->templates->renderString($emailModel->body, $variables);
     } else {
         // They didn't provide an htmlBody, so markdown the body.
         $renderedHtmlBody = craft()->templates->renderString(StringHelper::parseMarkdown($emailModel->body), $variables);
         $email->MsgHTML($renderedHtmlBody);
         $email->AltBody = craft()->templates->renderString($emailModel->body, $variables);
     }
     if (!$email->Send()) {
         throw new Exception(Craft::t('Email error: {error}', array('error' => $email->ErrorInfo)));
     }
     return true;
 }
 protected function initCpAccessControl()
 {
     if (craft()->request->isCpRequest() && craft()->userSession->isLoggedIn()) {
         $this->initMaintenance();
         if ($announcement = $this->announcement) {
             if (!craft()->userSession->checkPermission('maintenanceNoAnnouncements') && $announcement->getStatus() === 'inprogress') {
                 craft()->templates->includeTranslations('Maintenance in progress.');
                 $date = $announcement->startDate;
                 $meta = Craft::t('started {date}', array('date' => '<span class="maintenanceOverlay-date">' . $date->uiTimestamp() . '</span>'));
                 $message = StringHelper::parseMarkdown($announcement->message);
                 $maintenanceCPAccess = craft()->userSession->checkPermission('maintenanceCPAccess');
                 craft()->templates->includeJs('new Craft.MaintenanceModal(' . JsonHelper::encode($announcement) . ',' . JsonHelper::encode($message) . ',' . JsonHelper::encode($meta) . ',' . JsonHelper::encode($maintenanceCPAccess) . ');');
             }
         }
     }
 }
 /**
  * Parses text through Markdown.
  *
  * @param string $str
  * @return string
  */
 public function markdownFilter($str)
 {
     $html = StringHelper::parseMarkdown($str);
     $charset = craft()->templates->getTwig()->getCharset();
     return new \Twig_Markup($html, $charset);
 }