getController()->lang; $thissurvey = getSurveyInfo($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'export') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', '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}")); } Yii::app()->loadHelper("surveytranslator"); $aData['surveyprivate'] = $thissurvey['anonymized']; // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } else { //Check that the tokens table has the required fields /** * @todo is this still needed? What versions of token tables require this?? */ TokenDynamic::model($iSurveyId)->checkColumns(); $aData['thissurvey'] = $thissurvey; $aData['surveyid'] = $iSurveyId; $aData['queries'] = Token::model($iSurveyId)->summary(); $this->_renderWrappedTemplate('token', array('tokenbar', 'tokensummary'), $aData); } } /** * tokens::bounceprocessing() * * @return void */ function bounceprocessing($iSurveyId) { $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { $clang->eT("No token table."); return; } $thissurvey = getSurveyInfo($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')) { $clang->eT("We are sorry but you don't have permissions to do this."); return; } if ($thissurvey['bounceprocessing'] != 'N' || ($thissurvey['bounceprocessing'] == 'G' && getGlobalSetting('bounceaccounttype') != 'off')) { if (!function_exists('imap_open')) { $clang->eT("The imap PHP library is not installed. Please contact your system administrator."); return; } $bouncetotal = 0; $checktotal = 0; if ($thissurvey['bounceprocessing'] == 'G') { $accounttype=strtoupper(getGlobalSetting('bounceaccounttype')); $hostname = getGlobalSetting('bounceaccounthost'); $username = getGlobalSetting('bounceaccountuser'); $pass = getGlobalSetting('bounceaccountpass'); $hostencryption=strtoupper(getGlobalSetting('bounceencryption')); } else { $accounttype=strtoupper($thissurvey['bounceaccounttype']); $hostname = $thissurvey['bounceaccounthost']; $username = $thissurvey['bounceaccountuser']; $pass = $thissurvey['bounceaccountpass']; $hostencryption=strtoupper($thissurvey['bounceaccountencryption']); } @list($hostname, $port) = split(':', $hostname); if (empty($port)) { if ($accounttype == "IMAP") { switch ($hostencryption) { case "OFF": $hostname = $hostname . ":143"; break; case "SSL": $hostname = $hostname . ":993"; break; case "TLS": $hostname = $hostname . ":993"; break; } } else { switch ($hostencryption) { case "OFF": $hostname = $hostname . ":110"; break; case "SSL": $hostname = $hostname . ":995"; break; case "TLS": $hostname = $hostname . ":995"; break; } } } else { $hostname = $hostname.":".$port; } $flags = ""; switch ($accounttype) { case "IMAP": $flags.="/imap"; break; case "POP": $flags.="/pop3"; break; } switch ($hostencryption) // novalidate-cert to have personal CA , maybe option. { case "OFF": $flags.="/notls"; // Really Off break; case "SSL": $flags.="/ssl/novalidate-cert"; break; case "TLS": $flags.="/tls/novalidate-cert"; break; } if ($mbox = @imap_open('{' . $hostname . $flags . '}INBOX', $username, $pass)) { imap_errors(); $count = imap_num_msg($mbox); if ($count>0) { $lasthinfo = imap_headerinfo($mbox, $count); $datelcu = strtotime($lasthinfo->date); $datelastbounce = $datelcu; $lastbounce = $thissurvey['bouncetime']; while ($datelcu > $lastbounce) { @$header = explode("\r\n", imap_body($mbox, $count, FT_PEEK)); // Don't mark messages as read foreach ($header as $item) { if (preg_match('/^X-surveyid/', $item)) { $iSurveyIdBounce = explode(": ", $item); } if (preg_match('/^X-tokenid/', $item)) { $tokenBounce = explode(": ", $item); if ($iSurveyId == $iSurveyIdBounce[1]) { $aData = array( 'emailstatus' => 'bounced' ); $condn = array('token' => $tokenBounce[1]); $record = Token::model($iSurveyId)->findByAttributes($condn); if ($record->emailstatus != 'bounced') { $record->emailstatus = 'bounced'; $record->save(); $bouncetotal++; } $readbounce = imap_body($mbox, $count); // Put read if (isset($thissurvey['bounceremove']) && $thissurvey['bounceremove']) // TODO Y or just true, and a imap_delete { $deletebounce = imap_delete($mbox, $count); // Put delete } } } } $count--; @$lasthinfo = imap_headerinfo($mbox, $count); @$datelc = $lasthinfo->date; $datelcu = strtotime($datelc); $checktotal++; } } @imap_close($mbox); $condn = array('sid' => $iSurveyId); $survey = Survey::model()->findByAttributes($condn); $survey->bouncetime = $datelastbounce; $survey->save(); if ($bouncetotal > 0) { printf($clang->gT("%s messages were scanned out of which %s were marked as bounce by the system."), $checktotal, $bouncetotal); } else { printf($clang->gT("%s messages were scanned, none were marked as bounce by the system."), $checktotal); } } else { $clang->eT("Please check your settings"); } } else { $clang->eT("Bounce processing is deactivated either application-wide or for this survey in particular."); return; } exit; // if bounceprocessing : javascript : no more todo } /** * Browse Tokens */ function browse($iSurveyId, $limit = 50, $start = 0, $order = false, $searchstring = false) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); /* Check permissions */ if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read')) { Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page."); $this->getController()->redirect(array("/admin/tokens/sa/index/surveyid/{$iSurveyId}")); } // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } /* build JS variable to hide buttons forbidden for the current user */ $aData['showDelButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete')?'true':'false'; $aData['showInviteButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false'; $aData['showBounceButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false'; $aData['showRemindButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false'; // Javascript App()->getClientScript()->registerPackage('jqgrid'); App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "tokens.js"); // CSS App()->getClientScript()->registerCssFile(Yii::app()->getConfig('adminstyleurl') . "displayParticipants.css"); App()->getClientScript()->registerCssFile(Yii::app()->getConfig('adminstyleurl') . "jquery-ui/jquery-timepicker.css"); Yii::app()->loadHelper('surveytranslator'); Yii::import('application.libraries.Date_Time_Converter', true); $dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']); $limit = (int) $limit; $start = (int) $start; $tkcount = Token::model($iSurveyId)->count(); $next = $start + $limit; $last = $start - $limit; $end = $tkcount - $limit; if ($end < 0) { $end = 0; } if ($last < 0) { $last = 0; } if ($next >= $tkcount) { $next = $tkcount - $limit; } if ($end < 0) { $end = 0; } $order = Yii::app()->request->getPost('order','tid'); $order = preg_replace('/[^_ a-z0-9-]/i', '', $order); $aData['next'] = $next; $aData['last'] = $last; $aData['end'] = $end; $searchstring = Yii::app()->request->getPost('searchstring'); $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['searchstring'] = $searchstring; $aData['surveyid'] = $iSurveyId; $aData['bgc'] = ""; $aData['limit'] = $limit; $aData['start'] = $start; $aData['order'] = $order; $aData['surveyprivate'] = $aData['thissurvey']['anonymized']; $aData['dateformatdetails'] = $dateformatdetails; $this->_renderWrappedTemplate('token', array('tokenbar', 'browse'), $aData); } /** * This function sends the shared participant info to the share panel using JSON encoding * This function is called after the share panel grid is loaded * This function returns the json depending on the user logged in by checking it from the session * @param it takes the session user data loginID * @return JSON encoded string containg sharing information */ function getTokens_json($iSurveyId, $search = null) { // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { $clang->eT("No token table.");// return json ? error not treated in js. return; } $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read')) { $clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js. return; } $page = Yii::app()->request->getPost('page', 1); $sidx = Yii::app()->request->getPost('sidx', 'lastname'); $sord = Yii::app()->request->getPost('sord', 'asc'); $limit = Yii::app()->request->getPost('rows', 25); $aData = new stdClass; $aData->page = $page; if (!empty($search)) { $condition = TokenDynamic::model($iSurveyId)->getSearchMultipleCondition($search); } else { $condition = new CDbCriteria(); } $condition->order = $sidx. " ". $sord; $condition->offset = ($page - 1) * $limit; $condition->limit = $limit; $tokens = Token::model($iSurveyId)->findAll($condition); $condition->offset=0; $condition->limit=0; $aData->records = Token::model($iSurveyId)->count($condition); if ($limit>$aData->records) { $limit=$aData->records; } if ($limit!=0) { $aData->total = ceil($aData->records / $limit); } else { $aData->total = 0; } Yii::app()->loadHelper("surveytranslator"); $format = getDateFormatData(Yii::app()->session['dateformat']); $aSurveyInfo = Survey::model()->findByPk($iSurveyId)->getAttributes(); //Get survey settings $attributes = getAttributeFieldNames($iSurveyId); // Now find all responses for the visible tokens $visibleTokens = array(); $answeredTokens = array(); if ($aSurveyInfo['anonymized'] == "N" && $aSurveyInfo['active'] == "Y") { foreach ($tokens as $token) { if(isset($token['token']) && $token['token']) $visibleTokens[] = $token['token']; } $answers = SurveyDynamic::model($iSurveyId)->findAllByAttributes(array('token'=>$visibleTokens)); foreach($answers as $answer) { $answeredTokens[$answer['token']] = $answer['token']; } } $bReadPermission = Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'read'); $bCreatePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'create'); $bTokenUpdatePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'); $bTokenDeletePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete'); $bGlobalPanelReadPermission = Permission::model()->hasGlobalPermission('participantpanel','read'); foreach ($tokens as $token) { $aRowToAdd = array(); if ((int) $token['validfrom']) { $token['validfrom'] = date($format['phpdate'] . ' H:i', strtotime(trim($token['validfrom']))); } else { $token['validfrom'] = ''; } if ((int) $token['validuntil']) { $token['validuntil'] = date($format['phpdate'] . ' H:i', strtotime(trim($token['validuntil']))); } else { $token['validuntil'] = ''; } $aRowToAdd['id'] = $token['tid']; $action=""; $action .= "
"; // so we can hide this when edit is clicked // Check is we have an answer if (in_array($token['token'], $answeredTokens) && $bReadPermission) { // @@TODO change link $url = $this->getController()->createUrl("admin/responses/sa/browse/surveyid/{$iSurveyId}", array('token'=>$token['token'])); $title = $clang->gT("View response details"); $action .= CHtml::link(CHtml::image(Yii::app()->getConfig('adminimageurl') . 'token_viewanswer.png', $title, array('title'=>$title)), $url, array('class'=>'imagelink')); } else { $action .= '
'; } // Check if the token can be taken if ($token['token'] != "" && ($token['completed'] == "N" || $token['completed'] == "") && $bCreatePermission) { $action .= viewHelper::getImageLink('do_16.png', "survey/index/sid/{$iSurveyId}/token/{$token['token']}/lang/{$token['language']}/newtest/Y", $clang->gT("Do survey"), '_blank'); } else { $action .= '
'; } if($bTokenDeletePermission){ $attribs = array('onclick' => 'if (confirm("' . $clang->gT("Are you sure you want to delete this entry?") . ' (' . $token['tid'] . ')")) {$("#displaytokens").delRowData(' . $token['tid'] . ');$.post(delUrl,{tid:' . $token['tid'] . '});}'); $action .= viewHelper::getImageLink('token_delete.png', null, $clang->gT("Delete token entry"), null, 'imagelink btnDelete', $attribs); } if (strtolower($token['emailstatus']) == 'ok' && $token['email'] && $bTokenUpdatePermission) { if ($token['completed'] == 'N' && $token['usesleft'] > 0) { if ($token['sent'] == 'N') { $action .= viewHelper::getImageLink('token_invite.png', "admin/tokens/sa/email/surveyid/{$iSurveyId}/tokenids/" . $token['tid'], $clang->gT("Send invitation email to this person (if they have not yet been sent an invitation email)"), "_blank"); } else { $action .= viewHelper::getImageLink('token_remind.png', "admin/tokens/sa/email/action/remind/surveyid/{$iSurveyId}/tokenids/" . $token['tid'], $clang->gT("Send reminder email to this person (if they have already received the invitation email)"), "_blank"); } } else { $action .= '
'; } } else { $action .= '
'; } if($bTokenUpdatePermission) $action .= viewHelper::getImageLink('edit_16.png', null, $clang->gT("Edit token entry"), null, 'imagelink token_edit'); if(!empty($token['participant_id']) && $token['participant_id'] != "" && $bGlobalPanelReadPermission) { $action .= viewHelper::getImageLink('cpdb_16.png', null, $clang->gT("View this person in the central participants database"), null, 'imagelink cpdb',array('onclick'=>"sendPost('".$this->getController()->createUrl('admin/participants/sa/displayParticipants')."','',['searchcondition'],['participant_id||equal||{$token['participant_id']}']);")); } else { $action .= '
'; } $action .= '
'; $aRowToAdd['cell'] = array($token['tid'], $action, $token['firstname'], $token['lastname'], $token['email'], $token['emailstatus'], $token['token'], $token['language'], $token['sent'], $token['remindersent'], $token['remindercount'], $token['completed'], $token['usesleft'], $token['validfrom'], $token['validuntil']); foreach ($attributes as $attribute) { $aRowToAdd['cell'][] = $token[$attribute]; } $aData->rows[] = $aRowToAdd; } viewHelper::disableHtmlLogging(); header("Content-type: application/json"); echo ls_json_encode($aData); } function getSearch_json($iSurveyId) { $searchcondition = Yii::app()->request->getQuery('search'); $searchcondition = urldecode($searchcondition); $finalcondition = array(); $condition = explode("||", $searchcondition); return $this->getTokens_json($iSurveyId, $condition); } /** * Called by jqGrid if a token is saved after editing * * @param mixed $iSurveyId The Survey ID */ function editToken($iSurveyId) { $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create')) { $clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js. return; } // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } $sOperation = Yii::app()->request->getPost('oper'); if (trim(Yii::app()->request->getPost('validfrom')) == '') $from = null; else $from = date('Y-m-d H:i:s', strtotime(trim($_POST['validfrom']))); if (trim(Yii::app()->request->getPost('validuntil')) == '') $until = null; else $until = date('Y-m-d H:i:s', strtotime(trim($_POST['validuntil']))); // if edit it will update the row if ($sOperation == 'edit' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')) { // if (Yii::app()->request->getPost('language') == '') // { // $sLang = Yii::app()->session['adminlang']; // } // else // { // $sLang = Yii::app()->request->getPost('language'); // } echo $from . ',' . $until; $aData = array( 'firstname' => Yii::app()->request->getPost('firstname'), 'lastname' => Yii::app()->request->getPost('lastname'), 'email' => Yii::app()->request->getPost('email'), 'emailstatus' => Yii::app()->request->getPost('emailstatus'), 'token' => Yii::app()->request->getPost('token'), 'language' => Yii::app()->request->getPost('language'), 'sent' => Yii::app()->request->getPost('sent'), 'remindersent' => Yii::app()->request->getPost('remindersent'), 'remindercount' => Yii::app()->request->getPost('remindercount'), 'completed' => Yii::app()->request->getPost('completed'), 'usesleft' => Yii::app()->request->getPost('usesleft'), 'validfrom' => $from, 'validuntil' => $until); $attrfieldnames = GetParticipantAttributes($iSurveyId); foreach ($attrfieldnames as $attr_name => $desc) { $value = Yii::app()->request->getPost($attr_name); if ($desc['mandatory'] == 'Y' && trim($value) == '') $this->getController()->error(sprintf($this->controller->lang->gT('%s cannot be left empty'), $desc['description'])); $aData[$attr_name] = Yii::app()->request->getPost($attr_name); } $token = Token::model($iSurveyId)->find('tid=' . Yii::app()->getRequest()->getPost('id')); foreach ($aData as $k => $v) $token->$k = $v; echo $token->update(); } // if add it will insert a new row elseif ($sOperation == 'add' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create')) { if (Yii::app()->request->getPost('language') == '') $aData = array('firstname' => Yii::app()->request->getPost('firstname'), 'lastname' => Yii::app()->request->getPost('lastname'), 'email' => Yii::app()->request->getPost('email'), 'emailstatus' => Yii::app()->request->getPost('emailstatus'), 'token' => Yii::app()->request->getPost('token'), 'language' => Yii::app()->request->getPost('language'), 'sent' => Yii::app()->request->getPost('sent'), 'remindersent' => Yii::app()->request->getPost('remindersent'), 'remindercount' => Yii::app()->request->getPost('remindercount'), 'completed' => Yii::app()->request->getPost('completed'), 'usesleft' => Yii::app()->request->getPost('usesleft'), 'validfrom' => $from, 'validuntil' => $until); $attrfieldnames = Survey::model()->findByPk($iSurveyId)->tokenAttributes; foreach ($attrfieldnames as $attr_name => $desc) { $value = Yii::app()->request->getPost($attr_name); if ($desc['mandatory'] == 'Y' && trim($value) == '') $this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description'])); $aData[$attr_name] = Yii::app()->request->getPost($attr_name); } $token = Token::create($surveyId); $token->setAttributes($aData, false); echo $token->save(); } elseif ($sOperation == 'del' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')) { $_POST['tid'] = Yii::app()->request->getPost('id'); $this->delete($iSurveyId); } else { $clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js. return; } } /** * Add new token form */ function addnew($iSurveyId) { // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create')) { 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}")); } $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } Yii::app()->loadHelper("surveytranslator"); $dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']); if (Yii::app()->request->getPost('subaction') == 'inserttoken') { Yii::import('application.libraries.Date_Time_Converter'); //Fix up dates and match to database format if (trim(Yii::app()->request->getPost('validfrom')) == '') { $validfrom = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i'); $validfrom = $datetimeobj->convert('Y-m-d H:i:s'); } if (trim(Yii::app()->request->getPost('validuntil')) == '') { $validuntil = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i'); $validuntil = $datetimeobj->convert('Y-m-d H:i:s'); } $sanitizedtoken = sanitize_token(Yii::app()->request->getPost('token')); /* Mdekker: commented out this block as it doesn't respect tokenlength * or existing tokens and was always handled by the tokenify action as * the ui still suggests if (empty($sanitizedtoken)) { $isvalidtoken = false; while ($isvalidtoken == false) { $newtoken = randomChars(15); if (!isset($existingtokens[$newtoken])) { $isvalidtoken = true; $existingtokens[$newtoken] = null; } } $sanitizedtoken = $newtoken; } */ $aData = array( 'firstname' => Yii::app()->request->getPost('firstname'), 'lastname' => Yii::app()->request->getPost('lastname'), 'email' => Yii::app()->request->getPost('email'), 'emailstatus' => Yii::app()->request->getPost('emailstatus'), 'token' => $sanitizedtoken, 'language' => sanitize_languagecode(Yii::app()->request->getPost('language')), 'sent' => Yii::app()->request->getPost('sent'), 'remindersent' => Yii::app()->request->getPost('remindersent'), 'completed' => Yii::app()->request->getPost('completed'), 'usesleft' => Yii::app()->request->getPost('usesleft'), 'validfrom' => $validfrom, 'validuntil' => $validuntil, ); // add attributes $attrfieldnames = Survey::model()->findByPk($iSurveyId)->tokenAttributes; $aTokenFieldNames=Yii::app()->db->getSchema()->getTable("{{tokens_$iSurveyId}}",true); $aTokenFieldNames=array_keys($aTokenFieldNames->columns); foreach ($attrfieldnames as $attr_name => $desc) { if(!in_array($attr_name,$aTokenFieldNames)) continue; $value = Yii::app()->getRequest()->getPost($attr_name); if ($desc['mandatory'] == 'Y' && trim($value) == '') $this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description'])); $aData[$attr_name] = Yii::app()->getRequest()->getPost($attr_name); } $udresult = Token::model($iSurveyId)->findAll("token <> '' and token = '$sanitizedtoken'"); if (count($udresult) == 0) { // AutoExecute $token = Token::create($iSurveyId); $token->setAttributes($aData, false); $inresult = $token->save(); $aData['success'] = true; } else { $aData['success'] = false; } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $this->_renderWrappedTemplate('token', array('tokenbar', 'addtokenpost'), $aData); } else { self::_handletokenform($iSurveyId, "addnew"); } } /** * Edit Tokens */ function edit($iSurveyId, $iTokenId) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); $iTokenId = sanitize_int($iTokenId); 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } Yii::app()->loadHelper("surveytranslator"); $dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']); if (Yii::app()->request->getPost('subaction')) { Yii::import('application.libraries.Date_Time_Converter', true); if (trim(Yii::app()->request->getPost('validfrom')) == '') { $_POST['validfrom'] = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i'); $_POST['validfrom'] = $datetimeobj->convert('Y-m-d H:i:s'); } if (trim(Yii::app()->request->getPost('validuntil')) == '') { $_POST['validuntil'] = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i'); $_POST['validuntil'] = $datetimeobj->convert('Y-m-d H:i:s'); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $aTokenData['firstname'] = Yii::app()->request->getPost('firstname'); $aTokenData['lastname'] = Yii::app()->request->getPost('lastname'); $aTokenData['email'] = Yii::app()->request->getPost('email'); $aTokenData['emailstatus'] = Yii::app()->request->getPost('emailstatus'); $santitizedtoken = sanitize_token(Yii::app()->request->getPost('token')); $aTokenData['token'] = $santitizedtoken; $aTokenData['language'] = sanitize_languagecode(Yii::app()->request->getPost('language')); $aTokenData['sent'] = Yii::app()->request->getPost('sent'); $aTokenData['completed'] = Yii::app()->request->getPost('completed'); $aTokenData['usesleft'] = Yii::app()->request->getPost('usesleft'); $aTokenData['validfrom'] = Yii::app()->request->getPost('validfrom'); $aTokenData['validuntil'] = Yii::app()->request->getPost('validuntil'); $aTokenData['remindersent'] = Yii::app()->request->getPost('remindersent'); $aTokenData['remindercount'] = intval(Yii::app()->request->getPost('remindercount')); $udresult = Token::model($iSurveyId)->findAll("tid <> '$iTokenId' and token <> '' and token = '$santitizedtoken'"); if (count($udresult) == 0) { //$aTokenData = array(); $attrfieldnames = $udresult[0]->survey->tokenAttributes; foreach ($attrfieldnames as $attr_name => $desc) { $value = Yii::app()->request->getPost($attr_name); if ($desc['mandatory'] == 'Y' && trim($value) == '') $this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description'])); $aTokenData[$attr_name] = Yii::app()->request->getPost($attr_name); } $token = Token::model($iSurveyId)->findByPk($iTokenId); foreach ($aTokenData as $k => $v) $token->$k = $v; $token->save(); $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Success"), 'message' => $clang->gT("The token entry was successfully updated.") . "

\n" . "\t\tgetController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId/") . "', '_top')\" />\n" )), $aData); } else { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Failed"), 'message' => $clang->gT("There is already an entry with that exact token in the table. The same token cannot be used in multiple entries.") . "

\n" . "\t\tgetController()->createUrl("admin/tokens/sa/edit/surveyid/$iSurveyId/tokenid/$iTokenId") . "', '_top')\" />\n" ))); } } else { $this->_handletokenform($iSurveyId, "edit", $iTokenId); } } /** * Delete tokens */ function delete($iSurveyID) { $clang = $this->getController()->lang; $iSurveyID = sanitize_int($iSurveyID); $sTokenIDs = Yii::app()->request->getPost('tid'); /* Check permissions */ 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) //If no tokens table exists { self::_newtokentable($iSurveyID); } if (Permission::model()->hasSurveyPermission($iSurveyID, 'tokens', 'delete')) { $aTokenIds = explode(',', $sTokenIDs); //Make the tokenids string into an array //Delete any survey_links SurveyLink::model()->deleteTokenLink($aTokenIds, $iSurveyID); //Then delete the tokens Token::model($iSurveyID)->deleteByPk($aTokenIds); } } /** * Add dummy tokens form */ function addDummies($iSurveyId, $subaction = '') { $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create')) { 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}")); } $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } $this->getController()->loadHelper("surveytranslator"); if (!empty($subaction) && $subaction == 'add') { $this->getController()->loadLibrary('Date_Time_Converter'); $dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']); //Fix up dates and match to database format if (trim(Yii::app()->request->getPost('validfrom')) == '') { $_POST['validfrom'] = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i'); $_POST['validfrom'] = $datetimeobj->convert('Y-m-d H:i:s'); } if (trim(Yii::app()->request->getPost('validuntil')) == '') { $_POST['validuntil'] = null; } else { $datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i'); $_POST['validuntil'] = $datetimeobj->convert('Y-m-d H:i:s'); } $santitizedtoken = ''; $aData = array('firstname' => Yii::app()->request->getPost('firstname'), 'lastname' => Yii::app()->request->getPost('lastname'), 'email' => Yii::app()->request->getPost('email'), 'emailstatus' => 'OK', 'token' => $santitizedtoken, 'language' => sanitize_languagecode(Yii::app()->request->getPost('language')), 'sent' => 'N', 'remindersent' => 'N', 'completed' => 'N', 'usesleft' => Yii::app()->request->getPost('usesleft'), 'validfrom' => Yii::app()->request->getPost('validfrom'), 'validuntil' => Yii::app()->request->getPost('validuntil')); // add attributes $attrfieldnames = getTokenFieldsAndNames($iSurveyId,true); foreach ($attrfieldnames as $attr_name => $desc) { $value = Yii::app()->request->getPost($attr_name); if ($desc['mandatory'] == 'Y' && trim($value) == '') $this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description'])); $aData[$attr_name] = Yii::app()->request->getPost($attr_name); } $amount = sanitize_int(Yii::app()->request->getPost('amount')); $tokenlength = sanitize_int(Yii::app()->request->getPost('tokenlen')); // Fill an array with all existing tokens $existingtokens = array(); $tokenModel = Token::model($iSurveyId); $criteria = $tokenModel->getDbCriteria(); $criteria->select = 'token'; $criteria->distinct = true; $command = $tokenModel->getCommandBuilder()->createFindCommand($tokenModel->getTableSchema(),$criteria); $result = $command->query(); while ($tokenRow = $result->read()) { $existingtokens[$tokenRow['token']] = true; } $result->close(); $invalidtokencount=0; $newDummyToken=0; while ($newDummyToken < $amount && $invalidtokencount < 50) { $token = Token::create($iSurveyId); $token->setAttributes($aData, false); $token->firstname = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->firstname); $token->lastname = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->lastname); $token->email = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->email); $attempts = 0; do { $token->token = randomChars($tokenlength); $attempts++; } while (isset($existingtokens[$token->token]) && $attempts < 50); if ($attempts == 50) { throw new Exception('Something is wrong with your random generator.'); } $existingtokens[$token->token] = true; $token->save(); $newDummyToken++; } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; if(!$invalidtokencount) { $aData['success'] = false; $message=array('title' => $clang->gT("Success"), 'message' => $clang->gT("New dummy tokens were added.") . "

\ngetController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId") . "', '_top')\" />\n" ); } else { $aData['success'] = true; $message= array( 'title' => $clang->gT("Failed"), 'message' => "

".sprintf($clang->gT("Only %s new dummy tokens were added after %s trials."),$newDummyToken,$invalidtokencount) .$clang->gT("Try with a bigger token length.")."

" ."\ngetController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId") . "', '_top')\" />\n" ); } $this->_renderWrappedTemplate('token', array('tokenbar','message' => $message),$aData); } else { $tokenlength = !empty(Token::model($iSurveyId)->survey->tokenlength) ? Token::model($iSurveyId)->survey->tokenlength : 15; $thissurvey = getSurveyInfo($iSurveyId); $aData['thissurvey'] = $thissurvey; $aData['surveyid'] = $iSurveyId; $aData['tokenlength'] = $tokenlength; $aData['dateformatdetails'] = getDateFormatData(Yii::app()->session['dateformat'],$clang->langcode); $aData['aAttributeFields']=GetParticipantAttributes($iSurveyId); $this->_renderWrappedTemplate('token', array('tokenbar', 'dummytokenform'), $aData); } } /** * Handle managetokenattributes action */ function managetokenattributes($iSurveyId) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', '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) //If no tokens table exists { self::_newtokentable($iSurveyId); } Yii::app()->loadHelper("surveytranslator"); $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $aData['tokenfields'] = getAttributeFieldNames($iSurveyId); $aData['tokenfielddata'] = $aData['thissurvey']['attributedescriptions']; // Prepare token fiel list for dropDownList $tokenfieldlist=array(); foreach($aData['tokenfields'] as $tokenfield){ if (isset($aData['tokenfielddata'][$tokenfield])) $descrition = $aData['tokenfielddata'][$tokenfield]['description']; else $descrition = ""; $descrition=sprintf($clang->gT("Attribute %s (%s)"),str_replace("attribute_","",$tokenfield),$descrition); $tokenfieldlist[]=array("id"=>$tokenfield,"descrition"=>$descrition); } $aData['tokenfieldlist'] = $tokenfieldlist; $languages = array_merge((array) Survey::model()->findByPk($iSurveyId)->language, Survey::model()->findByPk($iSurveyId)->additionalLanguages); $captions = array(); foreach ($languages as $language) $captions[$language] = SurveyLanguageSetting::model()->findByAttributes(array('surveyls_survey_id' => $iSurveyId, 'surveyls_language' => $language))->attributeCaptions; $aData['languages'] = $languages; $aData['tokencaptions'] = $captions; $aData['nrofattributes'] = 0; $aData['examplerow'] = TokenDynamic::model($iSurveyId)->find(); $aData['aCPDBAttributes']['']=$clang->gT('(none)'); foreach (ParticipantAttributeName::model()->getCPDBAttributes() as $aCPDBAttribute) { $aData['aCPDBAttributes'][$aCPDBAttribute['attribute_id']]=$aCPDBAttribute['attribute_name']; } $this->_renderWrappedTemplate('token', array('tokenbar', 'managetokenattributes'), $aData); } /** * Update token attributes */ function updatetokenattributes($iSurveyId) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', '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) //If no tokens table exists { self::_newtokentable($iSurveyId); } $number2add = sanitize_int(Yii::app()->request->getPost('addnumber'), 1, 100); $tokenattributefieldnames = getAttributeFieldNames($iSurveyId); $i = 1; for ($b = 0; $b < $number2add; $b++) { while (in_array('attribute_' . $i, $tokenattributefieldnames) !== false) { $i++; } $tokenattributefieldnames[] = 'attribute_' . $i; Yii::app()->db->createCommand(Yii::app()->db->getSchema()->addColumn("{{tokens_".intval($iSurveyId)."}}", 'attribute_' . $i, 'VARCHAR(255)'))->execute(); $fields['attribute_' . $i] = array('type' => 'VARCHAR', 'constraint' => '255'); } Yii::app()->db->schema->getTable('{{tokens_' . $iSurveyId . '}}', true); // Refresh schema cache just in case the table existed in the past LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed Yii::app()->session['flashmessage'] = sprintf($clang->gT("%s field(s) were successfully added."), $number2add); Yii::app()->getController()->redirect(array("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId")); } /** * Delete token attributes */ function deletetokenattributes($iSurveyId) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { Yii::app()->session['flashmessage'] = $clang->gT("No token table."); $this->getController()->redirect($this->getController()->createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}")); } if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update')) { Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page."); $this->getController()->redirect($this->getController()->createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}")); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $confirm=Yii::app()->request->getPost('confirm',''); $cancel=Yii::app()->request->getPost('cancel',''); $tokenfields = getAttributeFieldNames($iSurveyId); $sAttributeToDelete=Yii::app()->request->getPost('deleteattribute',''); tracevar($sAttributeToDelete); if(!in_array($sAttributeToDelete,$tokenfields)) $sAttributeToDelete=false; tracevar($sAttributeToDelete); if ($cancel=='cancel') { Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId")); } elseif ($confirm!='confirm' && $sAttributeToDelete) { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => sprintf($clang->gT("Delete token attribute %s"),$sAttributeToDelete), 'message' => "

".$clang->gT("If you remove this attribute, you will lose all information.") . "

\n" . CHtml::form(array("admin/tokens/sa/deletetokenattributes/surveyid/{$iSurveyId}"), 'post',array('id'=>'attributenumber')) . CHtml::hiddenField('deleteattribute',$sAttributeToDelete) . CHtml::hiddenField('sid',$iSurveyId) . CHtml::htmlButton($clang->gT('Delete attribute'),array('type'=>'submit','value'=>'confirm','name'=>'confirm')) . CHtml::htmlButton($clang->gT('Cancel'),array('type'=>'submit','value'=>'cancel','name'=>'cancel')) . CHtml::endForm() )), $aData); } elseif($sAttributeToDelete) { $sTableName="{{tokens_".intval($iSurveyId)."}}"; Yii::app()->db->createCommand(Yii::app()->db->getSchema()->dropColumn($sTableName, $sAttributeToDelete))->execute(); Yii::app()->db->schema->getTable($sTableName, true); // Refresh schema cache just in case the table existed in the past LimeExpressionManager::SetDirtyFlag(); Yii::app()->session['flashmessage'] = sprintf($clang->gT("Attribute %s was deleted."), $sAttributeToDelete); Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId")); } else { Yii::app()->session['flashmessage'] = $clang->gT("The selected attribute was invalid."); Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId")); } } /** * updatetokenattributedescriptions action */ function updatetokenattributedescriptions($iSurveyId) { $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', '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) //If no tokens table exists { self::_newtokentable($iSurveyId); } // find out the existing token attribute fieldnames $tokenattributefieldnames = getAttributeFieldNames($iSurveyId); $languages = array_merge((array) Survey::model()->findByPk($iSurveyId)->language, Survey::model()->findByPk($iSurveyId)->additionalLanguages); $fieldcontents = array(); $captions = array(); foreach ($tokenattributefieldnames as $fieldname) { $fieldcontents[$fieldname] = array( 'description' => strip_tags(Yii::app()->request->getPost('description_' . $fieldname)), 'mandatory' => Yii::app()->request->getPost('mandatory_' . $fieldname) == 'Y' ? 'Y' : 'N', 'show_register' => Yii::app()->request->getPost('show_register_' . $fieldname) == 'Y' ? 'Y' : 'N', 'cpdbmap' => Yii::app()->request->getPost('cpdbmap_' . $fieldname) ); foreach ($languages as $language) $captions[$language][$fieldname] = $_POST["caption_{$fieldname}_$language"]; } Survey::model()->updateByPk($iSurveyId, array('attributedescriptions' => serialize($fieldcontents))); foreach ($languages as $language) { $ls = SurveyLanguageSetting::model()->findByAttributes(array('surveyls_survey_id' => $iSurveyId, 'surveyls_language' => $language)); $ls->surveyls_attributecaptions = json_encode($captions[$language]); $ls->save(); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT('Token attribute descriptions were successfully updated.'), 'message' => "
getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId") . "', '_top')\" />" )), $aData); } /** * 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) //If no tokens table exists { 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}"] = "" . htmlspecialchars($url) . ''; 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.") . "
", $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.") . "
", $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']})
\n"; if (Yii::app()->getConfig("emailsmtpdebug") == 2) { $tokenoutput .= $maildebug; } } else { $tokenoutput .= ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:") . " " . $maildebug . "
", $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'].='All emails were sent.'; } $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:") . "
 " )), $aData); } } } /** * Export Dialog */ function exportdialog($iSurveyId) { // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'export'))//EXPORT FEATURE SUBMITTED BY PIETERJAN HEYSE { 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}")); } $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } if (Yii::app()->request->getPost('submit')) { Yii::app()->loadHelper("export"); tokensExport($iSurveyId); } else { $aData['resultr'] = Token::model($iSurveyId)->findAll(array('select' => 'language', 'group' => 'language')); $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $this->_renderWrappedTemplate('token', array('tokenbar', 'exportdialog'), $aData); } } /** * Performs a ldap import * * @access public * @param int $iSurveyId * @return void */ public function importldap($iSurveyId) { $iSurveyId = (int) $iSurveyId; $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import')) { 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } Yii::app()->loadConfig('ldap'); Yii::app()->loadHelper('ldap'); $tokenoutput = ''; $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId; $aData['ldap_queries'] = Yii::app()->getConfig('ldap_queries'); if (!Yii::app()->request->getPost('submit')) { $this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData); } else { $filterduplicatetoken = (Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on'); $filterblankemail = (Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on'); $ldap_queries = Yii::app()->getConfig('ldap_queries'); $ldap_server = Yii::app()->getConfig('ldap_server'); $duplicatelist = array(); $invalidemaillist = array(); $tokenoutput .= "\t" . $clang->gT("Uploading LDAP Query") . "\n" . "\t\n"; $ldapq = Yii::app()->request->getPost('ldapQueries'); // the ldap query id $ldap_server_id = $ldap_queries[$ldapq]['ldapServerId']; $ldapserver = $ldap_server[$ldap_server_id]['server']; $ldapport = $ldap_server[$ldap_server_id]['port']; if (isset($ldap_server[$ldap_server_id]['encoding']) && $ldap_server[$ldap_server_id]['encoding'] != 'utf-8' && $ldap_server[$ldap_server_id]['encoding'] != 'UTF-8') { $ldapencoding = $ldap_server[$ldap_server_id]['encoding']; } else { $ldapencoding = ''; } // define $attrlist: list of attributes to read from users' entries $attrparams = array('firstname_attr', 'lastname_attr', 'email_attr', 'token_attr', 'language'); $aTokenAttr = getAttributeFieldNames($iSurveyId); foreach ($aTokenAttr as $thisattrfieldname) { $attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long $attrparams[] = "attr" . $attridx; } foreach ($attrparams as $id => $attr) { if (array_key_exists($attr, $ldap_queries[$ldapq]) && $ldap_queries[$ldapq][$attr] != '') { $attrlist[] = $ldap_queries[$ldapq][$attr]; } } // Open connection to server $ds = ldap_getCnx($ldap_server_id); if ($ds) { // bind to server $resbind = ldap_bindCnx($ds, $ldap_server_id); if ($resbind) { $ResArray = array(); $resultnum = ldap_doTokenSearch($ds, $ldapq, $ResArray, $iSurveyId); $xz = 0; // imported token count $xv = 0; // meet minim requirement count $xy = 0; // check for duplicates $duplicatecount = 0; // duplicate tokens skipped count $invalidemailcount = 0; if ($resultnum >= 1) { foreach ($ResArray as $responseGroupId => $responseGroup) { for ($j = 0; $j < $responseGroup['count']; $j++) { // first let's initialize everything to '' $myfirstname = ''; $mylastname = ''; $myemail = ''; $mylanguage = ''; $mytoken = ''; $myattrArray = array(); // The first 3 attrs MUST exist in the ldap answer // ==> send PHP notice msg to apache logs otherwise $meetminirequirements = true; if (isset($responseGroup[$j][$ldap_queries[$ldapq]['firstname_attr']]) && isset($responseGroup[$j][$ldap_queries[$ldapq]['lastname_attr']]) ) { // minimum requirement for ldap // * at least a firstanme // * at least a lastname // * if filterblankemail is set (default): at least an email address $myfirstname = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['firstname_attr']]); $mylastname = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['lastname_attr']]); if (isset($responseGroup[$j][$ldap_queries[$ldapq]['email_attr']])) { $myemail = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['email_attr']]); $myemail = $myemail; ++$xv; } elseif ($filterblankemail !== true) { $myemail = ''; ++$xv; } else { $meetminirequirements = false; } } else { $meetminirequirements = false; } // The following attrs are optionnal if (isset($responseGroup[$j][$ldap_queries[$ldapq]['token_attr']])) $mytoken = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['token_attr']]); foreach ($aTokenAttr as $thisattrfieldname) { $attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long if (isset($ldap_queries[$ldapq]['attr' . $attridx]) && isset($responseGroup[$j][$ldap_queries[$ldapq]['attr' . $attridx]])) $myattrArray[$attridx] = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['attr' . $attridx]]); } if (isset($responseGroup[$j][$ldap_queries[$ldapq]['language']])) $mylanguage = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['language']]); // In case Ldap Server encoding isn't UTF-8, let's translate // the strings to UTF-8 if ($ldapencoding != '') { $myfirstname = @mb_convert_encoding($myfirstname, "UTF-8", $ldapencoding); $mylastname = @mb_convert_encoding($mylastname, "UTF-8", $ldapencoding); foreach ($aTokenAttr as $thisattrfieldname) { $attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long @mb_convert_encoding($myattrArray[$attridx], "UTF-8", $ldapencoding); } } // Now check for duplicates or bad formatted email addresses $dupfound = false; $invalidemail = false; if ($filterduplicatetoken) { $dupquery = "SELECT count(tid) from {{tokens_".intval($iSurveyId)."}} where email=:email and firstname=:firstname and lastname=:lastname"; $dupresult = Yii::app()->db->createCommand($dupquery)->bindParam(":email", $myemail, PDO::PARAM_STR)->bindParam(":firstname", $myfirstname, PDO::PARAM_STR)->bindParam(":lastname", $mylastname, PDO::PARAM_STR)->queryScalar(); if ($dupresult > 0) { $dupfound = true; $duplicatelist[] = $myfirstname . " " . $mylastname . " (" . $myemail . ")"; $xy++; } } if ($filterblankemail && $myemail == '') { $invalidemail = true; $invalidemaillist[] = $myfirstname . " " . $mylastname . " ( )"; } elseif ($myemail != '' && !validateEmailAddress($myemail)) { $invalidemail = true; $invalidemaillist[] = $myfirstname . " " . $mylastname . " (" . $myemail . ")"; } if ($invalidemail) { ++$invalidemailcount; } elseif ($dupfound) { ++$duplicatecount; } elseif ($meetminirequirements === true) { // No issue, let's import $iq = "INSERT INTO {{tokens_".intval($iSurveyId)."}} \n" . "(firstname, lastname, email, emailstatus, token, language"; foreach ($aTokenAttr as $thisattrfieldname) { $attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long if (!empty($myattrArray[$attridx])) { $iq .= ", ".Yii::app()->db->quoteColumnName($thisattrfieldname); } } $iq .=") \n" . "VALUES (" . Yii::app()->db->quoteValue($myfirstname) . ", " . Yii::app()->db->quoteValue($mylastname) . ", " . Yii::app()->db->quoteValue($myemail) . ", 'OK', " . Yii::app()->db->quoteValue($mytoken) . ", " . Yii::app()->db->quoteValue($mylanguage) . ""; foreach ($aTokenAttr as $thisattrfieldname) { $attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long if (!empty($myattrArray[$attridx])) { $iq .= ", " . Yii::app()->db->quoteValue($myattrArray[$attridx]) . ""; }// dbquote_all encloses str with quotes } $iq .= ")"; $ir = Yii::app()->db->createCommand($iq)->execute(); if (!$ir) $duplicatecount++; $xz++; // or die ("Couldn't insert line
\n$buffer
\n".htmlspecialchars($connect->ErrorMsg())."
$iq
\n"); } } // End for each entry } // End foreach responseGroup } // End of if resnum >= 1 $aData['duplicatelist'] = $duplicatelist; $aData['invalidemaillist'] = $invalidemaillist; $aData['invalidemailcount'] = $invalidemailcount; $aData['resultnum'] = $resultnum; $aData['xv'] = $xv; $aData['xy'] = $xy; $aData['xz'] = $xz; $this->_renderWrappedTemplate('token', array('tokenbar', 'ldappost'), $aData); } else { $aData['sError'] = $clang->gT("Can't bind to the LDAP directory"); $this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData); } @ldap_close($ds); } else { $aData['sError'] = $clang->gT("Can't connect to the LDAP directory"); $this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData); } } } /** * import from csv */ function import($iSurveyId) { $clang = $this->getController()->lang; $iSurveyId = (int) $iSurveyId; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import')) { 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . 'tokensimport.js'); $aEncodings =aEncodingsArray(); if (Yii::app()->request->getPost('submit')) { if (Yii::app()->request->getPost('csvcharset') && Yii::app()->request->getPost('csvcharset')) //sanitize charset - if encoding is not found sanitize to 'auto' { $uploadcharset = Yii::app()->request->getPost('csvcharset'); if (!array_key_exists($uploadcharset, $aEncodings)) { $uploadcharset = 'auto'; } $filterduplicatetoken = (Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on'); $filterblankemail = (Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on'); } $attrfieldnames = getAttributeFieldNames($iSurveyId); $duplicatelist = array(); $invalidemaillist = array(); $invalidformatlist = array(); $firstline = array(); $sPath = Yii::app()->getConfig('tempdir'); $sFileTmpName = $_FILES['the_file']['tmp_name']; $sFilePath = $sPath . '/' . randomChars(20); if (!@move_uploaded_file($sFileTmpName, $sFilePath)) { $aData['sError'] = $clang->gT("Upload file not found. Check your permissions and path ({$sFilePath}) for the upload directory"); $aData['aEncodings'] = $aEncodings; $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId; $aData['thissurvey'] = getSurveyInfo($iSurveyId); $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData); } else { $xz = 0; $recordcount = 0; $xv = 0; // This allows to read file with MAC line endings too @ini_set('auto_detect_line_endings', true); // open it and trim the ednings $tokenlistarray = file($sFilePath); $sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language; if (!Yii::app()->request->getPost('filterduplicatefields') || (Yii::app()->request->getPost('filterduplicatefields') && count(Yii::app()->request->getPost('filterduplicatefields')) == 0)) { $filterduplicatefields = array('firstname', 'lastname', 'email'); } else { $filterduplicatefields = Yii::app()->request->getPost('filterduplicatefields'); } $separator = returnGlobal('separator'); foreach ($tokenlistarray as $buffer) { $buffer = @mb_convert_encoding($buffer, "UTF-8", $uploadcharset); if ($recordcount == 0) { // Parse first line (header) from CSV $buffer = removeBOM($buffer); // We alow all field except tid because this one is really not needed. $allowedfieldnames = array('participant_id','firstname','lastname','email','emailstatus','token','language','blacklisted','sent','remindersent','remindercount','validfrom','validuntil','completed','usesleft'); $allowedfieldnames = array_merge($attrfieldnames, $allowedfieldnames); // Some header don't have same column name $aReplacedFields=array( 'invited'=>'sent' ); switch ($separator) { case 'comma': $separator = ','; break; case 'semicolon': $separator = ';'; break; default: $comma = substr_count($buffer, ','); $semicolon = substr_count($buffer, ';'); if ($semicolon > $comma) $separator = ';'; else $separator = ','; } $firstline = convertCSVRowToArray($buffer, $separator, '"'); $firstline = array_map('trim', $firstline); $ignoredcolumns = array(); // Now check the first line for invalid fields foreach ($firstline as $index => $fieldname) { $firstline[$index] = preg_replace("/(.*) <[^,]*>$/", "$1", $fieldname); $fieldname = $firstline[$index]; if (!in_array($fieldname, $allowedfieldnames)) { $ignoredcolumns[] = $fieldname; } if (array_key_exists($fieldname, $aReplacedFields)) { $firstline[$index] = $aReplacedFields[$fieldname]; } } if (!in_array('firstname', $firstline) || !in_array('lastname', $firstline) || !in_array('email', $firstline)) { $recordcount = count($tokenlistarray); break; } } else { $line = convertCSVRowToArray($buffer, $separator, '"'); if (count($firstline) != count($line)) { $invalidformatlist[] = $recordcount; $recordcount++; continue; } $writearray = array_combine($firstline, $line); //kick out ignored columns foreach ($ignoredcolumns as $column) { unset($writearray[$column]); } $dupfound = false; $invalidemail = false; if ($filterduplicatetoken != false) { $dupquery = "SELECT count(tid) from {{tokens_".intval($iSurveyId)."}} where 1=1"; foreach ($filterduplicatefields as $field) { if (isset($writearray[$field])) { $dupquery.= " and ".Yii::app()->db->quoteColumnName($field)." = " . Yii::app()->db->quoteValue($writearray[$field]); } } $dupresult = Yii::app()->db->createCommand($dupquery)->queryScalar(); if ($dupresult > 0) { $dupfound = true; $duplicatelist[] = Yii::app()->db->quoteValue($writearray['firstname']) . " " . Yii::app()->db->quoteValue($writearray['lastname']) . " (" . Yii::app()->db->quoteValue($writearray['email']) . ")"; } } $writearray['email'] = trim($writearray['email']); //treat blank emails if ($filterblankemail && $writearray['email'] == '') { $invalidemail = true; $invalidemaillist[] = $line[0] . " " . $line[1] . " ( )"; } if ($writearray['email'] != '') { $aEmailAddresses = explode(';', $writearray['email']); foreach ($aEmailAddresses as $sEmailaddress) { if (!validateEmailAddress($sEmailaddress)) { $invalidemail = true; $invalidemaillist[] = $line[0] . " " . $line[1] . " (" . $line[2] . ")"; } } } if (isset($writearray['token'])) { $writearray['token'] = sanitize_token($writearray['token']); } if (!$dupfound && !$invalidemail) { // unset all empty value foreach ($writearray as $key=>$value) { if($writearray[$key]=="") unset($writearray[$key]); if (substr($value, 0, 1)=='"' && substr($value, -1)=='"')// Fix CSV quote $value = substr($value, 1, -1); } // Some default value : to be moved to Token model rules in future release ? // But think we have to accept invalid email etc ... then use specific scenario $writearray['emailstatus']=isset($writearray['emailstatus'])?$writearray['emailstatus']:"OK"; $writearray['language']=isset($writearray['language'])?$writearray['language']:$sBaseLanguage; $oToken = Token::create($iSurveyId); foreach ($writearray as $key => $value) { //if(in_array($key,$oToken->attributes)) Not needed because we filter attributes before $oToken->$key=$value; } $ir=$oToken->save(); if (!$ir) { $duplicatelist[] = $writearray['firstname'] . " " . $writearray['lastname'] . " (" . $writearray['email'] . ")"; } else { $xz++; } } $xv++; } $recordcount++; } $recordcount = $recordcount - 1; unlink($sFilePath); $aData['tokenlistarray'] = $tokenlistarray; $aData['xz'] = $xz; $aData['xv'] = $xv; $aData['recordcount'] = $recordcount; $aData['firstline'] = $firstline; $aData['duplicatelist'] = $duplicatelist; $aData['invalidformatlist'] = $invalidformatlist; $aData['invalidemaillist'] = $invalidemaillist; $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId; $this->_renderWrappedTemplate('token', array('tokenbar', 'csvpost'), $aData); } } else { $aData['aEncodings'] = $aEncodings; $aData['iSurveyId'] = $iSurveyId; $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $aTokenTableFields = getTokenFieldsAndNames($iSurveyId); unset($aTokenTableFields['sent']); unset($aTokenTableFields['remindersent']); unset($aTokenTableFields['remindercount']); unset($aTokenTableFields['usesleft']); foreach ($aTokenTableFields as $sKey=>$sValue) { if ($sValue['description']!=$sKey) { $sValue['description'] .= ' - '.$sKey; } $aNewTokenTableFields[$sKey]= $sValue['description']; } $aData['aTokenTableFields'] = $aNewTokenTableFields; $this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData); } } /** * Generate tokens */ function tokenify($iSurveyId) { $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; if (!Yii::app()->request->getParam('ok')) { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Create tokens"), 'message' => $clang->gT("Clicking 'Yes' will generate tokens for all those in this token list that have not been issued one. Continue?") . "

\n" . "getController()->createUrl("admin/tokens/sa/tokenify/surveyid/$iSurveyId", array('ok'=>'Y'))) . "\" />\n" . "getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n" . "
\n" )), $aData); } else { //get token length from survey settings $newtoken = TokenDynamic::model($iSurveyId)->createTokens($iSurveyId); $newtokencount = $newtoken['0']; $neededtokencount = $newtoken['1']; if($neededtokencount>$newtokencount) { $aData['success'] = false; $message = sprintf($clang->ngT('Only %s token has been created.','Only %s tokens have been created.',$newtokencount),$newtokencount) .sprintf($clang->ngT('Need %s token.','Need %s tokens.',$neededtokencount),$neededtokencount); } else { $aData['success'] = true; $message = sprintf($clang->ngT('%s token has been created.','%s tokens have been created.',$newtokencount),$newtokencount); } $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Create tokens"), 'message' => $message )), $aData); } } /** * Remove Token Database */ function kill($iSurveyId) { $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; if (!Permission::model()->hasSurveyPermission($iSurveyId, 'surveysettings', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete')) { 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $date = date('YmdHis'); /* If there is not a $_POST value of 'ok', then ask if the user is sure they want to delete the tokens table */ $oldtable = "tokens_$iSurveyId"; $newtable = "old_tokens_{$iSurveyId}_$date"; $newtableDisplay = Yii::app()->db->tablePrefix . $newtable; if (!Yii::app()->request->getQuery('ok')) { $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Delete Tokens Table"), 'message' => $clang->gT("If you delete this table tokens will no longer be required to access this survey.") . "
" . $clang->gT("A backup of this table will be made if you proceed. Your system administrator will be able to access this table.") . "
\n" . sprintf('("%s")

', $newtableDisplay) . "getController()->createUrl("admin/tokens/sa/kill/surveyid/{$iSurveyId}/ok/Y") . "', '_top')\" />\n" . "getController()->createUrl("admin/tokens/sa/index/surveyid/{$iSurveyId}") . "', '_top')\" />\n" )), $aData); } else /* The user has confirmed they want to delete the tokens table */ { Yii::app()->db->createCommand()->renameTable("{{{$oldtable}}}", "{{{$newtable}}}"); //Remove any survey_links to the CPDB SurveyLink::model()->deleteLinksBySurvey($iSurveyId); $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Delete Tokens Table"), 'message' => '
' . $clang->gT("The tokens table has now been removed and tokens are no longer required to access this survey.") . "
" . $clang->gT("A backup of this table has been made and can be accessed by your system administrator.") . "
\n" . sprintf('("%s")

', $newtableDisplay) . "getController()->createUrl("admin/survey/sa/view/surveyid/".$iSurveyId) . "', '_top')\" />" )), $aData); LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed } } function bouncesettings($iSurveyId) { $iSurveyId = sanitize_int($iSurveyId); $clang = $this->getController()->lang; 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) //If no tokens table exists { self::_newtokentable($iSurveyId); } $aData['thissurvey'] = $aData['settings'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; if (!empty($_POST)) { $fieldvalue = array( "bounceprocessing" => Yii::app()->request->getPost('bounceprocessing'), "bounce_email" => Yii::app()->request->getPost('bounce_email'), ); if (Yii::app()->request->getPost('bounceprocessing') == 'L') { $fieldvalue['bounceaccountencryption'] = Yii::app()->request->getPost('bounceaccountencryption'); $fieldvalue['bounceaccountuser'] = Yii::app()->request->getPost('bounceaccountuser'); $fieldvalue['bounceaccountpass'] = Yii::app()->request->getPost('bounceaccountpass'); $fieldvalue['bounceaccounttype'] = Yii::app()->request->getPost('bounceaccounttype'); $fieldvalue['bounceaccounthost'] = Yii::app()->request->getPost('bounceaccounthost'); } $survey = Survey::model()->findByAttributes(array('sid' => $iSurveyId)); foreach ($fieldvalue as $k => $v) $survey->$k = $v; $test=$survey->save(); $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array( 'title' => $clang->gT("Bounce settings"), 'message' => $clang->gT("Bounce settings have been saved."), 'class' => 'successheader' )), $aData); } else { App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "tokenbounce.js"); $this->_renderWrappedTemplate('token', array('tokenbar', 'bounce'), $aData); } } /** * Handle token form for addnew/edit actions */ function _handletokenform($iSurveyId, $subaction, $iTokenId="") { // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) //If no tokens table exists { self::_newtokentable($iSurveyId); } $clang = $this->getController()->lang; Yii::app()->loadHelper("surveytranslator"); if ($subaction == "edit") { $aData['tokenid'] = $iTokenId; $aData['tokendata'] = Token::model($iSurveyId)->findByPk($iTokenId); } $thissurvey = getSurveyInfo($iSurveyId); $aAdditionalAttributeFields = $thissurvey['attributedescriptions']; $aTokenFieldNames=Yii::app()->db->getSchema()->getTable("{{tokens_$iSurveyId}}",true); $aTokenFieldNames=array_keys($aTokenFieldNames->columns); $aData['attrfieldnames']=array(); foreach ($aAdditionalAttributeFields as $sField=>$aAttrData) { if (in_array($sField,$aTokenFieldNames)) { if ($aAttrData['description']=='') { $aAttrData['description']=$sField; } $aData['attrfieldnames'][(string)$sField]=$aAttrData; } } foreach ($aTokenFieldNames as $sTokenFieldName) { if (strpos($sTokenFieldName,'attribute_')===0 && (!isset($aData['attrfieldnames']) || !isset($aData['attrfieldnames'][$sTokenFieldName]))) { $aData['attrfieldnames'][$sTokenFieldName]=array('description'=>$sTokenFieldName,'mandatory'=>'N'); } } $aData['thissurvey'] = $thissurvey; $aData['surveyid'] = $iSurveyId; $aData['subaction'] = $subaction; $aData['dateformatdetails'] = getDateFormatData(Yii::app()->session['dateformat']); $this->_renderWrappedTemplate('token', array('tokenbar', 'tokenform'), $aData); } /** * Show dialogs and create a new tokens table */ function _newtokentable($iSurveyId) { $clang = $this->getController()->lang; $aSurveyInfo = getSurveyInfo($iSurveyId); if (!Permission::model()->hasSurveyPermission($iSurveyId, 'surveysettings', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens','create')) { Yii::app()->session['flashmessage'] = $clang->gT("Tokens have not been initialised for this survey."); $this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}")); } $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if ($bTokenExists) //The token table already exist ? { Yii::app()->session['flashmessage'] = $clang->gT("Tokens already exist for this survey."); $this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}")); } // The user have rigth to create token, then don't test right after Yii::import('application.helpers.admin.token_helper', true); if (Yii::app()->request->getQuery('createtable') == "Y") { createTokenTable($iSurveyId); LimeExpressionManager::SetDirtyFlag(); // LimeExpressionManager needs to know about the new token table $this->_renderWrappedTemplate('token', array('message' =>array( 'title' => $clang->gT("Token control"), 'message' => $clang->gT("A token table has been created for this survey.") . " (\"" . Yii::app()->db->tablePrefix . "tokens_$iSurveyId\")

\n" . "getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n" ))); } /* Restore a previously deleted tokens table */ elseif (returnGlobal('restoretable') == "Y" && Yii::app()->request->getPost('oldtable')) { //Rebuild attributedescription value for the surveys table $table = Yii::app()->db->schema->getTable(Yii::app()->request->getPost('oldtable')); $fields=array_filter(array_keys($table->columns), 'filterForAttributes'); $fieldcontents = $aSurveyInfo['attributedescriptions']; if (!is_array($fieldcontents)) $fieldcontents=array(); foreach ($fields as $fieldname) { $name=$fieldname; if($fieldname[10]=='c') { //This belongs to a cpdb attribute $cpdbattid=substr($fieldname,15); $data=ParticipantAttributeName::model()->getAttributeName($cpdbattid, Yii::app()->session['adminlang']); $name=$data['attribute_name']; } if (!isset($fieldcontents[$fieldname])) { $fieldcontents[$fieldname] = array( 'description' => $name, 'mandatory' => 'N', 'show_register' => 'N' ); } } Survey::model()->updateByPk($iSurveyId, array('attributedescriptions' => serialize($fieldcontents))); Yii::app()->db->createCommand()->renameTable(Yii::app()->request->getPost('oldtable'), Yii::app()->db->tablePrefix."tokens_".intval($iSurveyId)); Yii::app()->db->schema->getTable(Yii::app()->db->tablePrefix."tokens_".intval($iSurveyId), true); // Refresh schema cache just in case the table existed in the past //Check that the tokens table has the required fields TokenDynamic::model($iSurveyId)->checkColumns(); //Add any survey_links from the renamed table SurveyLink::model()->rebuildLinksFromTokenTable($iSurveyId); $this->_renderWrappedTemplate('token', array('message' => array( 'title' => $clang->gT("Import old tokens"), 'message' => $clang->gT("A token table has been created for this survey and the old tokens were imported.") . " (\"" . Yii::app()->db->tablePrefix . "tokens_$iSurveyId" . "\")

\n" . "getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n" ))); LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed } else { $this->getController()->loadHelper('database'); $result = Yii::app()->db->createCommand(dbSelectTablesLike("{{old_tokens_".intval($iSurveyId)."_%}}"))->queryAll(); $tcount = count($result); if ($tcount > 0) { foreach ($result as $rows) { $oldlist[] = reset($rows); } $aData['oldlist'] = $oldlist; } $thissurvey = getSurveyInfo($iSurveyId); $aData['thissurvey'] = $thissurvey; $aData['surveyid'] = $iSurveyId; $aData['tcount'] = $tcount; $aData['databasetype'] = Yii::app()->db->getDriverName(); $this->_renderWrappedTemplate('token', 'tokenwarning', $aData); } } /** * Renders template(s) wrapped in header and footer * * @param string $sAction Current action, the folder to fetch views from * @param string|array $aViewUrls View url(s) * @param array $aData Data to be passed on. Optional. */ protected function _renderWrappedTemplate($sAction = 'token', $aViewUrls = array(), $aData = array()) { $aData['imageurl'] = Yii::app()->getConfig('adminimageurl'); $aData['display']['menu_bars'] = false; parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData); } }