get('efu_parent'), "/\\ \t\n\r\0\x0B"); $folder = trim($params->get('efu_folder'), "/\\ \t\n\r\0\x0B"); if (self::isOrigin($params) === FALSE) $folder .= DIRECTORY_SEPARATOR . date("Ym", time() + ((int)date("j") <= 27 ? 0 : 86400 * 10)); $path = rtrim($jpath . DIRECTORY_SEPARATOR . $parent . DIRECTORY_SEPARATOR . $folder, "/\\ \t\n\r\0\x0B"); $user = JFactory::getUser(); if ($user->guest == false) { $path .= DIRECTORY_SEPARATOR . $user->id; if (self::isOrigin($params) === FALSE) { if (is_file($path . DIRECTORY_SEPARATOR . trim($_POST['delfile']))) unlink($path . DIRECTORY_SEPARATOR . trim($_POST['delfile'])); if (is_file($path . DIRECTORY_SEPARATOR . trim($_POST['delfile']) . '.txt')) unlink($path . DIRECTORY_SEPARATOR . trim($_POST['delfile']) . '.txt'); } } } public static function getFileToUpload(&$params) { $result = array(); //get the Joomla Path and trim whitespace and slashes from the end $jpath = JPATH_SITE; error_log($jpath); $jpath = rtrim($jpath, "/\\ \t\n\r\0\x0B"); error_log($jpath); //get the parent folder and trim whitespace and slashes from both ends $parent = $params->get('efu_parent'); error_log($parent); $parent = trim($parent, "/\\ \t\n\r\0\x0B"); error_log($parent); //get the folder location and trim whitespace and slashes from both ends $folder = $params->get('efu_folder'); error_log($folder); $folder = trim($folder, "/\\ \t\n\r\0\x0B"); error_log($folder); //compile the full absolute path $path = $jpath . DIRECTORY_SEPARATOR . $parent . DIRECTORY_SEPARATOR . $folder; $path = rtrim($path, "/\\ \t\n\r\0\x0B"); error_log('full path = ' . $path); if ($params->get('efu_user') == true) { //get the user data $user = JFactory::getUser(); if ($user->guest == false) { $path .= DIRECTORY_SEPARATOR . $user->username; } else { //If it is a guest user, then store the file in the 'efu_folder'. //You can add something here, if you have a special folder that //you want to add the guest uploads to. //$path.= DIRECTORY_SEPARATOR.'your_guest_folder'; } } //check to see if the upload process has started if (isset($_FILES[$params->get('efu_variable')])) { //now, we're going to check each of the uploaded files $total = intval($params->get('efu_multiple')); for ($i = 0; $i < $total; $i++) { $result[$i]['show'] = true; //so, now, check for any other errors if ($_FILES[$params->get('efu_variable')]["error"][$i] > 0) { //error was found. Show the return code. $error_text = JText::_('MOD_EFU_RETURN_CODE') . ": " . $_FILES[$params->get('efu_variable')]["error"][$i] . "
"; $error_text .= modEasyFileUploaderHelper::fileUploadErrorMessage($_FILES[$params->get('efu_variable')]["error"][$i]); $result[$i]['type'] = 'error'; $result[$i]['text'] = $error_text; //Note that UPLOAD_ERR_NO_FILE = 4 if ($_FILES[$params->get('efu_variable')]["error"][$i] == UPLOAD_ERR_NO_FILE) { //set the result type to warning instead of error $result[$i]['type'] = 'warning'; //get the value for 'efu_shownofile', the default is 1 $shownofile = $params->get('efu_shownofile', 1); if ($shownofile == false) { $result[$i]['show'] = false; } } } else { //no errors found. //check to see if the file type is correct //but first, we have to store the file types in a variable. I was getting an issue with empty() if (modEasyFileUploaderHelper::isValidFileType($params, $i)) { //the file type is permitted //so, check for the right size if ($_FILES[$params->get('efu_variable')]["size"][$i] < $params->get('efu_maxsize')) { //file is an acceptable size //check to see if file already exists in the destination folder if (file_exists($path . DIRECTORY_SEPARATOR . $_FILES[$params->get('efu_variable')]["name"][$i])) { //file already exists //check whether the user wants to replace the file or not. if ($params->get('efu_replace') == true && $_POST["answer"] == true) { //yep, the user wants to replace the file, so just delete the existing file JFile::delete($path . DIRECTORY_SEPARATOR . $_FILES[$params->get('efu_variable')]["name"][$i]); modEasyFileUploaderHelper::storeUploadedFile($path, $params, $result, $i, true); } else { $result[$i]['type'] = 'info'; $result[$i]['text'] = $_FILES[$params->get('efu_variable')]["name"][$i] . " " . JText::_('MOD_EFU_ALREADY_EXISTS'); } } else { //Check to see if the file meets the safety standards $is_safe = modEasyFileUploaderHelper::checkFileSafety($params, $result, $i); if ($is_safe) { modEasyFileUploaderHelper::storeUploadedFile($path, $params, $result, $i); } } } else { //file is too large $result[$i]['type'] = 'warning'; $result[$i]['text'] = JText::_('MOD_EFU_TOO_LARGE_ERROR') . modEasyFileUploaderHelper::sizeToText($params->get('efu_maxsize')) . "."; } } else { if ($_FILES[$params->get('efu_variable')]["size"][$i]) { //the file type is not permitted $fakeMIME = $_FILES[$params->get('efu_variable')]["type"][$i]; $trueMIME = modEasyFileUploaderHelper::actualMIME($_FILES[$params->get('efu_variable')]["tmp_name"][$i]); $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_INVALID_ERROR') . "
" . JText::_('MOD_EFU_PHP_MIME_ERROR') . ($trueMIME !== false ? "(" . $trueMIME . ")" : "") . "
" . JText::_('MOD_EFU_BROWSER_MIME_ERROR') . $fakeMIME; } else { $result[$i]['show'] = false; } } } } } return $result; } private static function isValidFileType(&$params, &$i) { $valid = false; $filetypes = $params->get('efu_filetypes'); $actualMIME = modEasyFileUploaderHelper::actualMIME($_FILES[$params->get('efu_variable')]["tmp_name"][$i]); if ( $filetypes == "*" || (stripos($filetypes, $_FILES[$params->get('efu_variable')]["type"][$i]) !== false && $actualMIME !== false && stripos($filetypes, $actualMIME) !== false) ) { $valid = true; } return $valid; } private static function actualMIME($file) { if (!file_exists($file)) { return false; } $mime = false; // try to use recommended functions if ( defined('FILEINFO_MIME_TYPE') && function_exists('finfo_open') && is_callable('finfo_open') && function_exists('finfo_file') && is_callable('finfo_file') && function_exists('finfo_close') && is_callable('finfo_close') ) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file); if ($mime === '') { $mime = false; } finfo_close($finfo); } else if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { $f = "'" . $file . "'"; if (function_exists('escapeshellarg') && is_callable('escapeshellarg')) { //prefer to use escapeshellarg if it is available $f = escapeshellarg($file); } if (function_exists('exec') && is_callable('exec')) { //didn't like how 'system' flushes output to browser. replaced with 'exec' //note: You can change this to: shell_exec("file -b --mime-type $f"); if you get // "regular file" as the mime type $mime = exec("file -bi $f"); //this removes the charset value if it was returned with the mime type. mime is first. $mime = strtok($mime, '; '); $mime = trim($mime); //remove any remaining whitespace } else if (function_exists('shell_exec') && is_callable('shell_exec')) { //note: You can change this to: shell_exec("file -b --mime-type $f"); if you get // "regular file" as the mime type $mime = shell_exec("file -bi $f"); //this removes the charset value if it was returned with the mime type. mime is first. $mime = strtok($mime, '; '); $mime = trim($mime); //remove any remaining whitespace } } else if (function_exists('mime_content_type') && is_callable('mime_content_type')) { //test using mime_content_type last, since it sometimes detects the mime incorrectly $mime = mime_content_type($file); } return $mime; } public static function isOrigin(&$params) { $ret = TRUE; if (strpos($params->get('efu_folder'), "honapkepe") !== FALSE || strpos($params->get('efu_folder'), "honapkepe_live") !== FALSE || strpos($params->get('efu_folder'), "rendering_palyazat") !== FALSE) $ret = FALSE; return ($ret); } public static function getImgPath(&$params) { $ret = ""; $user = JFactory::getUser(); if ($user->guest == false) { // a 9-es eredetileg 27 volt! $ret = DIRECTORY_SEPARATOR . $params->get('efu_parent') . DIRECTORY_SEPARATOR . $params->get('efu_folder') . DIRECTORY_SEPARATOR . date("Ym", time() + ((int)date("j") <= 9 ? 0 : 86400 * 10)) . DIRECTORY_SEPARATOR . $user->id; } return ($ret); } public static function getImages(&$params) { $ret = array(); $path = JPATH_SITE . self::getImgPath($params); if (is_dir($path)) { $tmp = scandir($path); $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_BMP); foreach ($tmp as $file) { $detectedType = exif_imagetype($path . DIRECTORY_SEPARATOR . $file); if (!in_array($file, array(".", "..")) && in_array($detectedType, $allowedTypes)) $ret[] = $file; } } return ($ret); } private static function storeUploadedFile($filepath, &$params, &$result, &$i, $replaced = false) { error_log('file path = ' . $filepath); $result_text = ''; //move the file to the destination folder $dateFolderName = date("Y"); $month = intval(date("m")); if ($month == 2) { if (date("j") > 28) $month++; } else { if (date("j") > 30) $month++; } if ($month == 13) $month = 1; $isRenderingCompetition = strpos($params->get('efu_folder'), "rendering_palyazat") !== FALSE; if ($isRenderingCompetition) { $uploadFolder = $filepath . DIRECTORY_SEPARATOR . JFactory::getUser()->id . DIRECTORY_SEPARATOR; @mkdir($uploadFolder, 0770); } else { $dateFolderName .= ($month < 10) ? "0" . $month : $month; $uploadFolder = $filepath . DIRECTORY_SEPARATOR . $dateFolderName . DIRECTORY_SEPARATOR; @mkdir($uploadFolder, 0770); $uploadFolder = $filepath . DIRECTORY_SEPARATOR . $dateFolderName . DIRECTORY_SEPARATOR . JFactory::getUser()->id . DIRECTORY_SEPARATOR; @mkdir($uploadFolder, 0770); } $success = move_uploaded_file($_FILES[$params->get('efu_variable')]["tmp_name"][$i], $uploadFolder . $_FILES[$params->get('efu_variable')]["name"][$i]); if ($replaced) { $result_text .= JText::_('MOD_EFU_REPLACEMENT_APPROVED') . " "; } if ($success) { if (self::isOrigin($params) === FALSE) { $res = getimagesize($uploadFolder . $_FILES[$params->get('efu_variable')]["name"][$i]); if (($res[0] >= 1920 && $res[1] >= 1080) || ($res[0] >= 1080 && $res[1] >= 1920)) { $user = JFactory::getUser(); $text = "author name: " . $user->name . "\r\n" . "author crm id: " . $user->nUserID . "\r\n" . "author joomla id: " . $user->id . "\r\n" . "upload: " . date("Y-m-d H:i:s") . "\r\n" . "file name: " . $_FILES[$params->get("efu_variable")]["name"][$i] . "\r\n" . "file type: " . $res['mime'] . "\r\n" . "resolution: " . $res[3] . "\r\n" . "render software: " . (isset($_POST["thirdparty_" . $i]) && trim($_POST["thirdparty_" . $i]) > "" ? strtoupper(isset($_POST["thirdparty_val_" . $i]) && trim($_POST["thirdparty_val_" . $i]) > "" ? trim(substr(strip_tags(stripslashes($_POST["thirdparty_val_" . $i])), 0, 15)) : "3rd party") : "ARCHLine"); $supported_format = array('jpg', 'jpeg', 'png'); $all_files = glob($uploadFolder . '*.*'); $img_count = 0; for ($j = 0; $j < count($all_files); $j++) { $image_name = $all_files[$j]; $ext = strtolower(pathinfo($image_name, PATHINFO_EXTENSION)); if (in_array($ext, $supported_format)) $img_count++; } // $count = strpos($params->get('efu_folder'), "rendering_palyazat") !== FALSE ? 10 : 3; $count = 3; if ($img_count > $count) { unlink($uploadFolder . $_FILES[$params->get('efu_variable')]["name"][$i]); $result[$i]['show'] = TRUE; $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_UPLOAD_FILE_LIMIT'); return; } file_put_contents($uploadFolder . $_FILES[$params->get('efu_variable')]["name"][$i] . ".txt", $text); } else { unlink($uploadFolder . $_FILES[$params->get('efu_variable')]["name"][$i]); $result[$i]['show'] = TRUE; $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_UPLOAD_UNSUCCESSFUL_RESOLUTION') . ": " . $_FILES[$params->get('efu_variable')]["name"][$i]; return; } } //Upload was successful. $result_text .= JText::_('MOD_EFU_UPLOAD_SUCCESSFUL') . "
"; $result_text .= JText::_('MOD_EFU_NAME') . ": " . $_FILES[$params->get('efu_variable')]["name"][$i] . "
"; $result_text .= JText::_('MOD_EFU_TYPE') . ": " . $_FILES[$params->get('efu_variable')]["type"][$i] . "
"; $result_text .= JText::_('MOD_EFU_SIZE') . ": " . modEasyFileUploaderHelper::sizeToText($_FILES[$params->get('efu_variable')]["size"][$i]) . "
"; //$result_text.= "Temp file: ".$_FILES[$params->get('efu_variable')]["tmp_name"][$i]."
"; //$result_text.= "Stored in: ".$filepath; $result[$i]['type'] = 'success'; $result[$i]['text'] = $result_text; } else { $result_text .= JText::_('MOD_EFU_UPLOAD_UNSUCCESSFUL'); $result[$i]['type'] = 'error'; $result[$i]['text'] = $result_text; } } protected static function fileUploadErrorMessage($error_code) { switch ($error_code) { case UPLOAD_ERR_INI_SIZE: $message = JText::_('MOD_EFU_INI_SIZE_ERROR'); break; case UPLOAD_ERR_FORM_SIZE: $message = JText::_('MOD_EFU_FORM_SIZE_ERROR'); break; case UPLOAD_ERR_PARTIAL: $message = JText::_('MOD_EFU_PARTIAL_ERROR'); break; case UPLOAD_ERR_NO_FILE: $message = JText::_('MOD_EFU_NO_FILE_ERROR'); break; case UPLOAD_ERR_NO_TMP_DIR: $message = JText::_('MOD_EFU_NO_TMP_DIR_ERROR'); break; case UPLOAD_ERR_CANT_WRITE: $message = JText::_('MOD_EFU_CANT_WRITE_ERROR'); break; case UPLOAD_ERR_EXTENSION: $message = JText::_('MOD_EFU_EXTENSION_ERROR'); break; default: $message = JText::_('MOD_EFU_UNKNOWN_ERROR'); break; } return $message; } protected static function sizeToText($size) { $text = ""; $kb = 1024; $mb = $kb * $kb; $gb = $mb * $kb; if ($size >= $gb) { $size = round($size / $gb, 2); $text = $size . "GB"; } elseif ($size >= $mb) { $size = round($size / $mb, 2); $text = $size . "MB"; } elseif ($size >= $kb) { $size = round($size / $kb, 2); $text = $size . "KB"; } else { $text = $size . JText::_('MOD_EFU_BYTES'); } return $text; } /** * Checks an uploaded for suspicious naming and potential PHP contents which could indicate a hacking attempt. * * * @return boolean True of the file is safe */ public static function checkFileSafety(&$params, &$result, &$i, $forbidden = array('php', 'phps', 'php5', 'php3', 'php4', 'inc', 'pl', 'cgi', 'fcgi', 'java', 'jar', 'py')) { $safe = true; /** * 1. Prevent buffer overflow attack by checking for null byte in the file name */ $null_byte = "\x00"; if (stripos($_FILES[$params->get('efu_variable')]["name"][$i], $null_byte) !== false) { $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_NULL_BYTE_FOUND'); return false; } /** * 2. Prevent uploading forbidden script files (based on file extension) */ $filename = $_FILES[$params->get('efu_variable')]["name"][$i]; $split = explode('.', $filename); array_shift($split); $only_extensions = array_map('strtolower', $split); foreach ($forbidden as $script) { if (in_array($script, $only_extensions)) { $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_FORBIDDEN_SCRIPT_FOUND'); return false; } } /** * 3. Check the contents of the uploaded file for the following: * a. Presence of the PHP tag, get('efu_variable')]["tmp_name"][$i], 'r'); if ($fp !== false) { $data = ''; while (!feof($fp) && $safe === true) { $data .= @fread($fp, $buffer); /** * a. Check for the presence of the PHP tag, get('efu_scriptsinarchives'); if (!$allow_scripts_in_archive) { $archive_exts = array('zip', '7z', 'jar', 'rar', 'tar', 'gz', 'tgz', 'bz2', 'tbz', 'jpa'); $is_archive = false; foreach ($archive_exts as $archive) { //check to see if uploaded file is an archive file if (in_array($archive, $only_extensions)) { $is_archive = true; } } if ($is_archive) { foreach ($forbidden as $ext) { //search for the short tag if (stripos($data, '.' . $ext) !== false) { $result[$i]['type'] = 'error'; $result[$i]['text'] = JText::_('MOD_EFU_FORBIDDEN_IN_ARCHIVE_FOUND'); $safe = false; continue; } } } } //start the next loop with the last 10 bytes just in case the PHP tag was split up $data = substr($data, -10); } //close the file handle fclose($fp); } return $safe; } }