findByPk($_SESSION['LEMsid'])){ $surveyid= $_SESSION['LEMsid']; }else{ throw new CHttpException(400);// See for debug > 1 } if (isset($_SESSION['survey_'.$surveyid]['s_lang'])) { $sLanguage = $_SESSION['survey_'.$surveyid]['s_lang']; } else { $sLanguage=''; } $clang = SetSurveyLanguage( $surveyid, $sLanguage); $uploaddir = Yii::app()->getConfig("uploaddir"); $tempdir = Yii::app()->getConfig("tempdir"); Yii::app()->loadHelper("database"); // Fill needed var $sFileGetContent=Yii::app()->request->getParam('filegetcontents','');// The file to view fu_ or fu_tmp $bDelete=Yii::app()->request->getParam('delete'); $sFieldName = Yii::app()->request->getParam('fieldname'); $sFileName = Yii::app()->request->getParam('filename','');// The file to delete fu_ or fu_tmp $sOriginalFileName = Yii::app()->request->getParam('name','');// Used for javascript return only $sMode = Yii::app()->request->getParam('mode'); $sPreview=Yii::app()->request->getParam('preview',0); // Validate and filter and throw error if problems // Using 'futmp_'.randomChars(15).'_'.$pathinfo['extension'] for filename, then remove all other characters $sFileGetContentFiltered=preg_replace('/[^a-z0-9_]/', '', $sFileGetContent); $sFileNameFiltered = preg_replace('/[^a-z0-9_]/', '',$sFileName); $sFieldNameFiltered=preg_replace('/[^X0-9]/', '', $sFieldName); if($sFileGetContent!=$sFileGetContentFiltered || $sFileName!=$sFileNameFiltered || $sFieldName!=$sFieldNameFiltered) {// If one seems to be a hack: Bad request throw new CHttpException(400);// See for debug > 1 } if ($sFileGetContent) { if (substr($sFileGetContent,0,6)=='futmp_') { $sFileDir = $tempdir.'/upload/'; } elseif(substr($sFileGetContent,0,3)=='fu_') { // Need to validate $_SESSION['srid'], and this file is from this srid ! $sFileDir = "{$uploaddir}/surveys/{$surveyid}/files/"; } else { throw new CHttpException(400);// See for debug > 1 } if(is_file($sFileDir.$sFileGetContent))// Validate file before else 500 error by getMimeType { header('Content-Type: '. CFileHelper::getMimeType($sFileDir.$sFileGetContent)); readfile($sFileDir.$sFileGetContent); Yii::app()->end(); } else { Yii::app()->end(); } } elseif ($bDelete) { if (substr($sFileName,0,6)=='futmp_') { $sFileDir = $tempdir.'/upload/'; } elseif(substr($sFileName,0,3)=='fu_') { // Need to validate $_SESSION['srid'], and this file is from this srid ! $sFileDir = "{$uploaddir}/surveys/{$surveyid}/files/"; } else { throw new CHttpException(400);// See for debug > 1 } if(isset($_SESSION[$sFieldName])) {// We already have $sFieldName ? $sJSON = $_SESSION[$sFieldName]; $aFiles = json_decode(stripslashes($sJSON),true); if(substr($sFileName,0,3)=='fu_'){ $iFileIndex=0; $found=false; foreach ($aFiles as $aFile) { if ($aFile['filename']==$sFileName) { $found=true; break; } $iFileIndex++; } if ($found==true) unset($aFiles[$iFileIndex]); $_SESSION[$sFieldName] = ls_json_encode($aFiles); } } //var_dump($sFileDir.$sFilename); // Return some json to do a beautiful text if (@unlink($sFileDir.$sFileName)) { echo sprintf($clang->gT('File %s deleted'), $sOriginalFileName); } else echo $clang->gT('Oops, There was an error deleting the file'); Yii::app()->end(); } if($sMode == "upload") { $clang = Yii::app()->lang; $sTempUploadDir = $tempdir.'/upload/'; // Check if exists and is writable if (!file_exists($sTempUploadDir)) { // Try to create mkdir($sTempUploadDir); } $filename = $_FILES['uploadfile']['name']; // Do we filter file name ? It's used on displaying only , but not save like that. //$filename = sanitize_filename($_FILES['uploadfile']['name']);// This remove all non alpha numeric characters and replaced by _ . Leave only one dot . $size = 0.001 * $_FILES['uploadfile']['size']; $preview = Yii::app()->session['preview']; $aFieldMap = createFieldMap($surveyid,'short',false,false,$sLanguage); if (!isset($aFieldMap[$sFieldName])) { throw new CHttpException(400);// See for debug > 1 } $aAttributes=getQuestionAttributeValues($aFieldMap[$sFieldName]['qid'],$aFieldMap[$sFieldName]['type']); $maxfilesize = (int) $aAttributes['max_filesize']; $valid_extensions_array = explode(",", $aAttributes['allowed_filetypes']); $valid_extensions_array = array_map('trim',$valid_extensions_array); $pathinfo = pathinfo($_FILES['uploadfile']['name']); $ext = $pathinfo['extension']; $randfilename = 'futmp_'.randomChars(15).'_'.$pathinfo['extension']; $randfileloc = $sTempUploadDir . $randfilename; // check to see that this file type is allowed // it is also checked at the client side, but jst double checking if (!in_array(strtolower($ext), $valid_extensions_array)) { $return = array( "success" => false, "msg" => sprintf($clang->gT("Sorry, this file extension (%s) is not allowed!"),$ext) ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } // If this is just a preview, don't save the file if ($preview) { if ($size > $maxfilesize) { $return = array( "success" => false, "msg" => sprintf($clang->gT("Sorry, this file is too large. Only files upto %s KB are allowed."), $maxfilesize) ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } else if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $randfileloc)) { $return = array( "success" => true, "file_index" => $filecount, "size" => $size, "name" => rawurlencode(basename($filename)), "ext" => $ext, "filename" => $randfilename, "msg" => $clang->gT("The file has been successfuly uploaded.") ); // TODO : unlink this file since this is just a preview. But we can do it only if it's not needed, and still needed to have the file content // Maybe use a javascript 'onunload' on preview question/group // unlink($randfileloc) //header('Content-Type: application/json'); echo ls_json_encode($return);; Yii::app()->end(); } } else { // if everything went fine and the file was uploaded successfuly, // send the file related info back to the client $iFileUploadTotalSpaceMB = Yii::app()->getConfig("iFileUploadTotalSpaceMB"); if ($size > $maxfilesize) { $return = array( "success" => false, "msg" => sprintf($clang->gT("Sorry, this file is too large. Only files up to %s KB are allowed.",'unescaped'), $maxfilesize) ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } elseif ($iFileUploadTotalSpaceMB>0 && ((calculateTotalFileUploadUsage()+($size/1024/1024))>$iFileUploadTotalSpaceMB)) { $return = array( "success" => false, "msg" => $clang->gT("We are sorry but there was a system error and your file was not saved. An email has been dispatched to notify the survey administrator.",'unescaped') ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } elseif (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $randfileloc)) { $return = array( "success" => true, "size" => $size, "name" => rawurlencode(basename($filename)), "ext" => $ext, "filename" => $randfilename, "msg" => $clang->gT("The file has been successfuly uploaded.") ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } // if there was some error, report error message else { // check for upload error if ($_FILES['uploadfile']['error'] > 2) { $return = array( "success" => false, "msg" => $clang->gT("Sorry, there was an error uploading your file") ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } // check to ensure that the file does not cross the maximum file size else if ( $_FILES['uploadfile']['error'] == 1 || $_FILES['uploadfile']['error'] == 2 || $size > $maxfilesize) { $return = array( "success" => false, "msg" => sprintf($clang->gT("Sorry, this file is too large. Only files upto %s KB are allowed."), $maxfilesize) ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } else { $return = array( "success" => false, "msg" => $clang->gT("Unknown error") ); //header('Content-Type: application/json'); echo ls_json_encode($return); Yii::app()->end(); } } } return; } $clang = Yii::app()->lang; $meta = ''; App()->getClientScript()->registerPackage('jqueryui'); App()->getClientScript()->registerPackage('jquery-superfish'); $sNeededScriptVar=' var uploadurl = "'.$this->createUrl('/uploader/index/mode/upload/').'"; var imageurl = "'.Yii::app()->getConfig('imageurl').'/"; var surveyid = "'.$surveyid.'"; var fieldname = "'.$sFieldName.'"; var questgrppreview = '.$sPreview.'; csrfToken = '.ls_json_encode(Yii::app()->request->csrfToken).'; showpopups="'.Yii::app()->getConfig("showpopups").'"; '; $sLangScriptVar=" translt = { titleFld: '" . $clang->gT('Title','js') . "', commentFld: '" . $clang->gT('Comment','js') . "', errorNoMoreFiles: '" . $clang->gT('Sorry, no more files can be uploaded!','js') . "', errorOnlyAllowed: '" . $clang->gT('Sorry, only %s files can be uploaded for this question!','js') . "', uploading: '" . $clang->gT('Uploading','js') . "', selectfile: '" . $clang->gT('Select file','js') . "', errorNeedMore: '" . $clang->gT('Please upload %s more file(s).','js') . "', errorMoreAllowed: '" . $clang->gT('If you wish, you may upload %s more file(s); else you may return back to survey.','js') . "', errorMaxReached: '" . $clang->gT('The maximum number of files has been uploaded. You may return back to survey.','js') . "', errorTooMuch: '" . $clang->gT('The maximum number of files has been uploaded. You may return back to survey.','js') . "', errorNeedMoreConfirm: '" . $clang->gT("You need to upload %s more files for this question.\nAre you sure you want to exit?",'js') . "' }; "; $aSurveyInfo=getSurveyInfo($surveyid, $sLanguage); $oEvent = new PluginEvent('beforeSurveyPage'); $oEvent->set('surveyId', $surveyid); App()->getPluginManager()->dispatchEvent($oEvent); if (!is_null($oEvent->get('template'))) { $aSurveyInfo['templatedir'] = $event->get('template'); } $sTemplateDir = getTemplatePath($aSurveyInfo['template']); $sTemplateUrl = getTemplateURL($aSurveyInfo['template'])."/"; App()->clientScript->registerScript('sNeededScriptVar',$sNeededScriptVar,CClientScript::POS_HEAD); App()->clientScript->registerScript('sLangScriptVar',$sLangScriptVar,CClientScript::POS_HEAD); App()->getClientScript()->registerScriptFile(Yii::app()->getConfig("generalscripts").'ajaxupload.js'); App()->getClientScript()->registerScriptFile(Yii::app()->getConfig("generalscripts").'uploader.js'); App()->getClientScript()->registerScriptFile("{$sTemplateUrl}template.js"); App()->clientScript->registerCssFile(Yii::app()->getConfig("publicstyleurl")."uploader.css"); if (file_exists($sTemplateDir .DIRECTORY_SEPARATOR.'jquery-ui-custom.css')) { Yii::app()->getClientScript()->registerCssFile("{$sTemplateUrl}jquery-ui-custom.css"); } elseif(file_exists($sTemplateDir.DIRECTORY_SEPARATOR.'jquery-ui.css')) { Yii::app()->getClientScript()->registerCssFile("{$sTemplateUrl}jquery-ui.css"); } else { Yii::app()->getClientScript()->registerCssFile(Yii::app()->getConfig('publicstyleurl')."jquery-ui.css"); } App()->clientScript->registerCssFile("{$sTemplateUrl}template.css"); $header = getHeader($meta); echo $header; $fn = $sFieldName; $qid = (int)Yii::app()->request->getParam('qid'); $minfiles = (int)Yii::app()->request->getParam('minfiles'); $maxfiles = (int)Yii::app()->request->getParam('maxfiles'); $qidattributes=getQuestionAttributeValues($qid); $qidattributes['max_filesize']=floor(min($qidattributes['max_filesize']*1024,getMaximumFileUploadSize())/1024); $body = '
'.sprintf($clang->gT("You can upload %s under %s KB each."),$qidattributes['allowed_filetypes'],$qidattributes['max_filesize']).'