diff --git a/vas/rest/class/vmlib/phpUtil.inc b/vas/rest/class/vmlib/phpUtil.inc index dee4b832527ccda3d2af6ca01b50acc49085d063..a89eab29644fbe6ea2f1b9f7e745137f1988fb51 100755 --- a/vas/rest/class/vmlib/phpUtil.inc +++ b/vas/rest/class/vmlib/phpUtil.inc @@ -30,148 +30,319 @@ function stripslashes_deep($aString) { *@param $sFileType Type of file needed. *@param $sServerPath New path of the file. *@param $sMaxSize Maximal size of the file. - *@return $sErrorMsg The error message. + *@param $aFileValues File structure generated by extractFileStruct. + *@return $sErrorMsg The error message or the final file path on success. */ -function uploadFile($sNomObjet, $sFileType, $sServerPath, $sMaxSize) { +function uploadFile($sNomObjet, $sFileType, $sServerPath, $sMaxSize, $aFileValues) { global $properties, $sFolderLib; loadLang($sFolderLib, $properties["language"], $sFolderLib . "/"); - $aExtensionPicture = array('gif', 'jpg', 'jpeg', 'png'); - $aExtensionPictureAndPdf = array('gif', 'jpg', 'jpeg', 'png', 'pdf'); - $aExtensionFile = array('pdf', 'gif', 'jpg', 'jpeg', 'png', 'txt'); - $aExtensionZip = array('zip', 'gex'); - $aExtensionFmw = array('fmw'); + + $aExtension = array( + "image" => array('gif', 'jpg', 'jpeg', 'png'), + "image-pdf" => array('gif', 'jpg', 'jpeg', 'png', 'pdf'), + "document" => array('pdf', 'gif', 'jpg', 'jpeg', 'png', 'txt'), + "pdf" => array('pdf'), + "zip" => array('zip', 'gex'), + "fmw" => array('fmw') + ); $aForbiddenExtension = explode('|', str_replace("*.", "", $properties['forbidden_extension'])); - $sTmpFile = $_FILES[$sNomObjet]['tmp_name']; - // Si l'utilisateur n'a indiqué aucun fichier à uploader, il ne se passe rien + $sTmpFile = ""; $sErrorMsg = ""; - - if ($sTmpFile == '') { - if ($_FILES[$sNomObjet]['name'] != "") { - switch ($_FILES[$sNomObjet]['error']) { - case "1" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_UPLOAD_MAX_FILE_SIZE; - break; - case "2" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_MAX_FILE_SIZE; - break; - case "3" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_PARTIAL_DOWNLOAD; - break; - case "4" : - $sErrorMsg = ERROR_NO_FILE_DOWNLOADED; - break; - case "6" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_MISSING_TEMP_FOLDER; - break; - case "7" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_WRITING_DISK; - break; - case "8" : - $sErrorMsg = ERROR_DOWNLOAD_FILE . $_FILES[$sNomObjet]['name'] . " : " . ERROR_PHP_EXT_SEND; - break; + // si pas de aValues il y a eu une erreur pendant l'upload dans tmp du PUT + if (!empty($aFileValues)){ + $sTmpFile = $aFileValues['tmp_name']; + + // Si l'utilisateur n'a indiqué aucun fichier à uploader, il ne se passe rien + if ($sTmpFile == '') { + if ($aFileValues['name'] != "") { + switch ($aFileValues['error']) { + case "1" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_UPLOAD_MAX_FILE_SIZE; + break; + case "2" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_MAX_FILE_SIZE; + break; + case "3" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_PARTIAL_DOWNLOAD; + break; + case "4" : + $sErrorMsg = ERROR_NO_FILE_DOWNLOADED; + break; + case "6" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_MISSING_TEMP_FOLDER; + break; + case "7" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_WRITING_DISK; + break; + case "8" : + $sErrorMsg = ERROR_DOWNLOAD_FILE . $aFileValues['name'] . " : " . ERROR_PHP_EXT_SEND; + break; + } + writeToErrorLog($sErrorMsg); } - writeToErrorLog($sErrorMsg); + return $sErrorMsg; } - return $sErrorMsg; - } - $aTemp = explode("\\", $sServerPath); - if (is_uploaded_file($sTmpFile)) { - if (!in_array(extension($aTemp[count($aTemp) - 1]), $aForbiddenExtension)) { + + $aTemp = explode("/", $sServerPath); + + $sFileName = end($aTemp); + $sFileExtension = extension($sFileName); + + if (!in_array($sFileExtension, $aForbiddenExtension)) { //Teste si le fichier correspont au format voulu. $bAllowUpload = false; $sFormat = ""; - switch ($sFileType) { - case "image" : - if (in_array(extension($aTemp[count($aTemp) - 1]), $aExtensionPicture)) { - $bAllowUpload = true; - } else { - foreach ($aExtensionPicture as $sValue) { - $sFormat .= " " . $sValue; - } - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; - } - break; - case "image-pdf" : - if (in_array(extension($aTemp[count($aTemp) - 1]), $aExtensionPictureAndPdf)) { - $bAllowUpload = true; - } else { - foreach ($aExtensionPictureAndPdf as $sValue) { - $sFormat .= " " . $sValue; - } - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; - } - break; - case "document" : - if (in_array(extension($aTemp[count($aTemp) - 1]), $aExtensionFile)) { - $bAllowUpload = true; - } else { - foreach ($aExtensionFile as $sValue) { - $sFormat .= " " . $sValue; - } - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; - } - break; - case "zip" : - if (in_array(extension($aTemp[count($aTemp) - 1]), $aExtensionZip)) { - $bAllowUpload = true; - } else { - foreach ($aExtensionZip as $sValue) { - $sFormat .= " " . $sValue; - } - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; - } - break; - case "fmw" : - if (in_array(extension($aTemp[count($aTemp) - 1]), $aExtensionFmw)) { - $bAllowUpload = true; - } else { - foreach ($aExtensionFmw as $sValue) { - $sFormat .= " " . $sValue; - } - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; - } - break; - default : + if (in_array($sFileType, array_keys($aExtension))){ + if (in_array($sFileExtension, $aExtension[$sFileType])) { $bAllowUpload = true; - - break; + } else { + foreach ($aExtensionPicture as $sValue) { + $sFormat .= " " . $sValue; + } + writeToErrorLog(ERROR_FILE . $aFileValues['name'] . ERROR_NOT_FILE . $sFileType); + $sErrorMsg = FILE_LABEL_PHPUTIL . $aFileValues['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; + } + } else { + $bAllowUpload = true; } //Teste si le fichier n'est pas de trop grande taille. - if ($_FILES[$sNomObjet]['size'] > $sMaxSize || $_FILES[$sNomObjet]['error'] == 1) { + if ($aFileValues['size'] > $sMaxSize || $aFileValues['error'] == 1) { $bAllowUpload = false; - if ($_FILES[$sNomObjet]['size'] > $sMaxSize) - $sErrorMsg .= FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . OF_LABEL_PHPUTIL . $_FILES[$sNomObjet]['size'] . ERROR_EXCEED_MAX_SIZE . ' (' . $sMaxSize . LABEL_BYTES_PHPUTIL . ').'; - if ($_FILES[$sNomObjet]['error'] > $sMaxSize) - $sErrorMsg .= FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_EXCEED_MAX_SIZE_PHP . ' (' . $sMaxSize . LABEL_BYTES_PHPUTIL . ').'; + if ($aFileValues['size'] > $sMaxSize) + $sErrorMsg .= FILE_LABEL_PHPUTIL . $aFileValues['name'] . OF_LABEL_PHPUTIL . $aFileValues['size'] . ERROR_EXCEED_MAX_SIZE . ' (' . $sMaxSize . LABEL_BYTES_PHPUTIL . ').'; + if ($aFileValues['error'] > $sMaxSize) + $sErrorMsg .= FILE_LABEL_PHPUTIL . $aFileValues['name'] . ERROR_EXCEED_MAX_SIZE_PHP . ' (' . $sMaxSize . LABEL_BYTES_PHPUTIL . ').'; } + //Lance l'upload. if ($bAllowUpload) { if (!copy($sTmpFile, $sServerPath)) { - writeToErrorLog(ERROR_COPYING_FILE . $_FILES[$sNomObjet]['name'] . ON_SERVER_PHPUTIL . ', ' . $sTmpFile . ', ' . $sServerPath); - $sErrorMsg = ERROR_COPYING_FILE . $_FILES[$sNomObjet]['name'] . ON_SERVER_PHPUTIL . '.'; + writeToErrorLog(ERROR_COPYING_FILE . $aFileValues['name'] . ON_SERVER_PHPUTIL . ', ' . $sTmpFile . ', ' . $sServerPath); + $sErrorMsg = ERROR_COPYING_FILE . $aFileValues['name'] . ON_SERVER_PHPUTIL . '.'; } unlink($sTmpFile); + $sErrorMsg = $sServerPath; //chmod($sServerPath,755); } } else { - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; + writeToErrorLog(ERROR_FILE . $aFileValues['name'] . ERROR_NOT_FILE . $sFileType); + $sErrorMsg = FILE_LABEL_PHPUTIL . $aFileValues['name'] . ERROR_NOT_FILE . $sFileType . ERROR_VALID_FILE . $sFormat . '.'; } } else { - writeToErrorLog(ERROR_FILE . $_FILES[$sNomObjet]['name'] . ERROR_DOWNLOAD_SERVER); - $sErrorMsg = FILE_LABEL_PHPUTIL . $_FILES[$sNomObjet]['name'] . ERROR_DOWNLOAD_SERVER . ' (' . ERROR_CODE_PHPUTIL . $_FILES[$sNomObjet]['error'] . ').'; + writeToErrorLog(ERROR_FILE . "File" . ERROR_DOWNLOAD_SERVER); + $sErrorMsg = FILE_LABEL_PHPUTIL . "File" . ERROR_DOWNLOAD_SERVER . '.'; } return $sErrorMsg; } +/** + *This method convert $_FILE struct or the aValues File to a File Struct usable by uploadFile. + *@file vmlib/phpUtil.inc + *@param $sField Name of the field. + *@param $aValues $aValues to copy file in tmp. + *@return $aFileStruct FileStuct or null if an error block the write in tmp. + */ +function extractFileStruct ($sField, $aValues = null){ + global $properties; + if (empty($aValues)){ + // Extract From Post $File Struct + return $aFileStruc = array( + "name" => $_FILES[$sField]['name'], + "tmp_name" => $_FILES[$sField]['tmp_name'], + "error" => $_FILES[$sField]['error'], + "size" => $_FILES[$sField]['size'] + ); + } else { + // Extraction de $aValues, on le met dans tmp pour préparer la copie dans upload file + $sTmpFile = $properties['extract_dir'] . "/" . getUniqRandomId(); + $oFile = fopen($sTmpFile, 'w+'); + if (!$oFile){ + writeToErrorLog("Can't open file in " . $properties['extract_dir']); + return null; + }else{ + fwrite($oFile, $aValues[$sField . "_file"]); + fclose($oFile); + return $aFileStruc = array( + "name" => $aValues[$sField . "_name"], + "tmp_name" => $sTmpFile, + "error" => "0", + "size" => filesize($sTmpFile) + ); + } + } +} + +/** + *This method upload a file in ws_data. + *@file vmlib/phpUtil.inc + *@param $sModule Name of the module. + *@param $sObject Name of the object. + *@param $mId Id of the current object. + *@param $sField field name (generally DB column name). + *@param $aValues Vitis $aValues. + *@param $iMaxSize Maximum size to upload on server. (set to -1 to disable this control) + *@param $sFileTypeCtrl Type of the document. (set to all to disable this control) + *@return $sErrorMsg The error message. + */ +function uploadInWsDataDir ($sModule, $sObject, $mId, $sField, $aValues, $iMaxSize = -1, $sFileTypeCtrl = "all"){ + global $properties; + + // on controle les attributs pour éviter les mauvais placements + if (strpos($sModule, '/') > -1){ + writeToErrorLog("Module can't contain path : " . $sModule); + return "Module can't contain path : " . $sModule; + } + + if (strpos($sObject, "/") > -1){ + writeToErrorLog("Object can't contain path : " . $sObject); + return "Object can't contain path : " . $sObject; + } + + if (strpos($mId, "/") > -1){ + writeToErrorLog("Id can't contain path : " . $mId); + return "Id can't contain path : " . $mId; + } + + if (strpos($sField, "/") > -1){ + writeToErrorLog("Field can't contain path : " . $sField); + return "Field can't contain path : " . $sField; + } + // on génére la Structure fichier + $aFileStruct = extractFileStruct ($sField, $aValues); + // on génére la destination + $sDestDir = $properties['ws_data_dir'] . "/" . $sModule . "/" . $sObject . "/" . $mId . "/" . $sField; + $sDestPath = $sDestDir . "/" . $aFileStruct["name"]; + + // on controle la destination pour éviter les mauvais placements + if (strpos($sDestPath, "/\.\./") > -1){ + writeToErrorLog("This function doesn't accept relative reference : " . $sDestPath); + return "This function doesn't accept relative reference : " . $sDestPath; + } + // si taille max vaut -1 alors taille max = taille fichier + 1 + if ($iMaxSize == -1){ + $iMaxSize = $aFileStruct["size"] + 1; + } + // création du fichier si besoin + if (!is_dir($sDestDir)){ + if(!mkdir($sDestDir, 0777, true)){ + writeToErrorLog("Can't create directory " . $sDestDir); + return "Can't create directory " . $sDestDir; + } + } + // Upload du fichier + return uploadFile($sField, $sFileTypeCtrl, $sDestPath, $iMaxSize, $aFileStruct); +} +/** + *This method upload a file in Public. + *@file vmlib/phpUtil.inc + *@param $sModule Name of the module. + *@param $sRandomUniqId Uniq folder to use to stock file(s) (set it to "auto" to let the function create this folder). + *@param $sField field name (generally DB column name). + *@param $aValues Vitis $aValues. + *@param $iMaxSize Maximum size to upload on server. (set to -1 to disable this control) + *@param $sFileTypeCtrl Type of the document. (set to all to disable this control) + *@return $sErrorMsg The error message or the file path if success. + */ +function uploadInPublicDir($sModule, $sField, $aValues, $sRandomUniqId = "auto", $iMaxSize = -1, $sFileTypeCtrl = "all"){ + global $properties; + + // on controle les attributs pour éviter les mauvais placements + if (strpos($sModule, '/') > -1){ + writeToErrorLog("Module can't contain path : " . $sModule); + return "Module can't contain path : " . $sModule; + } + if (strpos($sField, "/") > -1){ + writeToErrorLog("Field can't contain path : " . $sField); + return "Field can't contain path : " . $sField; + } + // on génére la Structure fichier + $aFileStruct = extractFileStruct ($sField, $aValues); + // on génére le dossier unique si besoin + if($sRandomUniqId == "auto"){ + $sRandomUniqId = getUniqRandomId(); + } + // on génére la destination + $sDestDir = $properties['dir_export'] . "/" . $sModule . "/" . $sRandomUniqId; + $sDestPath = $sDestDir . "/" . $aFileStruct["name"]; + + // on controle la destination pour éviter les mauvais placements + if (strpos($sDestPath, "/\.\./") > -1){ + writeToErrorLog("This function doesn't accept relative reference : " . $sDestPath); + return "This function doesn't accept relative reference : " . $sDestPath; + } + // si taille max vaut -1 alors taille max = taille fichier + 1 + if ($iMaxSize == -1){ + $iMaxSize = $aFileStruct["size"] + 1; + } + + // création du fichier si besoin + if (!is_dir($sDestDir)){ + if(!mkdir($sDestDir, 0777, true)){ + writeToErrorLog("Can't create directory " . $sDestDir); + return "Can't create directory " . $sDestDir; + } + } + // Upload du fichier + return uploadFile($sField, $sFileTypeCtrl, $sDestPath, $iMaxSize, $aFileStruct); +} + +/** + *This method upload a file in Upload. + *@file vmlib/phpUtil.inc + *@param $sModule Name of the module. + *@param $sRandomUniqId Uniq folder to use to stock file(s) (set it to "auto" to let the function create this folder). + *@param $sField field name (generally DB column name). + *@param $aValues Vitis $aValues. + *@param $iMaxSize Maximum size to upload on server. (set to -1 to disable this control) + *@param $sFileTypeCtrl Type of the document. (set to all to disable this control) + *@return $sErrorMsg The error message or the file path if success. + */ +function uploadInUploadDir($sModule, $sField, $aValues, $sRandomUniqId = "auto", $iMaxSize = -1, $sFileTypeCtrl = "all"){ + global $properties; + + // on controle les attributs pour éviter les mauvais placements + if (strpos($sModule, '/') > -1){ + writeToErrorLog("Module can't contain path : " . $sModule); + return "Module can't contain path : " . $sModule; + } + if (strpos($sField, "/") > -1){ + writeToErrorLog("Field can't contain path : " . $sField); + return "Field can't contain path : " . $sField; + } + // on génére la Structure fichier + $aFileStruct = extractFileStruct ($sField, $aValues); + // on génére le dossier unique si besoin + if($sRandomUniqId == "auto"){ + $sRandomUniqId = getUniqRandomId(); + } + // on génére la destination + $sDestDir = $properties['upload_dir'] . "/" . $sModule . "/" . $sRandomUniqId; + $sDestPath = $sDestDir . "/" . $aFileStruct["name"]; + + // on controle la destination pour éviter les mauvais placements + if (strpos($sDestPath, "/\.\./") > -1){ + writeToErrorLog("This function doesn't accept relative reference : " . $sDestPath); + return "This function doesn't accept relative reference : " . $sDestPath; + } + // si taille max vaut -1 alors taille max = taille fichier + 1 + if ($iMaxSize == -1){ + $iMaxSize = $aFileStruct["size"] + 1; + } + + // création du fichier si besoin + if (!is_dir($sDestDir)){ + if(!mkdir($sDestDir, 0777, true)){ + writeToErrorLog("Can't create directory " . $sDestDir); + return "Can't create directory " . $sDestDir; + } + } + // Upload du fichier + return uploadFile($sField, $sFileTypeCtrl, $sDestPath, $iMaxSize, $aFileStruct); +} + /** *This method return the extension of a file. *@file vmlib/phpUtil.inc