41 return preg_replace(
'/^.*\/([^\/]+)$/',
'$1', rtrim($pathfile,
'/'));
64function dol_dir_list($utf8_path, $types =
"all", $recursive = 0, $filter =
"", $excludefilter =
null, $sortcriteria =
"name", $sortorder = SORT_ASC, $mode = 0, $nohook = 0, $relativename =
"", $donotfollowsymlinks = 0, $nbsecondsold = 0)
69 if ($recursive <= 1) {
74 if (!empty($filter) && !is_array($filter)) {
75 if (strlen($filter) > 25000) {
76 dol_syslog(
"Value for filter is too large", LOG_ERR);
80 if ((
int) preg_match(
'/(?:^|[^\\\\])\//', $filter) > 0) {
81 $excludefilter_ok =
false;
82 $error_info .=
" error='filter_has_unescaped_slash'";
83 dol_syslog(
"'$filter' has unescaped '/'", LOG_ERR);
89 $excludefilter_ok =
true;
90 $exclude_array = ($excludefilter ===
null || $excludefilter ===
'') ? array() : (is_array($excludefilter) ? $excludefilter : array($excludefilter));
91 foreach ($exclude_array as $f) {
93 if ((
int) preg_match(
'/(?:^|[^\\\\])\//', $f) > 0) {
94 $excludefilter_ok =
false;
95 $error_info .=
" error='excludefilter_has_unescaped_slash'";
100 dol_syslog(
"files.lib.php::dol_dir_list path=".$utf8_path.
" types=".$types.
" recursive=".$recursive.
" filter=".json_encode($filter).
" excludefilter=".json_encode($excludefilter).$error_info);
102 if (!$filter_ok || !$excludefilter_ok) {
108 $exclude_array = ($excludefilter ===
null || $excludefilter ===
'') ? array() : (is_array($excludefilter) ? $excludefilter : array($excludefilter));
112 $excludefilterarray = array_merge(array(
'^\.'), $exclude_array);
114 $loaddate = ($mode == 1 || $mode == 2 || $nbsecondsold != 0 || $sortcriteria ==
'date');
115 $loadsize = ($mode == 1 || $mode == 3 || $sortcriteria ==
'size');
116 $loadperm = ($mode == 1 || $mode == 4 || $sortcriteria ==
'perm');
120 $file_list = array();
123 $utf8_path = preg_replace(
'/([\\/]+)$/',
'', $utf8_path);
125 if (preg_match(
'/\*/', $utf8_path)) {
126 $utf8_path_array = glob($utf8_path, GLOB_ONLYDIR);
129 $utf8_path_array = array($utf8_path);
132 foreach ($utf8_path_array as $utf8_path_cursor) {
134 if (!$nohook && $hookmanager instanceof
HookManager) {
135 $hookmanager->resArray = array();
137 $hookmanager->initHooks(array(
'fileslib'));
142 'recursive' => $recursive,
144 'excludefilter' => $exclude_array,
145 'sortcriteria' => $sortcriteria,
146 'sortorder' => $sortorder,
147 'loaddate' => $loaddate,
148 'loadsize' => $loadsize,
151 $reshook = $hookmanager->executeHooks(
'getDirList', $parameters,
$object);
155 if (empty($reshook)) {
156 if (!is_dir($os_path)) {
160 if (($dir = opendir($os_path)) ===
false) {
168 while (
false !== ($os_file = readdir($dir))) {
169 $os_fullpathfile = ($os_path ? $os_path.
'/' :
'').$os_file;
172 $utf8_file = mb_convert_encoding($os_file,
'UTF-8',
'ISO-8859-1');
174 $utf8_file = $os_file;
177 $utf8_fullpathfile = $utf8_path_cursor.
"/".$utf8_file;
181 foreach ($excludefilterarray as $filt) {
182 if (preg_match(
'/'.$filt.
'/i', $utf8_file) || preg_match(
'/'.$filt.
'/i', $utf8_fullpathfile)) {
190 $isdir = is_dir($os_fullpathfile);
194 if (($types ==
"directories") || ($types ==
"all")) {
195 if ($loaddate || $sortcriteria ==
'date') {
198 if ($loadsize || $sortcriteria ==
'size') {
201 if ($loadperm || $sortcriteria ==
'perm') {
205 $qualifiedforfilter = 0;
206 if (empty($filter)) {
207 $qualifiedforfilter = 1;
209 $testpregmatch =
false;
210 if (is_array($filter)) {
211 $chunks = array_chunk($filter, 500);
212 foreach ($chunks as $chunk) {
213 $testpregmatch = preg_match(
'/'.implode(
'|', $chunk).
'/i', $utf8_file);
214 if ($testpregmatch) {
219 $testpregmatch = preg_match(
'/'.$filter.
'/i', $utf8_file);
221 if ($testpregmatch) {
222 $qualifiedforfilter = 1;
226 if ($qualifiedforfilter) {
228 preg_match(
'/([^\/]+)\/[^\/]+$/', $utf8_fullpathfile, $reg);
229 $level1name = (isset($reg[1]) ? $reg[1] :
'');
230 $file_list[] = array(
231 "name" => $utf8_file,
232 "path" => $utf8_path,
233 "level1name" => $level1name,
234 "relativename" => ($relativename ? $relativename.
'/' :
'').$utf8_file,
235 "fullname" => $utf8_fullpathfile,
245 if ($recursive > 0) {
246 if (empty($donotfollowsymlinks) || !is_link($os_fullpathfile)) {
248 $file_list = array_merge($file_list,
dol_dir_list($utf8_fullpathfile, $types, $recursive + 1, $filter, $exclude_array, $sortcriteria, $sortorder, $mode, $nohook, ($relativename !=
'' ? $relativename.
'/' :
'').$utf8_file, $donotfollowsymlinks, $nbsecondsold));
251 } elseif (in_array($types, array(
"files",
"all"))) {
253 if ($loaddate || $sortcriteria ==
'date') {
256 if ($loadsize || $sortcriteria ==
'size') {
260 $qualifiedforfilter = 0;
261 if (empty($filter)) {
262 $qualifiedforfilter = 1;
264 $testpregmatch =
false;
265 if (is_array($filter)) {
266 $chunks = array_chunk($filter, 500);
267 foreach ($chunks as $chunk) {
268 $testpregmatch = preg_match(
'/'.implode(
'|', $chunk).
'/i', $utf8_file);
269 if ($testpregmatch) {
274 $testpregmatch = preg_match(
'/'.$filter.
'/i', $utf8_file);
276 if ($testpregmatch) {
277 $qualifiedforfilter = 1;
281 if ($qualifiedforfilter) {
282 if (empty($nbsecondsold) || $filedate <= ($now - $nbsecondsold)) {
283 preg_match(
'/([^\/]+)\/[^\/]+$/', $utf8_fullpathfile, $reg);
284 $level1name = (isset($reg[1]) ? $reg[1] :
'');
285 $file_list[] = array(
286 "name" => $utf8_file,
287 "path" => $utf8_path,
288 "level1name" => $level1name,
289 "relativename" => ($relativename ? $relativename.
'/' :
'').$utf8_file,
290 "fullname" => $utf8_fullpathfile,
305 if (!empty($sortcriteria) && $sortorder) {
306 $file_list =
dol_sort_array($file_list, $sortcriteria, ($sortorder == SORT_ASC ?
'asc' :
'desc'));
309 if ($hookmanager instanceof
HookManager && is_array($hookmanager->resArray)) {
310 $file_list = array_merge($file_list, $hookmanager->resArray);
333function dol_dir_list_in_database($path, $filter =
"", $excludefilter =
null, $sortcriteria =
"name", $sortorder = SORT_ASC, $mode = 0, $sqlfilters =
"",
$object =
null)
341 $sql =
"SELECT rowid, label, entity, filename, filepath, fullpath_orig, keywords, cover, gen_or_uploaded, extraparams,";
342 $sql .=
" date_c, tms as date_m, fk_user_c, fk_user_m, acl, position, share";
344 $sql .=
", description";
346 $sql .=
" FROM ".MAIN_DB_PREFIX.
"ecm_files";
348 $sql .=
" WHERE entity = ".((int)
$object->entity);
350 $sql .=
" WHERE entity = ".((int)
$conf->entity);
352 if (preg_match(
'/%$/', $path)) {
353 $sql .=
" AND (filepath LIKE '".$db->escape($path).
"' OR filepath = '".
$db->escape(preg_replace(
'/\/%$/',
'', $path)).
"')";
355 $sql .=
" AND filepath = '".$db->escape($path).
"'";
360 $sql .= forgeSQLFromUniversalSearchCriteria($sqlfilters, $errormessage);
366 $resql =
$db->query($sql);
368 $file_list = array();
369 $num =
$db->num_rows($resql);
372 $obj =
$db->fetch_object($resql);
375 preg_match(
'/([^\/]+)\/[^\/]+$/', DOL_DATA_ROOT.
'/'.$obj->filepath.
'/'.$obj->filename, $reg);
376 $level1name = (isset($reg[1]) ? $reg[1] :
'');
377 $file_list[] = array(
378 "rowid" => $obj->rowid,
379 "label" => $obj->label,
380 "name" => $obj->filename,
381 "path" => DOL_DATA_ROOT.
'/'.$obj->filepath,
382 "level1name" => $level1name,
383 "fullname" => DOL_DATA_ROOT.
'/'.$obj->filepath.
'/'.$obj->filename,
384 "fullpath_orig" => $obj->fullpath_orig,
385 "date_c" =>
$db->jdate($obj->date_c),
386 "date_m" =>
$db->jdate($obj->date_m),
388 "keywords" => $obj->keywords,
389 "cover" => $obj->cover,
390 "position" => (
int) $obj->position,
392 "share" => $obj->share,
393 "description" => ($mode ? $obj->description :
'')
401 if (!empty($sortcriteria)) {
403 foreach ($file_list as $key => $row) {
404 $myarray[$key] = (isset($row[$sortcriteria]) ? $row[$sortcriteria] :
'');
408 array_multisort($myarray, $sortorder, SORT_REGULAR, $file_list);
442 if ($modulepart ==
'produit' &&
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
447 $upload_dirold =
$conf->product->multidir_output[
$object->entity ??
$conf->entity].
'/'.substr(substr(
"000".
$object->id, -2), 1, 1).
'/'.substr(substr(
"000".
$object->id, -2), 0, 1).
'/'.
$object->id.
"/photos";
449 $upload_dirold =
$conf->service->multidir_output[
$object->entity ??
$conf->entity].
'/'.substr(substr(
"000".
$object->id, -2), 1, 1).
'/'.substr(substr(
"000".
$object->id, -2), 0, 1).
'/'.
$object->id.
"/photos";
452 $relativedirold = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dirold);
453 $relativedirold = ltrim($relativedirold,
"/\\");
455 $filearrayindatabase = array_merge($filearrayindatabase,
dol_dir_list_in_database($relativedirold,
'',
null,
'name', SORT_ASC));
457 } elseif ($modulepart ==
'ticket') {
458 foreach ($filearray as $key => $val) {
459 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filearray[$key][
'path']);
460 $rel_dir = trim($rel_dir,
"/\\");
461 if ($rel_dir != $relativedir) {
462 $filearrayindatabase = array_merge($filearrayindatabase,
dol_dir_list_in_database($rel_dir,
'',
null,
'name', SORT_ASC));
468 foreach ($filearray as $key => $val) {
469 $tmpfilename = preg_replace(
'/\.noexe$/',
'', $filearray[$key][
'name']);
472 foreach ($filearrayindatabase as $key2 => $val2) {
473 if (($filearrayindatabase[$key2][
'path'] == $filearray[$key][
'path']) && ($filearrayindatabase[$key2][
'name'] == $tmpfilename)) {
474 $filearray[$key][
'position_name'] = ($filearrayindatabase[$key2][
'position'] ? $filearrayindatabase[$key2][
'position'] :
'0').
'_'.$filearrayindatabase[$key2][
'name'];
475 $filearray[$key][
'position'] = $filearrayindatabase[$key2][
'position'];
476 $filearray[$key][
'cover'] = $filearrayindatabase[$key2][
'cover'];
477 $filearray[$key][
'keywords'] = $filearrayindatabase[$key2][
'keywords'];
478 $filearray[$key][
'acl'] = $filearrayindatabase[$key2][
'acl'];
479 $filearray[$key][
'rowid'] = $filearrayindatabase[$key2][
'rowid'];
480 $filearray[$key][
'label'] = $filearrayindatabase[$key2][
'label'];
481 $filearray[$key][
'share'] = $filearrayindatabase[$key2][
'share'];
488 $filearray[$key][
'position'] =
'999999';
489 $filearray[$key][
'cover'] = 0;
490 $filearray[$key][
'acl'] =
'';
491 $filearray[$key][
'share'] = 0;
493 $rel_filename = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filearray[$key][
'fullname']);
495 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filename)) {
496 dol_syslog(
"list_of_documents We found a file called '".$filearray[$key][
'name'].
"' not indexed into database. We add it");
498 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
502 $filename = basename($rel_filename);
503 $rel_dir = dirname($rel_filename);
504 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
505 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
507 $ecmfile->filepath = $rel_dir;
508 $ecmfile->filename = $filename;
509 $ecmfile->label = md5_file(
dol_osencode($filearray[$key][
'fullname']));
510 $ecmfile->fullpath_orig = $filearray[$key][
'fullname'];
511 $ecmfile->gen_or_uploaded =
'unknown';
513 $ecmfile->src_object_type =
$object->element;
514 $ecmfile->src_object_id =
$object->id;
516 $ecmfile->description =
'';
517 $ecmfile->keywords =
'';
522 $result = $ecmfile->create($user);
526 $filearray[$key][
'rowid'] = $result;
529 $filearray[$key][
'rowid'] = 0;
546 global $sortorder, $sortfield;
548 $sortorder = strtoupper($sortorder);
550 if ($sortorder ==
'ASC') {
558 if ($sortfield ==
'name') {
559 if ($a->name == $b->name) {
562 return ($a->name < $b->name) ? $retup : $retdown;
564 if ($sortfield ==
'date') {
565 if ($a->date == $b->date) {
568 return ($a->date < $b->date) ? $retup : $retdown;
570 if ($sortfield ==
'size') {
571 if ($a->size == $b->size) {
574 return ($a->size < $b->size) ? $retup : $retdown;
590 if (is_dir($newfolder)) {
605 if (!is_readable($dir)) {
608 return (count(scandir($dir)) == 2);
620 return is_file($newpathoffile);
632 return is_link($newpathoffile);
644 return is_writable($newfolderorfile);
657 $prots = array(
'file',
'http',
'https',
'ftp',
'zlib',
'data',
'ssh',
'ssh2',
'ogg',
'expect');
658 return false !== preg_match(
'/^('.implode(
'|', $prots).
'):/i', $uri);
670 if (is_dir($newfolder)) {
671 $handle = opendir($newfolder);
672 $folder_content =
'';
674 while ((gettype($name = readdir($handle)) !=
"boolean")) {
675 $name_array[] = $name;
677 foreach ($name_array as $temp) {
678 $folder_content .= $temp;
683 if ($folder_content ==
"...") {
706 $fp = fopen($newfile,
'r');
713 if ($line !==
false) {
736 return filesize($newpathoffile);
748 return @filemtime($newpathoffile);
760 return fileperms($newpathoffile);
775function dolReplaceInFile($srcfile, $arrayreplacement, $destfile =
'', $newmask =
'0', $indexdatabase = 0, $arrayreplacementisregex = 0)
777 dol_syslog(
"files.lib.php::dolReplaceInFile srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" indexdatabase=".$indexdatabase.
" arrayreplacementisregex=".$arrayreplacementisregex);
779 if (empty($srcfile)) {
782 if (empty($destfile)) {
783 $destfile = $srcfile;
787 $srcfile = preg_replace(
'/\.\.\/?/',
'', $srcfile);
788 $destfile = preg_replace(
'/\.\.\/?/',
'', $destfile);
791 if (($destfile != $srcfile) && $destexists) {
797 dol_syslog(
"files.lib.php::dolReplaceInFile failed to read src file", LOG_WARNING);
801 $tmpdestfile = $destfile.
'.tmp';
806 $newdirdestfile = dirname($newpathofdestfile);
808 if ($destexists && !is_writable($newpathofdestfile)) {
809 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to overwrite target file", LOG_WARNING);
812 if (!is_writable($newdirdestfile)) {
813 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
820 $content = file_get_contents($newpathofsrcfile);
822 if (empty($arrayreplacementisregex)) {
825 foreach ($arrayreplacement as $key => $value) {
826 $content = preg_replace($key, (
string) $value, $content);
830 file_put_contents($newpathoftmpdestfile, $content);
831 dolChmod($newpathoftmpdestfile, $newmask);
834 $moreinfo = array(
'gen_or_uploaded' =>
'unknown');
835 $result =
dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile) ? 1 : 0), 0, $indexdatabase, $moreinfo);
837 dol_syslog(
"files.lib.php::dolReplaceInFile failed to move tmp file to final dest", LOG_WARNING);
843 if (empty($newmask)) {
844 dol_syslog(
"Warning: dolReplaceInFile called with empty value for newmask and no default value defined", LOG_WARNING);
848 dolChmod($newpathofdestfile, $newmask);
863 if (! file_exists($filePath)) {
864 dol_syslog(
"files.lib.php::removePatternFromFile: File $filePath does not exist", LOG_WARNING);
870 $content = file_get_contents($filePath);
871 if ($content ===
false) {
872 dol_syslog(
"files.lib.php::removePatternFromFile: Unable to read the file $filePath", LOG_WARNING);
878 $updatedContent = preg_replace($pattern,
'', $content);
879 if ($updatedContent ===
null) {
880 dol_syslog(
"files.lib.php::removePatternFromFile: Error while processing the file $filePath", LOG_WARNING);
886 $result = file_put_contents($filePath, $updatedContent);
887 if ($result ===
false) {
888 dol_syslog(
"files.lib.php::removePatternFromFile: Permission denied to overwrite the target file $filePath", LOG_WARNING);
893 dol_syslog(
"files.lib.php::removePatternFromFile: Content successfully removed in the file $filePath", LOG_INFO);
912function dol_copy($srcfile, $destfile, $newmask =
'0', $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 0)
916 dol_syslog(
"files.lib.php::dol_copy srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
918 if (empty($srcfile) || empty($destfile)) {
923 if (!$overwriteifexists && $destexists) {
929 $newdirdestfile = dirname($newpathofdestfile);
931 if ($destexists && !is_writable($newpathofdestfile)) {
932 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to overwrite target file", LOG_WARNING);
935 if (!is_writable($newdirdestfile)) {
936 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
941 $testvirusarray = array();
944 if (count($testvirusarray)) {
945 dol_syslog(
"files.lib.php::dol_copy canceled because a virus was found into source file. we ignore the copy request.", LOG_WARNING);
951 $result = @copy($newpathofsrcfile, $newpathofdestfile);
954 dol_syslog(
"files.lib.php::dol_copy failed to copy", LOG_WARNING);
960 if (empty($newmask)) {
961 dol_syslog(
"Warning: dol_copy called with empty value for newmask and no default value defined", LOG_WARNING);
965 dolChmod($newpathofdestfile, $newmask);
967 if ($result && $indexdatabase) {
969 $rel_filetocopyafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $newpathofdestfile);
970 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetocopyafter)) {
971 $rel_filetocopyafter = preg_replace(
'/^[\\/]/',
'', $rel_filetocopyafter);
974 dol_syslog(
"Try to copy also entries in database for: ".$rel_filetocopyafter, LOG_DEBUG);
975 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
978 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetocopyafter);
979 if ($resultecmtarget > 0) {
980 dol_syslog(
"ECM dest file found, remove it", LOG_DEBUG);
981 $ecmfiletarget->delete($user);
983 dol_syslog(
"ECM dest file not found, create it", LOG_DEBUG);
987 $resultecm = $ecmSrcfile->fetch(0,
'', $srcfile);
991 dol_syslog(
"Fetch src file error", LOG_DEBUG);
995 $filename = basename($rel_filetocopyafter);
996 $rel_dir = dirname($rel_filetocopyafter);
997 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
998 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1000 $ecmfile->filepath = $rel_dir;
1001 $ecmfile->filename = $filename;
1003 $ecmfile->fullpath_orig = $srcfile;
1004 $ecmfile->gen_or_uploaded =
'copy';
1005 $ecmfile->description = $ecmSrcfile->description;
1006 $ecmfile->keywords = $ecmSrcfile->keywords;
1007 $resultecm = $ecmfile->create($user);
1008 if ($resultecm < 0) {
1012 dol_syslog(
"Create ECM file error", LOG_DEBUG);
1016 if ($resultecm > 0) {
1024 return (
int) $result;
1041function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement =
null, $excludesubdir = 0, $excludefileext =
null, $excludearchivefiles = 0)
1045 dol_syslog(
"files.lib.php::dolCopyDir srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
1047 if (empty($srcfile) || empty($destfile)) {
1058 $dirmaskdec = octdec($newmask);
1062 $dirmaskdec |= octdec(
'0200');
1064 $result =
dol_mkdir($destfile,
'', decoct($dirmaskdec));
1076 if (is_dir($ossrcfile)) {
1077 $dir_handle = opendir($ossrcfile);
1079 while ($file = readdir($dir_handle)) {
1080 if ($file !=
"." && $file !=
".." && !is_link($ossrcfile.
"/".$file)) {
1081 if (is_dir($ossrcfile.
"/".$file)) {
1082 if (empty($excludesubdir) || ($excludesubdir == 2 && strlen($file) == 2)) {
1085 if (is_array($arrayreplacement)) {
1086 foreach ($arrayreplacement as $key => $val) {
1087 $newfile = str_replace($key, $val, $newfile);
1091 $tmpresult =
dolCopyDir($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists, $arrayreplacement, $excludesubdir, $excludefileext, $excludearchivefiles);
1096 if (is_array($excludefileext)) {
1097 $extension = pathinfo($file, PATHINFO_EXTENSION);
1098 if (in_array($extension, $excludefileext)) {
1104 if ($excludearchivefiles == 1) {
1105 $extension = pathinfo($file, PATHINFO_EXTENSION);
1106 if (preg_match(
'/^[v|d]\d+$/', $extension)) {
1112 if (is_array($arrayreplacement)) {
1113 foreach ($arrayreplacement as $key => $val) {
1114 $newfile = str_replace($key, $val, $newfile);
1117 $tmpresult =
dol_copy($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists);
1120 if ($result > 0 && $tmpresult >= 0) {
1123 $result = $tmpresult;
1130 closedir($dir_handle);
1136 return (
int) $result;
1158function dol_move($srcfile, $destfile, $newmask =
'0', $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 1, $moreinfo = array(), $entity =
null)
1163 dol_syslog(
"files.lib.php::dol_move srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwritifexists=".$overwriteifexists);
1168 dol_syslog(
"files.lib.php::dol_move srcfile does not exists. we ignore the move request.");
1172 if ($overwriteifexists || !$destexists) {
1177 $testvirusarray = array();
1180 $testvirusarray =
dolCheckVirus($newpathofsrcfile, $newpathofdestfile);
1181 if (count($testvirusarray)) {
1182 dol_syslog(
"files.lib.php::dol_move canceled because a virus was found into source file. We ignore the move request.", LOG_WARNING);
1188 if (count($testvirusarray)) {
1189 dol_syslog(
"files.lib.php::dol_move canceled because a virus was found into source file. We ignore the move request.", LOG_WARNING);
1194 global $dolibarr_main_restrict_os_commands;
1195 if (!empty($dolibarr_main_restrict_os_commands)) {
1196 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
1197 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
1198 if (in_array(basename($destfile), $arrayofallowedcommand)) {
1201 dol_syslog(
"files.lib.php::dol_move canceled because target filename ".basename($destfile).
" is using a reserved command name. we ignore the move request.", LOG_WARNING);
1206 $result = @rename($newpathofsrcfile, $newpathofdestfile);
1209 dol_syslog(
"files.lib.php::dol_move Failed. We try to delete target first and move after.", LOG_WARNING);
1212 $result = @rename($newpathofsrcfile, $newpathofdestfile);
1214 dol_syslog(
"files.lib.php::dol_move Failed.", LOG_WARNING);
1219 if ($result && $indexdatabase) {
1221 $rel_filetorenamebefore = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $srcfile);
1222 $rel_filetorenameafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $destfile);
1223 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetorenameafter)) {
1224 $rel_filetorenamebefore = preg_replace(
'/^[\\/]/',
'', $rel_filetorenamebefore);
1225 $rel_filetorenameafter = preg_replace(
'/^[\\/]/',
'', $rel_filetorenameafter);
1228 dol_syslog(
"Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore.
" after = ".$rel_filetorenameafter, LOG_DEBUG);
1229 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1232 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetorenameafter,
'',
'',
'', 0, $entity);
1233 if ($resultecmtarget > 0) {
1234 $ecmfiletarget->delete($user);
1238 $resultecm = $ecmfile->fetch(0,
'', $rel_filetorenamebefore,
'',
'',
'', 0, $entity);
1239 if ($resultecm > 0) {
1240 $filename = basename($rel_filetorenameafter);
1241 $rel_dir = dirname($rel_filetorenameafter);
1242 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1243 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1245 $ecmfile->filepath = $rel_dir;
1246 $ecmfile->filename = $filename;
1248 $resultecm = $ecmfile->update($user);
1249 } elseif ($resultecm == 0) {
1250 $filename = basename($rel_filetorenameafter);
1251 $rel_dir = dirname($rel_filetorenameafter);
1252 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1253 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1255 $ecmfile->filepath = $rel_dir;
1256 $ecmfile->filename = $filename;
1258 $ecmfile->fullpath_orig = basename($srcfile);
1259 if (!empty($moreinfo) && !empty($moreinfo[
'gen_or_uploaded'])) {
1260 $ecmfile->gen_or_uploaded = $moreinfo[
'gen_or_uploaded'];
1262 $ecmfile->gen_or_uploaded =
'unknown';
1264 if (!empty($moreinfo) && !empty($moreinfo[
'description'])) {
1265 $ecmfile->description = $moreinfo[
'description'];
1267 $ecmfile->description =
'';
1269 if (!empty($moreinfo) && !empty($moreinfo[
'keywords'])) {
1270 $ecmfile->keywords = $moreinfo[
'keywords'];
1272 $ecmfile->keywords =
'';
1274 if (!empty($moreinfo) && !empty($moreinfo[
'note_private'])) {
1275 $ecmfile->note_private = $moreinfo[
'note_private'];
1277 if (!empty($moreinfo) && !empty($moreinfo[
'note_public'])) {
1278 $ecmfile->note_public = $moreinfo[
'note_public'];
1280 if (!empty($moreinfo) && !empty($moreinfo[
'src_object_type'])) {
1281 $ecmfile->src_object_type = $moreinfo[
'src_object_type'];
1283 if (!empty($moreinfo) && !empty($moreinfo[
'src_object_id'])) {
1284 $ecmfile->src_object_id = $moreinfo[
'src_object_id'];
1286 if (!empty($moreinfo) && !empty($moreinfo[
'position'])) {
1287 $ecmfile->position = $moreinfo[
'position'];
1289 if (!empty($moreinfo) && !empty($moreinfo[
'cover'])) {
1290 $ecmfile->cover = $moreinfo[
'cover'];
1292 if (! empty($entity)) {
1293 $ecmfile->entity = $entity;
1296 $resultecm = $ecmfile->create($user);
1297 if ($resultecm < 0) {
1300 if (!empty($moreinfo) && !empty($moreinfo[
'array_options']) && is_array($moreinfo[
'array_options'])) {
1301 $ecmfile->array_options = $moreinfo[
'array_options'];
1302 $resultecm = $ecmfile->insertExtraFields();
1303 if ($resultecm < 0) {
1308 } elseif ($resultecm < 0) {
1312 if ($resultecm > 0) {
1320 if (empty($newmask)) {
1327 dolChmod($newpathofdestfile, $newmask);
1343function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase = 1, $renamedircontent = 1)
1347 dol_syslog(
"files.lib.php::dol_move_dir srcdir=".$srcdir.
" destdir=".$destdir.
" overwritifexists=".$overwriteifexists.
" indexdatabase=".$indexdatabase.
" renamedircontent=".$renamedircontent);
1349 $srcbasename = basename($srcdir);
1353 dol_syslog(
"files.lib.php::dol_move_dir srcdir does not exists. Move fails");
1357 if ($overwriteifexists || !$destexists) {
1364 if ($overwriteifexists) {
1365 if (strtoupper(substr(PHP_OS, 0, 3)) ===
'WIN') {
1366 if (is_dir($newpathofdestdir)) {
1367 @rmdir($newpathofdestdir);
1372 $result = @rename($newpathofsrcdir, $newpathofdestdir);
1375 if ($result && $renamedircontent) {
1376 if (file_exists($newpathofdestdir)) {
1377 $destbasename = basename($newpathofdestdir);
1379 if (!empty($files) && is_array($files)) {
1380 foreach ($files as $key => $file) {
1381 if (!file_exists($file[
"fullname"])) {
1384 $filepath = $file[
"path"];
1385 $oldname = $file[
"name"];
1387 $newname = str_replace($srcbasename, $destbasename, $oldname);
1388 if (!empty($newname) && $newname !== $oldname) {
1389 if ($file[
"type"] ==
"dir") {
1390 $res =
dol_move_dir($filepath.
'/'.$oldname, $filepath.
'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
1392 $moreinfo = array(
'gen_or_uploaded' =>
'unknown');
1393 $res =
dol_move($filepath.
'/'.$oldname, $filepath.
'/'.$newname,
'0', $overwriteifexists, 0, $indexdatabase, $moreinfo);
1420 return trim(basename($filename),
".\x00..\x20");
1436 if (!empty($reterrors)) {
1441 if (!class_exists(
'AntiVir')) {
1442 require_once DOL_DOCUMENT_ROOT.
'/core/class/antivir.class.php';
1445 $result = $antivir->dol_avscan_file($src_file);
1447 $reterrors = $antivir->errors;
1463 if (preg_match(
'/\.pdf$/i', $dest_file)) {
1465 dol_syslog(
"dolCheckOnFileName Check that pdf does not contains js code");
1467 $tmp = file_get_contents(trim($src_file));
1468 if (preg_match(
'/[\n\s]+\/JavaScript[\n\s]+/m', $tmp)) {
1469 return array(
'File is a PDF with javascript inside');
1472 dol_syslog(
"dolCheckOnFileName Check js into pdf disabled");
1501function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $keyforsourcefile =
'addedfile', $upload_dir =
'', $mode = 0)
1507 $file_name = $dest_file;
1510 if (empty($nohook)) {
1511 $reshook = $hookmanager->initHooks(array(
'fileslib'));
1513 $parameters = array(
'dest_file' => $dest_file,
'src_file' => $src_file,
'file_name' => $file_name,
'varfiles' => $keyforsourcefile,
'allowoverwrite' => $allowoverwrite);
1514 $reshook = $hookmanager->executeHooks(
'moveUploadedFile', $parameters,
$object);
1517 if (empty($reshook)) {
1519 if ($uploaderrorcode) {
1520 switch ($uploaderrorcode) {
1521 case UPLOAD_ERR_INI_SIZE:
1522 return 'ErrorFileSizeTooLarge';
1523 case UPLOAD_ERR_FORM_SIZE:
1524 return 'ErrorFileSizeTooLarge';
1525 case UPLOAD_ERR_PARTIAL:
1526 return 'ErrorPartialFile';
1527 case UPLOAD_ERR_NO_TMP_DIR:
1528 return 'ErrorNoTmpDir';
1529 case UPLOAD_ERR_CANT_WRITE:
1530 return 'ErrorFailedToWriteInDir';
1531 case UPLOAD_ERR_EXTENSION:
1532 return 'ErrorUploadBlockedByAddon';
1540 if (empty($disablevirusscan) && file_exists($src_file)) {
1542 if (count($checkvirusarray)) {
1543 dol_syslog(
'Files.lib::dol_move_uploaded_file File "'.$src_file.
'" (target name "'.$dest_file.
'") KO with antivirus: errors='.implode(
',', $checkvirusarray), LOG_WARNING);
1544 return 'ErrorFileIsInfectedWithAVirus: '.implode(
',', $checkvirusarray);
1551 if (isAFileWithExecutableContent($dest_file) && !
getDolGlobalString(
'MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED')) {
1553 $publicmediasdirwithslash =
$conf->medias->multidir_output[
$conf->entity];
1554 if (!preg_match(
'/\/$/', $publicmediasdirwithslash)) {
1555 $publicmediasdirwithslash .=
'/';
1558 if (strpos($upload_dir, $publicmediasdirwithslash) !== 0 || !
getDolGlobalInt(
"MAIN_DOCUMENT_DISABLE_NOEXE_IN_MEDIAS_DIR")) {
1559 $file_name .=
'.noexe';
1566 if (preg_match(
'/^\./', basename($src_file)) || preg_match(
'/\.\./', $src_file) || preg_match(
'/[<>|]/', $src_file)) {
1567 dol_syslog(
"Refused to deliver file ".$src_file, LOG_WARNING);
1573 if (preg_match(
'/^\./', basename($dest_file)) || preg_match(
'/\.\./', $dest_file) || preg_match(
'/[<>|]/', $dest_file)) {
1574 dol_syslog(
"Refused to deliver file ".$dest_file, LOG_WARNING);
1580 $errmsg = implode(
',', $hookmanager->errors);
1581 if (empty($errmsg)) {
1582 $errmsg =
'ErrorReturnedBySomeHooks';
1585 } elseif (empty($reshook)) {
1591 if (!is_writable(dirname($file_name_osencoded))) {
1592 dol_syslog(
"Files.lib::dol_move_uploaded_file Dir ".dirname($file_name_osencoded).
" is not writable. Return 'ErrorDirNotWritable'", LOG_WARNING);
1593 return 'ErrorDirNotWritable';
1597 if (!$allowoverwrite) {
1598 if (file_exists($file_name_osencoded)) {
1599 dol_syslog(
"Files.lib::dol_move_uploaded_file File ".$file_name.
" already exists. Return 'ErrorFileAlreadyExists'", LOG_WARNING);
1600 return 'ErrorFileAlreadyExists';
1603 if (is_dir($file_name_osencoded)) {
1604 dol_syslog(
"Files.lib::dol_move_uploaded_file A directory with name ".$file_name.
" already exists. Return 'ErrorDirWithFileNameAlreadyExists'", LOG_WARNING);
1605 return 'ErrorDirWithFileNameAlreadyExists';
1611 $return = move_uploaded_file($src_file_osencoded, $file_name_osencoded);
1613 $return = rename($src_file_osencoded, $file_name_osencoded);
1618 dol_syslog(
"Files.lib::dol_move_uploaded_file Success to move ".$src_file.
" to ".$file_name.
" - Umask=" .
getDolGlobalString(
'MAIN_UMASK'), LOG_DEBUG);
1619 return $successcode;
1621 dol_syslog(
"Files.lib::dol_move_uploaded_file Failed to move ".$src_file.
" to ".$file_name, LOG_ERR);
1626 return $successcode;
1644function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0,
$object =
null, $allowdotdot =
false, $indexdatabase = 1, $nolog = 0)
1647 global $hookmanager;
1649 if (empty($nolog)) {
1650 dol_syslog(
"dol_delete_file file=".$file.
" disableglob=".$disableglob.
" nophperrors=".$nophperrors.
" nohook=".$nohook);
1655 if ((!$allowdotdot && preg_match(
'/\.\./', $file)) || preg_match(
'/[<>|]/', $file)) {
1656 dol_syslog(
"Refused to delete file ".$file, LOG_WARNING);
1661 if (empty($nohook) && !empty($hookmanager)) {
1662 $hookmanager->initHooks(array(
'fileslib'));
1664 $parameters = array(
1666 'disableglob' => $disableglob,
1667 'nophperrors' => $nophperrors
1669 $reshook = $hookmanager->executeHooks(
'deleteFile', $parameters,
$object);
1672 if (empty($nohook) && $reshook != 0) {
1680 if (empty($disableglob) && !empty($file_osencoded)) {
1682 $globencoded = str_replace(
'[',
'\[', $file_osencoded);
1683 $globencoded = str_replace(
']',
'\]', $globencoded);
1684 $listofdir = glob($globencoded);
1686 if (!empty($listofdir) && is_array($listofdir)) {
1687 foreach ($listofdir as $filename) {
1689 $ok = @unlink($filename);
1691 $ok = unlink($filename);
1695 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1696 dol_syslog(
"Error in deletion, but parent directory exists with no permission to write, we try to change permission on parent directory and retry...", LOG_DEBUG);
1697 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1700 $ok = @unlink($filename);
1702 $ok = unlink($filename);
1707 if (empty($nolog)) {
1708 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1712 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1713 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1714 if (is_object(
$db) && $indexdatabase) {
1715 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1716 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1718 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1719 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1722 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1723 if ($result >= 0 && $ecmfile->id > 0) {
1724 $result = $ecmfile->delete($user);
1732 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1739 dol_syslog(
"No files to delete found", LOG_DEBUG);
1744 $ok = @unlink($file_osencoded);
1746 $ok = unlink($file_osencoded);
1749 if (empty($nolog)) {
1750 dol_syslog(
"Removed file ".$file_osencoded, LOG_DEBUG);
1753 dol_syslog(
"Failed to remove file ".$file_osencoded, LOG_WARNING);
1774 if (preg_match(
'/\.\./', $dir) || preg_match(
'/[<>|]/', $dir)) {
1775 dol_syslog(
"Refused to delete dir ".$dir.
' (contains invalid char sequence)', LOG_WARNING);
1780 return ($nophperrors ? @rmdir($dir_osencoded) : rmdir($dir_osencoded));
1796function dol_delete_dir_recursive($dir, $count = 0, $nophperrors = 0, $onlysub = 0, &$countdeleted = 0, $indexdatabase = 1, $nolog = 0, $level = 0)
1798 if (empty($nolog) || empty($level)) {
1799 dol_syslog(
"functions.lib:dol_delete_dir_recursive ".$dir, LOG_DEBUG);
1801 if ($level > 1000) {
1802 dol_syslog(
"functions.lib:dol_delete_dir_recursive too many depth", LOG_WARNING);
1807 if ($handle = opendir(
"$dir_osencoded")) {
1808 while (
false !== ($item = readdir($handle))) {
1810 $item = mb_convert_encoding($item,
'UTF-8',
'ISO-8859-1');
1813 if ($item !=
"." && $item !=
"..") {
1815 $count =
dol_delete_dir_recursive(
"$dir/$item", $count, $nophperrors, 0, $countdeleted, $indexdatabase, $nolog, ($level + 1));
1818 $result =
dol_delete_file(
"$dir/$item", 1, $nophperrors, 0,
null,
false, $indexdatabase, $nolog);
1830 if (empty($onlysub)) {
1855 global $langs,
$conf;
1860 if (
$object->element ==
'order_supplier') {
1861 $dir =
$conf->fournisseur->commande->dir_output;
1862 } elseif (
$object->element ==
'invoice_supplier') {
1863 $dir =
$conf->fournisseur->facture->dir_output;
1864 } elseif (
$object->element ==
'project') {
1865 $dir =
$conf->project->dir_output;
1866 } elseif (
$object->element ==
'shipping') {
1867 $dir =
$conf->expedition->dir_output.
'/sending';
1868 } elseif (
$object->element ==
'delivery') {
1869 $dir =
$conf->expedition->dir_output.
'/receipt';
1870 } elseif (
$object->element ==
'fichinter') {
1871 $dir =
$conf->ficheinter->dir_output;
1873 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1877 $object->error = $langs->trans(
'ErrorObjectNoSupportedByFunction');
1882 $dir = $dir.
"/".$refsan;
1883 $filepreviewnew = $dir.
"/".$refsan.
".pdf_preview.png";
1884 $filepreviewnewbis = $dir.
"/".$refsan.
".pdf_preview-0.png";
1885 $filepreviewold = $dir.
"/".$refsan.
".pdf.png";
1888 if (file_exists($filepreviewnew) && is_writable($filepreviewnew)) {
1890 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnew);
1894 if (file_exists($filepreviewnewbis) && is_writable($filepreviewnewbis)) {
1896 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnewbis);
1901 if (file_exists($filepreviewold) && is_writable($filepreviewold)) {
1903 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewold);
1907 $multiple = $filepreviewold.
".";
1908 for ($i = 0; $i < 20; $i++) {
1909 $preview = $multiple.$i;
1911 if (file_exists($preview) && is_writable($preview)) {
1913 $object->error = $langs->trans(
"ErrorFailedToOpenFile", $preview);
1943 if (
$object->element ==
'order_supplier') {
1944 $dir =
$conf->fournisseur->dir_output.
'/commande';
1945 } elseif (
$object->element ==
'invoice_supplier') {
1946 $dir =
$conf->fournisseur->dir_output.
'/facture';
1947 } elseif (
$object->element ==
'project') {
1948 $dir =
$conf->project->dir_output;
1949 } elseif (
$object->element ==
'shipping') {
1950 $dir =
$conf->expedition->dir_output.
'/sending';
1951 } elseif (
$object->element ==
'delivery') {
1952 $dir =
$conf->expedition->dir_output.
'/receipt';
1953 } elseif (
$object->element ==
'fichinter') {
1954 $dir =
$conf->ficheinter->dir_output;
1956 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1963 $dir = $dir.
"/".$objectref;
1964 $file = $dir.
"/".$objectref.
".meta";
1966 if (!is_dir($dir)) {
1973 $nblines = count(
$object->lines);
1978 $meta =
"REFERENCE=\"".$object->ref.
"\"
1980 NB_ITEMS=\"" . $nblines.
"\"
1981 CLIENT=\"" . $client.
"\"
1982 AMOUNT_EXCL_TAX=\"" .
$object->total_ht.
"\"
1983 AMOUNT=\"" .
$object->total_ttc.
"\"\n";
1985 for ($i = 0; $i < $nblines; $i++) {
1987 $meta .=
"ITEM_".$i.
"_QUANTITY=\"".
$object->lines[$i]->qty.
"\"
1988 ITEM_" . $i.
"_AMOUNT_WO_TAX=\"".
$object->lines[$i]->total_ht.
"\"
1989 ITEM_" . $i.
"_VAT=\"".
$object->lines[$i]->tva_tx.
"\"
1990 ITEM_" . $i.
"_DESCRIPTION=\"".str_replace(
"\r\n",
"", nl2br(
$object->lines[$i]->desc)).
"\"
1995 $fp = fopen($file,
"w");
2003 dol_syslog(
'FailedToDetectDirInDolMetaCreateFor'.
$object->element, LOG_WARNING);
2021 $listofpaths = array();
2022 $listofnames = array();
2023 $listofmimes = array();
2027 foreach ($listoffiles as $key => $val) {
2028 $listofpaths[] = $val[
'fullname'];
2029 $listofnames[] = $val[
'name'];
2030 $listofmimes[] = dol_mimetype($val[
'name']);
2033 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2034 $_SESSION[
"listofpaths".$keytoavoidconflict] = implode(
';', $listofpaths);
2035 $_SESSION[
"listofnames".$keytoavoidconflict] = implode(
';', $listofnames);
2036 $_SESSION[
"listofmimes".$keytoavoidconflict] = implode(
';', $listofmimes);
2060function dol_add_file_process($upload_dir, $allowoverwrite = 0, $updatesessionordb = 0, $keyforsourcefile =
'addedfile', $savingdocmask =
'', $link =
null, $trackid =
'', $generatethumbs = 1,
$object =
null, $forceFullTextIndexation =
'', $mode = 0)
2068 $_FILES = array($keyforsourcefile => array());
2069 $_FILES[$keyforsourcefile][
'tmp_name'] = $keyforsourcefile;
2070 $_FILES[$keyforsourcefile][
'name'] = $keyforsourcefile;
2074 if (!empty($_FILES[$keyforsourcefile])) {
2075 dol_syslog(
'dol_add_file_process varfiles = '.$keyforsourcefile.
' upload_dir='.$upload_dir.
' allowoverwrite='.$allowoverwrite.
' updatesessionordb='.$updatesessionordb.
' savingdocmask='.$savingdocmask, LOG_DEBUG);
2076 $maxfilesinform =
getDolGlobalInt(
"MAIN_SECURITY_MAX_ATTACHMENT_ON_FORMS", 10);
2077 if (is_array($_FILES[$keyforsourcefile][
"name"]) && count($_FILES[$keyforsourcefile][
"name"]) > $maxfilesinform) {
2078 $langs->load(
"errors");
2079 setEventMessages($langs->trans(
"ErrorTooMuchFileInForm", $maxfilesinform),
null,
"errors");
2087 $TFile = $_FILES[$keyforsourcefile];
2089 if (!is_array($TFile[
'name'])) {
2090 foreach ($TFile as $key => &$val) {
2095 $nbfile = count($TFile[
'name']);
2097 for ($i = 0; $i < $nbfile; $i++) {
2098 if (empty($TFile[
'name'][$i])) {
2103 $destfile = trim($TFile[
'name'][$i]);
2104 $destfull = $upload_dir.
"/".$destfile;
2105 $destfilewithoutext = preg_replace(
'/\.[^\.]+$/',
'', $destfile);
2107 if ($savingdocmask && strpos($savingdocmask, $destfilewithoutext) !== 0) {
2108 $destfile = trim(preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask));
2109 $destfull = $upload_dir.
"/".$destfile;
2112 $filenameto = basename($destfile);
2113 if (preg_match(
'/^\./', $filenameto)) {
2114 $langs->load(
"errors");
2115 setEventMessages($langs->trans(
"ErrorFilenameCantStartWithDot", $filenameto),
null,
'errors');
2119 $info = pathinfo($destfull);
2120 $destfull = $info[
'dirname'].
'/'.
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2121 $info = pathinfo($destfile);
2122 $destfile =
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2127 $defaultexecutableextensions = function_exists(
'getExecutableContent') ? implode(
',', getExecutableContent()) :
'htm,html,shtml,js,phar,php,php3,php4,php5,phtml,pht,pl,py,cgi,ksh,sh,bash,bat,cmd,wpk,exe';
2128 $fileextensionrestriction =
getDolGlobalString(
"MAIN_FILE_EXTENSION_UPLOAD_RESTRICTION", $defaultexecutableextensions);
2129 if (!empty($fileextensionrestriction)) {
2130 $arrayofregexextension = explode(
",", $fileextensionrestriction);
2132 foreach ($arrayofregexextension as $fileextension) {
2133 if (preg_match(
'/\.'.preg_quote(trim($fileextension),
'/').
'$/i', $destfull)) {
2134 $langs->load(
"errors");
2135 setEventMessages($langs->trans(
"ErrorFilenameExtensionNotAllowed", $filenameto),
null,
'errors');
2147 global $dolibarr_main_restrict_os_commands;
2148 if (!empty($dolibarr_main_restrict_os_commands)) {
2149 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
2150 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
2151 if (in_array($destfile, $arrayofallowedcommand)) {
2152 $langs->load(
"errors");
2153 setEventMessages($langs->trans(
"ErrorFilenameReserved", $destfile),
null,
'errors');
2159 $resupload =
dol_move_uploaded_file($TFile[
'tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile[
'error'][$i], 0, $keyforsourcefile, $upload_dir, $mode);
2161 if (is_numeric($resupload) && $resupload > 0) {
2162 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2165 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
2166 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
2167 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
2168 $maxheightmini = $tmparraysize[
'maxheightmini'];
2173 if ($generatethumbs) {
2179 $imgThumbSmall =
vignette($destfull, $maxwidthsmall, $maxheightsmall,
'_small', $quality,
"thumbs");
2182 $imgThumbMini =
vignette($destfull, $maxwidthmini, $maxheightmini,
'_mini', $quality,
"thumbs");
2187 if (empty($updatesessionordb)) {
2188 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2190 $formmail->trackid = $trackid;
2191 $formmail->add_attached_files($destfull, $destfile, $TFile[
'type'][$i]);
2195 if ($updatesessionordb == 1) {
2197 if ($TFile[
'type'][$i] ==
'application/pdf' && strpos($_SERVER[
"REQUEST_URI"],
'product') !==
false &&
getDolGlobalString(
'PRODUCT_ALLOW_EXTERNAL_DOWNLOAD')) {
2202 if ($allowoverwrite) {
2206 $result =
addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ?
'.noexe' :
''), $TFile[
'name'][$i],
'uploaded', $sharefile,
$object, $forceFullTextIndexation);
2208 if ($allowoverwrite) {
2211 setEventMessages(
'WarningFailedToAddFileIntoDatabaseIndex',
null,
'warnings');
2218 $langs->load(
"errors");
2219 if (is_numeric($resupload) && $resupload < 0) {
2221 } elseif (preg_match(
'/ErrorFileIsInfectedWithAVirus/', $resupload)) {
2222 if (preg_match(
'/File is a PDF with javascript inside/', $resupload)) {
2223 setEventMessages($langs->trans(
"ErrorFileIsAnInfectedPDFWithJSInside"),
null,
'errors');
2237 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $upload_dir),
null,
'errors');
2240 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2242 $linkObject->entity =
$conf->entity;
2243 $linkObject->url = $link;
2244 $linkObject->objecttype =
GETPOST(
'objecttype',
'alpha');
2245 $linkObject->objectid =
GETPOSTINT(
'objectid');
2246 $linkObject->label =
GETPOST(
'label',
'alpha');
2247 $res = $linkObject->create($user);
2255 $langs->load(
"errors");
2256 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"File")),
null,
'errors');
2278 $keytodelete = $filenb;
2281 $listofpaths = array();
2282 $listofnames = array();
2283 $listofmimes = array();
2284 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2285 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
2286 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
2288 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
2289 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
2291 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
2292 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
2295 if ($keytodelete >= 0) {
2296 $pathtodelete = $listofpaths[$keytodelete];
2297 $filetodelete = $listofnames[$keytodelete];
2298 if (empty($donotdeletefile)) {
2304 if (empty($donotdeletefile)) {
2305 $langs->load(
"other");
2306 setEventMessages($langs->trans(
"FileWasRemoved", $filetodelete),
null,
'mesgs');
2308 if (empty($donotupdatesession)) {
2309 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2311 $formmail->trackid = $trackid;
2312 $formmail->remove_attached_files($keytodelete);
2340 dol_syslog(
"addFileIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2342 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2344 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2345 $filename = basename(preg_replace(
'/\.noexe$/',
'', $file));
2346 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2347 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2349 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
2351 $ecmfile->filepath = $rel_dir;
2352 $ecmfile->filename = $filename;
2353 $ecmfile->label = md5_file(
dol_osencode($dir.
'/'.$file));
2354 $ecmfile->fullpath_orig = $fullpathorig;
2355 $ecmfile->gen_or_uploaded = $mode;
2356 $ecmfile->description =
'';
2357 $ecmfile->keywords =
'';
2360 $ecmfile->src_object_id =
$object->id;
2361 if (isset(
$object->table_element)) {
2362 $ecmfile->src_object_type =
$object->table_element;
2364 dol_syslog(
'Error: object ' . get_class(
$object) .
' has no table_element attribute.');
2367 if (isset(
$object->src_object_description)) {
2368 $ecmfile->description =
$object->src_object_description;
2370 if (isset(
$object->src_object_keywords)) {
2371 $ecmfile->keywords =
$object->src_object_keywords;
2374 $ecmfile->entity =
$object->entity;
2383 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2389 if (empty($useFullTextIndexation) && $forceFullTextIndexation ==
'1') {
2391 $useFullTextIndexation =
'pdftotext';
2393 $useFullTextIndexation =
'docling';
2398 if ($useFullTextIndexation) {
2399 $ecmfile->filepath = $rel_dir;
2400 $ecmfile->filename = $filename;
2402 $filetoprocess = $dir.
'/'.$ecmfile->filename;
2404 $textforfulltextindex =
'';
2407 if (preg_match(
'/\.pdf/i', $filename)) {
2411 if (empty($result[
'error'])) {
2412 $textforfulltextindex = $result[
'content'];
2413 $filetoprocess = $result[
'keywords'];
2414 $cmd = $result[
'cmd'];
2421 $ecmfile->description =
'File content generated by '.$cmd;
2423 $ecmfile->content = $textforfulltextindex;
2424 $ecmfile->keywords = $keywords;
2428 $result = $ecmfile->create($user);
2454 dol_syslog(
"deleteFilesIntoDatabaseIndex: dir parameter can't be empty", LOG_ERR);
2458 dol_syslog(
"deleteFilesIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2462 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2464 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2466 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2467 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2470 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'ecm_files';
2472 $sql .=
' WHERE entity = ' . ((int)
$object->entity);
2474 $sql .=
' WHERE entity = ' . ((int)
$conf->entity);
2476 $sql .=
" AND filepath = '".$db->escape($rel_dir).
"'";
2478 $sql .=
" AND filename = '".$db->escape($file).
"'";
2481 $sql .=
" AND gen_or_uploaded = '".$db->escape($mode).
"'";
2484 $resql =
$db->query($sql);
2511 if (!is_file($filePath) || !is_readable($filePath)) {
2516 $handle = fopen($filePath,
'rb');
2520 $header = fread($handle, 5);
2523 if ($header !==
'%PDF-') {
2553 if (class_exists(
'Imagick')) {
2554 $image =
new Imagick();
2560 dol_syslog(
"We try to convert a PDF file with name ".$fileinput.
" but it is not a real PDF file (hack attempt ?).", LOG_WARNING);
2564 $filetoconvert = $fileinput.(($page !=
'') ?
'['.$page.
']' :
'');
2566 $ret = $image->readImage($filetoconvert);
2568 $ext = pathinfo($fileinput, PATHINFO_EXTENSION);
2569 dol_syslog(
"Failed to read image using Imagick (Try to install package 'apt-get install php-imagick ghostscript' and check there is no policy to disable ".$ext.
" conversion in /etc/ImageMagick*/policy.xml): ".$e->getMessage(), LOG_WARNING);
2574 $ret = $image->setImageFormat($ext);
2576 if (empty($fileoutput)) {
2577 $fileoutput = $fileinput.
".".$ext;
2580 $count = $image->getNumberImages();
2582 if (!
dol_is_file($fileoutput) || is_writable($fileoutput)) {
2584 $ret = $image->writeImages($fileoutput,
true);
2589 dol_syslog(
"Warning: Failed to write cache preview file '.$fileoutput.'. Check permission on file/dir", LOG_ERR);
2619function dol_compress_file($inputfile, $outputfile, $mode =
"gz", &$errorstring =
null)
2625 dol_syslog(
"dol_compress_file mode=".$mode.
" inputfile=".$inputfile.
" outputfile=".$outputfile);
2628 $compressdata =
null;
2629 if ($mode ==
'gz' && function_exists(
'gzencode')) {
2631 $compressdata = gzencode($data, 9);
2632 } elseif ($mode ==
'bz' && function_exists(
'bzcompress')) {
2634 $compressdata = bzcompress($data, 9);
2635 } elseif ($mode ==
'zstd' && function_exists(
'zstd_compress')) {
2637 $compressdata = zstd_compress($data, 9);
2638 } elseif ($mode ==
'zip') {
2639 if (class_exists(
'ZipArchive') &&
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS')) {
2642 $rootPath = realpath($inputfile);
2644 dol_syslog(
"Class ZipArchive is set so we zip using ZipArchive to zip into ".$outputfile.
' rootPath='.$rootPath);
2645 $zip =
new ZipArchive();
2647 if ($zip->open($outputfile, ZipArchive::CREATE) !==
true) {
2648 $errorstring =
"dol_compress_file failure - Failed to open file ".$outputfile.
"\n";
2652 $errormsg = $errorstring;
2659 $files =
new RecursiveIteratorIterator(
2660 new RecursiveDirectoryIterator($rootPath, FilesystemIterator::UNIX_PATHS),
2661 RecursiveIteratorIterator::LEAVES_ONLY
2663 '@phan-var-force SplFileInfo[] $files';
2665 foreach ($files as $name => $file) {
2667 if (!$file->isDir()) {
2669 $filePath = $file->getPath();
2670 $fileName = $file->getFilename();
2671 $fileFullRealPath = $file->getRealPath();
2674 $relativePath = substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($rootPath) + 1);
2677 $zip->addFile($fileFullRealPath, $relativePath);
2684 dol_syslog(
"dol_compress_file success - ".$zip->numFiles.
" files");
2688 if (defined(
'ODTPHP_PATHTOPCLZIP')) {
2691 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2692 $archive =
new PclZip($outputfile);
2694 $result = $archive->add($inputfile, PCLZIP_OPT_REMOVE_PATH, dirname($inputfile));
2696 if ($result === 0) {
2698 $errormsg = $archive->errorInfo(
true);
2700 if ($archive->errorCode() == PCLZIP_ERR_WRITE_OPEN_FAIL) {
2701 $errorstring =
"PCLZIP_ERR_WRITE_OPEN_FAIL";
2702 dol_syslog(
"dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL", LOG_ERR);
2706 $errorstring =
"dol_compress_file error archive->errorCode = ".$archive->errorCode().
" errormsg=".$errormsg;
2707 dol_syslog(
"dol_compress_file failure - ".$errormsg, LOG_ERR);
2710 dol_syslog(
"dol_compress_file success - ".count($result).
" files");
2716 if ($foundhandler && is_string($compressdata)) {
2717 $fp = fopen($outputfile,
"w");
2718 fwrite($fp, $compressdata);
2722 $errorstring =
"Try to zip with format ".$mode.
" with no handler for this format";
2726 $errormsg = $errorstring;
2730 global $langs, $errormsg;
2731 $langs->load(
"errors");
2732 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir");
2734 $errorstring =
"Failed to open file ".$outputfile;
2752 $fileinfo = pathinfo($inputfile);
2753 $fileinfo[
"extension"] = strtolower($fileinfo[
"extension"]);
2755 if ($fileinfo[
"extension"] ==
"zip") {
2756 if (defined(
'ODTPHP_PATHTOPCLZIP') && !
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS')) {
2757 dol_syslog(
"Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.
", so we use Pclzip to unzip into ".$outputdir);
2758 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2759 $archive =
new PclZip($inputfile);
2766 $result = $archive->extract(PCLZIP_OPT_PATH, $outputdir, PCLZIP_OPT_BY_PREG,
'/^((?!\.\.).)*$/');
2768 return array(
'error' => $e->getMessage());
2771 if (!is_array($result) && $result <= 0) {
2772 return array(
'error' => $archive->errorInfo(
true));
2777 foreach ($result as $key => $val) {
2778 if ($val[
'status'] ==
'path_creation_fail') {
2779 $langs->load(
"errors");
2781 $errmsg = $langs->trans(
"ErrorFailToCreateDir", $val[
'filename']);
2784 if ($val[
'status'] ==
'write_protected') {
2785 $langs->load(
"errors");
2787 $errmsg = $langs->trans(
"ErrorFailToCreateFile", $val[
'filename']);
2795 return array(
'error' => $errmsg);
2800 if (class_exists(
'ZipArchive')) {
2801 dol_syslog(
"Class ZipArchive is set so we unzip using ZipArchive to unzip into ".$outputdir);
2802 $zip =
new ZipArchive();
2803 $res = $zip->open($inputfile);
2804 if ($res ===
true) {
2810 for ($i = 0; $i < $zip->numFiles; $i++) {
2811 if (preg_match(
'/\.\./', $zip->getNameIndex($i))) {
2812 dol_syslog(
"Warning: Try to unzip a file with a transversal path ".$zip->getNameIndex($i), LOG_WARNING);
2815 $zip->extractTo($outputdir.
'/', array($zip->getNameIndex($i)));
2821 return array(
'error' =>
'ErrUnzipFails');
2825 return array(
'error' =>
'ErrNoZipEngine');
2826 } elseif (in_array($fileinfo[
"extension"], array(
'gz',
'bz2',
'zst'))) {
2827 include_once DOL_DOCUMENT_ROOT.
"/core/class/utils.class.php";
2835 $extension = strtolower(pathinfo($fileinfo[
"filename"], PATHINFO_EXTENSION));
2836 if ($extension ==
"tar") {
2839 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0, $outputfilename.
'.err', 0);
2840 if ($resarray[
"result"] != 0) {
2841 $resarray[
"error"] .= file_get_contents($outputfilename.
'.err');
2845 if ($fileinfo[
"extension"] ==
"gz") {
2847 } elseif ($fileinfo[
"extension"] ==
"bz2") {
2849 } elseif ($fileinfo[
"extension"] ==
"zst") {
2852 return array(
'error' =>
'ErrorBadFileExtension');
2855 $cmd .=
' > '.$outputfilename;
2857 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0,
null, 1, $outputfilename.
'.err');
2858 if ($resarray[
"result"] != 0) {
2859 $errfilecontent = @file_get_contents($outputfilename.
'.err');
2860 if ($errfilecontent) {
2861 $resarray[
"error"] .=
" - ".$errfilecontent;
2865 return $resarray[
"result"] != 0 ? array(
'error' => $resarray[
"error"]) : array();
2868 return array(
'error' =>
'ErrorBadFileExtension');
2884function dol_compress_dir($inputdir, $outputfile, $mode =
"zip", $excludefiles =
'', $rootdirinzip =
'', $newmask =
'0')
2888 dol_syslog(
"Try to zip dir ".$inputdir.
" into ".$outputfile.
" mode=".$mode);
2890 if (!
dol_is_dir(dirname($outputfile)) || !is_writable(dirname($outputfile))) {
2891 global $langs, $errormsg;
2892 $langs->load(
"errors");
2893 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir", $outputfile);
2898 if ($mode ==
'gz') {
2900 } elseif ($mode ==
'bz') {
2902 } elseif ($mode ==
'zip') {
2916 if (class_exists(
'ZipArchive')) {
2920 $zip =
new ZipArchive();
2921 $result = $zip->open($outputfile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
2922 if ($result !==
true) {
2923 global $langs, $errormsg;
2924 $langs->load(
"errors");
2925 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile);
2932 $files =
new RecursiveIteratorIterator(
2933 new RecursiveDirectoryIterator($inputdir, FilesystemIterator::UNIX_PATHS),
2934 RecursiveIteratorIterator::LEAVES_ONLY
2936 '@phan-var-force SplFileInfo[] $files';
2939 foreach ($files as $name => $file) {
2941 if (!$file->isDir()) {
2943 $filePath = $file->getPath();
2944 $fileName = $file->getFilename();
2945 $fileFullRealPath = $file->getRealPath();
2948 $relativePath = ($rootdirinzip ? $rootdirinzip.
'/' :
'').substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($inputdir) + 1);
2951 if (empty($excludefiles) || !preg_match($excludefiles, $fileFullRealPath)) {
2953 $zip->addFile($fileFullRealPath, $relativePath);
2964 if (empty($newmask)) {
2965 dol_syslog(
"Warning: dol_compress_dir called with empty value for newmask and no default value defined", LOG_WARNING);
2975 if (!$foundhandler) {
2976 dol_syslog(
"Try to zip with format ".$mode.
" with no handler for this format", LOG_ERR);
2982 global $langs, $errormsg;
2983 $langs->load(
"errors");
2984 dol_syslog(
"Failed to open file ".$outputfile, LOG_ERR);
2986 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile).
' - '.$e->getMessage();
3003function dol_most_recent_file($dir, $regexfilter =
'', $excludefilter = array(
'(\.meta|_preview.*\.png)$',
'^\.'), $nohook = 0, $mode = 0)
3005 $tmparray =
dol_dir_list($dir,
'files', 0, $regexfilter, $excludefilter,
'date', SORT_DESC, $mode, $nohook);
3006 return isset($tmparray[0]) ? $tmparray[0] :
null;
3024 global
$conf,
$db, $user, $hookmanager;
3025 global $dolibarr_main_data_root, $dolibarr_main_document_root_alt;
3028 if (!is_object($fuser)) {
3032 if (empty($modulepart)) {
3033 return 'ErrorBadParameter';
3035 if (empty($entity)) {
3043 if ($modulepart ==
'facture') {
3044 $modulepart =
'invoice';
3045 } elseif ($modulepart ==
'users') {
3046 $modulepart =
'user';
3047 } elseif ($modulepart ==
'tva') {
3048 $modulepart =
'tax-vat';
3049 } elseif ($modulepart ==
'expedition' && strpos($original_file,
'receipt/') === 0) {
3051 $modulepart =
'delivery';
3052 } elseif ($modulepart ==
'propale') {
3053 $modulepart =
'propal';
3057 dol_syslog(
'dol_check_secure_access_document modulepart='.$modulepart.
' original_file='.$original_file.
' entity='.$entity);
3061 $sqlprotectagainstexternals =
'';
3065 if (empty($refname)) {
3066 $refname = basename(dirname($original_file).
"/");
3067 if ($refname ==
'thumbs' || $refname ==
'temp') {
3069 $refname = basename(dirname(dirname($original_file)).
"/");
3076 $download =
'download';
3077 if ($mode ==
'write') {
3080 $download =
'upload';
3084 if ($modulepart ==
'common') {
3087 $original_file = DOL_DOCUMENT_ROOT.
'/public/theme/common/'.$original_file;
3088 } elseif ($modulepart ==
'medias' && !empty($dolibarr_main_data_root)) {
3090 if (empty($entity)) {
3094 if ($mode ==
'write') {
3095 if ($fuser->hasRight(
'website',
'write')) {
3101 $original_file = (empty(
$conf->medias->multidir_output[$entity]) ? (empty(
$conf->medias->dir_output) ? DOL_DATA_ROOT.
'/medias' :
$conf->medias->dir_output) :
$conf->medias->multidir_output[$entity]).
'/'.$original_file;
3102 } elseif ($modulepart ==
'logs' && !empty($dolibarr_main_data_root)) {
3104 $accessallowed = ($user->admin && basename($original_file) == $original_file && preg_match(
'/^dolibarr.*\.(log|json)$/', basename($original_file)));
3105 $original_file = $dolibarr_main_data_root.
'/'.$original_file;
3106 } elseif ($modulepart ==
'doctemplates' && !empty($dolibarr_main_data_root)) {
3107 $accessallowed = $user->admin;
3108 $relative_file = $original_file;
3109 $ent = ($entity > 0 ? $entity :
$conf->entity);
3110 $path_with_entity = $dolibarr_main_data_root .
'/' . $ent .
'/doctemplates/' . $relative_file;
3111 if ($ent > 1 && file_exists(
dol_osencode($path_with_entity))) {
3112 $original_file = $path_with_entity;
3114 $original_file = $dolibarr_main_data_root .
'/doctemplates/' . $relative_file;
3116 } elseif ($modulepart ==
'doctemplateswebsite' && !empty($dolibarr_main_data_root)) {
3118 $accessallowed = ($fuser->hasRight(
'website',
'write') && preg_match(
'/\.jpg$/i', basename($original_file)));
3119 $original_file = $dolibarr_main_data_root.
'/doctemplates/websites/'.$original_file;
3120 } elseif ($modulepart ==
'packages' && !empty($dolibarr_main_data_root)) {
3123 $tmp = explode(
',', $dolibarr_main_document_root_alt);
3126 $accessallowed = ($user->admin && preg_match(
'/^module_.*\.zip$/', basename($original_file)));
3127 $original_file = $dirins.
'/'.$original_file;
3128 } elseif ($modulepart ==
'mycompany' && !empty(
$conf->mycompany->dir_output)) {
3131 $original_file =
$conf->mycompany->dir_output.
'/'.$original_file;
3132 } elseif ($modulepart ==
'userphoto' && !empty(
$conf->user->dir_output)) {
3135 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3138 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3139 } elseif ($modulepart ==
'userphotopublic' && !empty(
$conf->user->dir_output)) {
3144 if (preg_match(
'/^(\d+)\/photos\//', $original_file, $reg)) {
3145 if ((
int) $reg[1]) {
3147 $tmpobject->fetch((
int) $reg[1],
'',
'', 1);
3149 $securekey =
GETPOST(
'securekey',
'alpha', 1);
3151 global $dolibarr_main_cookie_cryptkey, $dolibarr_main_instance_unique_id;
3152 $valuetouse = $dolibarr_main_instance_unique_id ? $dolibarr_main_instance_unique_id : $dolibarr_main_cookie_cryptkey;
3153 $encodedsecurekey =
dol_hash($valuetouse.
'uservirtualcard'.$tmpobject->id.
'-'.$tmpobject->login,
'md5');
3154 if ($encodedsecurekey == $securekey) {
3163 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3164 } elseif (($modulepart ==
'companylogo') && !empty(
$conf->mycompany->dir_output)) {
3167 $original_file =
$conf->mycompany->dir_output.
'/logos/'.$original_file;
3168 } elseif ($modulepart ==
'memberphoto' && !empty(
$conf->member->dir_output)) {
3172 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3176 if (preg_match(
'/^MEM\d\d\d\d-\d\d\d\d\/photos\//', $original_file)) {
3179 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3180 } elseif ($modulepart ==
'apercufacture' && !empty(
$conf->invoice->multidir_output[$entity])) {
3182 if ($fuser->hasRight(
'facture', $lire)) {
3185 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3186 } elseif ($modulepart ==
'apercupropal' && !empty(
$conf->propal->multidir_output[$entity])) {
3188 if ($fuser->hasRight(
'propal', $lire)) {
3191 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3192 } elseif ($modulepart ==
'apercucommande' && !empty(
$conf->order->multidir_output[$entity])) {
3194 if ($fuser->hasRight(
'commande', $lire)) {
3197 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3198 } elseif (($modulepart ==
'apercufichinter' || $modulepart ==
'apercuficheinter') && !empty(
$conf->ficheinter->dir_output)) {
3200 if ($fuser->hasRight(
'ficheinter', $lire)) {
3203 $original_file =
$conf->ficheinter->dir_output.
'/'.$original_file;
3204 } elseif (($modulepart ==
'apercucontract') && !empty(
$conf->contract->multidir_output[$entity])) {
3206 if ($fuser->hasRight(
'contrat', $lire)) {
3209 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3210 } elseif (($modulepart ==
'apercusupplier_proposal') && !empty(
$conf->supplier_proposal->dir_output)) {
3212 if ($fuser->hasRight(
'supplier_proposal', $lire)) {
3215 $original_file =
$conf->supplier_proposal->dir_output.
'/'.$original_file;
3216 } elseif (($modulepart ==
'apercusupplier_order') && !empty(
$conf->fournisseur->commande->dir_output)) {
3218 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3221 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3222 } elseif (($modulepart ==
'apercusupplier_invoice') && !empty(
$conf->fournisseur->facture->dir_output)) {
3224 if ($fuser->hasRight(
'fournisseur', $lire)) {
3227 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3228 } elseif (($modulepart ==
'holiday') && !empty(
$conf->holiday->dir_output)) {
3229 if ($fuser->hasRight(
'holiday', $read) || $fuser->hasRight(
'holiday',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3232 if ($refname && !$fuser->hasRight(
'holiday',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3233 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
3235 $tmpholiday->fetch(0, $refname);
3236 $accessallowed =
checkUserAccessToObject($user, array(
'holiday'), $tmpholiday,
'holiday',
'',
'',
'rowid',
'');
3239 $original_file =
$conf->holiday->dir_output.
'/'.$original_file;
3240 } elseif (($modulepart ==
'expensereport') && !empty(
$conf->expensereport->dir_output)) {
3241 if ($fuser->hasRight(
'expensereport', $lire) || $fuser->hasRight(
'expensereport',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3244 if ($refname && !$fuser->hasRight(
'expensereport',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3245 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
3247 $tmpexpensereport->fetch(0, $refname);
3248 $accessallowed =
checkUserAccessToObject($user, array(
'expensereport'), $tmpexpensereport,
'expensereport',
'',
'',
'rowid',
'');
3251 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3252 } elseif (($modulepart ==
'apercuexpensereport') && !empty(
$conf->expensereport->dir_output)) {
3254 if ($fuser->hasRight(
'expensereport', $lire)) {
3257 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3258 } elseif ($modulepart ==
'propalstats' && !empty(
$conf->propal->multidir_temp[$entity])) {
3260 if ($fuser->hasRight(
'propal', $lire)) {
3263 $original_file =
$conf->propal->multidir_temp[$entity].
'/'.$original_file;
3264 } elseif ($modulepart ==
'orderstats' && !empty(
$conf->order->dir_temp)) {
3266 if ($fuser->hasRight(
'commande', $lire)) {
3269 $original_file =
$conf->order->dir_temp.
'/'.$original_file;
3270 } elseif ($modulepart ==
'orderstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3271 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3274 $original_file =
$conf->fournisseur->commande->dir_temp.
'/'.$original_file;
3275 } elseif ($modulepart ==
'billstats' && !empty(
$conf->invoice->dir_temp)) {
3277 if ($fuser->hasRight(
'facture', $lire)) {
3280 $original_file =
$conf->invoice->dir_temp.
'/'.$original_file;
3281 } elseif ($modulepart ==
'billstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3282 if ($fuser->hasRight(
'fournisseur',
'facture', $lire)) {
3285 $original_file =
$conf->fournisseur->facture->dir_temp.
'/'.$original_file;
3286 } elseif ($modulepart ==
'expeditionstats' && !empty(
$conf->expedition->dir_temp)) {
3288 if ($fuser->hasRight(
'expedition', $lire)) {
3291 $original_file =
$conf->expedition->dir_temp.
'/'.$original_file;
3292 } elseif ($modulepart ==
'tripsexpensesstats' && !empty(
$conf->deplacement->dir_temp)) {
3294 if ($fuser->hasRight(
'deplacement', $lire)) {
3297 $original_file =
$conf->deplacement->dir_temp.
'/'.$original_file;
3298 } elseif ($modulepart ==
'memberstats' && !empty(
$conf->member->dir_temp)) {
3300 if ($fuser->hasRight(
'adherent', $lire)) {
3303 $original_file =
$conf->member->dir_temp.
'/'.$original_file;
3304 } elseif (preg_match(
'/^productstats_/i', $modulepart) && !empty(
$conf->product->dir_temp)) {
3306 if ($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) {
3309 $original_file = (!empty(
$conf->product->multidir_temp[$entity]) ?
$conf->product->multidir_temp[$entity] :
$conf->service->multidir_temp[$entity]).
'/'.$original_file;
3310 } elseif (in_array($modulepart, array(
'tax',
'tax-vat',
'tva')) && !empty(
$conf->tax->dir_output)) {
3312 if ($fuser->hasRight(
'tax',
'charges', $lire)) {
3315 $modulepartsuffix = str_replace(
'tax-',
'', $modulepart);
3316 $original_file =
$conf->tax->dir_output.
'/'.($modulepartsuffix !=
'tax' ? $modulepartsuffix.
'/' :
'').$original_file;
3317 } elseif (($modulepart ==
'actions' || $modulepart ==
'actioncomm') && !empty(
$conf->agenda->dir_output)) {
3319 if ($fuser->hasRight(
'agenda',
'myactions', $read)) {
3322 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3323 include_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3325 $tmpobject->fetch((
int) $refname);
3326 $accessallowed =
checkUserAccessToObject($user, array(
'agenda'), $tmpobject->id,
'actioncomm&societe',
'myactions|allactions',
'fk_soc',
'id',
'');
3327 if ($user->socid && $tmpobject->socid) {
3332 $original_file =
$conf->agenda->dir_output.
'/'.$original_file;
3333 } elseif ($modulepart ==
'category' && !empty(
$conf->categorie->multidir_output[$entity])) {
3335 if (empty($entity) || empty(
$conf->categorie->multidir_output[$entity])) {
3336 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3338 if ($fuser->hasRight(
"categorie", $lire) || $fuser->hasRight(
"takepos",
"run")) {
3341 $original_file =
$conf->categorie->multidir_output[$entity].
'/'.$original_file;
3342 } elseif ($modulepart ==
'prelevement' && !empty(
$conf->prelevement->dir_output)) {
3344 if ($fuser->hasRight(
'prelevement',
'bons', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3347 $original_file =
$conf->prelevement->dir_output.
'/'.$original_file;
3348 } elseif ($modulepart ==
'graph_stock' && !empty(
$conf->stock->dir_temp)) {
3351 $original_file =
$conf->stock->dir_temp.
'/'.$original_file;
3352 } elseif ($modulepart ==
'graph_fourn' && !empty(
$conf->fournisseur->dir_temp)) {
3355 $original_file =
$conf->fournisseur->dir_temp.
'/'.$original_file;
3356 } elseif ($modulepart ==
'graph_product' && !empty(
$conf->product->dir_temp)) {
3359 $original_file =
$conf->product->multidir_temp[$entity].
'/'.$original_file;
3360 } elseif ($modulepart ==
'barcode') {
3365 $original_file =
'';
3366 } elseif ($modulepart ==
'iconmailing' && !empty(
$conf->mailing->dir_temp)) {
3369 $original_file =
$conf->mailing->dir_temp.
'/'.$original_file;
3370 } elseif ($modulepart ==
'scanner_user_temp' && !empty(
$conf->scanner->dir_temp)) {
3373 $original_file =
$conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3374 } elseif ($modulepart ==
'fckeditor' && !empty(
$conf->fckeditor->dir_output)) {
3377 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3378 } elseif ($modulepart ==
'user' && !empty(
$conf->user->dir_output)) {
3380 $canreaduser = (!empty($fuser->admin) || $fuser->hasRight(
'user',
'user', $lire));
3381 if ($fuser->id == (
int) $refname) {
3384 if ($canreaduser || preg_match(
'/^specimen/i', $original_file)) {
3387 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3388 } elseif (($modulepart ==
'company' || $modulepart ==
'societe' || $modulepart ==
'thirdparty') && !empty(
$conf->societe->multidir_output[$entity])) {
3390 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3391 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3393 if ($fuser->hasRight(
'societe', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3396 $original_file =
$conf->societe->multidir_output[$entity].
'/'.$original_file;
3397 $sqlprotectagainstexternals =
"SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX.
"societe WHERE rowid='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'societe').
")";
3398 } elseif (($modulepart ==
'contact' || $modulepart ==
'socpeople') && !empty(
$conf->societe->multidir_output[$entity])) {
3400 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3401 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3403 if ($fuser->hasRight(
'societe', $lire)) {
3406 $original_file =
$conf->societe->multidir_output[$entity].
'/contact/'.$original_file;
3407 } elseif (($modulepart ==
'facture' || $modulepart ==
'invoice') && !empty(
$conf->invoice->multidir_output[$entity])) {
3409 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3412 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3413 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'invoice').
")";
3414 } elseif ($modulepart ==
'massfilesarea_proposals' && !empty(
$conf->propal->multidir_output[$entity])) {
3416 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3419 $original_file =
$conf->propal->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3420 } elseif ($modulepart ==
'massfilesarea_orders') {
3421 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3424 $original_file =
$conf->order->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3425 } elseif ($modulepart ==
'massfilesarea_sendings') {
3426 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3429 $original_file =
$conf->expedition->dir_output.
'/sending/temp/massgeneration/'.$user->id.
'/'.$original_file;
3430 } elseif ($modulepart ==
'massfilesarea_receipts') {
3431 if ($fuser->hasRight(
'reception', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3434 $original_file =
$conf->reception->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3435 } elseif ($modulepart ==
'massfilesarea_invoices') {
3436 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3439 $original_file =
$conf->invoice->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3440 } elseif ($modulepart ==
'massfilesarea_expensereport') {
3441 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3444 $original_file =
$conf->expensereport->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3445 } elseif ($modulepart ==
'massfilesarea_interventions') {
3446 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3449 $original_file =
$conf->ficheinter->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3450 } elseif ($modulepart ==
'massfilesarea_supplier_proposal' && !empty(
$conf->supplier_proposal->dir_output)) {
3451 if ($fuser->hasRight(
'supplier_proposal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3454 $original_file =
$conf->supplier_proposal->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3455 } elseif ($modulepart ==
'massfilesarea_supplier_order') {
3456 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3459 $original_file =
$conf->fournisseur->commande->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3460 } elseif ($modulepart ==
'massfilesarea_supplier_invoice') {
3461 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3464 $original_file =
$conf->fournisseur->facture->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3465 } elseif ($modulepart ==
'massfilesarea_contract' && !empty(
$conf->contract->dir_output)) {
3466 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3469 $original_file =
$conf->contract->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3470 } elseif ($modulepart ==
'massfilesarea_stock' && !empty(
$conf->stock->dir_output)) {
3471 if ($fuser->hasRight(
'stock', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3474 $original_file =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3475 } elseif (($modulepart ==
'fichinter' || $modulepart ==
'ficheinter') && !empty(
$conf->ficheinter->dir_output)) {
3477 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3480 $original_file =
$conf->ficheinter->dir_output.
'/'.$original_file;
3481 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"fichinter WHERE ref='".
$db->escape($refname).
"' AND entity=".
$conf->entity;
3482 } elseif ($modulepart ==
'deplacement' && !empty(
$conf->deplacement->dir_output)) {
3484 if ($fuser->hasRight(
'deplacement', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3487 $original_file =
$conf->deplacement->dir_output.
'/'.$original_file;
3489 } elseif (($modulepart ==
'propal' || $modulepart ==
'propale') && isset(
$conf->propal->multidir_output[$entity])) {
3491 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3494 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3495 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"propal WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'propal').
")";
3496 } elseif (($modulepart ==
'commande' || $modulepart ==
'order') && !empty(
$conf->order->multidir_output[$entity])) {
3498 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3501 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3502 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'order').
")";
3503 } elseif ($modulepart ==
'project' && !empty(
$conf->project->multidir_output[$entity])) {
3505 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3508 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3509 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
3511 $tmpproject->fetch(0, $refname);
3512 $accessallowed =
checkUserAccessToObject($user, array(
'projet'), $tmpproject->id,
'projet&project',
'',
'',
'rowid',
'');
3515 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3516 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3517 } elseif ($modulepart ==
'project_task' && !empty(
$conf->project->multidir_output[$entity])) {
3518 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3521 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3522 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
3524 $tmptask->fetch(0, $refname);
3525 $accessallowed =
checkUserAccessToObject($user, array(
'projet_task'), $tmptask->id,
'projet_task&project',
'',
'',
'rowid',
'');
3528 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3529 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3530 } elseif (($modulepart ==
'commande_fournisseur' || $modulepart ==
'order_supplier') && !empty(
$conf->fournisseur->commande->dir_output)) {
3532 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3535 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3536 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande_fournisseur WHERE ref='".
$db->escape($refname).
"' AND entity=".
$conf->entity;
3537 } elseif (($modulepart ==
'facture_fournisseur' || $modulepart ==
'invoice_supplier') && !empty(
$conf->fournisseur->facture->dir_output)) {
3539 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3542 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3543 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture_fourn WHERE ref='".
$db->escape($refname).
"' AND entity=".
$conf->entity;
3544 } elseif ($modulepart ==
'supplier_payment') {
3546 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3549 $original_file = preg_replace(
"/payment\//",
"", $original_file);
3550 $original_file =
$conf->fournisseur->payment->dir_output.
'/'.$original_file;
3551 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"paiementfournisseur WHERE ref='".
$db->escape($refname).
"' AND entity=".
$conf->entity;
3552 } elseif ($modulepart ==
'payment') {
3554 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3557 $original_file =
$conf->compta->payment->dir_output.
'/'.$original_file;
3558 } elseif ($modulepart ==
'facture_paiement' && !empty(
$conf->invoice->dir_output)) {
3560 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3563 if ($fuser->socid > 0) {
3564 $original_file =
$conf->invoice->dir_output.
'/payments/private/'.$fuser->id.
'/'.$original_file;
3566 $original_file =
$conf->invoice->dir_output.
'/payments/'.$original_file;
3568 } elseif ($modulepart ==
'export_compta' && !empty(
$conf->accounting->dir_output)) {
3570 if ($fuser->hasRight(
'accounting',
'bind',
'write') || preg_match(
'/^specimen/i', $original_file)) {
3573 $original_file =
$conf->accounting->dir_output.
'/'.$original_file;
3574 } elseif (($modulepart ==
'expedition' || $modulepart ==
'shipment' || $modulepart ==
'shipping') && !empty(
$conf->expedition->dir_output)) {
3576 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3579 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'sending/') === 0 ?
'' :
'sending/').$original_file;
3581 } elseif (($modulepart ==
'livraison' || $modulepart ==
'delivery') && !empty(
$conf->expedition->dir_output)) {
3583 if ($fuser->hasRight(
'expedition',
'delivery', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3586 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'receipt/') === 0 ?
'' :
'receipt/').$original_file;
3587 } elseif ($modulepart ==
'actionsreport' && !empty(
$conf->agenda->dir_temp)) {
3589 if ($fuser->hasRight(
'agenda',
'allactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3592 $original_file =
$conf->agenda->dir_temp.
"/".$original_file;
3593 } elseif ($modulepart ==
'product' || $modulepart ==
'produit' || $modulepart ==
'service' || $modulepart ==
'produit|service') {
3595 if (empty($entity) || (empty(
$conf->product->multidir_output[$entity]) && empty(
$conf->service->multidir_output[$entity]))) {
3596 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3598 if (($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3602 $original_file =
$conf->product->multidir_output[$entity].
'/'.$original_file;
3604 $original_file =
$conf->service->multidir_output[$entity].
'/'.$original_file;
3606 } elseif ($modulepart ==
'product_batch' || $modulepart ==
'produitlot') {
3608 if (empty($entity) || (empty(
$conf->productbatch->multidir_output[$entity]))) {
3609 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3611 if (($fuser->hasRight(
'produit', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3615 $original_file =
$conf->productbatch->multidir_output[$entity].
'/'.$original_file;
3617 } elseif ($modulepart ==
'movement' || $modulepart ==
'mouvement') {
3619 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3620 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3622 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3626 $original_file =
$conf->stock->multidir_output[$entity].
'/movement/'.$original_file;
3628 } elseif ($modulepart ==
'entrepot') {
3630 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3631 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3633 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3637 $original_file =
$conf->stock->multidir_output[$entity].
'/'.$original_file;
3639 } elseif ($modulepart ==
'contract' && !empty(
$conf->contract->multidir_output[$entity])) {
3641 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3644 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3645 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"contrat WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'contract').
")";
3646 } elseif ($modulepart ==
'donation' && !empty(
$conf->don->dir_output)) {
3648 if ($fuser->hasRight(
'don', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3651 $original_file =
$conf->don->dir_output.
'/'.$original_file;
3652 } elseif ($modulepart ==
'dolresource' && !empty(
$conf->resource->dir_output)) {
3654 if ($fuser->hasRight(
'resource', $read) || preg_match(
'/^specimen/i', $original_file)) {
3657 $original_file =
$conf->resource->dir_output.
'/'.$original_file;
3658 } elseif (($modulepart ==
'remisecheque' || $modulepart ==
'chequereceipt') && !empty(
$conf->bank->dir_output)) {
3660 if ($fuser->hasRight(
'banque', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3663 $original_file =
$conf->bank->dir_output.
'/checkdeposits/'.$original_file;
3664 } elseif (($modulepart ==
'banque' || $modulepart ==
'bank') && !empty(
$conf->bank->dir_output)) {
3666 if ($fuser->hasRight(
'banque', $lire)) {
3669 $original_file =
$conf->bank->dir_output.
'/'.$original_file;
3670 } elseif ($modulepart ==
'export' && !empty(
$conf->export->dir_temp)) {
3673 $accessallowed = $user->hasRight(
'export',
'lire');
3674 $original_file =
$conf->export->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3675 } elseif ($modulepart ==
'import' && !empty(
$conf->import->dir_temp)) {
3677 $accessallowed = $user->hasRight(
'import',
'run');
3678 $original_file =
$conf->import->dir_temp.
'/'.$original_file;
3679 } elseif ($modulepart ==
'recruitment' && !empty(
$conf->recruitment->dir_output)) {
3681 $accessallowed = $user->hasRight(
'recruitment',
'recruitmentjobposition',
'read');
3682 $original_file =
$conf->recruitment->dir_output.
'/'.$original_file;
3683 } elseif ($modulepart ==
'hrm' && !empty(
$conf->hrm->dir_output)) {
3685 $accessallowed = $user->hasRight(
'hrm',
'all',
'read');
3686 $original_file =
$conf->hrm->dir_output.
'/'.$original_file;
3687 } elseif ($modulepart ==
'editor' && !empty(
$conf->fckeditor->dir_output)) {
3690 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3691 } elseif ($modulepart ==
'systemtools' && !empty(
$conf->admin->dir_output)) {
3693 if ($fuser->admin) {
3696 $original_file =
$conf->admin->dir_output.
'/'.$original_file;
3697 } elseif ($modulepart ==
'admin_temp' && !empty(
$conf->admin->dir_temp)) {
3699 if ($fuser->admin) {
3702 $original_file =
$conf->admin->dir_temp.
'/'.$original_file;
3703 } elseif ($modulepart ==
'bittorrent' && !empty(
$conf->bittorrent->dir_output)) {
3707 if (dol_mimetype($original_file) ==
'application/x-bittorrent') {
3710 $original_file =
$conf->bittorrent->dir_output.
'/'.$dir.
'/'.$original_file;
3711 } elseif ($modulepart ==
'member' && !empty(
$conf->member->dir_output)) {
3713 if ($fuser->hasRight(
'adherent', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3716 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3717 } elseif ($modulepart ==
'ticket' && !empty(
$conf->ticket->multidir_output[$entity])) {
3719 if ($fuser->hasRight(
'ticket', $read)) {
3722 if (!isset($_SESSION[
'email_customer'])) {
3723 $sqlprotectagainstexternals =
'';
3725 $email_split = explode(
'@', $_SESSION[
'email_customer']);
3727 $sqlprotectagainstexternals =
'SELECT t.rowid, t.fk_soc FROM '.MAIN_DB_PREFIX.
'ticket t';
3728 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'element_contact ec ON ec.element_id = t.rowid';
3729 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'socpeople c ON c.rowid = ec.fk_socpeople';
3730 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_type_contact tc ON tc.element = "ticket" AND tc.rowid = ec.fk_c_type_contact';
3731 $sqlprotectagainstexternals .=
' WHERE t.ref LIKE "'.$db->sanitize($refname).
'"';
3732 $sqlprotectagainstexternals .=
' AND (';
3733 $sqlprotectagainstexternals .=
' (';
3734 $sqlprotectagainstexternals .=
' tc.rowid IS NOT NULL';
3735 $sqlprotectagainstexternals .=
' AND c.email = "'.$db->sanitize($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
'"';
3736 $sqlprotectagainstexternals .=
' )';
3737 $sqlprotectagainstexternals .=
' OR t.origin_email = "'.$db->sanitize($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
'"';
3738 $sqlprotectagainstexternals .=
' )';
3740 $original_file =
$conf->ticket->multidir_output[$entity].
'/'.$original_file;
3750 if (preg_match(
'/^specimen/i', $original_file)) {
3753 if ($fuser->admin) {
3757 $tmpmodulepart = explode(
'-', $modulepart);
3758 if (!empty($tmpmodulepart[1])) {
3759 $modulepart = $tmpmodulepart[0];
3760 $original_file = $tmpmodulepart[1].
'/'.$original_file;
3765 if (preg_match(
'/^([a-z]+)_user_temp$/i', $modulepart, $reg)) {
3766 $tmpmodule = $reg[1];
3767 if (empty(
$conf->$tmpmodule->dir_temp)) {
3768 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3771 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3774 $original_file =
$conf->{$reg[1]}->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3775 } elseif (preg_match(
'/^([a-z]+)_temp$/i', $modulepart, $reg)) {
3776 $tmpmodule = $reg[1];
3777 if (empty(
$conf->$tmpmodule->dir_temp)) {
3778 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3781 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3784 $original_file =
$conf->$tmpmodule->dir_temp.
'/'.$original_file;
3785 } elseif (preg_match(
'/^([a-z]+)_user$/i', $modulepart, $reg)) {
3786 $tmpmodule = $reg[1];
3787 if (empty(
$conf->$tmpmodule->dir_output)) {
3788 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3791 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3794 $original_file =
$conf->$tmpmodule->dir_output.
'/'.$fuser->id.
'/'.$original_file;
3795 } elseif (preg_match(
'/^massfilesarea_([a-z]+)$/i', $modulepart, $reg)) {
3796 $tmpmodule = $reg[1];
3797 if (empty(
$conf->$tmpmodule->dir_output)) {
3798 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3803 $partsofdirinoriginalfile = explode(
'/', $original_file);
3804 if (!empty($partsofdirinoriginalfile[1])) {
3805 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3806 if (($partofdirinoriginalfile && $fuser->hasRight($tmpmodule, $partofdirinoriginalfile,
'read')) || preg_match(
'/^specimen/i', $original_file)) {
3810 if ($fuser->hasRight($tmpmodule, $read) || preg_match(
'/^specimen/i', $original_file)) {
3813 $original_file =
$conf->$tmpmodule->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3815 if (empty(
$conf->$modulepart->dir_output)) {
3816 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
'). The module for this modulepart value may not be activated.');
3821 $partsofdirinoriginalfile = explode(
'/', $original_file);
3822 if (!empty($partsofdirinoriginalfile[1])) {
3823 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3824 if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile,
'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile,
'read'))) {
3828 if (($fuser->hasRight($modulepart, $lire) || $fuser->hasRight($modulepart, $read)) || ($fuser->hasRight($modulepart,
'all', $lire) || $fuser->hasRight($modulepart,
'all', $read))) {
3832 if (is_array(
$conf->$modulepart->multidir_output) && !empty(
$conf->$modulepart->multidir_output[$entity])) {
3833 $original_file =
$conf->$modulepart->multidir_output[$entity].
'/'.$original_file;
3835 $original_file =
$conf->$modulepart->dir_output.
'/'.$original_file;
3839 $parameters = array(
3840 'modulepart' => $modulepart,
3841 'original_file' => $original_file,
3842 'entity' => $entity,
3847 $reshook = $hookmanager->executeHooks(
'checkSecureAccess', $parameters,
$object);
3849 if (!empty($hookmanager->resArray[
'original_file'])) {
3850 $original_file = $hookmanager->resArray[
'original_file'];
3852 if (!empty($hookmanager->resArray[
'accessallowed'])) {
3853 $accessallowed = $hookmanager->resArray[
'accessallowed'];
3855 if (!empty($hookmanager->resArray[
'sqlprotectagainstexternals'])) {
3856 $sqlprotectagainstexternals = $hookmanager->resArray[
'sqlprotectagainstexternals'];
3862 'accessallowed' => ($accessallowed ? 1 : 0),
3863 'sqlprotectagainstexternals' => $sqlprotectagainstexternals,
3864 'original_file' => $original_file
3883 dol_syslog(
"Failed to create the cache directory ".$directory, LOG_WARNING);
3886 $cachefile = $directory.$filename;
3888 file_put_contents($cachefile, json_encode(
$object), LOCK_EX);
3903 $cachefile = $directory.$filename;
3904 $refresh = !file_exists($cachefile) || ($now - $cachetime) >
dol_filemtime($cachefile);
3917 $cachefile = $directory.$filename;
3918 $object = json_decode(file_get_contents($cachefile));
3930 return preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'\//',
'', $pathfile);
3945function getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path =
'', $pathref =
'', &$checksumconcat = array())
3953 if (!empty($dir->md5file)) {
3954 $entry = $dir->md5file;
3956 } elseif (!empty($dir->sha256file)) {
3957 $entry = $dir->sha256file;
3961 foreach ($entry as $file) {
3962 $filename = $path.$file[
'name'];
3963 $file_list[
'insignature'][] = $filename;
3964 $expectedsize = (empty($file[
'size']) ?
'' : $file[
'size']);
3965 $expectedhash = (
string) $file;
3967 if (!file_exists($pathref.
'/'.$filename)) {
3968 $file_list[
'missing'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'algo' => (
string) $algo);
3970 $hash_local = hash_file($algo, $pathref.
'/'.$filename);
3972 if (
$conffile ==
'/etc/dolibarr/conf.php' && $filename ==
'/filefunc.inc.php') {
3973 $checksumconcat[] = $expectedhash;
3975 if ($hash_local != $expectedhash) {
3976 $file_list[
'updated'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'hash' => (
string) $hash_local,
'algo' => (
string) $algo);
3978 $checksumconcat[] = $hash_local;
3983 foreach ($dir->dir as $subdir) {
3984 getFilesUpdated($file_list, $subdir, $path.$subdir[
'name'].
'/', $pathref, $checksumconcat);
4002 $out .=
'<div id="'.$htmlname.
'Message" class="dragDropAreaMessage hidden"><span>'.
img_picto(
"",
'download').
'<br>'.$langs->trans(
"DropFileToAddItToObject").
'</span></div>';
4003 $out .=
"\n<!-- JS CODE TO ENABLE DRAG AND DROP OF FILE -->\n";
4006 jQuery(document).ready(function() {
4007 var enterTargetDragDrop = null;
4009 $("#'.$htmlname.
'").addClass("cssDragDropArea");
4011 $(".cssDragDropArea").on("dragenter", function(ev, ui) {
4012 var dataTransfer = ev.originalEvent.dataTransfer;
4013 var dataTypes = dataTransfer.types;
4014 //console.log(dataTransfer);
4015 //console.log(dataTypes);
4017 if (!dataTypes || ($.inArray(\'Files\', dataTypes) === -1)) {
4018 // The element dragged is not a file, so we avoid the "dragenter"
4019 ev.preventDefault();
4023 // Entering drop area. Highlight area
4024 console.log("dragAndDropFileUpload: We add class highlightDragDropArea")
4025 enterTargetDragDrop = ev.target;
4026 $(this).addClass("highlightDragDropArea");
4027 $("#'.$htmlname.
'Message").removeClass("hidden");
4028 ev.preventDefault();
4031 $(".cssDragDropArea").on("dragleave", function(ev) {
4032 // Going out of drop area. Remove Highlight
4033 if (enterTargetDragDrop == ev.target){
4034 console.log("dragAndDropFileUpload: We remove class highlightDragDropArea")
4035 $("#'.$htmlname.
'Message").addClass("hidden");
4036 $(this).removeClass("highlightDragDropArea");
4040 $(".cssDragDropArea").on("dragover", function(ev) {
4041 ev.preventDefault();
4045 $(".cssDragDropArea").on("drop", function(e) {
4048 fd = new FormData();
4051 fd.append("token", "'.currentToken().
'");
4052 fd.append("action", "linkit");
4054 var dataTransfer = e.originalEvent.dataTransfer;
4056 if (dataTransfer.files && dataTransfer.files.length){
4057 var droppedFiles = e.originalEvent.dataTransfer.files;
4058 $.each(droppedFiles, function(index,file){
4059 fd.append("files[]", file,file.name)
4062 $(".cssDragDropArea").removeClass("highlightDragDropArea");
4063 counterdragdrop = 0;
4065 url: "'.DOL_URL_ROOT.
'/core/ajax/fileupload.php",
4070 success:function() {
4071 console.log("Uploaded.", arguments);
4072 /* arguments[0] is the json string of files */
4073 /* arguments[1] is the value for variable "success", can be 0 or 1 */
4074 let listoffiles = JSON.parse(arguments[0]);
4075 console.log(listoffiles);
4077 for (let i = 0; i < listoffiles.length; i++) {
4078 console.log(listoffiles[i].error);
4079 if (listoffiles[i].error) {
4083 console.log(nboferror);
4084 if (nboferror > 0) {
4085 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorOnAtLeastOneFileUpload:warnings";
4087 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=UploadFileDragDropSuccess:mesgs";
4091 console.log("Error Uploading.", arguments)
4092 if (arguments[0].status == 403) {
4093 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadPermissionDenied:errors";
4095 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadFileDragDropPermissionDenied:errors";
4101 $out .=
"</script>\n";
4115function archiveOrBackupFile($srcfile, $max_versions = 5, $archivedir =
'', $suffix =
"v", $moveorcopy =
'move')
4117 $base_file_pattern = ($archivedir ? $archivedir : dirname($srcfile)).
'/'.basename($srcfile).
".".$suffix;
4118 $files_in_directory = glob($base_file_pattern .
"*");
4121 $files_with_timestamps = [];
4122 foreach ($files_in_directory as $file) {
4123 $files_with_timestamps[] = [
4125 'timestamp' => filemtime($file)
4131 while (count($files_with_timestamps) > 0) {
4132 $latest_file =
null;
4133 $latest_index =
null;
4136 foreach ($files_with_timestamps as $index => $file_info) {
4137 if ($latest_file ===
null || (is_array($latest_file) && $file_info[
'timestamp'] > $latest_file[
'timestamp'])) {
4138 $latest_file = $file_info;
4139 $latest_index = $index;
4144 if ($latest_file !==
null) {
4145 $sorted_files[] = $latest_file[
'file'];
4146 unset($files_with_timestamps[$latest_index]);
4151 if (count($sorted_files) >= $max_versions) {
4152 $oldest_files = array_slice($sorted_files, $max_versions - 1);
4153 foreach ($oldest_files as $oldest_file) {
4159 $new_backup = $srcfile .
".v" . $timestamp;
4162 if ($moveorcopy ==
'move') {
4163 $result =
dol_move($srcfile, $new_backup,
'0', 1, 0, 0);
4165 $result =
dol_copy($srcfile, $new_backup,
'0', 1, 0, 0);
4181function dolDocToText($filetoprocess, $useFullTextIndexation =
'pdftotext', $options =
'html')
4186 $keywords = array();
4187 $textforfulltextindex =
'';
4190 if (empty($useFullTextIndexation)) {
4191 $useFullTextIndexation =
'pdftotext';
4198 if (preg_match(
'/pdftotext/i', $useFullTextIndexation)) {
4199 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4201 $outputfile =
$conf->admin->dir_temp.
'/tmppdftotext.'.$user->id.
'.out';
4205 if ($options ==
'fulltext') {
4206 $params =
'-nodiag -layout';
4208 $params =
'-htmlmeta';
4210 $cmd =
getDolGlobalString(
'MAIN_SAVE_FILE_CONTENT_AS_TEXT_PDFTOTEXT',
'pdftotext') .
" " . $params .
" '".escapeshellcmd($filetoprocess).
"' - ";
4211 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4213 if (empty($resultexec[
'error'])) {
4215 if ($options ==
'fulltext') {
4216 $textforfulltextindex = $resultexec[
'output'];
4218 if ($options ==
'html') {
4219 $txt = $resultexec[
'output'];
4220 if (preg_match(
'/<meta name="keywords" content="([^\/]+)"\s*\/>/i', $txt, $matches)) {
4221 $keywords = $matches[1];
4223 if (preg_match(
'/<pre>(.*)<\/pre>/si', $txt, $matches)) {
4235 if (preg_match(
'/docling/i', $useFullTextIndexation)) {
4236 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4238 $outputfile =
$conf->admin->dir_temp.
'/tmpdocling.'.$user->id.
'.out';
4242 $cmd =
getDolGlobalString(
'MAIN_SAVE_FILE_CONTENT_AS_TEXT_DOCLING',
'docling').
" --from pdf --to text '".escapeshellcmd($filetoprocess).
"'";
4243 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4245 if (!$resultexec[
'error']) {
4246 $txt = $resultexec[
'output'];
4254 $textforfulltextindex = $txt;
4261 return array(
'error' => $error,
'keywords' => $keywords,
'content' => $textforfulltextindex,
'cmd' => $cmd);
4273 $fp = fopen($fullpath,
"r");
4274 fseek($fp, -1, SEEK_END);
4277 while ($char ===
"\n" || $char ===
"\r") {
4278 fseek($fp, $pos--, SEEK_END);
4281 while ($char !==
"\n" && $char !==
false) {
4282 fseek($fp, $pos--, SEEK_END);
4291 $truncatePos = ftell($fp);
4294 $fp = fopen($fullpath,
"c+");
4295 ftruncate($fp, $truncatePos);
if(! $sortfield) if(! $sortorder) $object
Class to manage agenda events (actions)
Class to manage ECM files.
Class to manage Trips and Expenses.
Class of the module paid holiday.
Class to manage projects.
Class to manage Dolibarr users.
Class to manage utility methods.
dirbasename($pathfile)
Return the relative dirname (relative to DOL_DATA_ROOT) of a full path string.
dol_move($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=1, $moreinfo=array(), $entity=null)
Move a file into another name.
dol_dir_list_in_database($path, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $sqlfilters="", $object=null)
Scan a directory and return a list of files/directories.
dol_is_link($pathoffile)
Return if path is a symbolic link.
dol_compare_file($a, $b)
Fast compare of 2 files identified by their properties ->name, ->date and ->size.
removePatternFromFile(string $filePath, string $pattern)
Removes content from a file that matches a given pattern.
dol_meta_create($object)
Create a meta file with document file into same directory.
dol_is_url($uri)
Return if path is an URI (the name of the method is misleading).
dol_basename($pathfile)
Make a basename working with all page code (default PHP basenamed fails with cyrillic).
getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path='', $pathref='', &$checksumconcat=array())
Function to get list of updated or modified files.
dol_filemtime($pathoffile)
Return time of a file.
dol_filesize($pathoffile)
Return size of a file.
dol_copy($srcfile, $destfile, $newmask='0', $overwriteifexists=1, $testvirus=0, $indexdatabase=0)
Copy a file to another file.
dol_add_file_process($upload_dir, $allowoverwrite=0, $updatesessionordb=0, $keyforsourcefile='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null, $forceFullTextIndexation='', $mode=0)
Get and save an upload file (for example after submitting a new file in a mail form).
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir, $object=null)
Complete $filearray with data from database.
archiveOrBackupFile($srcfile, $max_versions=5, $archivedir='', $suffix="v", $moveorcopy='move')
Manage backup versions for a given file, ensuring only a maximum number of versions are kept.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_move_dir($srcdir, $destdir, $overwriteifexists=1, $indexdatabase=1, $renamedircontent=1)
Move a directory into another name.
addFileIntoDatabaseIndex($dir, $file, $fullpathorig='', $mode='uploaded', $setsharekey=0, $object=null, $forceFullTextIndexation='')
Add a file into database index.
dol_fileperm($pathoffile)
Return permissions of a file.
dol_is_writable($folderorfile)
Test if directory or filename is writable.
dol_delete_dir($dir, $nophperrors=0)
Remove a directory (not recursive, so content must be empty).
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
isRealPdf(string $filePath)
Check if a file is a real PDF file by checking its signature and its MIME type.
dol_uncompress($inputfile, $outputdir)
Uncompress a file.
dol_check_secure_access_document($modulepart, $original_file, $entity, $fuser=null, $refname='', $mode='read')
Security check when accessing to a document (used by document.php, viewimage.php and webservices to g...
dol_init_file_process($pathtoscan='', $trackid='')
Scan a directory and init $_SESSION to manage uploaded files with list of all found files.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert a PDF file into another image format.
removeLastLine($fullpath)
Remove the last line of a text file.
dol_filecache($directory, $filename, $object)
Store object in file.
dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement=null, $excludesubdir=0, $excludefileext=null, $excludearchivefiles=0)
Copy a dir to another dir.
dragAndDropFileUpload($htmlname)
Function to manage the drag and drop of a file.
dol_is_file($pathoffile)
Return if path is a file.
dol_count_nb_of_line($file)
Count number of lines in a file.
dolCheckVirus($src_file, $dest_file='')
Check virus into a file.
dol_unescapefile($filename)
Unescape a file submitted by upload.
dolDocToText($filetoprocess, $useFullTextIndexation='pdftotext', $options='html')
dol_dir_is_emtpy($folder)
Test if a folder is empty.
dol_remove_file_process($filenb, $donotupdatesession=0, $donotdeletefile=1, $trackid='')
Remove an uploaded file (for example after submitting a new file a mail form).
dolCheckOnFileName($src_file, $dest_file='')
Check virus into a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_readcachefile($directory, $filename)
Read object from cachefile.
dol_most_recent_file($dir, $regexfilter='', $excludefilter=array('(\.meta|_preview.*\.png) $', '^\.'), $nohook=0, $mode=0)
Return file(s) into a directory (by default most recent)
dol_is_dir($folder)
Test if filename is a directory.
dol_cache_refresh($directory, $filename, $cachetime)
Test if Refresh needed.
dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask='0', $indexdatabase=0, $arrayreplacementisregex=0)
Make replacement of strings into a file.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_is_dir_empty($dir)
Return if path is empty.
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $keyforsourcefile='addedfile', $upload_dir='', $mode=0)
Check validity of a file upload from an GUI page, and move it to its final destination.
deleteFilesIntoDatabaseIndex($dir, $file, $mode='uploaded', $object=null)
Delete files into database index using search criteria.
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_sanitizePathName($str, $newstr='_', $unaccent=0, $allowdash=0)
Clean a string to use it as a path name.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dolChmod($filepath, $newmask='')
Change mod of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_string_nounprintableascii($str, $removetabcrlf=1)
Clean a string from all non printable ASCII chars (0x00-0x1F and 0x7F).
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
utf8_check($str)
Check if a string is in UTF8.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
checkUserAccessToObject($user, array $featuresarray, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='', $dbt_select='rowid', $parenttableforentity='')
Check that access by a given user to an object is ok.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.