/** * register::index() * Process register form data and take appropriate action * @return */ function actionIndex($surveyid = null) { Yii::app()->loadHelper('database'); Yii::app()->loadHelper('replacements'); $postlang = Yii::app()->request->getPost('lang'); if ($surveyid == null) { $surveyid = Yii::app()->request->getPost('sid'); } if (!$surveyid) { Yii::app()->request->redirect(Yii::app()->baseUrl); } // Get passed language from form, so that we dont loose this! if (!isset($postlang) || $postlang == "" || !$postlang) { $baselang = Survey::model()->findByPk($surveyid)->language; Yii::import('application.libraries.Limesurvey_lang'); Yii::app()->lang = new Limesurvey_lang($baselang); $clang = Yii::app()->lang; } else { Yii::import('application.libraries.Limesurvey_lang'); Yii::app()->lang = new Limesurvey_lang($postlang); $clang = Yii::app()->lang; $baselang = $postlang; } $thissurvey = getSurveyInfo($surveyid, $baselang); $register_errormsg = ""; // Check the security question's answer if (function_exists("ImageCreate") && isCaptchaEnabled('registrationscreen', $thissurvey['usecaptcha'])) { if (!isset($_POST['loadsecurity']) || !isset($_SESSION['survey_' . $surveyid]['secanswer']) || Yii::app()->request->getPost('loadsecurity') != $_SESSION['survey_' . $surveyid]['secanswer']) { $register_errormsg .= $clang->gT("The answer to the security question is incorrect.") . "<br />\n"; } } //Check that the email is a valid style address if (!validateEmailAddress(Yii::app()->request->getPost('register_email'))) { $register_errormsg .= $clang->gT("The email you used is not valid. Please try again."); } // Check for additional fields $attributeinsertdata = array(); foreach (GetParticipantAttributes($surveyid) as $field => $data) { if (empty($data['show_register']) || $data['show_register'] != 'Y') { continue; } $value = sanitize_xss_string(Yii::app()->request->getPost('register_' . $field)); if (trim($value) == '' && $data['mandatory'] == 'Y') { $register_errormsg .= sprintf($clang->gT("%s cannot be left empty"), $thissurvey['attributecaptions'][$field]); } $attributeinsertdata[$field] = $value; } if ($register_errormsg != "") { $_SESSION['survey_' . $surveyid]['register_errormsg'] = $register_errormsg; Yii::app()->request->redirect(Yii::app()->createUrl('survey/index/sid/' . $surveyid)); } //Check if this email already exists in token database $query = "SELECT email FROM {{tokens_{$surveyid}}}\n" . "WHERE email = '" . sanitize_email(Yii::app()->request->getPost('register_email')) . "'"; $usrow = Yii::app()->db->createCommand($query)->queryRow(); if ($usrow) { $register_errormsg = $clang->gT("The email you used has already been registered."); $_SESSION['survey_' . $surveyid]['register_errormsg'] = $register_errormsg; Yii::app()->request->redirect(Yii::app()->createUrl('survey/index/sid/' . $surveyid)); //include "index.php"; //exit; } $mayinsert = false; // Get the survey settings for token length //$this->load->model("surveys_model"); $tlresult = Survey::model()->findAllByAttributes(array("sid" => $surveyid)); if (isset($tlresult[0])) { $tlrow = $tlresult[0]; } else { $tlrow = $tlresult; } $tokenlength = $tlrow['tokenlength']; //if tokenlength is not set or there are other problems use the default value (15) if (!isset($tokenlength) || $tokenlength == '') { $tokenlength = 15; } while ($mayinsert != true) { $newtoken = randomChars($tokenlength); $ntquery = "SELECT * FROM {{tokens_{$surveyid}}} WHERE token='{$newtoken}'"; $usrow = Yii::app()->db->createCommand($ntquery)->queryRow(); if (!$usrow) { $mayinsert = true; } } $postfirstname = sanitize_xss_string(strip_tags(Yii::app()->request->getPost('register_firstname'))); $postlastname = sanitize_xss_string(strip_tags(Yii::app()->request->getPost('register_lastname'))); $starttime = sanitize_xss_string(Yii::app()->request->getPost('startdate')); $endtime = sanitize_xss_string(Yii::app()->request->getPost('enddate')); /*$postattribute1=sanitize_xss_string(strip_tags(returnGlobal('register_attribute1'))); $postattribute2=sanitize_xss_string(strip_tags(returnGlobal('register_attribute2'))); */ // Insert new entry into tokens db Tokens_dynamic::sid($thissurvey['sid']); $token = new Tokens_dynamic(); $token->firstname = $postfirstname; $token->lastname = $postlastname; $token->email = Yii::app()->request->getPost('register_email'); $token->emailstatus = 'OK'; $token->token = $newtoken; if ($starttime && $endtime) { $token->validfrom = $starttime; $token->validuntil = $endtime; } foreach ($attributeinsertdata as $k => $v) { $token->{$k} = $v; } $result = $token->save(); /** $result = $connect->Execute($query, array($postfirstname, $postlastname, returnGlobal('register_email'), 'OK', $newtoken) // $postattribute1, $postattribute2) ) or safeDie ($query."<br />".$connect->ErrorMsg()); //Checked - According to adodb docs the bound variables are quoted automatically */ $tid = getLastInsertID($token->tableName()); $fieldsarray["{ADMINNAME}"] = $thissurvey['adminname']; $fieldsarray["{ADMINEMAIL}"] = $thissurvey['adminemail']; $fieldsarray["{SURVEYNAME}"] = $thissurvey['name']; $fieldsarray["{SURVEYDESCRIPTION}"] = $thissurvey['description']; $fieldsarray["{FIRSTNAME}"] = $postfirstname; $fieldsarray["{LASTNAME}"] = $postlastname; $fieldsarray["{EXPIRY}"] = $thissurvey["expiry"]; $message = $thissurvey['email_register']; $subject = $thissurvey['email_register_subj']; $from = "{$thissurvey['adminname']} <{$thissurvey['adminemail']}>"; if (getEmailFormat($surveyid) == 'html') { $useHtmlEmail = true; $surveylink = $this->createAbsoluteUrl($surveyid . '/lang-' . $baselang . '/tk-' . $newtoken); $optoutlink = $this->createAbsoluteUrl('optout/local/' . $surveyid . '/' . $baselang . '/' . $newtoken); $optinlink = $this->createAbsoluteUrl('optin/local/' . $surveyid . '/' . $baselang . '/' . $newtoken); $fieldsarray["{SURVEYURL}"] = "<a href='{$surveylink}'>" . $surveylink . "</a>"; $fieldsarray["{OPTOUTURL}"] = "<a href='{$optoutlink}'>" . $optoutlink . "</a>"; $fieldsarray["{OPTINURL}"] = "<a href='{$optinlink}'>" . $optinlink . "</a>"; } else { $useHtmlEmail = false; $fieldsarray["{SURVEYURL}"] = $this->createAbsoluteUrl('' . $surveyid . '/lang-' . $baselang . '/tk-' . $newtoken); $fieldsarray["{OPTOUTURL}"] = $this->createAbsoluteUrl('optout/local/' . $surveyid . '/' . $baselang . '/' . $newtoken); $fieldsarray["{OPTINURL}"] = $this->createAbsoluteUrl('optin/local/' . $surveyid . '/' . $baselang . '/' . $newtoken); } $message = ReplaceFields($message, $fieldsarray); $subject = ReplaceFields($subject, $fieldsarray); $html = ""; //Set variable $sitename = Yii::app()->getConfig('sitename'); if (SendEmailMessage($message, $subject, Yii::app()->request->getPost('register_email'), $from, $sitename, $useHtmlEmail, getBounceEmail($surveyid))) { // TLR change to put date into sent $today = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig('timeadjust')); $query = "UPDATE {{tokens_{$surveyid}}}\n" . "SET sent='{$today}' WHERE tid={$tid}"; $result = dbExecuteAssoc($query) or show_error("Unable to execute this query : {$query}<br />"); //Checked $html = "<center>" . $clang->gT("Thank you for registering to participate in this survey.") . "<br /><br />\n" . $clang->gT("An email has been sent to the address you provided with access details for this survey. Please follow the link in that email to proceed.") . "<br /><br />\n" . $clang->gT("Survey administrator") . " {ADMINNAME} ({ADMINEMAIL})"; $html = ReplaceFields($html, $fieldsarray); $html .= "<br /><br /></center>\n"; } else { $html = "Email Error"; } //PRINT COMPLETED PAGE if (!$thissurvey['template']) { $thistpl = getTemplatePath(validateTemplateDir('default')); } else { $thistpl = getTemplatePath(validateTemplateDir($thissurvey['template'])); } sendCacheHeaders(); doHeader(); Yii::app()->lang = $clang; // fetch the defined variables and pass it to the header footer templates. $redata = compact(array_keys(get_defined_vars())); $this->_printTemplateContent($thistpl . '/startpage.pstpl', $redata, __LINE__); $this->_printTemplateContent($thistpl . '/survey.pstpl', $redata, __LINE__); echo $html; $this->_printTemplateContent($thistpl . '/endpage.pstpl', $redata, __LINE__); doFooter(); }
/** * Handle email action */ function email($iSurveyId, $tokenids = null) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')) { Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page."); $this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}")); } // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) { self::_newtokentable($iSurveyId); } $aTokenIds = $tokenids; if (empty($tokenids)) { $aTokenIds = Yii::app()->request->getPost('tokenids', false); } if (!empty($aTokenIds)) { $aTokenIds = explode('|', $aTokenIds); $aTokenIds = array_filter($aTokenIds); $aTokenIds = array_map('sanitize_int', $aTokenIds); } $aTokenIds = array_unique(array_filter((array) $aTokenIds)); $sSubAction = Yii::app()->request->getParam('action'); $sSubAction = !in_array($sSubAction, array('email', 'remind')) ? 'email' : $sSubAction; $bEmail = $sSubAction == 'email'; Yii::app()->loadHelper('surveytranslator'); Yii::app()->loadHelper('/admin/htmleditor'); Yii::app()->loadHelper('replacements'); $token = Token::model($iSurveyId)->find(); $aExampleRow = isset($token) ? $token->attributes : array(); $aSurveyLangs = Survey::model()->findByPk($iSurveyId)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language; array_unshift($aSurveyLangs, $sBaseLanguage); $aTokenFields = getTokenFieldsAndNames($iSurveyId, true); $iAttributes = 0; $bHtml = getEmailFormat($iSurveyId) == 'html'; $timeadjust = Yii::app()->getConfig("timeadjust"); $aData['thissurvey'] = getSurveyInfo($iSurveyId); foreach ($aSurveyLangs as $sSurveyLanguage) { $aData['thissurvey'][$sSurveyLanguage] = getSurveyInfo($iSurveyId, $sSurveyLanguage); } $aData['surveyid'] = $iSurveyId; $aData['sSubAction'] = $sSubAction; $aData['bEmail'] = $bEmail; $aData['aSurveyLangs'] = $aData['surveylangs'] = $aSurveyLangs; $aData['baselang'] = $sBaseLanguage; $aData['tokenfields'] = array_keys($aTokenFields); $aData['nrofattributes'] = $iAttributes; $aData['examplerow'] = $aExampleRow; $aData['tokenids'] = $aTokenIds; $aData['ishtml'] = $bHtml; $iMaxEmails = Yii::app()->getConfig('maxemails'); if (Yii::app()->request->getPost('bypassbademails') == 'Y') { $SQLemailstatuscondition = "emailstatus = 'OK'"; } else { $SQLemailstatuscondition = "emailstatus <> 'OptOut'"; } if (!Yii::app()->request->getPost('ok')) { if (empty($aData['tokenids'])) { $aTokens = TokenDynamic::model($iSurveyId)->findUninvitedIDs($aTokenIds, 0, $bEmail, $SQLemailstatuscondition); foreach ($aTokens as $aToken) { $aData['tokenids'][] = $aToken; } } $this->_renderWrappedTemplate('token', array('tokenbar', $sSubAction), $aData); } else { $SQLremindercountcondition = ""; $SQLreminderdelaycondition = ""; if (!$bEmail) { if (Yii::app()->request->getPost('maxremindercount') && Yii::app()->request->getPost('maxremindercount') != '' && intval(Yii::app()->request->getPost('maxremindercount')) != 0) { $SQLremindercountcondition = "remindercount < " . intval(Yii::app()->request->getPost('maxremindercount')); } if (Yii::app()->request->getPost('minreminderdelay') && Yii::app()->request->getPost('minreminderdelay') != '' && intval(Yii::app()->request->getPost('minreminderdelay')) != 0) { // Yii::app()->request->getPost('minreminderdelay') in days (86400 seconds per day) $compareddate = dateShift(date("Y-m-d H:i:s", time() - 86400 * intval(Yii::app()->request->getPost('minreminderdelay'))), "Y-m-d H:i", $timeadjust); $SQLreminderdelaycondition = " ( " . " (remindersent = 'N' AND sent < '" . $compareddate . "') " . " OR " . " (remindersent < '" . $compareddate . "'))"; } } $ctresult = TokenDynamic::model($iSurveyId)->findUninvitedIDs($aTokenIds, 0, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition); $ctcount = count($ctresult); $emresult = TokenDynamic::model($iSurveyId)->findUninvited($aTokenIds, $iMaxEmails, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition); $emcount = count($emresult); foreach ($aSurveyLangs as $language) { // See #08683 : this allow use of {TOKEN:ANYTHING}, directly replaced by {ANYTHING} $sSubject[$language] = preg_replace("/{TOKEN:([A-Z0-9_]+)}/", "{" . "\$1" . "}", Yii::app()->request->getPost('subject_' . $language)); $sMessage[$language] = preg_replace("/{TOKEN:([A-Z0-9_]+)}/", "{" . "\$1" . "}", Yii::app()->request->getPost('message_' . $language)); if ($bHtml) { $sMessage[$language] = html_entity_decode($sMessage[$language], ENT_QUOTES, Yii::app()->getConfig("emailcharset")); } } $attributes = array_keys(getTokenFieldsAndNames($iSurveyId, true)); $tokenoutput = ""; if ($emcount > 0) { foreach ($emresult as $emrow) { $to = $fieldsarray = array(); $aEmailaddresses = explode(';', $emrow['email']); foreach ($aEmailaddresses as $sEmailaddress) { $to[] = $emrow['firstname'] . " " . $emrow['lastname'] . " <{$sEmailaddress}>"; } $fieldsarray["{EMAIL}"] = $emrow['email']; $fieldsarray["{FIRSTNAME}"] = $emrow['firstname']; $fieldsarray["{LASTNAME}"] = $emrow['lastname']; $fieldsarray["{TOKEN}"] = $emrow['token']; $fieldsarray["{LANGUAGE}"] = $emrow['language']; foreach ($attributes as $attributefield) { $fieldsarray['{' . strtoupper($attributefield) . '}'] = $emrow[$attributefield]; $fieldsarray['{TOKEN:' . strtoupper($attributefield) . '}'] = $emrow[$attributefield]; } $emrow['language'] = trim($emrow['language']); $found = array_search($emrow['language'], $aSurveyLangs); if ($emrow['language'] == '' || $found == false) { $emrow['language'] = $sBaseLanguage; } $from = Yii::app()->request->getPost('from_' . $emrow['language']); $fieldsarray["{OPTOUTURL}"] = $this->getController()->createAbsoluteUrl("/optout/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}"); $fieldsarray["{OPTINURL}"] = $this->getController()->createAbsoluteUrl("/optin/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}"); $fieldsarray["{SURVEYURL}"] = $this->getController()->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}/token/{$emrow['token']}/lang/" . trim($emrow['language']) . "/"); foreach (array('OPTOUT', 'OPTIN', 'SURVEY') as $key) { $url = $fieldsarray["{{$key}URL}"]; if ($bHtml) { $fieldsarray["{{$key}URL}"] = "<a href='{$url}'>" . htmlspecialchars($url) . '</a>'; } if ($key == 'SURVEY') { $barebone_link = $url; } } $customheaders = array('1' => "X-surveyid: " . $iSurveyId, '2' => "X-tokenid: " . $fieldsarray["{TOKEN}"]); global $maildebug; $modsubject = Replacefields($sSubject[$emrow['language']], $fieldsarray); $modmessage = Replacefields($sMessage[$emrow['language']], $fieldsarray); if (isset($barebone_link)) { $modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject); $modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage); } if (trim($emrow['validfrom']) != '' && convertDateTimeFormat($emrow['validfrom'], 'Y-m-d H:i:s', 'U') * 1 > date('U') * 1) { $tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.") . "<br />", $fieldsarray); } elseif (trim($emrow['validuntil']) != '' && convertDateTimeFormat($emrow['validuntil'], 'Y-m-d H:i:s', 'U') * 1 < date('U') * 1) { $tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.") . "<br />", $fieldsarray); } else { /* * Get attachments. */ if ($sSubAction == 'email') { $sTemplate = 'invitation'; } elseif ($sSubAction == 'remind') { $sTemplate = 'reminder'; } $aRelevantAttachments = array(); if (isset($aData['thissurvey'][$emrow['language']]['attachments'])) { $aAttachments = unserialize($aData['thissurvey'][$emrow['language']]['attachments']); if (!empty($aAttachments)) { if (isset($aAttachments[$sTemplate])) { LimeExpressionManager::singleton()->loadTokenInformation($aData['thissurvey']['sid'], $emrow['token']); foreach ($aAttachments[$sTemplate] as $aAttachment) { if (LimeExpressionManager::singleton()->ProcessRelevance($aAttachment['relevance'])) { $aRelevantAttachments[] = $aAttachment['url']; } } } } } /** * Event for email handling. * Parameter type description: * subject rw Body of the email * to rw Recipient(s) * from rw Sender(s) * type r "invitation" or "reminder" * send w If true limesurvey will send the email. Setting this to false will cause limesurvey to assume the mail has been sent by the plugin. * error w If set and "send" is true, log the error as failed email attempt. * token r Raw token data. */ $event = new PluginEvent('beforeTokenEmail'); $event->set('type', $sTemplate); $event->set('subject', $modsubject); $event->set('to', $to); $event->set('body', $modmessage); $event->set('from', $from); $event->set('bounce', getBounceEmail($iSurveyId)); $event->set('token', $emrow); App()->getPluginManager()->dispatchEvent($event); $modsubject = $event->get('subject'); $modmessage = $event->get('body'); $to = $event->get('to'); $from = $event->get('from'); if ($event->get('send', true) == false) { // This is some ancient global used for error reporting instead of a return value from the actual mail function.. $maildebug = $event->get('error', $maildebug); $success = $event->get('error') == null; } else { $success = SendEmailMessage($modmessage, $modsubject, $to, $from, Yii::app()->getConfig("sitename"), $bHtml, getBounceEmail($iSurveyId), $aRelevantAttachments, $customheaders); } if ($success) { // Put date into sent $token = Token::model($iSurveyId)->findByPk($emrow['tid']); if ($bEmail) { $tokenoutput .= $clang->gT("Invitation sent to:"); $token->sent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); } else { $tokenoutput .= $clang->gT("Reminder sent to:"); $token->remindersent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); $token->remindercount++; } $token->save(); //Update central participant survey_links if (!empty($emrow['participant_id'])) { $slquery = SurveyLink::model()->find('participant_id = :pid AND survey_id = :sid AND token_id = :tid', array(':pid' => $emrow['participant_id'], ':sid' => $iSurveyId, ':tid' => $emrow['tid'])); if (!is_null($slquery)) { $slquery->date_invited = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); $slquery->save(); } } $tokenoutput .= "{$emrow['tid']}: {$emrow['firstname']} {$emrow['lastname']} ({$emrow['email']})<br />\n"; if (Yii::app()->getConfig("emailsmtpdebug") == 2) { $tokenoutput .= $maildebug; } } else { $tokenoutput .= ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:") . " " . $maildebug . "<br />", $fieldsarray); } } unset($fieldsarray); } $aViewUrls = array('tokenbar', 'emailpost'); $aData['tokenoutput'] = $tokenoutput; if ($ctcount > $emcount) { $i = 0; if (isset($aTokenIds)) { while ($i < $iMaxEmails) { array_shift($aTokenIds); $i++; } $aData['tids'] = implode('|', $aTokenIds); } $aData['lefttosend'] = $ctcount - $iMaxEmails; $aViewUrls[] = 'emailwarning'; } else { $aData['tokenoutput'] .= "<strong class='result success text-success'>" . gT("All emails were sent.") . "<strong>"; } $this->_renderWrappedTemplate('token', $aViewUrls, $aData); } else { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array('title' => $clang->gT("Warning"), 'message' => $clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:") . "<br/> <ul><li>" . $clang->gT("having a valid email address") . "</li>" . "<li>" . $clang->gT("not having been sent an invitation already") . "</li>" . "<li>" . $clang->gT("having already completed the survey") . "</li>" . "<li>" . $clang->gT("having a token") . "</li></ul>")), $aData); } } }
/** * Send a submit notification to the email address specified in the notifications tab in the survey settings */ function sendSubmitNotifications($surveyid) { // @todo: Remove globals global $thissurvey, $maildebug, $tokensexist; if (trim($thissurvey['adminemail']) == '') { return; } $homeurl = Yii::app()->createAbsoluteUrl('/admin'); $clang = Yii::app()->lang; $sitename = Yii::app()->getConfig("sitename"); $debug = Yii::app()->getConfig('debug'); $bIsHTML = $thissurvey['htmlemail'] == 'Y'; $aReplacementVars = array(); if ($thissurvey['allowsave'] == "Y" && isset($_SESSION['survey_' . $surveyid]['scid'])) { $aReplacementVars['RELOADURL'] = "" . Yii::app()->getController()->createUrl("/survey/index/sid/{$surveyid}/loadall/reload/scid/" . $_SESSION['survey_' . $surveyid]['scid'] . "/loadname/" . urlencode($_SESSION['survey_' . $surveyid]['holdname']) . "/loadpass/" . urlencode($_SESSION['survey_' . $surveyid]['holdpass']) . "/lang/" . urlencode($clang->langcode)); if ($bIsHTML) { $aReplacementVars['RELOADURL'] = "<a href='{$aReplacementVars['RELOADURL']}'>{$aReplacementVars['RELOADURL']}</a>"; } } else { $aReplacementVars['RELOADURL'] = ''; } if (!isset($_SESSION['survey_' . $surveyid]['srid'])) { $srid = null; } else { $srid = $_SESSION['survey_' . $surveyid]['srid']; } $aReplacementVars['ADMINNAME'] = $thissurvey['adminname']; $aReplacementVars['ADMINEMAIL'] = $thissurvey['adminemail']; $aReplacementVars['VIEWRESPONSEURL'] = Yii::app()->createAbsoluteUrl("/admin/responses/sa/view/surveyid/{$surveyid}/id/{$srid}"); $aReplacementVars['EDITRESPONSEURL'] = Yii::app()->createAbsoluteUrl("/admin/dataentry/sa/editdata/subaction/edit/surveyid/{$surveyid}/id/{$srid}"); $aReplacementVars['STATISTICSURL'] = Yii::app()->createAbsoluteUrl("/admin/statistics/sa/index/surveyid/{$surveyid}"); if ($bIsHTML) { $aReplacementVars['VIEWRESPONSEURL'] = "<a href='{$aReplacementVars['VIEWRESPONSEURL']}'>{$aReplacementVars['VIEWRESPONSEURL']}</a>"; $aReplacementVars['EDITRESPONSEURL'] = "<a href='{$aReplacementVars['EDITRESPONSEURL']}'>{$aReplacementVars['EDITRESPONSEURL']}</a>"; $aReplacementVars['STATISTICSURL'] = "<a href='{$aReplacementVars['STATISTICSURL']}'>{$aReplacementVars['STATISTICSURL']}</a>"; } $aReplacementVars['ANSWERTABLE'] = ''; $aEmailResponseTo = array(); $aEmailNotificationTo = array(); $sResponseData = ""; if (!empty($thissurvey['emailnotificationto'])) { $aRecipient = explode(";", ReplaceFields($thissurvey['emailnotificationto'], array('ADMINEMAIL' => $thissurvey['adminemail']), true)); foreach ($aRecipient as $sRecipient) { $sRecipient = trim($sRecipient); if (validateEmailAddress($sRecipient)) { $aEmailNotificationTo[] = $sRecipient; } } } if (!empty($thissurvey['emailresponseto'])) { // there was no token used so lets remove the token field from insertarray if (!isset($_SESSION['survey_' . $surveyid]['token']) && $_SESSION['survey_' . $surveyid]['insertarray'][0] == 'token') { unset($_SESSION['survey_' . $surveyid]['insertarray'][0]); } //Make an array of email addresses to send to $aRecipient = explode(";", ReplaceFields($thissurvey['emailresponseto'], array('ADMINEMAIL' => $thissurvey['adminemail']), true)); foreach ($aRecipient as $sRecipient) { $sRecipient = trim($sRecipient); if (validateEmailAddress($sRecipient)) { $aEmailResponseTo[] = $sRecipient; } } $aFullResponseTable = getFullResponseTable($surveyid, $_SESSION['survey_' . $surveyid]['srid'], $_SESSION['survey_' . $surveyid]['s_lang']); $ResultTableHTML = "<table class='printouttable' >\n"; $ResultTableText = "\n\n"; $oldgid = 0; $oldqid = 0; foreach ($aFullResponseTable as $sFieldname => $fname) { if (substr($sFieldname, 0, 4) == 'gid_') { $ResultTableHTML .= "\t<tr class='printanswersgroup'><td colspan='2'>" . strip_tags($fname[0]) . "</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n\n"; } elseif (substr($sFieldname, 0, 4) == 'qid_') { $ResultTableHTML .= "\t<tr class='printanswersquestionhead'><td colspan='2'>" . strip_tags($fname[0]) . "</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n"; } else { $ResultTableHTML .= "\t<tr class='printanswersquestion'><td>" . strip_tags("{$fname[0]} {$fname[1]}") . "</td><td class='printanswersanswertext'>" . CHtml::encode($fname[2]) . "</td></tr>\n"; $ResultTableText .= " {$fname[0]} {$fname[1]}: {$fname[2]}\n"; } } $ResultTableHTML .= "</table>\n"; $ResultTableText .= "\n\n"; if ($bIsHTML) { $aReplacementVars['ANSWERTABLE'] = $ResultTableHTML; } else { $aReplacementVars['ANSWERTABLE'] = $ResultTableText; } } $sFrom = $thissurvey['adminname'] . ' <' . $thissurvey['adminemail'] . '>'; $aAttachments = unserialize($thissurvey['attachments']); $aRelevantAttachments = array(); /* * Iterate through attachments and check them for relevance. */ if (isset($aAttachments['admin_notification'])) { foreach ($aAttachments['admin_notification'] as $aAttachment) { $relevance = $aAttachment['relevance']; // If the attachment is relevant it will be added to the mail. if (LimeExpressionManager::ProcessRelevance($relevance) && file_exists($aAttachment['url'])) { $aRelevantAttachments[] = $aAttachment['url']; } } } $redata = compact(array_keys(get_defined_vars())); if (count($aEmailNotificationTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_notification'], $aReplacementVars, $redata, 'frontend_helper[1398]', $thissurvey['anonymized'] == "Y", NULL, array(), true); $sSubject = templatereplace($thissurvey['email_admin_notification_subj'], $aReplacementVars, $redata, 'frontend_helper[1399]', $thissurvey['anonymized'] == "Y", NULL, array(), true); foreach ($aEmailNotificationTo as $sRecipient) { if (!SendEmailMessage($sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid), $aRelevantAttachments)) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } } $aRelevantAttachments = array(); /* * Iterate through attachments and check them for relevance. */ if (isset($aAttachments['detailed_admin_notification'])) { foreach ($aAttachments['detailed_admin_notification'] as $aAttachment) { $relevance = $aAttachment['relevance']; // If the attachment is relevant it will be added to the mail. if (LimeExpressionManager::ProcessRelevance($relevance) && file_exists($aAttachment['url'])) { $aRelevantAttachments[] = $aAttachment['url']; } } } if (count($aEmailResponseTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_responses'], $aReplacementVars, $redata, 'frontend_helper[1414]', $thissurvey['anonymized'] == "Y", NULL, array(), true); $sSubject = templatereplace($thissurvey['email_admin_responses_subj'], $aReplacementVars, $redata, 'frontend_helper[1415]', $thissurvey['anonymized'] == "Y", NULL, array(), true); foreach ($aEmailResponseTo as $sRecipient) { if (!SendEmailMessage($sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid), $aRelevantAttachments)) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } } }
} elseif (SendEmailMessage($sendmessage, $msgsubject, $to, $from, $sitename,$ishtml,getBounceEmail($surveyid),null,$customheaders)) { // Put date into remindersent $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" ."SET remindersent='$today',remindercount = remindercount+1 WHERE tid={$emrow['tid']}"; // $uderesult = $connect->Execute($udequery) or safe_die ("Could not update tokens<br />$udequery<br />".$connect->ErrorMsg()); //orig: $tokenoutput .= "({$emrow['tid']})[".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']}]<br />\n"; $tokenoutput .= "({$emrow['tid']}) [".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']} ($to)]<br />\n"; } else { $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."<br />", $fieldsarray); if ($debug>0) { $tokenoutput .= "<pre>Subject : $msgsubject<br /><br />".htmlspecialchars($maildebugbody)."<br /></pre>"; } } $lasttid = $emrow['tid']; } if ($ctcount > $emcount) { $lefttosend = $ctcount-$maxemails; $tokenoutput .= "</td>\n" ."\t</tr>\n" ."\t<tr><form method='post' action='$scriptname?action=tokens&sid=$surveyid'>" ."<td align='center'>\n"
public function beforeSurveyPage() { $oEvent = $this->event; $iSurveyId = $oEvent->get('surveyId'); self::__init(); $bUse=$this->get('bUse', 'Survey', $iSurveyId); if(is_null($bUse)) $bUse=$this->bUse; if(!$bUse) return; $sToken= Yii::app()->request->getParam('token'); if($iSurveyId && !$sToken)// Test invalid token ? { // Get the survey model $oSurvey=Survey::model()->find("sid=:sid",array(':sid'=>$iSurveyId)); if($oSurvey && $oSurvey->active=="Y" && $oSurvey->allowregister=="Y" && tableExists("tokens_{$iSurveyId}")) { // Fill parameters $bShowTokenForm=$this->get('bShowTokenForm', 'Survey', $iSurveyId); if(is_null($bShowTokenForm)) $bShowTokenForm=$this->bShowTokenForm; $bShowTokenForm=$this->get('use', 'Survey', $iSurveyId); if(is_null($bShowTokenForm)) $bShowTokenForm=$this->bUse; Yii::app()->getClientScript()->registerCssFile(Yii::app()->getConfig('publicurl')."plugins/replaceRegister/css/register.css"); // We can go $sLanguage = Yii::app()->request->getParam('lang',''); if ($sLanguage=="" ) { $sLanguage = Survey::model()->findByPk($iSurveyId)->language; } $aSurveyInfo=getSurveyInfo($iSurveyId,$sLanguage); $sAction= Yii::app()->request->getParam('action','view') ; $sHtmlRegistererror=""; $sHtmlRegistermessage1=gT("You must be registered to complete this survey");; $sHtmlRegistermessage2=gT("You may register for this survey if you wish to take part.")."<br />\n".gT("Enter your details below, and an email containing the link to participate in this survey will be sent immediately."); $sHtmlRegisterform=""; $sHtml=""; $bShowForm=true; $bValidMail=false; $bTokenCreate=true; $aExtraParams=array(); $aRegisterError=array(); $sR_email= Yii::app()->request->getPost('register_email'); $sR_firstname= sanitize_xss_string(Yii::app()->request->getPost('register_firstname',"")); $sR_lastname= sanitize_xss_string(Yii::app()->request->getPost('register_lastname',"")); $sR_lastname= sanitize_xss_string(Yii::app()->request->getPost('register_lastname',"")); $aR_attribute=array(); $aR_attributeGet=array(); $aExtraParams=array(); $aMail=array(); foreach ($aSurveyInfo['attributedescriptions'] as $field => $aAttribute) { if (!empty($aAttribute['show_register']) && $aAttribute['show_register'] == 'Y') { $aR_attribute[$field]= sanitize_xss_string(Yii::app()->request->getPost('register_'.$field),"");// Need to be filtered ? } elseif($aAttribute['description']==sanitize_paranoid_string($aAttribute['description']) && trim(Yii::app()->request->getQuery($aAttribute['description'],"")) ) { $aR_attributeGet[$field]= sanitize_xss_string(trim(Yii::app()->request->getQuery($aAttribute['description'],"")));// Allow prefill with URL (TODO: add an option) $aExtraParams[$aAttribute['description']]=sanitize_xss_string(trim(Yii::app()->request->getParam($aAttribute['description'],""))); } } if($sAction=='register' && !is_null($sR_email) && Yii::app()->request->getPost('changelang')!='changelang') { $bShowForm=false; // captcha $sLoadsecurity=Yii::app()->request->getPost('loadsecurity'); $sSecAnswer=(isset($_SESSION['survey_'.$iSurveyId]['secanswer']))?$_SESSION['survey_'.$iSurveyId]['secanswer']:""; $bShowForm=false; $bNoError=true; // Copy paste RegisterController if($sR_email) { //Check that the email is a valid style addressattribute_2 if (!validateEmailAddress($sR_email)) { $aRegisterError[]= gT("The email you used is not valid. Please try again."); } } else { $aRegisterError[]= gT("The email you used is not valid. Please try again.");// Empty email } // Fill and validate mandatory extra attribute foreach ($aSurveyInfo['attributedescriptions'] as $field => $aAttribute) { if (!empty($aAttribute['show_register']) && $aAttribute['show_register'] == 'Y' && $aAttribute['mandatory'] == 'Y' && ($aR_attribute[$field]=="" || is_null($aR_attribute[$field])) ) { $aRegisterError[]= sprintf(gT("%s cannot be left empty").".", $aSurveyInfo['attributecaptions'][$field]); } } // Check the security question's answer : at end because the security question is the last one if (function_exists("ImageCreate") && isCaptchaEnabled('registrationscreen',$aSurveyInfo['usecaptcha']) ) { if (!$sLoadsecurity || !$sSecAnswer || $sLoadsecurity != $sSecAnswer) { $aRegisterError[]= gT("The answer to the security question is incorrect."); } } if(count($aRegisterError)==0) { //Check if this email already exists in token database $oToken=TokenDynamic::model($iSurveyId)->find('email=:email',array(':email'=>$sR_email)); if ($oToken) { if($oToken->usesleft<1 && $aSurveyInfo['alloweditaftercompletion']!='Y') { $aRegisterError="The e-mail address you have entered is already registered an the questionnaire has been completed."; } elseif(strtolower(substr(trim($oToken->emailstatus),0,6))==="optout")// And global blacklisting ? { $aRegisterError="This email address is already registered but someone ask to don't receive new email again."; } elseif(!$oToken->emailstatus && $oToken->emailstatus!="OK") { $aRegisterError="This email address is already registered but the email adress was bounced."; } else { $iTokenId=$oToken->tid; $aMail['subject']=$aSurveyInfo['email_register_subj']; $aMail['message']=$aSurveyInfo['email_register']; $aMail['information']="The address you have entered is already registered. An email has been sent to this address with a link that gives you access to the survey."; // Did we update the token ? Setting ? } } else { $oToken= Token::create($iSurveyId); $oToken->firstname = $sR_firstname; $oToken->lastname = $sR_lastname; $oToken->email = $sR_email; $oToken->emailstatus = 'OK'; $oToken->language = $sLanguage; $oToken->setAttributes($aR_attribute); $oToken->setAttributes($aR_attributeGet);// Need an option if ($aSurveyInfo['startdate']) { $oToken->validfrom = $aSurveyInfo['startdate']; } if ($aSurveyInfo['expires']) { $oToken->validuntil = $aSurveyInfo['expires']; } $oToken->save(); $iTokenId=$oToken->tid; TokenDynamic::model($iSurveyId)->createToken($iTokenId);// Review if really create a token $aMail['subject']=$aSurveyInfo['email_register_subj']; $aMail['message']=$aSurveyInfo['email_register']; $aMail['information']=gT("An email has been sent to the address you provided with access details for this survey. Please follow the link in that email to proceed."); } } } if($aMail && $oToken) { $aReplacementFields=array(); $aReplacementFields["{ADMINNAME}"]=$aSurveyInfo['adminname']; $aReplacementFields["{ADMINEMAIL}"]=$aSurveyInfo['adminemail']; $aReplacementFields["{SURVEYNAME}"]=$aSurveyInfo['name']; $aReplacementFields["{SURVEYDESCRIPTION}"]=$aSurveyInfo['description']; $aReplacementFields["{EXPIRY}"]=$aSurveyInfo["expiry"]; $oToken=TokenDynamic::model($iSurveyId)->findByPk($iTokenId); foreach($oToken->attributes as $attribute=>$value){ $aReplacementFields["{".strtoupper($attribute)."}"]=$value; } $sToken=$oToken->token; $aMail['subject']=preg_replace("/{TOKEN:([A-Z0-9_]+)}/","{"."$1"."}",$aMail['subject']); $aMail['message']=preg_replace("/{TOKEN:([A-Z0-9_]+)}/","{"."$1"."}",$aMail['message']); $surveylink = App()->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}",array('lang'=>$sLanguage,'token'=>$sToken)); $optoutlink = App()->createAbsoluteUrl("/optout/tokens/surveyid/{$iSurveyId}",array('langcode'=>$sLanguage,'token'=>$sToken)); $optinlink = App()->createAbsoluteUrl("/optin/tokens/surveyid/{$iSurveyId}",array('langcode'=>$sLanguage,'token'=>$sToken)); if (getEmailFormat($iSurveyId) == 'html') { $useHtmlEmail = true; $aReplacementFields["{SURVEYURL}"]="<a href='$surveylink'>".$surveylink."</a>"; $aReplacementFields["{OPTOUTURL}"]="<a href='$optoutlink'>".$optoutlink."</a>"; $aReplacementFields["{OPTINURL}"]="<a href='$optinlink'>".$optinlink."</a>"; } else { $useHtmlEmail = false; $aReplacementFields["{SURVEYURL}"]= $surveylink; $aReplacementFields["{OPTOUTURL}"]= $optoutlink; $aReplacementFields["{OPTINURL}"]= $optinlink; } // Allow barebone link for all URL $aMail['message'] = str_replace("@@SURVEYURL@@", $surveylink, $aMail['message']); $aMail['message'] = str_replace("@@OPTOUTURL@@", $optoutlink, $aMail['message']); $aMail['message'] = str_replace("@@OPTINURL@@", $optinlink, $aMail['message']); // Replace the fields $aMail['subject']=ReplaceFields($aMail['subject'], $aReplacementFields); $aMail['message']=ReplaceFields($aMail['message'], $aReplacementFields); // We have it, then try to send the mail. $from = "{$aSurveyInfo['adminname']} <{$aSurveyInfo['adminemail']}>"; $sitename = Yii::app()->getConfig('sitename'); if (SendEmailMessage($aMail['message'], $aMail['subject'], $sR_email, $from, $sitename,$useHtmlEmail,getBounceEmail($iSurveyId))) { // TLR change to put date into sent $today = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig('timeadjust')); $oToken->sent=$today; $oToken->save(); $sReturnHtml="<div id='wrapper' class='message tokenmessage'>" . "<p>".gT("Thank you for registering to participate in this survey.")."</p>\n" . "<p>".$aMail['information']."</p>\n" . "<p>".gT("Survey administrator")." {ADMINNAME} ({ADMINEMAIL})</p>" . "</div>\n"; } else { $sReturnHtml="<div id='wrapper' class='message tokenmessage'>" . "<p>".gT("Thank you for registering to participate in this survey.")."</p>\n" . "<p>"."We can not sent you an email actually, please contact the survey administrator"."</p>\n" . "<p>".gT("Survey administrator")." {ADMINNAME} ({ADMINEMAIL})</p>" . "</div>\n"; } $sReturnHtml=ReplaceFields($sReturnHtml, $aReplacementFields); $sTemplatePath=$aData['templatedir'] = getTemplatePath($aSurveyInfo['template']); ob_start(function($buffer, $phase) { App()->getClientScript()->render($buffer); App()->getClientScript()->reset(); return $buffer; }); ob_implicit_flush(false); sendCacheHeaders(); doHeader(); $aData['thissurvey'] = $aSurveyInfo; $aData['thissurvey'] = $aSurveyInfo; echo templatereplace(file_get_contents($sTemplatePath.'/startpage.pstpl'),array(), $aData); echo templatereplace(file_get_contents($sTemplatePath.'/survey.pstpl'),array(), $aData); echo $sReturnHtml; echo templatereplace(file_get_contents($sTemplatePath.'/endpage.pstpl'),array(), $aData); doFooter(); ob_flush(); App()->end(); } if($bShowForm || count($aRegisterError)) { // Language ? if(count($aRegisterError)==1){ $sHtmlRegistererror="<p class='error error-register'><strong>{$aRegisterError[0]}</strong></p>"; }elseif(count($aRegisterError)>1){ $sHtmlRegistererror="<ul class='error error-register error-list'>"; foreach ($aRegisterError as $sRegisterError) $sHtmlRegistererror.="<li><strong>{$sRegisterError}</strong></li>"; $sHtmlRegistererror.="</ul>"; } $aExtraParams['action']='register'; $aExtraParams['lang']=$sLanguage; $sHtmlRegisterform = CHtml::form(Yii::app()->createUrl("/survey/index/sid/{$iSurveyId}",$aExtraParams), 'post'); $sHtmlRegisterform.="<table class='register'><tbody>\n"; $sHtmlRegisterform.= "<tr><th><label for='register_firstname'>".gT("First name") . "</label></th><td>".CHtml::textField('register_firstname',htmlentities($sR_firstname, ENT_QUOTES, 'UTF-8'),array('class'=>'text'))."</td></tr>\n"; $sHtmlRegisterform.= "<tr><th><label for='register_lastname'>".gT("Last name") . "</label></th><td>".CHtml::textField('register_lastname',htmlentities($sR_lastname, ENT_QUOTES, 'UTF-8'),array('class'=>'text'))."</td></tr>\n"; $sHtmlRegisterform.= "<tr class='mandatory'><th><label for='register_email'>".gT("Email address") . "</label></th><td>".CHtml::textField('register_email',htmlentities($sR_email, ENT_QUOTES, 'UTF-8'),array('class'=>'text'))."</td></tr>\n"; // Extra attribute foreach ($aSurveyInfo['attributedescriptions'] as $field => $aAttribute) { if (!empty($aAttribute['show_register']) && $aAttribute['show_register'] == 'Y') { $sHtmlRegisterform.= "<tr".($aAttribute['mandatory'] == 'Y' ? " class='mandatory'" : '')."><th><label for='register_{$field}'>".$aSurveyInfo['attributecaptions'][$field].($aAttribute['mandatory'] == 'Y' ? ' *' : '')."</label></th><td>".CHtml::textField('register_'.$field,htmlentities($aR_attribute[$field], ENT_QUOTES, 'UTF-8'),array('class'=>'text'))."</td></tr>\n"; } } if (function_exists("ImageCreate") && isCaptchaEnabled('registrationscreen', $aSurveyInfo['usecaptcha'])) $sHtmlRegisterform.= "<tr><th><label for='loadsecurity'>" . gT("Security question") . "</label></th><td><img src='".Yii::app()->getController()->createUrl("/verification/image/sid/{$iSurveyId}")."' alt='' /><input type='text' size='5' maxlength='3' name='loadsecurity' id='loadsecurity' value='' /></td></tr>\n"; $sHtmlRegisterform.= "<tr><td></td><td>".CHtml::submitButton(gT("Continue"))."</td></tr>"; $sHtmlRegisterform.= "</tbody></table>\n"; $sHtmlRegisterform.= makeLanguageChangerSurvey($sLanguage);// Need to be inside the form $sHtmlRegisterform.= CHtml::endForm(); } $sTemplatePath=$aData['templatedir'] = getTemplatePath($aSurveyInfo['template']); ob_start(function($buffer, $phase) { App()->getClientScript()->render($buffer); App()->getClientScript()->reset(); return $buffer; }); ob_implicit_flush(false); sendCacheHeaders(); doHeader(); // Get the register.pstpl file content, but remplace default by own string $sHtmlRegister=file_get_contents($sTemplatePath.'/register.pstpl'); $sHtmlRegister= str_replace("{REGISTERERROR}",$sHtmlRegistererror,$sHtmlRegister); $sHtmlRegister= str_replace("{REGISTERMESSAGE1}",$sHtmlRegistermessage1,$sHtmlRegister); $sHtmlRegister= str_replace("{REGISTERMESSAGE2}",$sHtmlRegistermessage2,$sHtmlRegister); $sHtmlRegister= str_replace("{REGISTERFORM}",$sHtmlRegisterform,$sHtmlRegister); $aData['thissurvey'] = $aSurveyInfo; echo templatereplace(file_get_contents($sTemplatePath.'/startpage.pstpl'),array(), $aData); echo templatereplace(file_get_contents($sTemplatePath.'/survey.pstpl'),array(), $aData); echo templatereplace($sHtmlRegister); echo templatereplace(file_get_contents($sTemplatePath.'/endpage.pstpl'),array(), $aData); doFooter(); ob_flush(); App()->end(); } } }
$message=ReplaceFields($message, $fieldsarray); $subject=ReplaceFields($subject, $fieldsarray); $html=""; //Set variable if (SendEmailMessage($message, $subject, returnglobal('register_email'), $from, $sitename,$useHtmlEmail,getBounceEmail($surveyid))) { // TLR change to put date into sent // $query = "UPDATE {$dbprefix}tokens_$surveyid\n" // ."SET sent='Y' WHERE tid=$tid"; $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); $query = "UPDATE {$dbprefix}tokens_$surveyid\n" ."SET sent='$today' WHERE tid=$tid"; $result=$connect->Execute($query) or safe_die ("$query<br />".$connect->ErrorMsg()); //Checked $html="<center>".$clang->gT("Thank you for registering to participate in this survey.")."<br /><br />\n".$clang->gT("An email has been sent to the address you provided with access details for this survey. Please follow the link in that email to proceed.")."<br /><br />\n".$clang->gT("Survey Administrator")." {ADMINNAME} ({ADMINEMAIL})"; $html=ReplaceFields($html, $fieldsarray); $html .= "<br /><br /></center>\n"; } else { $html="Email Error"; } //PRINT COMPLETED PAGE if (!$thissurvey['template']) { $thistpl=sGetTemplatePath(validate_templatedir('default')); } else { $thistpl=sGetTemplatePath(validate_templatedir($thissurvey['template']));
public function beforeSurveyPage() { $oEvent = $this->event; $iSurveyId = $oEvent->get('surveyId'); $bUse = $this->get('bUse', 'Survey', $iSurveyId); if ($bUse) { //Only private surveys with authsaml plugin enabled if ($this->ssp->isAuthenticated()) { //Only idp users $sLanguage = Yii::app()->request->getParam('lang'); $aSurveyInfo = getSurveyInfo($iSurveyId, $sLanguage); $aSurveyIdpAttributes = array_diff(json_decode($this->get('surveyIdpAttributes', 'Survey', $iSurveyId), true), array('none')); if ($this->checkIdpAttributes($aSurveyIdpAttributes)) { $oToken = TokenDynamic::model($iSurveyId)->find('email=:email', array(':email' => $this->getUserMail())); if ($oToken) { //Allow survey access if the token is given if (Yii::app()->request->getParam('token')) { return; } $sToken = $oToken->token; } else {//Creation of the token $oToken = Token::create($iSurveyId); $oToken->firstname = $this->getUserGivenName(); $oToken->lastname = $this->getUserSurName(); $oToken->email = $this->getUserMail(); $oToken->emailstatus = 'OK'; $oToken->language = $sLanguage; if ($aSurveyInfo['startdate']) { $oToken->validfrom = $aSurveyInfo['startdate']; } if ($aSurveyInfo['expires']) { $oToken->validuntil = $aSurveyInfo['expires']; } $oToken->save(); $iTokenId = $oToken->tid; $sToken = TokenDynamic::model($iSurveyId)->createToken($iTokenId); } if ($sToken) { $surveylink = App()->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}", array('token' => $sToken)); header('Location: ' . $surveylink); } } else { $aReplacementFields = array(); $aReplacementFields["{ADMINNAME}"] = $aSurveyInfo['adminname']; $aReplacementFields["{ADMINEMAIL}"] = $aSurveyInfo['adminemail']; $sLanguage = Yii::app()->request->getParam('lang', ''); if ($sLanguage == "") { $sLanguage = Survey::model()->findByPk($iSurveyId)->language; } $aSurveyInfo = getSurveyInfo($iSurveyId, $sLanguage); $sTemplatePath = $aData['templatedir'] = getTemplatePath($aSurveyInfo['template']); $sAttributesRequired = ''; $sAttributesReceived = ''; foreach ($aSurveyIdpAttributes as $key => $value) { $sAttributesRequired .= "<li>{$key} = \"{$value}\"</li>"; } foreach (array_intersect_key($this->attributes, $aSurveyIdpAttributes) as $key => $value) { $sAttributesReceived .= "<li>{$key} = \"{$value[0]}\"</li>"; } $sReturnHtml = "<div id='wrapper' class='message tokenmessage'>" . "<h3>Acesso ao questionário não permitido!</h3>\n" . "<p>Informações de usuário necessárias:</p>\n" . "<ul>$sAttributesRequired</ul><br />" . "<p>Informações de usuário recebidas:</p>\n" . "<ul>$sAttributesReceived</ul><br />" . "<p>Entre em contato com o administrador do questionário: {ADMINNAME} ({ADMINEMAIL})</p>" . "</div>\n"; $sReturnHtml = ReplaceFields($sReturnHtml, $aReplacementFields); ob_start(function($buffer, $phase) { App()->getClientScript()->render($buffer); App()->getClientScript()->reset(); return $buffer; }); ob_implicit_flush(false); sendCacheHeaders(); doHeader(); $aData['thissurvey'] = $aSurveyInfo; $aData['thissurvey'] = $aSurveyInfo; echo templatereplace(file_get_contents($sTemplatePath . '/startpage.pstpl'), array(), $aData); echo templatereplace(file_get_contents($sTemplatePath . '/survey.pstpl'), array(), $aData); echo $sReturnHtml; echo templatereplace(file_get_contents($sTemplatePath . '/endpage.pstpl'), array(), $aData); doFooter(); ob_flush(); App()->end(); } } else {// Asks idp authentication header('Location: ' . $this->ssp->getLoginURL()); } } }
/** * Send a submit notification to the email address specified in the notifications tab in the survey settings */ function sendSubmitNotifications($surveyid) { global $thissurvey, $debug; global $homeurl, $maildebug, $tokensexist; $clang = Yii::app()->lang; $sitename = Yii::app()->getConfig("sitename"); $bIsHTML = $thissurvey['htmlemail'] == 'Y'; $aReplacementVars = array(); if ($thissurvey['allowsave'] == "Y" && isset($_SESSION['survey_' . $surveyid]['scid'])) { $aReplacementVars['RELOADURL'] = "" . Yii::app()->getController()->createUrl("/survey/index/sid/{$surveyid}/loadall/reload/scid/" . $_SESSION['survey_' . $surveyid]['scid'] . "/loadname/" . urlencode($_SESSION['survey_' . $surveyid]['holdname']) . "/loadpass/" . urlencode($_SESSION['survey_' . $surveyid]['holdpass'])); if ($bIsHTML) { $aReplacementVars['RELOADURL'] = "<a href='{$aReplacementVars['RELOADURL']}'>{$aReplacementVars['RELOADURL']}</a>"; } } else { $aReplacementVars['RELOADURL'] = ''; } if (!isset($_SESSION['survey_' . $surveyid]['srid'])) { $srid = null; } else { $srid = $_SESSION['survey_' . $surveyid]['srid']; } $aReplacementVars['ADMINNAME'] = $thissurvey['adminname']; $aReplacementVars['ADMINEMAIL'] = $thissurvey['adminemail']; $aReplacementVars['VIEWRESPONSEURL'] = "{$homeurl}/admin.php?action=browse&sid={$surveyid}&subaction=id&id=" . $srid; $aReplacementVars['EDITRESPONSEURL'] = "{$homeurl}/admin.php?action=dataentry&sid={$surveyid}&subaction=edit&surveytable=survey_{$surveyid}&id=" . $srid; $aReplacementVars['STATISTICSURL'] = "{$homeurl}/admin.php?action=statistics&sid={$surveyid}"; if ($bIsHTML) { $aReplacementVars['VIEWRESPONSEURL'] = "<a href='{$aReplacementVars['VIEWRESPONSEURL']}'>{$aReplacementVars['VIEWRESPONSEURL']}</a>"; $aReplacementVars['EDITRESPONSEURL'] = "<a href='{$aReplacementVars['EDITRESPONSEURL']}'>{$aReplacementVars['EDITRESPONSEURL']}</a>"; $aReplacementVars['STATISTICSURL'] = "<a href='{$aReplacementVars['STATISTICSURL']}'>{$aReplacementVars['STATISTICSURL']}</a>"; } $aReplacementVars['ANSWERTABLE'] = ''; $aEmailResponseTo = array(); $aEmailNotificationTo = array(); $sResponseData = ""; if (!empty($thissurvey['emailnotificationto'])) { $aRecipient = explode(";", $thissurvey['emailnotificationto']); foreach ($aRecipient as $sRecipient) { $sRecipient = ReplaceFields($sRecipient, array('ADMINEMAIL' => $thissurvey['adminemail']), true); // Only need INSERTANS, ADMINMAIL and TOKEN if (validateEmailAddress($sRecipient)) { $aEmailNotificationTo[] = $sRecipient; } } } if (!empty($thissurvey['emailresponseto'])) { if (isset($_SESSION['survey_' . $surveyid]['token']) && $_SESSION['survey_' . $surveyid]['token'] != '' && tableExists('{{tokens_' . $surveyid . '}}')) { //Gather token data for tokenised surveys $_SESSION['survey_' . $surveyid]['thistoken'] = getTokenData($surveyid, $_SESSION['survey_' . $surveyid]['token']); } elseif ($_SESSION['survey_' . $surveyid]['insertarray'][0] == 'token') { unset($_SESSION['survey_' . $surveyid]['insertarray'][0]); } //Make an array of email addresses to send to $aRecipient = explode(";", $thissurvey['emailresponseto']); foreach ($aRecipient as $sRecipient) { $sRecipient = ReplaceFields($sRecipient, array('ADMINEMAIL' => $thissurvey['adminemail']), true); // Only need INSERTANS, ADMINMAIL and TOKEN if (validateEmailAddress($sRecipient)) { $aEmailResponseTo[] = $sRecipient; } } $aFullResponseTable = getFullResponseTable($surveyid, $_SESSION['survey_' . $surveyid]['srid'], $_SESSION['survey_' . $surveyid]['s_lang']); $ResultTableHTML = "<table class='printouttable' >\n"; $ResultTableText = "\n\n"; $oldgid = 0; $oldqid = 0; foreach ($aFullResponseTable as $sFieldname => $fname) { if (substr($sFieldname, 0, 4) == 'gid_') { $ResultTableHTML .= "\t<tr class='printanswersgroup'><td colspan='2'>{$fname[0]}</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n\n"; } elseif (substr($sFieldname, 0, 4) == 'qid_') { $ResultTableHTML .= "\t<tr class='printanswersquestionhead'><td colspan='2'>{$fname[0]}</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n"; } else { $ResultTableHTML .= "\t<tr class='printanswersquestion'><td>{$fname[0]} {$fname[1]}</td><td class='printanswersanswertext'>{$fname[2]}</td></tr>"; $ResultTableText .= " {$fname[0]} {$fname[1]}: {$fname[2]}\n"; } } $ResultTableHTML .= "</table>\n"; $ResultTableText .= "\n\n"; if ($bIsHTML) { $aReplacementVars['ANSWERTABLE'] = $ResultTableHTML; } else { $aReplacementVars['ANSWERTABLE'] = $ResultTableText; } } $sFrom = $thissurvey['adminname'] . ' <' . $thissurvey['adminemail'] . '>'; $redata = compact(array_keys(get_defined_vars())); if (count($aEmailNotificationTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_notification'], $aReplacementVars, $redata, 'frontend_helper[1398]', $thissurvey['anonymized'] == "Y"); $sSubject = templatereplace($thissurvey['email_admin_notification_subj'], $aReplacementVars, $redata, 'frontend_helper[1399]', $thissurvey['anonymized'] == "Y"); foreach ($aEmailNotificationTo as $sRecipient) { if (!SendEmailMessage($sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid))) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } } if (count($aEmailResponseTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_responses'], $aReplacementVars, $redata, 'frontend_helper[1414]', $thissurvey['anonymized'] == "Y"); $sSubject = templatereplace($thissurvey['email_admin_responses_subj'], $aReplacementVars, $redata, 'frontend_helper[1415]', $thissurvey['anonymized'] == "Y"); foreach ($aEmailResponseTo as $sRecipient) { if (!SendEmailMessage($sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid))) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } } }
/** * Handle email action */ function email($iSurveyId, $tokenids = null) { /* Check permissions */ if (!hasSurveyPermission($iSurveyId, 'tokens', 'read')) { die("You do not have permission to view this page"); // TODO Replace } $aTokenIds = $tokenids; if (empty($tokenids)) { $aTokenIds = Yii::app()->request->getPost('tokenids', false); } if (!empty($aTokenIds)) { $aTokenIds = explode('|', $aTokenIds); $aTokenIds = array_filter($aTokenIds); $aTokenIds = array_map('sanitize_int', $aTokenIds); } $aTokenIds = array_unique(array_filter((array) $aTokenIds)); // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) { self::_newtokentable($iSurveyId); } $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!hasSurveyPermission($iSurveyId, 'tokens', 'update')) { die("no permissions"); // TODO Replace } $sSubAction = Yii::app()->request->getParam('action'); $sSubAction = !in_array($sSubAction, array('email', 'remind')) ? 'email' : $sSubAction; $bEmail = $sSubAction == 'email'; Yii::app()->loadHelper('surveytranslator'); Yii::app()->loadHelper('/admin/htmleditor'); Yii::app()->loadHelper('replacements'); $query = Tokens_dynamic::model($iSurveyId)->find(); $aExampleRow = empty($query) ? array() : $query->attributes; $aSurveyLangs = Survey::model()->findByPk($iSurveyId)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language; array_unshift($aSurveyLangs, $sBaseLanguage); $aTokenFields = getTokenFieldsAndNames($iSurveyId, true); $iAttributes = 0; $bHtml = getEmailFormat($iSurveyId) == 'html'; $timeadjust = Yii::app()->getConfig("timeadjust"); $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $aData['sSubAction'] = $sSubAction; $aData['bEmail'] = $bEmail; $aData['aSurveyLangs'] = $aData['surveylangs'] = $aSurveyLangs; $aData['baselang'] = $sBaseLanguage; $aData['tokenfields'] = $aTokenFields; $aData['nrofattributes'] = $iAttributes; $aData['examplerow'] = $aExampleRow; $aData['tokenids'] = $aTokenIds; $aData['ishtml'] = $bHtml; $iMaxEmails = Yii::app()->getConfig('maxemails'); if (Yii::app()->request->getPost('bypassbademails') == 'Y') { $SQLemailstatuscondition = "emailstatus = 'OK'"; } else { $SQLemailstatuscondition = "emailstatus <> 'OptOut'"; } if (!Yii::app()->request->getPost('ok')) { if (empty($aData['tokenids'])) { $aTokens = Tokens_dynamic::model($iSurveyId)->findUninvited($aTokenIds, 0, $bEmail, $SQLemailstatuscondition); foreach ($aTokens as $aToken) { $aData['tokenids'][] = $aToken['tid']; } } $this->_renderWrappedTemplate('token', array('tokenbar', $sSubAction), $aData); } else { $SQLremindercountcondition = ""; $SQLreminderdelaycondition = ""; if (!$bEmail) { if (Yii::app()->request->getPost('maxremindercount') && Yii::app()->request->getPost('maxremindercount') != '' && intval(Yii::app()->request->getPost('maxremindercount')) != 0) { $SQLremindercountcondition = "remindercount < " . intval(Yii::app()->request->getPost('maxremindercount')); } if (Yii::app()->request->getPost('minreminderdelay') && Yii::app()->request->getPost('minreminderdelay') != '' && intval(Yii::app()->request->getPost('minreminderdelay')) != 0) { // Yii::app()->request->getPost('minreminderdelay') in days (86400 seconds per day) $compareddate = dateShift(date("Y-m-d H:i:s", time() - 86400 * intval(Yii::app()->request->getPost('minreminderdelay'))), "Y-m-d H:i", $timeadjust); $SQLreminderdelaycondition = " ( " . " (remindersent = 'N' AND sent < '" . $compareddate . "') " . " OR " . " (remindersent < '" . $compareddate . "'))"; } } $ctresult = Tokens_dynamic::model($iSurveyId)->findUninvited($aTokenIds, 0, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition); $ctcount = count($ctresult); $emresult = Tokens_dynamic::model($iSurveyId)->findUninvited($aTokenIds, $iMaxEmails, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition); $emcount = count($emresult); foreach ($aSurveyLangs as $language) { $_POST['message_' . $language] = autoUnescape(Yii::app()->request->getPost('message_' . $language)); $_POST['subject_' . $language] = autoUnescape(Yii::app()->request->getPost('subject_' . $language)); if ($bHtml) { $_POST['message_' . $language] = html_entity_decode(Yii::app()->request->getPost('message_' . $language), ENT_QUOTES, Yii::app()->getConfig("emailcharset")); } } $attributes = getTokenFieldsAndNames($iSurveyId); $tokenoutput = ""; if ($emcount > 0) { foreach ($emresult as $emrow) { $to = array(); $aEmailaddresses = explode(';', $emrow['email']); foreach ($aEmailaddresses as $sEmailaddress) { $to[] = $emrow['firstname'] . " " . $emrow['lastname'] . " <{$sEmailaddress}>"; } $fieldsarray["{EMAIL}"] = $emrow['email']; $fieldsarray["{FIRSTNAME}"] = $emrow['firstname']; $fieldsarray["{LASTNAME}"] = $emrow['lastname']; $fieldsarray["{TOKEN}"] = $emrow['token']; $fieldsarray["{LANGUAGE}"] = $emrow['language']; foreach ($attributes as $attributefield => $attributedescription) { $fieldsarray['{' . strtoupper($attributefield) . '}'] = $emrow[$attributefield]; $fieldsarray['{TOKEN:' . strtoupper($attributefield) . '}'] = $emrow[$attributefield]; } $emrow['language'] = trim($emrow['language']); $found = array_search($emrow['language'], $aSurveyLangs); if ($emrow['language'] == '' || $found == false) { $emrow['language'] = $sBaseLanguage; } $from = Yii::app()->request->getPost('from_' . $emrow['language']); $fieldsarray["{OPTOUTURL}"] = $this->getController()->createAbsoluteUrl("/optout/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}"); $fieldsarray["{OPTINURL}"] = $this->getController()->createAbsoluteUrl("/optin/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}"); $fieldsarray["{SURVEYURL}"] = $this->getController()->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}/token/{$emrow['token']}/langcode/" . trim($emrow['language']) . "/"); foreach (array('OPTOUT', 'OPTIN', 'SURVEY') as $key) { $url = $fieldsarray["{{$key}URL}"]; if ($bHtml) { $fieldsarray["{{$key}URL}"] = "<a href='{$url}'>" . htmlspecialchars($url) . '</a>'; } if ($key == 'SURVEY') { $barebone_link = $url; } } $customheaders = array('1' => "X-surveyid: " . $iSurveyId, '2' => "X-tokenid: " . $fieldsarray["{TOKEN}"]); global $maildebug; $modsubject = Replacefields(Yii::app()->request->getPost('subject_' . $emrow['language']), $fieldsarray); $modmessage = Replacefields(Yii::app()->request->getPost('message_' . $emrow['language']), $fieldsarray); if (isset($barebone_link)) { $modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject); $modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage); } if (trim($emrow['validfrom']) != '' && convertDateTimeFormat($emrow['validfrom'], 'Y-m-d H:i:s', 'U') * 1 > date('U') * 1) { $tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.") . "<br />", $fieldsarray); } elseif (trim($emrow['validuntil']) != '' && convertDateTimeFormat($emrow['validuntil'], 'Y-m-d H:i:s', 'U') * 1 < date('U') * 1) { $tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.") . "<br />", $fieldsarray); } else { if (SendEmailMessage($modmessage, $modsubject, $to, $from, Yii::app()->getConfig("sitename"), $bHtml, getBounceEmail($iSurveyId), null, $customheaders)) { // Put date into sent $udequery = Tokens_dynamic::model($iSurveyId)->findByPk($emrow['tid']); if ($bEmail) { $tokenoutput .= $clang->gT("Invitation sent to:"); $udequery->sent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); } else { $tokenoutput .= $clang->gT("Reminder sent to:"); $udequery->remindersent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); $udequery->remindercount = $udequery->remindercount + 1; } $udequery->save(); //Update central participant survey_links if (!empty($emrow['participant_id'])) { $slquery = Survey_links::model()->find('participant_id = "' . $emrow['participant_id'] . '" AND survey_id = ' . $iSurveyId . ' AND token_id = ' . $emrow['tid']); $slquery->date_invited = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")); $slquery->save(); } $tokenoutput .= "{$emrow['tid']}: {$emrow['firstname']} {$emrow['lastname']} ({$emrow['email']})<br />\n"; if (Yii::app()->getConfig("emailsmtpdebug") == 2) { $tokenoutput .= $maildebug; } } else { $tokenoutput .= ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:") . " " . $maildebug . "<br />", $fieldsarray); } } unset($fieldsarray); } $aViewUrls = array('tokenbar', 'emailpost'); $aData['tokenoutput'] = $tokenoutput; if ($ctcount > $emcount) { $i = 0; if (isset($aTokenIds)) { while ($i < $iMaxEmails) { array_shift($aTokenIds); $i++; } $aData['tids'] = implode('|', $aTokenIds); } $aData['lefttosend'] = $ctcount - $iMaxEmails; $aViewUrls[] = 'emailwarning'; } $this->_renderWrappedTemplate('token', $aViewUrls, $aData); } else { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array('title' => $clang->gT("Warning"), 'message' => $clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:") . "<br/> <ul><li>" . $clang->gT("having a valid email address") . "</li>" . "<li>" . $clang->gT("not having been sent an invitation already") . "</li>" . "<li>" . $clang->gT("having already completed the survey") . "</li>" . "<li>" . $clang->gT("having a token") . "</li></ul>")), $aData); } } }
/** * Marks a tokens as completed and sends a confirmation email to the participiant. * If $quotaexit is set to true then the user exited the survey due to a quota * restriction and the according token is only marked as 'Q' * * @param mixed $quotaexit */ function submittokens($quotaexit = false) { global $thissurvey, $timeadjust, $emailcharset; global $dbprefix, $surveyid, $connect; global $sitename, $thistpl, $clang, $clienttoken; // Shift the date due to global timeadjust setting $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); // check how many uses the token has left $usesquery = "SELECT usesleft FROM {$dbprefix}tokens_{$surveyid} WHERE token='" . db_quote($clienttoken) . "'"; $usesresult = db_execute_assoc($usesquery); $usesrow = $usesresult->FetchRow(); if (isset($usesrow)) { $usesleft = $usesrow['usesleft']; } $utquery = "UPDATE {$dbprefix}tokens_{$surveyid}\n"; if ($quotaexit == true) { $utquery .= "SET completed='Q', usesleft=usesleft-1\n"; } elseif (bIsTokenCompletedDatestamped($thissurvey)) { if (isset($usesleft) && $usesleft <= 1) { $utquery .= "SET usesleft=usesleft-1, completed='{$today}'\n"; } else { $utquery .= "SET usesleft=usesleft-1\n"; } } else { if (isset($usesleft) && $usesleft <= 1) { $utquery .= "SET usesleft=usesleft-1, completed='Y'\n"; } else { $utquery .= "SET usesleft=usesleft-1\n"; } } $utquery .= "WHERE token='" . db_quote($clienttoken) . "'"; $utresult = $connect->Execute($utquery) or safe_die("Couldn't update tokens table!<br />\n{$utquery}<br />\n" . $connect->ErrorMsg()); //Checked if ($quotaexit == false) { // TLR change to put date into sent and completed $cnfquery = "SELECT * FROM " . db_table_name("tokens_{$surveyid}") . " WHERE token='" . db_quote($clienttoken) . "' AND completed!='N' AND completed!=''"; $cnfresult = db_execute_assoc($cnfquery); //Checked $cnfrow = $cnfresult->FetchRow(); if (isset($cnfrow)) { $from = "{$thissurvey['adminname']} <{$thissurvey['adminemail']}>"; $to = $cnfrow['email']; $subject = $thissurvey['email_confirm_subj']; $fieldsarray["{ADMINNAME}"] = $thissurvey['adminname']; $fieldsarray["{ADMINEMAIL}"] = $thissurvey['adminemail']; $fieldsarray["{SURVEYNAME}"] = $thissurvey['name']; $fieldsarray["{SURVEYDESCRIPTION}"] = $thissurvey['description']; $fieldsarray["{FIRSTNAME}"] = $cnfrow['firstname']; $fieldsarray["{LASTNAME}"] = $cnfrow['lastname']; $fieldsarray["{TOKEN}"] = $clienttoken; $attrfieldnames = GetAttributeFieldnames($surveyid); foreach ($attrfieldnames as $attr_name) { $fieldsarray["{" . strtoupper($attr_name) . "}"] = $cnfrow[$attr_name]; } $dateformatdatat = getDateFormatData($thissurvey['surveyls_dateformat']); $numberformatdatat = getRadixPointData($thissurvey['surveyls_numberformat']); $fieldsarray["{EXPIRY}"] = convertDateTimeFormat($thissurvey["expiry"], 'Y-m-d H:i:s', $dateformatdatat['phpdate']); $subject = ReplaceFields($subject, $fieldsarray, true); if ($thissurvey['anonymized'] == "N") { // Survey is not anonymous, we can translate insertAns placeholder $subject = dTexts::run($subject); } $subject = html_entity_decode($subject, ENT_QUOTES, $emailcharset); if (getEmailFormat($surveyid) == 'html') { $ishtml = true; } else { $ishtml = false; } if (trim(strip_tags($thissurvey['email_confirm'])) != "") { $message = $thissurvey['email_confirm']; $message = ReplaceFields($message, $fieldsarray, true); if ($thissurvey['anonymized'] == "N") { // Survey is not anonymous, we can translate insertAns placeholder $message = dTexts::run($message); } if (!$ishtml) { $message = strip_tags(br2nl(html_entity_decode($message, ENT_QUOTES, $emailcharset))); } else { $message = html_entity_decode($message, ENT_QUOTES, $emailcharset); } //Only send confirmation email if there is a valid email address if (validate_email($cnfrow['email'])) { SendEmailMessage(null, $message, $subject, $to, $from, $sitename, $ishtml); } } else { //There is nothing in the message, so don't send a confirmation email //This section only here as placeholder to indicate new feature :-) } } } }
/** * Send the register email with $_POST value * @param $iSurveyId Survey Id to register * @return boolean : if email is set to sent (before SMTP problem) */ public function sendRegistrationEmail($iSurveyId, $iTokenId) { $sLanguage = App()->language; $aSurveyInfo = getSurveyInfo($iSurveyId, $sLanguage); $aMail['subject'] = $aSurveyInfo['email_register_subj']; $aMail['message'] = $aSurveyInfo['email_register']; $aReplacementFields = array(); $aReplacementFields["{ADMINNAME}"] = $aSurveyInfo['adminname']; $aReplacementFields["{ADMINEMAIL}"] = $aSurveyInfo['adminemail']; $aReplacementFields["{SURVEYNAME}"] = $aSurveyInfo['name']; $aReplacementFields["{SURVEYDESCRIPTION}"] = $aSurveyInfo['description']; $aReplacementFields["{EXPIRY}"] = $aSurveyInfo["expiry"]; $oToken = Token::model($iSurveyId)->findByPk($iTokenId); // Reload the token (needed if just created) foreach ($oToken->attributes as $attribute => $value) { $aReplacementFields["{" . strtoupper($attribute) . "}"] = $value; } $sToken = $oToken->token; $useHtmlEmail = getEmailFormat($iSurveyId) == 'html'; $aMail['subject'] = preg_replace("/{TOKEN:([A-Z0-9_]+)}/", "{" . "\$1" . "}", $aMail['subject']); $aMail['message'] = preg_replace("/{TOKEN:([A-Z0-9_]+)}/", "{" . "\$1" . "}", $aMail['message']); $aReplacementFields["{SURVEYURL}"] = App()->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}", array('lang' => $sLanguage, 'token' => $sToken)); $aReplacementFields["{OPTOUTURL}"] = App()->createAbsoluteUrl("/optout/tokens/surveyid/{$iSurveyId}", array('langcode' => $sLanguage, 'token' => $sToken)); $aReplacementFields["{OPTINURL}"] = App()->createAbsoluteUrl("/optin/tokens/surveyid/{$iSurveyId}", array('langcode' => $sLanguage, 'token' => $sToken)); foreach (array('OPTOUT', 'OPTIN', 'SURVEY') as $key) { $url = $aReplacementFields["{{$key}URL}"]; if ($useHtmlEmail) { $aReplacementFields["{{$key}URL}"] = "<a href='{$url}'>" . htmlspecialchars($url) . '</a>'; } $aMail['subject'] = str_replace("@@{$key}URL@@", $url, $aMail['subject']); $aMail['message'] = str_replace("@@{$key}URL@@", $url, $aMail['message']); } // Replace the fields $aMail['subject'] = ReplaceFields($aMail['subject'], $aReplacementFields); $aMail['message'] = ReplaceFields($aMail['message'], $aReplacementFields); $sFrom = "{$aSurveyInfo['adminname']} <{$aSurveyInfo['adminemail']}>"; $sBounce = getBounceEmail($iSurveyId); $sTo = $oToken->email; $sitename = Yii::app()->getConfig('sitename'); // Plugin event for email handling (Same than admin token but with register type) $event = new PluginEvent('beforeTokenEmail'); $event->set('type', 'register'); $event->set('subject', $aMail['subject']); $event->set('to', $sTo); $event->set('body', $aMail['message']); $event->set('from', $sFrom); $event->set('bounce', $sBounce); $event->set('token', $oToken->attributes); $aMail['subject'] = $event->get('subject'); $aMail['message'] = $event->get('body'); $sTo = $event->get('to'); $sFrom = $event->get('from'); if ($event->get('send', true) == false) { $this->sMessage = $event->get('message', ''); if ($event->get('error') == null) { // mimic token system, set send to today $today = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig('timeadjust')); $oToken->sent = $today; $oToken->save(); } } elseif (SendEmailMessage($aMail['message'], $aMail['subject'], $sTo, $sFrom, $sitename, $useHtmlEmail, $sBounce)) { // TLR change to put date into sent $today = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig('timeadjust')); $oToken->sent = $today; $oToken->save(); $this->sMessage = "<div id='wrapper' class='message tokenmessage'>" . "<p>" . gT("Thank you for registering to participate in this survey.") . "</p>\n" . "<p>{$this->sMailMessage}</p>\n" . "<p>" . sprintf(gT("Survey administrator %s (%s)"), $aSurveyInfo['adminname'], $aSurveyInfo['adminemail']) . "</p>" . "</div>\n"; } else { $this->sMessage = "<div id='wrapper' class='message tokenmessage'>" . "<p>" . gT("Thank you for registering to participate in this survey.") . "</p>\n" . "<p>" . gT("You are registered but an error happened when trying to send the email - please contact the survey administrator.") . "</p>\n" . "<p>" . sprintf(gT("Survey administrator %s (%s)"), $aSurveyInfo['adminname'], $aSurveyInfo['adminemail']) . "</p>" . "</div>\n"; } // Allways return true : if we come here, we allways trye to send an email return true; }
/** * register::index() * Process register form data and take appropriate action * @return */ function actionIndex($iSurveyID = null) { Yii::app()->loadHelper('database'); Yii::app()->loadHelper('replacements'); $sLanguage = Yii::app()->request->getParam('lang', ''); if ($iSurveyID == null) { $iSurveyID = Yii::app()->request->getPost('sid'); } if (!$iSurveyID) { $this->redirect(Yii::app()->baseUrl); } if ($sLanguage == "") { $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; } else { $sBaseLanguage = $sLanguage; } Yii::import('application.libraries.Limesurvey_lang'); Yii::app()->lang = new Limesurvey_lang($sBaseLanguage); $clang = Yii::app()->lang; $thissurvey = getSurveyInfo($iSurveyID, $sBaseLanguage); $register_errormsg = ""; // Check the security question's answer if (function_exists("ImageCreate") && isCaptchaEnabled('registrationscreen', $thissurvey['usecaptcha'])) { if (!isset($_POST['loadsecurity']) || !isset($_SESSION['survey_' . $iSurveyID]['secanswer']) || Yii::app()->request->getPost('loadsecurity') != $_SESSION['survey_' . $iSurveyID]['secanswer']) { $register_errormsg .= $clang->gT("The answer to the security question is incorrect.") . "<br />\n"; } } //Check that the email is a valid style address if (!validateEmailAddress(Yii::app()->request->getPost('register_email'))) { $register_errormsg .= $clang->gT("The email you used is not valid. Please try again."); } // Check for additional fields $attributeinsertdata = array(); foreach (GetParticipantAttributes($iSurveyID) as $field => $data) { if (empty($data['show_register']) || $data['show_register'] != 'Y') { continue; } $value = sanitize_xss_string(Yii::app()->request->getPost('register_' . $field)); if (trim($value) == '' && $data['mandatory'] == 'Y') { $register_errormsg .= sprintf($clang->gT("%s cannot be left empty"), $thissurvey['attributecaptions'][$field]); } $attributeinsertdata[$field] = $value; } if ($register_errormsg != "") { $_SESSION['survey_' . $iSurveyID]['register_errormsg'] = $register_errormsg; $this->redirect($this->createUrl("survey/index/sid/{$iSurveyID}", array('lang' => $sBaseLanguage))); } //Check if this email already exists in token database $oToken = TokenDynamic::model($iSurveyID)->find('email=:email', array(':email' => Yii::app()->request->getPost('register_email'))); if ($oToken) { $register_errormsg = $clang->gT("The email you used has already been registered."); $_SESSION['survey_' . $iSurveyID]['register_errormsg'] = $register_errormsg; $this->redirect($this->createUrl("survey/index/sid/{$iSurveyID}", array('lang' => $sBaseLanguage))); //include "index.php"; //exit; } $mayinsert = false; // Get the survey settings for token length $tokenlength = $thissurvey['tokenlength']; //if tokenlength is not set or there are other problems use the default value (15) if (!isset($tokenlength) || $tokenlength == '') { $tokenlength = 15; } while ($mayinsert != true) { $newtoken = randomChars($tokenlength); $oTokenExist = TokenDynamic::model($iSurveyID)->find('token=:token', array(':token' => $newtoken)); if (!$oTokenExist) { $mayinsert = true; } } $postfirstname = sanitize_xss_string(strip_tags(Yii::app()->request->getPost('register_firstname'))); $postlastname = sanitize_xss_string(strip_tags(Yii::app()->request->getPost('register_lastname'))); $starttime = sanitize_xss_string(Yii::app()->request->getPost('startdate')); $endtime = sanitize_xss_string(Yii::app()->request->getPost('enddate')); /*$postattribute1=sanitize_xss_string(strip_tags(returnGlobal('register_attribute1'))); $postattribute2=sanitize_xss_string(strip_tags(returnGlobal('register_attribute2'))); */ // Insert new entry into tokens db $oToken = Token::create($thissurvey['sid']); $oToken->firstname = $postfirstname; $oToken->lastname = $postlastname; $oToken->email = Yii::app()->request->getPost('register_email'); $oToken->emailstatus = 'OK'; $oToken->token = $newtoken; if ($starttime && $endtime) { $oToken->validfrom = $starttime; $oToken->validuntil = $endtime; } $oToken->setAttributes($attributeinsertdata, false); $result = $oToken->save(); //$tid = $oToken->tid;// Not needed any more $fieldsarray["{ADMINNAME}"] = $thissurvey['adminname']; $fieldsarray["{ADMINEMAIL}"] = $thissurvey['adminemail']; $fieldsarray["{SURVEYNAME}"] = $thissurvey['name']; $fieldsarray["{SURVEYDESCRIPTION}"] = $thissurvey['description']; $fieldsarray["{FIRSTNAME}"] = $postfirstname; $fieldsarray["{LASTNAME}"] = $postlastname; $fieldsarray["{EXPIRY}"] = $thissurvey["expiry"]; $fieldsarray["{TOKEN}"] = $oToken->token; $fieldsarray["{EMAIL}"] = $oToken->email; $token = $oToken->token; $message = $thissurvey['email_register']; $subject = $thissurvey['email_register_subj']; $from = "{$thissurvey['adminname']} <{$thissurvey['adminemail']}>"; $surveylink = $this->createAbsoluteUrl("/survey/index/sid/{$iSurveyID}", array('lang' => $sBaseLanguage, 'token' => $newtoken)); $optoutlink = $this->createAbsoluteUrl("/optout/tokens/surveyid/{$iSurveyID}", array('langcode' => $sBaseLanguage, 'token' => $newtoken)); $optinlink = $this->createAbsoluteUrl("/optin/tokens/surveyid/{$iSurveyID}", array('langcode' => $sBaseLanguage, 'token' => $newtoken)); if (getEmailFormat($iSurveyID) == 'html') { $useHtmlEmail = true; $fieldsarray["{SURVEYURL}"] = "<a href='{$surveylink}'>" . $surveylink . "</a>"; $fieldsarray["{OPTOUTURL}"] = "<a href='{$optoutlink}'>" . $optoutlink . "</a>"; $fieldsarray["{OPTINURL}"] = "<a href='{$optinlink}'>" . $optinlink . "</a>"; } else { $useHtmlEmail = false; $fieldsarray["{SURVEYURL}"] = $surveylink; $fieldsarray["{OPTOUTURL}"] = $optoutlink; $fieldsarray["{OPTINURL}"] = $optinlink; } $message = ReplaceFields($message, $fieldsarray); $subject = ReplaceFields($subject, $fieldsarray); $html = ""; //Set variable $sitename = Yii::app()->getConfig('sitename'); if (SendEmailMessage($message, $subject, Yii::app()->request->getPost('register_email'), $from, $sitename, $useHtmlEmail, getBounceEmail($iSurveyID))) { // TLR change to put date into sent $today = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig('timeadjust')); $oToken->sent = $today; $oToken->save(); $html = "<div id='wrapper' class='message tokenmessage'>" . "<p>" . $clang->gT("Thank you for registering to participate in this survey.") . "</p>\n" . "<p>" . $clang->gT("An email has been sent to the address you provided with access details for this survey. Please follow the link in that email to proceed.") . "</p>\n" . "<p>" . $clang->gT("Survey administrator") . " {ADMINNAME} ({ADMINEMAIL})</p>" . "</div>\n"; $html = ReplaceFields($html, $fieldsarray); } else { $html = "Email Error"; } //PRINT COMPLETED PAGE if (!$thissurvey['template']) { $thistpl = getTemplatePath(validateTemplateDir('default')); } else { $thistpl = getTemplatePath(validateTemplateDir($thissurvey['template'])); } // Same fix than http://bugs.limesurvey.org/view.php?id=8441 ob_start(function ($buffer, $phase) { App()->getClientScript()->render($buffer); App()->getClientScript()->reset(); return $buffer; }); ob_implicit_flush(false); sendCacheHeaders(); doHeader(); Yii::app()->lang = $clang; // fetch the defined variables and pass it to the header footer templates. $redata = compact(array_keys(get_defined_vars())); $this->_printTemplateContent($thistpl . '/startpage.pstpl', $redata, __LINE__); $this->_printTemplateContent($thistpl . '/survey.pstpl', $redata, __LINE__); echo $html; $this->_printTemplateContent($thistpl . '/endpage.pstpl', $redata, __LINE__); doFooter(); ob_flush(); }
/** * Send a submit notification to the email address specified in the notifications tab in the survey settings */ function SendSubmitNotifications() { global $thissurvey, $debug; global $dbprefix, $clang, $emailcharset; global $sitename, $homeurl, $surveyid, $publicurl, $maildebug, $tokensexist; $bIsHTML = $thissurvey['htmlemail'] == 'Y'; $aReplacementVars = array(); if ($thissurvey['allowsave'] == "Y" && isset($_SESSION['scid'])) { $aReplacementVars['RELOADURL'] = "{$publicurl}/index.php?sid={$surveyid}&loadall=reload&scid=" . $_SESSION['scid'] . "&loadname=" . urlencode($_SESSION['holdname']) . "&loadpass="******"<a href='{$aReplacementVars['RELOADURL']}'>{$aReplacementVars['RELOADURL']}</a>"; } } else { $aReplacementVars['RELOADURL'] = ''; } $aReplacementVars['ADMINNAME'] = $thissurvey['adminname']; $aReplacementVars['ADMINEMAIL'] = $thissurvey['adminemail']; $aReplacementVars['VIEWRESPONSEURL'] = "{$homeurl}/admin.php?action=browse&sid={$surveyid}&subaction=id&id={$_SESSION['srid']}"; $aReplacementVars['EDITRESPONSEURL'] = "{$homeurl}/admin.php?action=dataentry&sid={$surveyid}&subaction=edit&surveytable=survey_{$surveyid}&id=" . $_SESSION['srid']; $aReplacementVars['STATISTICSURL'] = "{$homeurl}/admin.php?action=statistics&sid={$surveyid}"; if ($bIsHTML) { $aReplacementVars['VIEWRESPONSEURL'] = "<a href='{$aReplacementVars['VIEWRESPONSEURL']}'>{$aReplacementVars['VIEWRESPONSEURL']}</a>"; $aReplacementVars['EDITRESPONSEURL'] = "<a href='{$aReplacementVars['EDITRESPONSEURL']}'>{$aReplacementVars['EDITRESPONSEURL']}</a>"; $aReplacementVars['STATISTICSURL'] = "<a href='{$aReplacementVars['STATISTICSURL']}'>{$aReplacementVars['STATISTICSURL']}</a>"; } $aReplacementVars['ANSWERTABLE'] = ''; $aEmailResponseTo = array(); $aEmailNotificationTo = array(); $sResponseData = ""; if (!empty($thissurvey['emailnotificationto'])) { $aRecipient = explode(";", $thissurvey['emailnotificationto']); foreach ($aRecipient as $sRecipient) { $sRecipient = ReplaceFields($sRecipient, array('ADMINEMAIL' => $thissurvey['adminemail']), true); // Only need INSERTANS, ADMINMAIL and TOKEN if (validate_email($sRecipient)) { $aEmailNotificationTo[] = $sRecipient; } } } if (!empty($thissurvey['emailresponseto'])) { if (isset($_SESSION['token']) && $_SESSION['token'] != '' && db_tables_exist($dbprefix . 'tokens_' . $surveyid)) { //Gather token data for tokenised surveys $_SESSION['thistoken'] = getTokenData($surveyid, $_SESSION['token']); } elseif ($_SESSION['insertarray'][0] == 'token') { unset($_SESSION['insertarray'][0]); } //Make an array of email addresses to send to $aRecipient = explode(";", $thissurvey['emailresponseto']); foreach ($aRecipient as $sRecipient) { $sRecipient = ReplaceFields($sRecipient, array('ADMINEMAIL' => $thissurvey['adminemail']), true); // Only need INSERTANS, ADMINMAIL and TOKEN if (validate_email($sRecipient)) { $aEmailResponseTo[] = $sRecipient; } } $aFullResponseTable = aGetFullResponseTable($surveyid, $_SESSION['srid'], $_SESSION['s_lang']); $ResultTableHTML = "<table class='printouttable' >\n"; $ResultTableText = "\n\n"; $oldgid = 0; $oldqid = 0; foreach ($aFullResponseTable as $sFieldname => $fname) { if (substr($sFieldname, 0, 4) == 'gid_') { $ResultTableHTML .= "\t<tr class='printanswersgroup'><td colspan='2'>{$fname[0]}</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n\n"; } elseif (substr($sFieldname, 0, 4) == 'qid_') { $ResultTableHTML .= "\t<tr class='printanswersquestionhead'><td colspan='2'>{$fname[0]}</td></tr>\n"; $ResultTableText .= "\n{$fname[0]}\n"; } else { $ResultTableHTML .= "\t<tr class='printanswersquestion'><td>{$fname[0]} {$fname[1]}</td><td class='printanswersanswertext'>{$fname[2]}</td></tr>"; $ResultTableText .= " {$fname[0]} {$fname[1]}: {$fname[2]}\n"; } } $ResultTableHTML .= "</table>\n"; $ResultTableText .= "\n\n"; if ($bIsHTML) { $aReplacementVars['ANSWERTABLE'] = $ResultTableHTML; } else { $aReplacementVars['ANSWERTABLE'] = $ResultTableText; } } $sFrom = $thissurvey['adminname'] . ' <' . $thissurvey['adminemail'] . '>'; if (count($aEmailNotificationTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_notification'], $aReplacementVars, $thissurvey['anonymized'] == "Y"); $sSubject = templatereplace($thissurvey['email_admin_notification_subj'], $aReplacementVars, $thissurvey['anonymized'] == "Y"); $oMail = new PHPMailer(); foreach ($aEmailNotificationTo as $sRecipient) { if (!SendEmailMessage($oMail, $sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid))) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } $oMail->SmtpClose(); } if (count($aEmailResponseTo) > 0) { $sMessage = templatereplace($thissurvey['email_admin_responses'], $aReplacementVars); $sSubject = templatereplace($thissurvey['email_admin_responses_subj'], $aReplacementVars); $mail = new PHPMailer(); foreach ($aEmailResponseTo as $sRecipient) { if (!SendEmailMessage($mail, $sMessage, $sSubject, $sRecipient, $sFrom, $sitename, true, getBounceEmail($surveyid))) { if ($debug > 0) { echo '<br />Email could not be sent. Reason: ' . $maildebug . '<br/>'; } } } $mail->SmtpClose(); } }