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).
"'";
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);
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 $listoffiles = glob($globencoded);
1686 if (!empty($listoffiles) && is_array($listoffiles)) {
1687 foreach ($listoffiles 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 $filename = $file_osencoded;
1752 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1753 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);
1754 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1757 $ok = @unlink($filename);
1759 $ok = unlink($filename);
1764 if (empty($nolog)) {
1765 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1769 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1770 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1771 if (is_object(
$db) && $indexdatabase) {
1772 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1773 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1775 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1776 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1779 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1780 if ($result >= 0 && $ecmfile->id > 0) {
1781 $result = $ecmfile->delete($user);
1789 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1810 if (preg_match(
'/\.\./', $dir) || preg_match(
'/[<>|]/', $dir)) {
1811 dol_syslog(
"Refused to delete dir ".$dir.
' (contains invalid char sequence)', LOG_WARNING);
1816 return ($nophperrors ? @rmdir($dir_osencoded) : rmdir($dir_osencoded));
1832function dol_delete_dir_recursive($dir, $count = 0, $nophperrors = 0, $onlysub = 0, &$countdeleted = 0, $indexdatabase = 1, $nolog = 0, $level = 0)
1834 if (empty($nolog) || empty($level)) {
1835 dol_syslog(
"functions.lib:dol_delete_dir_recursive ".$dir, LOG_DEBUG);
1837 if ($level > 1000) {
1838 dol_syslog(
"functions.lib:dol_delete_dir_recursive too many depth", LOG_WARNING);
1843 if ($handle = opendir(
"$dir_osencoded")) {
1844 while (
false !== ($item = readdir($handle))) {
1846 $item = mb_convert_encoding($item,
'UTF-8',
'ISO-8859-1');
1849 if ($item !=
"." && $item !=
"..") {
1851 $count =
dol_delete_dir_recursive(
"$dir/$item", $count, $nophperrors, 0, $countdeleted, $indexdatabase, $nolog, ($level + 1));
1854 $result =
dol_delete_file(
"$dir/$item", 1, $nophperrors, 0,
null,
false, $indexdatabase, $nolog);
1866 if (empty($onlysub)) {
1891 global $langs,
$conf;
1896 if (
$object->element ==
'order_supplier') {
1897 $dir =
$conf->fournisseur->commande->dir_output;
1898 } elseif (
$object->element ==
'invoice_supplier') {
1899 $dir =
$conf->fournisseur->facture->dir_output;
1900 } elseif (
$object->element ==
'project') {
1901 $dir =
$conf->project->dir_output;
1902 } elseif (
$object->element ==
'shipping') {
1903 $dir =
$conf->expedition->dir_output.
'/sending';
1904 } elseif (
$object->element ==
'delivery') {
1905 $dir =
$conf->expedition->dir_output.
'/receipt';
1906 } elseif (
$object->element ==
'fichinter') {
1907 $dir =
$conf->ficheinter->dir_output;
1909 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1913 $object->error = $langs->trans(
'ErrorObjectNoSupportedByFunction');
1918 $dir = $dir.
"/".$refsan;
1919 $filepreviewnew = $dir.
"/".$refsan.
".pdf_preview.png";
1920 $filepreviewnewbis = $dir.
"/".$refsan.
".pdf_preview-0.png";
1921 $filepreviewold = $dir.
"/".$refsan.
".pdf.png";
1924 if (file_exists($filepreviewnew) && is_writable($filepreviewnew)) {
1926 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnew);
1930 if (file_exists($filepreviewnewbis) && is_writable($filepreviewnewbis)) {
1932 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnewbis);
1937 if (file_exists($filepreviewold) && is_writable($filepreviewold)) {
1939 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewold);
1943 $multiple = $filepreviewold.
".";
1944 for ($i = 0; $i < 20; $i++) {
1945 $preview = $multiple.$i;
1947 if (file_exists($preview) && is_writable($preview)) {
1949 $object->error = $langs->trans(
"ErrorFailedToOpenFile", $preview);
1979 if (
$object->element ==
'order_supplier') {
1980 $dir =
$conf->fournisseur->dir_output.
'/commande';
1981 } elseif (
$object->element ==
'invoice_supplier') {
1982 $dir =
$conf->fournisseur->dir_output.
'/facture';
1983 } elseif (
$object->element ==
'project') {
1984 $dir =
$conf->project->dir_output;
1985 } elseif (
$object->element ==
'shipping') {
1986 $dir =
$conf->expedition->dir_output.
'/sending';
1987 } elseif (
$object->element ==
'delivery') {
1988 $dir =
$conf->expedition->dir_output.
'/receipt';
1989 } elseif (
$object->element ==
'fichinter') {
1990 $dir =
$conf->ficheinter->dir_output;
1992 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1999 $dir = $dir.
"/".$objectref;
2000 $file = $dir.
"/".$objectref.
".meta";
2002 if (!is_dir($dir)) {
2009 $nblines = count(
$object->lines);
2014 $meta =
"REFERENCE=\"".$object->ref.
"\"
2016 NB_ITEMS=\"" . $nblines.
"\"
2017 CLIENT=\"" . $client.
"\"
2018 AMOUNT_EXCL_TAX=\"" .
$object->total_ht.
"\"
2019 AMOUNT=\"" .
$object->total_ttc.
"\"\n";
2021 for ($i = 0; $i < $nblines; $i++) {
2023 $meta .=
"ITEM_".$i.
"_QUANTITY=\"".
$object->lines[$i]->qty.
"\"
2024 ITEM_" . $i.
"_AMOUNT_WO_TAX=\"".
$object->lines[$i]->total_ht.
"\"
2025 ITEM_" . $i.
"_VAT=\"".
$object->lines[$i]->tva_tx.
"\"
2026 ITEM_" . $i.
"_DESCRIPTION=\"".str_replace(
"\r\n",
"", nl2br(
$object->lines[$i]->desc)).
"\"
2031 $fp = fopen($file,
"w");
2039 dol_syslog(
'FailedToDetectDirInDolMetaCreateFor'.
$object->element, LOG_WARNING);
2057 $listofpaths = array();
2058 $listofnames = array();
2059 $listofmimes = array();
2063 foreach ($listoffiles as $key => $val) {
2064 $listofpaths[] = $val[
'fullname'];
2065 $listofnames[] = $val[
'name'];
2069 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2070 $_SESSION[
"listofpaths".$keytoavoidconflict] = implode(
';', $listofpaths);
2071 $_SESSION[
"listofnames".$keytoavoidconflict] = implode(
';', $listofnames);
2072 $_SESSION[
"listofmimes".$keytoavoidconflict] = implode(
';', $listofmimes);
2096function dol_add_file_process($upload_dir, $allowoverwrite = 0, $updatesessionordb = 0, $keyforsourcefile =
'addedfile', $savingdocmask =
'', $link =
null, $trackid =
'', $generatethumbs = 1,
$object =
null, $forceFullTextIndexation =
'', $mode = 0)
2104 $_FILES = array($keyforsourcefile => array());
2105 $_FILES[$keyforsourcefile][
'tmp_name'] = $keyforsourcefile;
2106 $_FILES[$keyforsourcefile][
'name'] = $keyforsourcefile;
2110 if (!empty($_FILES[$keyforsourcefile])) {
2111 dol_syslog(
'dol_add_file_process varfiles = '.$keyforsourcefile.
' upload_dir='.$upload_dir.
' allowoverwrite='.$allowoverwrite.
' updatesessionordb='.$updatesessionordb.
' savingdocmask='.$savingdocmask, LOG_DEBUG);
2112 $maxfilesinform =
getDolGlobalInt(
"MAIN_SECURITY_MAX_ATTACHMENT_ON_FORMS", 10);
2113 if (is_array($_FILES[$keyforsourcefile][
"name"]) && count($_FILES[$keyforsourcefile][
"name"]) > $maxfilesinform) {
2114 $langs->load(
"errors");
2115 setEventMessages($langs->trans(
"ErrorTooMuchFileInForm", $maxfilesinform),
null,
"errors");
2123 $TFile = $_FILES[$keyforsourcefile];
2125 if (!is_array($TFile[
'name'])) {
2126 foreach ($TFile as $key => &$val) {
2131 $nbfile = count($TFile[
'name']);
2133 for ($i = 0; $i < $nbfile; $i++) {
2134 if (empty($TFile[
'name'][$i])) {
2139 $destfile = trim($TFile[
'name'][$i]);
2140 $destfull = $upload_dir.
"/".$destfile;
2141 $destfilewithoutext = preg_replace(
'/\.[^\.]+$/',
'', $destfile);
2143 if ($savingdocmask && strpos($savingdocmask, $destfilewithoutext) !== 0) {
2144 $destfile = trim(preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask));
2145 $destfull = $upload_dir.
"/".$destfile;
2148 $filenameto = basename($destfile);
2149 if (preg_match(
'/^\./', $filenameto)) {
2150 $langs->load(
"errors");
2151 setEventMessages($langs->trans(
"ErrorFilenameCantStartWithDot", $filenameto),
null,
'errors');
2155 $info = pathinfo($destfull);
2156 $destfull = $info[
'dirname'].
'/'.
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2157 $info = pathinfo($destfile);
2158 $destfile =
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2163 $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';
2164 $fileextensionrestriction =
getDolGlobalString(
"MAIN_FILE_EXTENSION_UPLOAD_RESTRICTION", $defaultexecutableextensions);
2165 if (!empty($fileextensionrestriction)) {
2166 $arrayofregexextension = explode(
",", $fileextensionrestriction);
2168 foreach ($arrayofregexextension as $fileextension) {
2169 if (preg_match(
'/\.'.preg_quote(trim($fileextension),
'/').
'$/i', $destfull)) {
2170 $langs->load(
"errors");
2171 setEventMessages($langs->trans(
"ErrorFilenameExtensionNotAllowed", $filenameto),
null,
'errors');
2183 global $dolibarr_main_restrict_os_commands;
2184 if (!empty($dolibarr_main_restrict_os_commands)) {
2185 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
2186 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
2187 if (in_array($destfile, $arrayofallowedcommand)) {
2188 $langs->load(
"errors");
2189 setEventMessages($langs->trans(
"ErrorFilenameReserved", $destfile),
null,
'errors');
2195 $resupload =
dol_move_uploaded_file($TFile[
'tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile[
'error'][$i], 0, $keyforsourcefile, $upload_dir, $mode);
2197 if (is_numeric($resupload) && $resupload > 0) {
2198 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2201 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
2202 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
2203 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
2204 $maxheightmini = $tmparraysize[
'maxheightmini'];
2209 if ($generatethumbs) {
2215 $imgThumbSmall =
vignette($destfull, $maxwidthsmall, $maxheightsmall,
'_small', $quality,
"thumbs");
2218 $imgThumbMini =
vignette($destfull, $maxwidthmini, $maxheightmini,
'_mini', $quality,
"thumbs");
2223 if (empty($updatesessionordb)) {
2224 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2226 $formmail->trackid = $trackid;
2227 $formmail->add_attached_files($destfull, $destfile, $TFile[
'type'][$i]);
2231 if ($updatesessionordb == 1) {
2233 if ($TFile[
'type'][$i] ==
'application/pdf' && strpos($_SERVER[
"REQUEST_URI"],
'product') !==
false &&
getDolGlobalString(
'PRODUCT_ALLOW_EXTERNAL_DOWNLOAD')) {
2238 if ($allowoverwrite) {
2242 $result =
addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ?
'.noexe' :
''), $TFile[
'name'][$i],
'uploaded', $sharefile,
$object, $forceFullTextIndexation);
2244 if ($allowoverwrite) {
2247 setEventMessages(
'WarningFailedToAddFileIntoDatabaseIndex',
null,
'warnings');
2254 $langs->load(
"errors");
2255 if (is_numeric($resupload) && $resupload < 0) {
2257 } elseif (preg_match(
'/ErrorFileIsInfectedWithAVirus/', $resupload)) {
2258 if (preg_match(
'/File is a PDF with javascript inside/', $resupload)) {
2259 setEventMessages($langs->trans(
"ErrorFileIsAnInfectedPDFWithJSInside"),
null,
'errors');
2273 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $upload_dir),
null,
'errors');
2276 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2278 $linkObject->entity =
$conf->entity;
2279 $linkObject->url = $link;
2280 $linkObject->objecttype =
GETPOST(
'objecttype',
'alpha');
2281 $linkObject->objectid =
GETPOSTINT(
'objectid');
2282 $linkObject->label =
GETPOST(
'label',
'alpha');
2283 $res = $linkObject->create($user);
2291 $langs->load(
"errors");
2292 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"File")),
null,
'errors');
2314 $keytodelete = $filenb;
2317 $listofpaths = array();
2318 $listofnames = array();
2319 $listofmimes = array();
2320 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2321 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
2322 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
2324 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
2325 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
2327 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
2328 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
2331 if ($keytodelete >= 0) {
2332 $pathtodelete = $listofpaths[$keytodelete];
2333 $filetodelete = $listofnames[$keytodelete];
2334 if (empty($donotdeletefile)) {
2340 if (empty($donotdeletefile)) {
2341 $langs->load(
"other");
2342 setEventMessages($langs->trans(
"FileWasRemoved", $filetodelete),
null,
'mesgs');
2344 if (empty($donotupdatesession)) {
2345 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2347 $formmail->trackid = $trackid;
2348 $formmail->remove_attached_files($keytodelete);
2376 dol_syslog(
"addFileIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2378 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2380 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2381 $filename = basename(preg_replace(
'/\.noexe$/',
'', $file));
2382 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2383 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2385 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
2387 $ecmfile->filepath = $rel_dir;
2388 $ecmfile->filename = $filename;
2389 $ecmfile->label = md5_file(
dol_osencode($dir.
'/'.$file));
2390 $ecmfile->fullpath_orig = $fullpathorig;
2391 $ecmfile->gen_or_uploaded = $mode;
2392 $ecmfile->description =
'';
2393 $ecmfile->keywords =
'';
2396 $ecmfile->src_object_id =
$object->id;
2397 if (isset(
$object->table_element)) {
2398 $ecmfile->src_object_type =
$object->table_element;
2400 dol_syslog(
'Error: object ' . get_class(
$object) .
' has no table_element attribute.');
2403 if (isset(
$object->src_object_description)) {
2404 $ecmfile->description =
$object->src_object_description;
2406 if (isset(
$object->src_object_keywords)) {
2407 $ecmfile->keywords =
$object->src_object_keywords;
2410 $ecmfile->entity =
$object->entity;
2419 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2425 if (empty($useFullTextIndexation) && $forceFullTextIndexation ==
'1') {
2427 $useFullTextIndexation =
'pdftotext';
2429 $useFullTextIndexation =
'docling';
2434 if ($useFullTextIndexation) {
2435 $ecmfile->filepath = $rel_dir;
2436 $ecmfile->filename = $filename;
2438 $filetoprocess = $dir.
'/'.$ecmfile->filename;
2440 $textforfulltextindex =
'';
2443 if (preg_match(
'/\.pdf/i', $filename)) {
2447 if (empty($result[
'error'])) {
2448 $textforfulltextindex = $result[
'content'];
2449 $filetoprocess = $result[
'keywords'];
2450 $cmd = $result[
'cmd'];
2457 $ecmfile->description =
'File content generated by '.$cmd;
2459 $ecmfile->content = $textforfulltextindex;
2460 $ecmfile->keywords = $keywords;
2464 $result = $ecmfile->create($user);
2490 dol_syslog(
"deleteFilesIntoDatabaseIndex: dir parameter can't be empty", LOG_ERR);
2494 dol_syslog(
"deleteFilesIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2498 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2500 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2502 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2503 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2506 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'ecm_files';
2508 $sql .=
' WHERE entity = ' . ((int)
$object->entity);
2510 $sql .=
' WHERE entity = ' . ((int)
$conf->entity);
2512 $sql .=
" AND filepath = '".$db->escape($rel_dir).
"'";
2514 $sql .=
" AND filename = '".$db->escape($file).
"'";
2517 $sql .=
" AND gen_or_uploaded = '".$db->escape($mode).
"'";
2520 $resql =
$db->query($sql);
2547 if (!is_file($filePath) || !is_readable($filePath)) {
2552 $handle = fopen($filePath,
'rb');
2556 $header = fread($handle, 5);
2559 if ($header !==
'%PDF-') {
2589 if (class_exists(
'Imagick')) {
2590 $image =
new Imagick();
2596 dol_syslog(
"We try to convert a PDF file with name ".$fileinput.
" but it is not a real PDF file (hack attempt ?).", LOG_WARNING);
2600 $filetoconvert = $fileinput.(($page !=
'') ?
'['.$page.
']' :
'');
2602 $ret = $image->readImage($filetoconvert);
2604 $ext = pathinfo($fileinput, PATHINFO_EXTENSION);
2605 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);
2610 $ret = $image->setImageFormat($ext);
2612 if (empty($fileoutput)) {
2613 $fileoutput = $fileinput.
".".$ext;
2616 $count = $image->getNumberImages();
2618 if (!
dol_is_file($fileoutput) || is_writable($fileoutput)) {
2620 $ret = $image->writeImages($fileoutput,
true);
2625 dol_syslog(
"Warning: Failed to write cache preview file '.$fileoutput.'. Check permission on file/dir", LOG_ERR);
2655function dol_compress_file($inputfile, $outputfile, $mode =
"gz", &$errorstring =
null)
2661 dol_syslog(
"dol_compress_file mode=".$mode.
" inputfile=".$inputfile.
" outputfile=".$outputfile);
2664 $compressdata =
null;
2665 if ($mode ==
'gz' && function_exists(
'gzencode')) {
2667 $compressdata = gzencode($data, 9);
2668 } elseif ($mode ==
'bz' && function_exists(
'bzcompress')) {
2670 $compressdata = bzcompress($data, 9);
2671 } elseif ($mode ==
'zstd' && function_exists(
'zstd_compress')) {
2673 $compressdata = zstd_compress($data, 9);
2674 } elseif ($mode ==
'zip') {
2675 if (class_exists(
'ZipArchive') &&
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS')) {
2678 $rootPath = realpath($inputfile);
2680 dol_syslog(
"Class ZipArchive is set so we zip using ZipArchive to zip into ".$outputfile.
' rootPath='.$rootPath);
2681 $zip =
new ZipArchive();
2683 if ($zip->open($outputfile, ZipArchive::CREATE) !==
true) {
2684 $errorstring =
"dol_compress_file failure - Failed to open file ".$outputfile.
"\n";
2688 $errormsg = $errorstring;
2695 $files =
new RecursiveIteratorIterator(
2696 new RecursiveDirectoryIterator($rootPath, FilesystemIterator::UNIX_PATHS),
2697 RecursiveIteratorIterator::LEAVES_ONLY
2699 '@phan-var-force SplFileInfo[] $files';
2701 foreach ($files as $name => $file) {
2703 if (!$file->isDir()) {
2705 $filePath = $file->getPath();
2706 $fileName = $file->getFilename();
2707 $fileFullRealPath = $file->getRealPath();
2710 $relativePath = substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($rootPath) + 1);
2713 $zip->addFile($fileFullRealPath, $relativePath);
2720 dol_syslog(
"dol_compress_file success - ".$zip->numFiles.
" files");
2724 if (defined(
'ODTPHP_PATHTOPCLZIP')) {
2727 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2728 $archive =
new PclZip($outputfile);
2730 $result = $archive->add($inputfile, PCLZIP_OPT_REMOVE_PATH, dirname($inputfile));
2732 if ($result === 0) {
2734 $errormsg = $archive->errorInfo(
true);
2736 if ($archive->errorCode() == PCLZIP_ERR_WRITE_OPEN_FAIL) {
2737 $errorstring =
"PCLZIP_ERR_WRITE_OPEN_FAIL";
2738 dol_syslog(
"dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL", LOG_ERR);
2742 $errorstring =
"dol_compress_file error archive->errorCode = ".$archive->errorCode().
" errormsg=".$errormsg;
2743 dol_syslog(
"dol_compress_file failure - ".$errormsg, LOG_ERR);
2746 dol_syslog(
"dol_compress_file success - ".count($result).
" files");
2752 if ($foundhandler && is_string($compressdata)) {
2753 $fp = fopen($outputfile,
"w");
2754 fwrite($fp, $compressdata);
2758 $errorstring =
"Try to zip with format ".$mode.
" with no handler for this format";
2762 $errormsg = $errorstring;
2766 global $langs, $errormsg;
2767 $langs->load(
"errors");
2768 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir");
2770 $errorstring =
"Failed to open file ".$outputfile;
2788 $fileinfo = pathinfo($inputfile);
2789 $fileinfo[
"extension"] = strtolower($fileinfo[
"extension"]);
2791 if ($fileinfo[
"extension"] ==
"zip") {
2792 if (defined(
'ODTPHP_PATHTOPCLZIP') && !
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS')) {
2793 dol_syslog(
"Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.
", so we use Pclzip to unzip into ".$outputdir);
2794 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2795 $archive =
new PclZip($inputfile);
2802 $result = $archive->extract(PCLZIP_OPT_PATH, $outputdir, PCLZIP_OPT_BY_PREG,
'/^((?!\.\.).)*$/');
2804 return array(
'error' => $e->getMessage());
2807 if (!is_array($result) && $result <= 0) {
2808 return array(
'error' => $archive->errorInfo(
true));
2813 foreach ($result as $key => $val) {
2814 if ($val[
'status'] ==
'path_creation_fail') {
2815 $langs->load(
"errors");
2817 $errmsg = $langs->trans(
"ErrorFailToCreateDir", $val[
'filename']);
2820 if ($val[
'status'] ==
'write_protected') {
2821 $langs->load(
"errors");
2823 $errmsg = $langs->trans(
"ErrorFailToCreateFile", $val[
'filename']);
2831 return array(
'error' => $errmsg);
2836 if (class_exists(
'ZipArchive')) {
2837 dol_syslog(
"Class ZipArchive is set so we unzip using ZipArchive to unzip into ".$outputdir);
2838 $zip =
new ZipArchive();
2839 $res = $zip->open($inputfile);
2840 if ($res ===
true) {
2846 for ($i = 0; $i < $zip->numFiles; $i++) {
2847 if (preg_match(
'/\.\./', $zip->getNameIndex($i))) {
2848 dol_syslog(
"Warning: Try to unzip a file with a transversal path ".$zip->getNameIndex($i), LOG_WARNING);
2851 $zip->extractTo($outputdir.
'/', array($zip->getNameIndex($i)));
2857 return array(
'error' =>
'ErrUnzipFails');
2861 return array(
'error' =>
'ErrNoZipEngine');
2862 } elseif (in_array($fileinfo[
"extension"], array(
'gz',
'bz2',
'zst'))) {
2863 include_once DOL_DOCUMENT_ROOT.
"/core/class/utils.class.php";
2871 $extension = strtolower(pathinfo($fileinfo[
"filename"], PATHINFO_EXTENSION));
2872 if ($extension ==
"tar") {
2875 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0, $outputfilename.
'.err', 0);
2876 if ($resarray[
"result"] != 0) {
2877 $resarray[
"error"] .= file_get_contents($outputfilename.
'.err');
2881 if ($fileinfo[
"extension"] ==
"gz") {
2883 } elseif ($fileinfo[
"extension"] ==
"bz2") {
2885 } elseif ($fileinfo[
"extension"] ==
"zst") {
2888 return array(
'error' =>
'ErrorBadFileExtension');
2891 $cmd .=
' > '.$outputfilename;
2893 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0,
null, 1, $outputfilename.
'.err');
2894 if ($resarray[
"result"] != 0) {
2895 $errfilecontent = @file_get_contents($outputfilename.
'.err');
2896 if ($errfilecontent) {
2897 $resarray[
"error"] .=
" - ".$errfilecontent;
2901 return $resarray[
"result"] != 0 ? array(
'error' => $resarray[
"error"]) : array();
2904 return array(
'error' =>
'ErrorBadFileExtension');
2920function dol_compress_dir($inputdir, $outputfile, $mode =
"zip", $excludefiles =
'', $rootdirinzip =
'', $newmask =
'0')
2924 dol_syslog(
"Try to zip dir ".$inputdir.
" into ".$outputfile.
" mode=".$mode);
2926 if (!
dol_is_dir(dirname($outputfile)) || !is_writable(dirname($outputfile))) {
2927 global $langs, $errormsg;
2928 $langs->load(
"errors");
2929 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir", $outputfile);
2934 if ($mode ==
'gz') {
2936 } elseif ($mode ==
'bz') {
2938 } elseif ($mode ==
'zip') {
2952 if (class_exists(
'ZipArchive')) {
2956 $zip =
new ZipArchive();
2957 $result = $zip->open($outputfile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
2958 if ($result !==
true) {
2959 global $langs, $errormsg;
2960 $langs->load(
"errors");
2961 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile);
2968 $files =
new RecursiveIteratorIterator(
2969 new RecursiveDirectoryIterator($inputdir, FilesystemIterator::UNIX_PATHS),
2970 RecursiveIteratorIterator::LEAVES_ONLY
2972 '@phan-var-force SplFileInfo[] $files';
2975 foreach ($files as $name => $file) {
2977 if (!$file->isDir()) {
2979 $filePath = $file->getPath();
2980 $fileName = $file->getFilename();
2981 $fileFullRealPath = $file->getRealPath();
2984 $relativePath = ($rootdirinzip ? $rootdirinzip.
'/' :
'').substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($inputdir) + 1);
2987 if (empty($excludefiles) || !preg_match($excludefiles, $fileFullRealPath)) {
2989 $zip->addFile($fileFullRealPath, $relativePath);
3000 if (empty($newmask)) {
3001 dol_syslog(
"Warning: dol_compress_dir called with empty value for newmask and no default value defined", LOG_WARNING);
3011 if (!$foundhandler) {
3012 dol_syslog(
"Try to zip with format ".$mode.
" with no handler for this format", LOG_ERR);
3018 global $langs, $errormsg;
3019 $langs->load(
"errors");
3020 dol_syslog(
"Failed to open file ".$outputfile, LOG_ERR);
3022 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile).
' - '.$e->getMessage();
3039function dol_most_recent_file($dir, $regexfilter =
'', $excludefilter = array(
'(\.meta|_preview.*\.png)$',
'^\.'), $nohook = 0, $mode = 0)
3041 $tmparray =
dol_dir_list($dir,
'files', 0, $regexfilter, $excludefilter,
'date', SORT_DESC, $mode, $nohook);
3042 return isset($tmparray[0]) ? $tmparray[0] :
null;
3060 global
$conf,
$db, $user, $hookmanager;
3061 global $dolibarr_main_data_root, $dolibarr_main_document_root_alt;
3064 if (!is_object($fuser)) {
3068 if (empty($modulepart)) {
3069 return 'ErrorBadParameter';
3071 if (empty($entity)) {
3082 if ($modulepart ==
'facture') {
3083 $modulepart =
'invoice';
3084 } elseif ($modulepart ==
'users') {
3085 $modulepart =
'user';
3086 } elseif ($modulepart ==
'tva') {
3087 $modulepart =
'tax-vat';
3088 } elseif ($modulepart ==
'expedition' && strpos($original_file,
'receipt/') === 0) {
3090 $modulepart =
'delivery';
3091 } elseif ($modulepart ==
'propale') {
3092 $modulepart =
'propal';
3096 dol_syslog(
'dol_check_secure_access_document modulepart='.$modulepart.
' original_file='.$original_file.
' entity='.$entity);
3100 $sqlprotectagainstexternals =
'';
3104 if (empty($refname)) {
3105 $refname = basename(dirname($original_file).
"/");
3106 if ($refname ==
'thumbs' || $refname ==
'temp') {
3108 $refname = basename(dirname(dirname($original_file)).
"/");
3115 $download =
'download';
3116 if ($mode ==
'write') {
3119 $download =
'upload';
3123 if ($modulepart ==
'common') {
3126 $original_file = DOL_DOCUMENT_ROOT.
'/public/theme/common/'.$original_file;
3127 } elseif ($modulepart ==
'medias' && !empty($dolibarr_main_data_root)) {
3129 if (empty($entity)) {
3133 if ($mode ==
'write') {
3134 if ($fuser->hasRight(
'website',
'write')) {
3140 $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;
3141 } elseif ($modulepart ==
'logs' && !empty($dolibarr_main_data_root)) {
3143 $accessallowed = ($user->admin && basename($original_file) == $original_file && preg_match(
'/^dolibarr.*\.(log|json)$/', basename($original_file)));
3144 $original_file = $dolibarr_main_data_root.
'/'.$original_file;
3145 } elseif ($modulepart ==
'doctemplates' && !empty($dolibarr_main_data_root)) {
3146 $accessallowed = $user->admin;
3147 $relative_file = $original_file;
3148 $ent = ($entity > 0 ? $entity :
$conf->entity);
3149 $path_with_entity = $dolibarr_main_data_root .
'/' . $ent .
'/doctemplates/' . $relative_file;
3150 if ($ent > 1 && file_exists(
dol_osencode($path_with_entity))) {
3151 $original_file = $path_with_entity;
3153 $original_file = $dolibarr_main_data_root .
'/doctemplates/' . $relative_file;
3155 } elseif ($modulepart ==
'doctemplateswebsite' && !empty($dolibarr_main_data_root)) {
3157 $accessallowed = ($fuser->hasRight(
'website',
'write') && preg_match(
'/\.jpg$/i', basename($original_file)));
3158 $original_file = $dolibarr_main_data_root.
'/doctemplates/websites/'.$original_file;
3159 } elseif ($modulepart ==
'packages' && !empty($dolibarr_main_data_root)) {
3162 $tmp = explode(
',', $dolibarr_main_document_root_alt);
3165 $accessallowed = ($user->admin && preg_match(
'/^module_.*\.zip$/', basename($original_file)));
3166 $original_file = $dirins.
'/'.$original_file;
3167 } elseif ($modulepart ==
'mycompany' && !empty(
$conf->mycompany->dir_output)) {
3170 $original_file =
$conf->mycompany->dir_output.
'/'.$original_file;
3171 } elseif ($modulepart ==
'userphoto' && !empty(
$conf->user->dir_output)) {
3174 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3177 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3178 } elseif ($modulepart ==
'userphotopublic' && !empty(
$conf->user->dir_output)) {
3183 if (preg_match(
'/^(\d+)\/photos\//', $original_file, $reg)) {
3184 if ((
int) $reg[1]) {
3186 $tmpobject->fetch((
int) $reg[1],
'',
'', 1);
3188 $securekey =
GETPOST(
'securekey',
'alpha', 1);
3190 global $dolibarr_main_cookie_cryptkey, $dolibarr_main_instance_unique_id;
3191 $valuetouse = $dolibarr_main_instance_unique_id ? $dolibarr_main_instance_unique_id : $dolibarr_main_cookie_cryptkey;
3192 $encodedsecurekey =
dol_hash($valuetouse.
'uservirtualcard'.$tmpobject->id.
'-'.$tmpobject->login,
'md5');
3193 if ($encodedsecurekey == $securekey) {
3202 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3203 } elseif (($modulepart ==
'companylogo') && !empty(
$conf->mycompany->dir_output)) {
3206 $original_file =
$conf->mycompany->dir_output.
'/logos/'.$original_file;
3207 } elseif ($modulepart ==
'memberphoto' && !empty(
$conf->member->dir_output)) {
3211 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3215 if (preg_match(
'/^MEM\d\d\d\d-\d\d\d\d\/photos\//', $original_file)) {
3218 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3219 } elseif ($modulepart ==
'apercufacture' && !empty(
$conf->invoice->multidir_output[$entity])) {
3221 if ($fuser->hasRight(
'facture', $lire)) {
3224 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3225 } elseif ($modulepart ==
'apercupropal' && !empty(
$conf->propal->multidir_output[$entity])) {
3227 if ($fuser->hasRight(
'propal', $lire)) {
3230 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3231 } elseif ($modulepart ==
'apercucommande' && !empty(
$conf->order->multidir_output[$entity])) {
3233 if ($fuser->hasRight(
'commande', $lire)) {
3236 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3237 } elseif (($modulepart ==
'apercufichinter' || $modulepart ==
'apercuficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3239 if ($fuser->hasRight(
'ficheinter', $lire)) {
3242 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3243 } elseif (($modulepart ==
'apercucontract') && !empty(
$conf->contract->multidir_output[$entity])) {
3245 if ($fuser->hasRight(
'contrat', $lire)) {
3248 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3249 } elseif (($modulepart ==
'apercusupplier_proposal') && !empty(
$conf->supplier_proposal->dir_output)) {
3251 if ($fuser->hasRight(
'supplier_proposal', $lire)) {
3254 $original_file =
$conf->supplier_proposal->dir_output.
'/'.$original_file;
3255 } elseif (($modulepart ==
'apercusupplier_order') && !empty(
$conf->fournisseur->commande->dir_output)) {
3257 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3260 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3261 } elseif (($modulepart ==
'apercusupplier_invoice') && !empty(
$conf->fournisseur->facture->dir_output)) {
3263 if ($fuser->hasRight(
'fournisseur', $lire)) {
3266 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3267 } elseif (($modulepart ==
'holiday') && !empty(
$conf->holiday->dir_output)) {
3268 if ($fuser->hasRight(
'holiday', $read) || $fuser->hasRight(
'holiday',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3271 if ($refname && !$fuser->hasRight(
'holiday',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3272 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
3274 $tmpholiday->fetch(0, $refname);
3275 $accessallowed =
checkUserAccessToObject($user, array(
'holiday'), $tmpholiday,
'holiday',
'',
'',
'rowid',
'');
3278 $original_file =
$conf->holiday->dir_output.
'/'.$original_file;
3279 } elseif (($modulepart ==
'expensereport') && !empty(
$conf->expensereport->dir_output)) {
3280 if ($fuser->hasRight(
'expensereport', $lire) || $fuser->hasRight(
'expensereport',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3283 if ($refname && !$fuser->hasRight(
'expensereport',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3284 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
3286 $tmpexpensereport->fetch(0, $refname);
3287 $accessallowed =
checkUserAccessToObject($user, array(
'expensereport'), $tmpexpensereport,
'expensereport',
'',
'',
'rowid',
'');
3290 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3291 } elseif (($modulepart ==
'apercuexpensereport') && !empty(
$conf->expensereport->dir_output)) {
3293 if ($fuser->hasRight(
'expensereport', $lire)) {
3296 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3297 } elseif ($modulepart ==
'propalstats' && !empty(
$conf->propal->multidir_temp[$entity])) {
3299 if ($fuser->hasRight(
'propal', $lire)) {
3302 $original_file =
$conf->propal->multidir_temp[$entity].
'/'.$original_file;
3303 } elseif ($modulepart ==
'orderstats' && !empty(
$conf->order->dir_temp)) {
3305 if ($fuser->hasRight(
'commande', $lire)) {
3308 $original_file =
$conf->order->dir_temp.
'/'.$original_file;
3309 } elseif ($modulepart ==
'orderstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3310 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3313 $original_file =
$conf->fournisseur->commande->dir_temp.
'/'.$original_file;
3314 } elseif ($modulepart ==
'billstats' && !empty(
$conf->invoice->dir_temp)) {
3316 if ($fuser->hasRight(
'facture', $lire)) {
3319 $original_file =
$conf->invoice->dir_temp.
'/'.$original_file;
3320 } elseif ($modulepart ==
'billstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3321 if ($fuser->hasRight(
'fournisseur',
'facture', $lire)) {
3324 $original_file =
$conf->fournisseur->facture->dir_temp.
'/'.$original_file;
3325 } elseif ($modulepart ==
'expeditionstats' && !empty(
$conf->expedition->dir_temp)) {
3327 if ($fuser->hasRight(
'expedition', $lire)) {
3330 $original_file =
$conf->expedition->dir_temp.
'/'.$original_file;
3331 } elseif ($modulepart ==
'tripsexpensesstats' && !empty(
$conf->deplacement->dir_temp)) {
3333 if ($fuser->hasRight(
'deplacement', $lire)) {
3336 $original_file =
$conf->deplacement->dir_temp.
'/'.$original_file;
3337 } elseif ($modulepart ==
'memberstats' && !empty(
$conf->member->dir_temp)) {
3339 if ($fuser->hasRight(
'adherent', $lire)) {
3342 $original_file =
$conf->member->dir_temp.
'/'.$original_file;
3343 } elseif (preg_match(
'/^productstats_/i', $modulepart) && !empty(
$conf->product->dir_temp)) {
3345 if ($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) {
3348 $original_file = (!empty(
$conf->product->multidir_temp[$entity]) ?
$conf->product->multidir_temp[$entity] :
$conf->service->multidir_temp[$entity]).
'/'.$original_file;
3349 } elseif (in_array($modulepart, array(
'tax',
'tax-vat',
'tva')) && !empty(
$conf->tax->dir_output)) {
3351 if ($fuser->hasRight(
'tax',
'charges', $lire)) {
3354 $modulepartsuffix = str_replace(
'tax-',
'', $modulepart);
3355 $original_file =
$conf->tax->dir_output.
'/'.($modulepartsuffix !=
'tax' ? $modulepartsuffix.
'/' :
'').$original_file;
3356 } elseif (($modulepart ==
'actions' || $modulepart ==
'actioncomm') && !empty(
$conf->agenda->dir_output)) {
3358 if ($fuser->hasRight(
'agenda',
'myactions', $read)) {
3361 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3362 include_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3364 $tmpobject->fetch((
int) $refname);
3365 $accessallowed =
checkUserAccessToObject($user, array(
'agenda'), $tmpobject->id,
'actioncomm&societe',
'myactions|allactions',
'fk_soc',
'id',
'');
3366 if ($user->socid && $tmpobject->socid) {
3371 $original_file =
$conf->agenda->dir_output.
'/'.$original_file;
3372 } elseif ($modulepart ==
'category' && !empty(
$conf->categorie->multidir_output[$entity])) {
3374 if (empty($entity) || empty(
$conf->categorie->multidir_output[$entity])) {
3375 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3377 if ($fuser->hasRight(
"categorie", $lire) || $fuser->hasRight(
"takepos",
"run")) {
3380 $original_file =
$conf->categorie->multidir_output[$entity].
'/'.$original_file;
3381 } elseif ($modulepart ==
'prelevement' && !empty(
$conf->prelevement->dir_output)) {
3383 if ($fuser->hasRight(
'prelevement',
'bons', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3386 $original_file =
$conf->prelevement->dir_output.
'/'.$original_file;
3387 } elseif ($modulepart ==
'graph_stock' && !empty(
$conf->stock->dir_temp)) {
3390 $original_file =
$conf->stock->dir_temp.
'/'.$original_file;
3391 } elseif ($modulepart ==
'graph_fourn' && !empty(
$conf->fournisseur->dir_temp)) {
3394 $original_file =
$conf->fournisseur->dir_temp.
'/'.$original_file;
3395 } elseif ($modulepart ==
'graph_product' && !empty(
$conf->product->dir_temp)) {
3398 $original_file =
$conf->product->multidir_temp[$entity].
'/'.$original_file;
3399 } elseif ($modulepart ==
'barcode') {
3404 $original_file =
'';
3405 } elseif ($modulepart ==
'iconmailing' && !empty(
$conf->mailing->dir_temp)) {
3408 $original_file =
$conf->mailing->dir_temp.
'/'.$original_file;
3409 } elseif ($modulepart ==
'scanner_user_temp' && !empty(
$conf->scanner->dir_temp)) {
3412 $original_file =
$conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3413 } elseif ($modulepart ==
'fckeditor' && !empty(
$conf->fckeditor->dir_output)) {
3416 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3417 } elseif ($modulepart ==
'user' && !empty(
$conf->user->dir_output)) {
3419 $canreaduser = (!empty($fuser->admin) || $fuser->hasRight(
'user',
'user', $lire));
3420 if ($fuser->id == (
int) $refname) {
3423 if ($canreaduser || preg_match(
'/^specimen/i', $original_file)) {
3426 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3427 } elseif (($modulepart ==
'company' || $modulepart ==
'societe' || $modulepart ==
'thirdparty') && !empty(
$conf->societe->multidir_output[$entity])) {
3429 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3430 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3432 if ($fuser->hasRight(
'societe', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3435 $original_file =
$conf->societe->multidir_output[$entity].
'/'.$original_file;
3436 $sqlprotectagainstexternals =
"SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX.
"societe WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'societe').
")";
3437 } elseif (($modulepart ==
'contact' || $modulepart ==
'socpeople') && !empty(
$conf->societe->multidir_output[$entity])) {
3439 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3440 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3442 if ($fuser->hasRight(
'societe',
'contact', $lire)) {
3445 $original_file =
$conf->societe->multidir_output[$entity].
'/contact/'.$original_file;
3446 $sqlprotectagainstexternals =
"SELECT fk_soc FROM ".MAIN_DB_PREFIX.
"socpepople WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'contact').
")";
3447 } elseif (($modulepart ==
'facture' || $modulepart ==
'invoice') && !empty(
$conf->invoice->multidir_output[$entity])) {
3449 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3452 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3453 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'invoice').
")";
3454 } elseif ($modulepart ==
'massfilesarea_proposals' && !empty(
$conf->propal->multidir_output[$entity])) {
3456 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3459 $original_file =
$conf->propal->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3460 } elseif ($modulepart ==
'massfilesarea_orders') {
3461 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3464 $original_file =
$conf->order->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3465 } elseif ($modulepart ==
'massfilesarea_sendings') {
3466 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3469 $original_file =
$conf->expedition->dir_output.
'/sending/temp/massgeneration/'.$user->id.
'/'.$original_file;
3470 } elseif ($modulepart ==
'massfilesarea_receipts') {
3471 if ($fuser->hasRight(
'reception', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3474 $original_file =
$conf->reception->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3475 } elseif ($modulepart ==
'massfilesarea_invoices') {
3476 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3479 $original_file =
$conf->invoice->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3480 } elseif ($modulepart ==
'massfilesarea_expensereport') {
3481 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3484 $original_file =
$conf->expensereport->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3485 } elseif ($modulepart ==
'massfilesarea_interventions') {
3486 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3489 $original_file =
$conf->ficheinter->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3490 } elseif ($modulepart ==
'massfilesarea_supplier_proposal' && !empty(
$conf->supplier_proposal->dir_output)) {
3491 if ($fuser->hasRight(
'supplier_proposal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3494 $original_file =
$conf->supplier_proposal->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3495 } elseif ($modulepart ==
'massfilesarea_supplier_order') {
3496 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3499 $original_file =
$conf->fournisseur->commande->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3500 } elseif ($modulepart ==
'massfilesarea_supplier_invoice') {
3501 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3504 $original_file =
$conf->fournisseur->facture->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3505 } elseif ($modulepart ==
'massfilesarea_contract' && !empty(
$conf->contract->dir_output)) {
3506 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3509 $original_file =
$conf->contract->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3510 } elseif ($modulepart ==
'massfilesarea_stock' && !empty(
$conf->stock->dir_output)) {
3511 if ($fuser->hasRight(
'stock', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3514 $original_file =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3515 } elseif (($modulepart ==
'fichinter' || $modulepart ==
'ficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3517 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3520 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3521 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"fichinter WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3522 } elseif ($modulepart ==
'deplacement' && !empty(
$conf->deplacement->dir_output)) {
3524 if ($fuser->hasRight(
'deplacement', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3527 $original_file =
$conf->deplacement->dir_output.
'/'.$original_file;
3529 } elseif (($modulepart ==
'propal' || $modulepart ==
'propale') && isset(
$conf->propal->multidir_output[$entity])) {
3531 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3534 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3535 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"propal WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'propal').
")";
3536 } elseif (($modulepart ==
'commande' || $modulepart ==
'order') && !empty(
$conf->order->multidir_output[$entity])) {
3538 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3541 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3542 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'order').
")";
3543 } elseif ($modulepart ==
'project' && !empty(
$conf->project->multidir_output[$entity])) {
3545 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3548 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3549 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
3551 $tmpproject->fetch(0, $refname);
3552 $accessallowed =
checkUserAccessToObject($user, array(
'projet'), $tmpproject->id,
'projet&project',
'',
'',
'rowid',
'');
3555 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3556 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3557 } elseif ($modulepart ==
'project_task' && !empty(
$conf->project->multidir_output[$entity])) {
3558 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3561 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3562 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
3564 $tmptask->fetch(0, $refname);
3565 $accessallowed =
checkUserAccessToObject($user, array(
'projet_task'), $tmptask->id,
'projet_task&project',
'',
'',
'rowid',
'');
3568 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3569 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3570 } elseif (($modulepart ==
'commande_fournisseur' || $modulepart ==
'order_supplier') && !empty(
$conf->fournisseur->commande->dir_output)) {
3572 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3575 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3576 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande_fournisseur WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3577 } elseif (($modulepart ==
'facture_fournisseur' || $modulepart ==
'invoice_supplier') && !empty(
$conf->fournisseur->facture->dir_output)) {
3579 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3582 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3583 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture_fourn WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3584 } elseif ($modulepart ==
'supplier_payment') {
3586 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3589 $original_file = preg_replace(
"/payment\//",
"", $original_file);
3590 $original_file =
$conf->fournisseur->payment->dir_output.
'/'.$original_file;
3591 $sqlprotectagainstexternals =
"SELECT f.fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"paiementfourn as p";
3592 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid";
3593 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"facture_fourn as f ON pf.fk_facturefourn = p.rowid";
3594 $sqlprotectagainstexternals .=
" WHERE p.ref = '".$db->escape($refname).
"' AND p.entity=".((int)
$conf->entity);
3595 } elseif ($modulepart ==
'payment') {
3597 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3600 $original_file =
$conf->compta->payment->dir_output.
'/'.$original_file;
3601 } elseif ($modulepart ==
'facture_paiement' && !empty(
$conf->invoice->dir_output)) {
3603 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3606 if ($fuser->socid > 0) {
3607 $original_file =
$conf->invoice->dir_output.
'/payments/private/'.$fuser->id.
'/'.$original_file;
3609 $original_file =
$conf->invoice->dir_output.
'/payments/'.$original_file;
3616 } elseif ($modulepart ==
'export_compta' && !empty(
$conf->accounting->dir_output)) {
3618 if ($fuser->hasRight(
'accounting',
'bind',
'write') || $fuser->hasRight(
'accounting',
'mouvements',
'export') || preg_match(
'/^specimen/i', $original_file)) {
3621 $original_file =
$conf->accounting->dir_output.
'/'.$original_file;
3622 } elseif (($modulepart ==
'expedition' || $modulepart ==
'shipment' || $modulepart ==
'shipping') && !empty(
$conf->expedition->dir_output)) {
3624 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3627 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'sending/') === 0 ?
'' :
'sending/').$original_file;
3629 } elseif (($modulepart ==
'livraison' || $modulepart ==
'delivery') && !empty(
$conf->expedition->dir_output)) {
3631 if ($fuser->hasRight(
'expedition',
'delivery', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3634 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'receipt/') === 0 ?
'' :
'receipt/').$original_file;
3635 } elseif ($modulepart ==
'actionsreport' && !empty(
$conf->agenda->dir_temp)) {
3637 if ($fuser->hasRight(
'agenda',
'allactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3640 $original_file =
$conf->agenda->dir_temp.
"/".$original_file;
3641 } elseif ($modulepart ==
'product' || $modulepart ==
'produit' || $modulepart ==
'service' || $modulepart ==
'produit|service') {
3643 if (empty($entity) || (empty(
$conf->product->multidir_output[$entity]) && empty(
$conf->service->multidir_output[$entity]))) {
3644 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3646 if (($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3650 $original_file =
$conf->product->multidir_output[$entity].
'/'.$original_file;
3652 $original_file =
$conf->service->multidir_output[$entity].
'/'.$original_file;
3654 } elseif ($modulepart ==
'product_batch' || $modulepart ==
'produitlot') {
3656 if (empty($entity) || (empty(
$conf->productbatch->multidir_output[$entity]))) {
3657 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3659 if (($fuser->hasRight(
'produit', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3663 $original_file =
$conf->productbatch->multidir_output[$entity].
'/'.$original_file;
3665 } elseif ($modulepart ==
'movement' || $modulepart ==
'mouvement') {
3667 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3668 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3670 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3674 $original_file =
$conf->stock->multidir_output[$entity].
'/movement/'.$original_file;
3676 } elseif ($modulepart ==
'entrepot') {
3678 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3679 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3681 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3685 $original_file =
$conf->stock->multidir_output[$entity].
'/'.$original_file;
3687 } elseif ($modulepart ==
'contract' && !empty(
$conf->contract->multidir_output[$entity])) {
3689 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3692 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3693 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"contrat WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'contract').
")";
3694 } elseif ($modulepart ==
'donation' && !empty(
$conf->don->dir_output)) {
3696 if ($fuser->hasRight(
'don', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3699 $original_file =
$conf->don->dir_output.
'/'.$original_file;
3700 } elseif ($modulepart ==
'dolresource' && !empty(
$conf->resource->dir_output)) {
3702 if ($fuser->hasRight(
'resource', $read) || preg_match(
'/^specimen/i', $original_file)) {
3705 $original_file =
$conf->resource->dir_output.
'/'.$original_file;
3706 } elseif (($modulepart ==
'remisecheque' || $modulepart ==
'chequereceipt') && !empty(
$conf->bank->dir_output)) {
3708 if ($fuser->hasRight(
'banque', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3711 $original_file =
$conf->bank->dir_output.
'/checkdeposits/'.$original_file;
3712 } elseif (($modulepart ==
'banque' || $modulepart ==
'bank') && !empty(
$conf->bank->dir_output)) {
3714 if ($fuser->hasRight(
'banque', $lire)) {
3717 $original_file =
$conf->bank->dir_output.
'/'.$original_file;
3718 } elseif ($modulepart ==
'export' && !empty(
$conf->export->dir_temp)) {
3721 $accessallowed = $user->hasRight(
'export',
'lire');
3722 $original_file =
$conf->export->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3723 } elseif ($modulepart ==
'import' && !empty(
$conf->import->dir_temp)) {
3725 $accessallowed = $user->hasRight(
'import',
'run');
3726 $original_file =
$conf->import->dir_temp.
'/'.$original_file;
3727 } elseif ($modulepart ==
'recruitment' && !empty(
$conf->recruitment->dir_output)) {
3729 $accessallowed = $user->hasRight(
'recruitment',
'recruitmentjobposition',
'read');
3730 $original_file =
$conf->recruitment->dir_output.
'/'.$original_file;
3731 } elseif ($modulepart ==
'hrm' && !empty(
$conf->hrm->dir_output)) {
3733 $accessallowed = $user->hasRight(
'hrm',
'all',
'read');
3734 $original_file =
$conf->hrm->dir_output.
'/'.$original_file;
3735 } elseif ($modulepart ==
'editor' && !empty(
$conf->fckeditor->dir_output)) {
3738 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3739 } elseif ($modulepart ==
'systemtools' && !empty(
$conf->admin->dir_output)) {
3741 if ($fuser->admin) {
3744 $original_file =
$conf->admin->dir_output.
'/'.$original_file;
3745 } elseif ($modulepart ==
'admin_temp' && !empty(
$conf->admin->dir_temp)) {
3747 if ($fuser->admin) {
3750 $original_file =
$conf->admin->dir_temp.
'/'.$original_file;
3751 } elseif ($modulepart ==
'bittorrent' && !empty(
$conf->bittorrent->dir_output)) {
3755 if (
dol_mimetype($original_file) ==
'application/x-bittorrent') {
3758 $original_file =
$conf->bittorrent->dir_output.
'/'.$dir.
'/'.$original_file;
3759 } elseif ($modulepart ==
'member' && !empty(
$conf->member->dir_output)) {
3761 if ($fuser->hasRight(
'adherent', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3764 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3765 } elseif ($modulepart ==
'ticket' && !empty(
$conf->ticket->multidir_output[$entity])) {
3767 if ($fuser->hasRight(
'ticket', $read)) {
3770 if (!isset($_SESSION[
'email_customer'])) {
3771 $sqlprotectagainstexternals =
'';
3773 $email_split = explode(
'@', $_SESSION[
'email_customer']);
3775 $sqlprotectagainstexternals =
'SELECT t.rowid, t.fk_soc FROM '.MAIN_DB_PREFIX.
'ticket t';
3776 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'element_contact ec ON ec.element_id = t.rowid';
3777 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'socpeople c ON c.rowid = ec.fk_socpeople';
3778 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_type_contact tc ON tc.element = "ticket" AND tc.rowid = ec.fk_c_type_contact';
3779 $sqlprotectagainstexternals .=
' WHERE t.ref LIKE "'.$db->sanitize($refname).
'"';
3780 $sqlprotectagainstexternals .=
' AND (';
3781 $sqlprotectagainstexternals .=
' (';
3782 $sqlprotectagainstexternals .=
' tc.rowid IS NOT NULL';
3783 $sqlprotectagainstexternals .=
' AND c.email = "'.$db->sanitize($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
'"';
3784 $sqlprotectagainstexternals .=
' )';
3785 $sqlprotectagainstexternals .=
' OR t.origin_email = "'.$db->sanitize($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
'"';
3786 $sqlprotectagainstexternals .=
' )';
3788 $original_file =
$conf->ticket->multidir_output[$entity].
'/'.$original_file;
3798 if (preg_match(
'/^specimen/i', $original_file)) {
3801 if ($fuser->admin) {
3805 $tmpmodulepart = explode(
'-', $modulepart);
3806 if (!empty($tmpmodulepart[1])) {
3807 $modulepart = $tmpmodulepart[0];
3808 $original_file = $tmpmodulepart[1].
'/'.$original_file;
3813 if (preg_match(
'/^([a-z]+)_user_temp$/i', $modulepart, $reg)) {
3814 $tmpmodule = $reg[1];
3815 if (empty(
$conf->$tmpmodule->dir_temp)) {
3816 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3819 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3822 $original_file =
$conf->{$reg[1]}->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3823 } elseif (preg_match(
'/^([a-z]+)_temp$/i', $modulepart, $reg)) {
3824 $tmpmodule = $reg[1];
3825 if (empty(
$conf->$tmpmodule->dir_temp)) {
3826 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3829 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3832 $original_file =
$conf->$tmpmodule->dir_temp.
'/'.$original_file;
3833 } elseif (preg_match(
'/^([a-z]+)_user$/i', $modulepart, $reg)) {
3834 $tmpmodule = $reg[1];
3835 if (empty(
$conf->$tmpmodule->dir_output)) {
3836 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3839 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3842 $original_file =
$conf->$tmpmodule->dir_output.
'/'.$fuser->id.
'/'.$original_file;
3843 } elseif (preg_match(
'/^massfilesarea_([a-z]+)$/i', $modulepart, $reg)) {
3844 $tmpmodule = $reg[1];
3845 if (empty(
$conf->$tmpmodule->dir_output)) {
3846 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3851 $partsofdirinoriginalfile = explode(
'/', $original_file);
3852 if (!empty($partsofdirinoriginalfile[1])) {
3853 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3854 if (($partofdirinoriginalfile && $fuser->hasRight($tmpmodule, $partofdirinoriginalfile,
'read')) || preg_match(
'/^specimen/i', $original_file)) {
3858 if ($fuser->hasRight($tmpmodule, $read) || preg_match(
'/^specimen/i', $original_file)) {
3861 $original_file =
$conf->$tmpmodule->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3863 if (empty(
$conf->$modulepart->dir_output)) {
3864 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.');
3869 $partsofdirinoriginalfile = explode(
'/', $original_file);
3870 if (!empty($partsofdirinoriginalfile[1])) {
3871 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3872 if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile,
'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile,
'read'))) {
3876 if (($fuser->hasRight($modulepart, $lire) || $fuser->hasRight($modulepart, $read)) || ($fuser->hasRight($modulepart,
'all', $lire) || $fuser->hasRight($modulepart,
'all', $read))) {
3880 if (is_array(
$conf->$modulepart->multidir_output) && !empty(
$conf->$modulepart->multidir_output[$entity])) {
3881 $original_file =
$conf->$modulepart->multidir_output[$entity].
'/'.$original_file;
3883 $original_file =
$conf->$modulepart->dir_output.
'/'.$original_file;
3887 $parameters = array(
3888 'modulepart' => $modulepart,
3889 'original_file' => $original_file,
3890 'entity' => $entity,
3895 $reshook = $hookmanager->executeHooks(
'checkSecureAccess', $parameters,
$object);
3897 if (!empty($hookmanager->resArray[
'original_file'])) {
3898 $original_file = $hookmanager->resArray[
'original_file'];
3900 if (!empty($hookmanager->resArray[
'accessallowed'])) {
3901 $accessallowed = $hookmanager->resArray[
'accessallowed'];
3903 if (!empty($hookmanager->resArray[
'sqlprotectagainstexternals'])) {
3904 $sqlprotectagainstexternals = $hookmanager->resArray[
'sqlprotectagainstexternals'];
3910 'accessallowed' => ($accessallowed ? 1 : 0),
3911 'sqlprotectagainstexternals' => $sqlprotectagainstexternals,
3912 'original_file' => $original_file
3931 dol_syslog(
"Failed to create the cache directory ".$directory, LOG_WARNING);
3934 $cachefile = $directory.$filename;
3936 file_put_contents($cachefile, json_encode(
$object), LOCK_EX);
3951 $cachefile = $directory.$filename;
3952 $refresh = !file_exists($cachefile) || ($now - $cachetime) >
dol_filemtime($cachefile);
3965 $cachefile = $directory.$filename;
3966 $object = json_decode(file_get_contents($cachefile));
3978 return preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'\//',
'', $pathfile);
3993function getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path =
'', $pathref =
'', &$checksumconcat = array())
4001 if (!empty($dir->md5file)) {
4002 $entry = $dir->md5file;
4004 } elseif (!empty($dir->sha256file)) {
4005 $entry = $dir->sha256file;
4009 foreach ($entry as $file) {
4010 $filename = $path.$file[
'name'];
4011 $file_list[
'insignature'][] = $filename;
4012 $expectedsize = (empty($file[
'size']) ?
'' : $file[
'size']);
4013 $expectedhash = (
string) $file;
4015 if (!file_exists($pathref.
'/'.$filename)) {
4016 $file_list[
'missing'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'algo' => (
string) $algo);
4018 $hash_local = hash_file($algo, $pathref.
'/'.$filename);
4020 if (
$conffile ==
'/etc/dolibarr/conf.php' && $filename ==
'/filefunc.inc.php') {
4021 $checksumconcat[] = $expectedhash;
4023 if ($hash_local != $expectedhash) {
4024 $file_list[
'updated'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'hash' => (
string) $hash_local,
'algo' => (
string) $algo);
4026 $checksumconcat[] = $hash_local;
4031 foreach ($dir->dir as $subdir) {
4032 getFilesUpdated($file_list, $subdir, $path.$subdir[
'name'].
'/', $pathref, $checksumconcat);
4050 $out .=
'<div id="'.$htmlname.
'Message" class="dragDropAreaMessage hidden"><span>'.
img_picto(
"",
'download').
'<br>'.$langs->trans(
"DropFileToAddItToObject").
'</span></div>';
4051 $out .=
"\n<!-- JS CODE TO ENABLE DRAG AND DROP OF FILE -->\n";
4054 jQuery(document).ready(function() {
4055 var enterTargetDragDrop = null;
4057 $("#'.$htmlname.
'").addClass("cssDragDropArea");
4059 $(".cssDragDropArea").on("dragenter", function(ev, ui) {
4060 var dataTransfer = ev.originalEvent.dataTransfer;
4061 var dataTypes = dataTransfer.types;
4062 //console.log(dataTransfer);
4063 //console.log(dataTypes);
4065 if (!dataTypes || ($.inArray(\'Files\', dataTypes) === -1)) {
4066 // The element dragged is not a file, so we avoid the "dragenter"
4067 ev.preventDefault();
4071 // Entering drop area. Highlight area
4072 console.log("dragAndDropFileUpload: We add class highlightDragDropArea")
4073 enterTargetDragDrop = ev.target;
4074 $(this).addClass("highlightDragDropArea");
4075 $("#'.$htmlname.
'Message").removeClass("hidden");
4076 ev.preventDefault();
4079 $(".cssDragDropArea").on("dragleave", function(ev) {
4080 // Going out of drop area. Remove Highlight
4081 if (enterTargetDragDrop == ev.target){
4082 console.log("dragAndDropFileUpload: We remove class highlightDragDropArea")
4083 $("#'.$htmlname.
'Message").addClass("hidden");
4084 $(this).removeClass("highlightDragDropArea");
4088 $(".cssDragDropArea").on("dragover", function(ev) {
4089 ev.preventDefault();
4093 $(".cssDragDropArea").on("drop", function(e) {
4096 fd = new FormData();
4100 fd.append("action", "linkit");
4102 var dataTransfer = e.originalEvent.dataTransfer;
4104 if (dataTransfer.files && dataTransfer.files.length){
4105 var droppedFiles = e.originalEvent.dataTransfer.files;
4106 $.each(droppedFiles, function(index,file){
4107 fd.append("files[]", file,file.name)
4110 $(".cssDragDropArea").removeClass("highlightDragDropArea");
4111 counterdragdrop = 0;
4113 url: "'.DOL_URL_ROOT.
'/core/ajax/fileupload.php",
4118 success:function() {
4119 console.log("Uploaded.", arguments);
4120 /* arguments[0] is the json string of files */
4121 /* arguments[1] is the value for variable "success", can be 0 or 1 */
4122 let listoffiles = JSON.parse(arguments[0]);
4123 console.log(listoffiles);
4125 for (let i = 0; i < listoffiles.length; i++) {
4126 console.log(listoffiles[i].error);
4127 if (listoffiles[i].error) {
4131 console.log(nboferror);
4132 if (nboferror > 0) {
4133 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorOnAtLeastOneFileUpload:warnings";
4135 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=UploadFileDragDropSuccess:mesgs";
4139 console.log("Error Uploading.", arguments)
4140 if (arguments[0].status == 403) {
4141 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadPermissionDenied:errors";
4143 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadFileDragDropPermissionDenied:errors";
4149 $out .=
"</script>\n";
4163function archiveOrBackupFile($srcfile, $max_versions = 5, $archivedir =
'', $suffix =
"v", $moveorcopy =
'move')
4165 $base_file_pattern = ($archivedir ? $archivedir : dirname($srcfile)).
'/'.basename($srcfile).
".".$suffix;
4166 $files_in_directory = glob($base_file_pattern .
"*");
4169 $files_with_timestamps = [];
4170 foreach ($files_in_directory as $file) {
4171 $files_with_timestamps[] = [
4173 'timestamp' => filemtime($file)
4179 while (count($files_with_timestamps) > 0) {
4180 $latest_file =
null;
4181 $latest_index =
null;
4184 foreach ($files_with_timestamps as $index => $file_info) {
4185 if ($latest_file ===
null || (is_array($latest_file) && $file_info[
'timestamp'] > $latest_file[
'timestamp'])) {
4186 $latest_file = $file_info;
4187 $latest_index = $index;
4192 if ($latest_file !==
null) {
4193 $sorted_files[] = $latest_file[
'file'];
4194 unset($files_with_timestamps[$latest_index]);
4199 if (count($sorted_files) >= $max_versions) {
4200 $oldest_files = array_slice($sorted_files, $max_versions - 1);
4201 foreach ($oldest_files as $oldest_file) {
4207 $new_backup = $srcfile .
".v" . $timestamp;
4210 if ($moveorcopy ==
'move') {
4211 $result =
dol_move($srcfile, $new_backup,
'0', 1, 0, 0);
4213 $result =
dol_copy($srcfile, $new_backup,
'0', 1, 0, 0);
4229function dolDocToText($filetoprocess, $useFullTextIndexation =
'pdftotext', $options =
'html')
4234 $keywords = array();
4235 $textforfulltextindex =
'';
4238 if (empty($useFullTextIndexation)) {
4239 $useFullTextIndexation =
'pdftotext';
4246 if (preg_match(
'/pdftotext/i', $useFullTextIndexation)) {
4247 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4249 $outputfile =
$conf->admin->dir_temp.
'/tmppdftotext.'.$user->id.
'.out';
4253 if ($options ==
'fulltext') {
4254 $params =
'-nodiag -layout';
4256 $params =
'-htmlmeta';
4258 $cmd =
getDolGlobalString(
'MAIN_SAVE_FILE_CONTENT_AS_TEXT_PDFTOTEXT',
'pdftotext') .
" " . $params .
" '".escapeshellcmd($filetoprocess).
"' - ";
4259 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4261 if (empty($resultexec[
'error'])) {
4263 if ($options ==
'fulltext') {
4264 $textforfulltextindex = $resultexec[
'output'];
4266 if ($options ==
'html') {
4267 $txt = $resultexec[
'output'];
4268 if (preg_match(
'/<meta name="keywords" content="([^\/]+)"\s*\/>/i', $txt, $matches)) {
4269 $keywords = $matches[1];
4271 if (preg_match(
'/<pre>(.*)<\/pre>/si', $txt, $matches)) {
4283 if (preg_match(
'/docling/i', $useFullTextIndexation)) {
4284 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4286 $outputfile =
$conf->admin->dir_temp.
'/tmpdocling.'.$user->id.
'.out';
4290 $cmd =
getDolGlobalString(
'MAIN_SAVE_FILE_CONTENT_AS_TEXT_DOCLING',
'docling').
" --from pdf --to text '".escapeshellcmd($filetoprocess).
"'";
4291 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4293 if (!$resultexec[
'error']) {
4294 $txt = $resultexec[
'output'];
4302 $textforfulltextindex = $txt;
4309 return array(
'error' => $error,
'keywords' => $keywords,
'content' => $textforfulltextindex,
'cmd' => $cmd);
4321 $fp = fopen($fullpath,
"r");
4322 fseek($fp, -1, SEEK_END);
4325 while ($char ===
"\n" || $char ===
"\r") {
4326 fseek($fp, $pos--, SEEK_END);
4329 while ($char !==
"\n" && $char !==
false) {
4330 fseek($fp, $pos--, SEEK_END);
4339 $truncatePos = ftell($fp);
4342 $fp = fopen($fullpath,
"c+");
4343 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.
getExecutableContent()
Return array of extension for executable files of text files that can contains executable code.
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)
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
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.
currentToken()
Return the value of token currently saved into session with name 'token'.
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.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
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...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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...
isAFileWithExecutableContent($filename)
Return if a file can contains executable content.
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.