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);
443 if (in_array($modulepart, array(
'produit',
'product')) &&
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
448 $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";
450 $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";
453 $relativedirold = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dirold);
454 $relativedirold = ltrim($relativedirold,
"/\\");
459 } elseif ($modulepart ==
'ticket') {
460 foreach ($filearray as $key => $val) {
461 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filearray[$key][
'path']);
462 $rel_dir = trim($rel_dir,
"/\\");
463 if ($rel_dir != $relativedir) {
464 $filearrayindatabase = array_merge($filearrayindatabase,
dol_dir_list_in_database($rel_dir,
'',
null,
'name', SORT_ASC));
470 foreach ($filearray as $key => $val) {
471 $tmpfilename = preg_replace(
'/\.noexe$/',
'', $filearray[$key][
'name']);
474 foreach ($filearrayindatabase as $key2 => $val2) {
475 if (($filearrayindatabase[$key2][
'path'] == $filearray[$key][
'path']) && ($filearrayindatabase[$key2][
'name'] == $tmpfilename)) {
476 $filearray[$key][
'position_name'] = ($filearrayindatabase[$key2][
'position'] ? $filearrayindatabase[$key2][
'position'] :
'0').
'_'.$filearrayindatabase[$key2][
'name'];
477 $filearray[$key][
'position'] = $filearrayindatabase[$key2][
'position'];
478 $filearray[$key][
'cover'] = $filearrayindatabase[$key2][
'cover'];
479 $filearray[$key][
'keywords'] = $filearrayindatabase[$key2][
'keywords'];
480 $filearray[$key][
'acl'] = $filearrayindatabase[$key2][
'acl'];
481 $filearray[$key][
'rowid'] = $filearrayindatabase[$key2][
'rowid'];
482 $filearray[$key][
'label'] = $filearrayindatabase[$key2][
'label'];
483 $filearray[$key][
'share'] = $filearrayindatabase[$key2][
'share'];
490 $filearray[$key][
'position'] =
'999999';
491 $filearray[$key][
'cover'] = 0;
492 $filearray[$key][
'acl'] =
'';
493 $filearray[$key][
'share'] = 0;
495 $rel_filename = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filearray[$key][
'fullname']);
497 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filename)) {
498 dol_syslog(
"list_of_documents We found a file called '".$filearray[$key][
'name'].
"' not indexed into database. We add it");
500 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
504 $filename = basename($rel_filename);
505 $rel_dir = dirname($rel_filename);
506 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
507 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
509 $ecmfile->filepath = $rel_dir;
510 $ecmfile->filename = $filename;
511 $ecmfile->label = md5_file(
dol_osencode($filearray[$key][
'fullname']));
512 $ecmfile->fullpath_orig = $filearray[$key][
'fullname'];
513 $ecmfile->gen_or_uploaded =
'unknown';
515 $ecmfile->src_object_type =
$object->element;
516 $ecmfile->src_object_id =
$object->id;
518 $ecmfile->description =
'';
519 $ecmfile->keywords =
'';
524 $result = $ecmfile->create($user);
528 $filearray[$key][
'rowid'] = $result;
531 $filearray[$key][
'rowid'] = 0;
548 global $sortorder, $sortfield;
550 $sortorder = strtoupper($sortorder);
552 if ($sortorder ==
'ASC') {
560 if ($sortfield ==
'name') {
561 if ($a->name == $b->name) {
564 return ($a->name < $b->name) ? $retup : $retdown;
566 if ($sortfield ==
'date') {
567 if ($a->date == $b->date) {
570 return ($a->date < $b->date) ? $retup : $retdown;
572 if ($sortfield ==
'size') {
573 if ($a->size == $b->size) {
576 return ($a->size < $b->size) ? $retup : $retdown;
592 if (is_dir($newfolder)) {
607 if (!is_readable($dir)) {
610 return (count(scandir($dir)) == 2);
622 return is_file($newpathoffile);
634 return is_link($newpathoffile);
646 return is_writable($newfolderorfile);
659 $prots = array(
'file',
'http',
'https',
'ftp',
'zlib',
'data',
'ssh',
'ssh2',
'ogg',
'expect');
660 return false !== preg_match(
'/^('.implode(
'|', $prots).
'):/i', $uri);
672 if (is_dir($newfolder)) {
673 $handle = opendir($newfolder);
674 $folder_content =
'';
676 while ((gettype($name = readdir($handle)) !=
"boolean")) {
677 $name_array[] = $name;
679 foreach ($name_array as $temp) {
680 $folder_content .= $temp;
685 if ($folder_content ==
"...") {
708 $fp = fopen($newfile,
'r');
715 if ($line !==
false) {
738 return filesize($newpathoffile);
750 return @filemtime($newpathoffile);
762 return fileperms($newpathoffile);
777function dolReplaceInFile($srcfile, $arrayreplacement, $destfile =
'', $newmask =
'0', $indexdatabase = 0, $arrayreplacementisregex = 0)
779 dol_syslog(
"files.lib.php::dolReplaceInFile srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" indexdatabase=".$indexdatabase.
" arrayreplacementisregex=".$arrayreplacementisregex);
781 if (empty($srcfile)) {
784 if (empty($destfile)) {
785 $destfile = $srcfile;
789 $srcfile = preg_replace(
'/\.\.\/?/',
'', $srcfile);
790 $destfile = preg_replace(
'/\.\.\/?/',
'', $destfile);
793 if (($destfile != $srcfile) && $destexists) {
799 dol_syslog(
"files.lib.php::dolReplaceInFile failed to read src file", LOG_WARNING);
803 $tmpdestfile = $destfile.
'.tmp';
808 $newdirdestfile = dirname($newpathofdestfile);
810 if ($destexists && !is_writable($newpathofdestfile)) {
811 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to overwrite target file", LOG_WARNING);
814 if (!is_writable($newdirdestfile)) {
815 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
822 $content = file_get_contents($newpathofsrcfile);
824 if (empty($arrayreplacementisregex)) {
827 foreach ($arrayreplacement as $key => $value) {
828 $content = preg_replace($key, (
string) $value, $content);
832 file_put_contents($newpathoftmpdestfile, $content);
833 dolChmod($newpathoftmpdestfile, $newmask);
836 $moreinfo = array(
'gen_or_uploaded' =>
'unknown');
837 $result =
dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile) ? 1 : 0), 0, $indexdatabase, $moreinfo);
839 dol_syslog(
"files.lib.php::dolReplaceInFile failed to move tmp file to final dest", LOG_WARNING);
845 if (empty($newmask)) {
846 dol_syslog(
"Warning: dolReplaceInFile called with empty value for newmask and no default value defined", LOG_WARNING);
850 dolChmod($newpathofdestfile, $newmask);
865 if (! file_exists($filePath)) {
866 dol_syslog(
"files.lib.php::removePatternFromFile: File $filePath does not exist", LOG_WARNING);
872 $content = file_get_contents($filePath);
873 if ($content ===
false) {
874 dol_syslog(
"files.lib.php::removePatternFromFile: Unable to read the file $filePath", LOG_WARNING);
880 $updatedContent = preg_replace($pattern,
'', $content);
881 if ($updatedContent ===
null) {
882 dol_syslog(
"files.lib.php::removePatternFromFile: Error while processing the file $filePath", LOG_WARNING);
888 $result = file_put_contents($filePath, $updatedContent);
889 if ($result ===
false) {
890 dol_syslog(
"files.lib.php::removePatternFromFile: Permission denied to overwrite the target file $filePath", LOG_WARNING);
895 dol_syslog(
"files.lib.php::removePatternFromFile: Content successfully removed in the file $filePath", LOG_INFO);
914function dol_copy($srcfile, $destfile, $newmask =
'0', $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 0)
918 dol_syslog(
"files.lib.php::dol_copy srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
920 if (empty($srcfile) || empty($destfile)) {
925 if (!$overwriteifexists && $destexists) {
931 $newdirdestfile = dirname($newpathofdestfile);
933 if ($destexists && !is_writable($newpathofdestfile)) {
934 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to overwrite target file", LOG_WARNING);
937 if (!is_writable($newdirdestfile)) {
938 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
943 $testvirusarray = array();
946 if (count($testvirusarray)) {
947 dol_syslog(
"files.lib.php::dol_copy canceled because a virus was found into source file. we ignore the copy request.", LOG_WARNING);
953 $result = @copy($newpathofsrcfile, $newpathofdestfile);
956 dol_syslog(
"files.lib.php::dol_copy failed to copy", LOG_WARNING);
962 if (empty($newmask)) {
963 dol_syslog(
"Warning: dol_copy called with empty value for newmask and no default value defined", LOG_WARNING);
967 dolChmod($newpathofdestfile, $newmask);
969 if ($result && $indexdatabase) {
971 $rel_filetocopyafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $newpathofdestfile);
972 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetocopyafter)) {
973 $rel_filetocopyafter = preg_replace(
'/^[\\/]/',
'', $rel_filetocopyafter);
976 dol_syslog(
"Try to copy also entries in database for: ".$rel_filetocopyafter, LOG_DEBUG);
977 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
980 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetocopyafter);
981 if ($resultecmtarget > 0) {
982 dol_syslog(
"ECM dest file found, remove it", LOG_DEBUG);
983 $ecmfiletarget->delete($user);
985 dol_syslog(
"ECM dest file not found, create it", LOG_DEBUG);
989 $resultecm = $ecmSrcfile->fetch(0,
'', $srcfile);
993 dol_syslog(
"Fetch src file error", LOG_DEBUG);
997 $filename = basename($rel_filetocopyafter);
998 $rel_dir = dirname($rel_filetocopyafter);
999 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1000 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1002 $ecmfile->filepath = $rel_dir;
1003 $ecmfile->filename = $filename;
1005 $ecmfile->fullpath_orig = $srcfile;
1006 $ecmfile->gen_or_uploaded =
'copy';
1007 $ecmfile->description = $ecmSrcfile->description;
1008 $ecmfile->keywords = $ecmSrcfile->keywords;
1009 $resultecm = $ecmfile->create($user);
1010 if ($resultecm < 0) {
1014 dol_syslog(
"Create ECM file error", LOG_DEBUG);
1018 if ($resultecm > 0) {
1026 return (
int) $result;
1043function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement =
null, $excludesubdir = 0, $excludefileext =
null, $excludearchivefiles = 0)
1047 dol_syslog(
"files.lib.php::dolCopyDir srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
1049 if (empty($srcfile) || empty($destfile)) {
1060 $dirmaskdec = octdec($newmask);
1064 $dirmaskdec |= octdec(
'0200');
1066 $result =
dol_mkdir($destfile,
'', decoct($dirmaskdec));
1078 if (is_dir($ossrcfile)) {
1079 $dir_handle = opendir($ossrcfile);
1081 while ($file = readdir($dir_handle)) {
1082 if ($file !=
"." && $file !=
".." && !is_link($ossrcfile.
"/".$file)) {
1083 if (is_dir($ossrcfile.
"/".$file)) {
1084 if (empty($excludesubdir) || ($excludesubdir == 2 && strlen($file) == 2)) {
1087 if (is_array($arrayreplacement)) {
1088 foreach ($arrayreplacement as $key => $val) {
1089 $newfile = str_replace($key, $val, $newfile);
1093 $tmpresult =
dolCopyDir($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists, $arrayreplacement, $excludesubdir, $excludefileext, $excludearchivefiles);
1098 if (is_array($excludefileext)) {
1099 $extension = pathinfo($file, PATHINFO_EXTENSION);
1100 if (in_array($extension, $excludefileext)) {
1106 if ($excludearchivefiles == 1) {
1107 $extension = pathinfo($file, PATHINFO_EXTENSION);
1108 if (preg_match(
'/^[v|d]\d+$/', $extension)) {
1114 if (is_array($arrayreplacement)) {
1115 foreach ($arrayreplacement as $key => $val) {
1116 $newfile = str_replace($key, $val, $newfile);
1119 $tmpresult =
dol_copy($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists);
1122 if ($result > 0 && $tmpresult >= 0) {
1125 $result = $tmpresult;
1132 closedir($dir_handle);
1138 return (
int) $result;
1160function dol_move($srcfile, $destfile, $newmask =
'0', $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 1, $moreinfo = array(), $entity =
null)
1165 dol_syslog(
"files.lib.php::dol_move srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwritifexists=".$overwriteifexists);
1170 dol_syslog(
"files.lib.php::dol_move srcfile does not exists. we ignore the move request.");
1174 if ($overwriteifexists || !$destexists) {
1179 $testvirusarray = array();
1182 $testvirusarray =
dolCheckVirus($newpathofsrcfile, $newpathofdestfile);
1183 if (count($testvirusarray)) {
1184 dol_syslog(
"files.lib.php::dol_move canceled because a virus was found into source file. We ignore the move request.", LOG_WARNING);
1190 if (count($testvirusarray)) {
1191 dol_syslog(
"files.lib.php::dol_move canceled because a virus was found into source file. We ignore the move request.", LOG_WARNING);
1196 global $dolibarr_main_restrict_os_commands;
1197 if (!empty($dolibarr_main_restrict_os_commands)) {
1198 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
1199 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
1200 if (in_array(basename($destfile), $arrayofallowedcommand)) {
1203 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);
1208 $result = @rename($newpathofsrcfile, $newpathofdestfile);
1211 dol_syslog(
"files.lib.php::dol_move Failed. We try to delete target first and move after.", LOG_WARNING);
1214 $result = @rename($newpathofsrcfile, $newpathofdestfile);
1216 dol_syslog(
"files.lib.php::dol_move Failed.", LOG_WARNING);
1221 if ($result && $indexdatabase) {
1223 $rel_filetorenamebefore = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $srcfile);
1224 $rel_filetorenameafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $destfile);
1225 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetorenameafter)) {
1226 $rel_filetorenamebefore = preg_replace(
'/^[\\/]/',
'', $rel_filetorenamebefore);
1227 $rel_filetorenameafter = preg_replace(
'/^[\\/]/',
'', $rel_filetorenameafter);
1230 dol_syslog(
"Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore.
" after = ".$rel_filetorenameafter, LOG_DEBUG);
1231 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1234 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetorenameafter,
'',
'',
'', 0, $entity);
1235 if ($resultecmtarget > 0) {
1236 $ecmfiletarget->delete($user);
1240 $resultecm = $ecmfile->fetch(0,
'', $rel_filetorenamebefore,
'',
'',
'', 0, $entity);
1241 if ($resultecm > 0) {
1242 $filename = basename($rel_filetorenameafter);
1243 $rel_dir = dirname($rel_filetorenameafter);
1244 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1245 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1247 $ecmfile->filepath = $rel_dir;
1248 $ecmfile->filename = $filename;
1250 $resultecm = $ecmfile->update($user);
1251 } elseif ($resultecm == 0) {
1252 $filename = basename($rel_filetorenameafter);
1253 $rel_dir = dirname($rel_filetorenameafter);
1254 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1255 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1257 $ecmfile->filepath = $rel_dir;
1258 $ecmfile->filename = $filename;
1260 $ecmfile->fullpath_orig = basename($srcfile);
1261 if (!empty($moreinfo) && !empty($moreinfo[
'gen_or_uploaded'])) {
1262 $ecmfile->gen_or_uploaded = $moreinfo[
'gen_or_uploaded'];
1264 $ecmfile->gen_or_uploaded =
'unknown';
1266 if (!empty($moreinfo) && !empty($moreinfo[
'description'])) {
1267 $ecmfile->description = $moreinfo[
'description'];
1269 $ecmfile->description =
'';
1271 if (!empty($moreinfo) && !empty($moreinfo[
'keywords'])) {
1272 $ecmfile->keywords = $moreinfo[
'keywords'];
1274 $ecmfile->keywords =
'';
1276 if (!empty($moreinfo) && !empty($moreinfo[
'note_private'])) {
1277 $ecmfile->note_private = $moreinfo[
'note_private'];
1279 if (!empty($moreinfo) && !empty($moreinfo[
'note_public'])) {
1280 $ecmfile->note_public = $moreinfo[
'note_public'];
1282 if (!empty($moreinfo) && !empty($moreinfo[
'src_object_type'])) {
1283 $ecmfile->src_object_type = $moreinfo[
'src_object_type'];
1285 if (!empty($moreinfo) && !empty($moreinfo[
'src_object_id'])) {
1286 $ecmfile->src_object_id = $moreinfo[
'src_object_id'];
1288 if (!empty($moreinfo) && !empty($moreinfo[
'position'])) {
1289 $ecmfile->position = $moreinfo[
'position'];
1291 if (!empty($moreinfo) && !empty($moreinfo[
'cover'])) {
1292 $ecmfile->cover = $moreinfo[
'cover'];
1294 if (!empty($moreinfo) && !empty($moreinfo[
'share'])) {
1295 $ecmfile->share = $moreinfo[
'share'];
1297 if (! empty($entity)) {
1298 $ecmfile->entity = $entity;
1301 $resultecm = $ecmfile->create($user);
1302 if ($resultecm < 0) {
1305 if (!empty($moreinfo) && !empty($moreinfo[
'array_options']) && is_array($moreinfo[
'array_options'])) {
1306 $ecmfile->array_options = $moreinfo[
'array_options'];
1307 $resultecm = $ecmfile->insertExtraFields();
1308 if ($resultecm < 0) {
1313 } elseif ($resultecm < 0) {
1317 if ($resultecm > 0) {
1325 if (empty($newmask)) {
1332 dolChmod($newpathofdestfile, $newmask);
1348function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase = 1, $renamedircontent = 1)
1352 dol_syslog(
"files.lib.php::dol_move_dir srcdir=".$srcdir.
" destdir=".$destdir.
" overwritifexists=".$overwriteifexists.
" indexdatabase=".$indexdatabase.
" renamedircontent=".$renamedircontent);
1354 $srcbasename = basename($srcdir);
1358 dol_syslog(
"files.lib.php::dol_move_dir srcdir does not exists. Move fails");
1362 if ($overwriteifexists || !$destexists) {
1369 if ($overwriteifexists) {
1370 if (strtoupper(substr(PHP_OS, 0, 3)) ===
'WIN') {
1371 if (is_dir($newpathofdestdir)) {
1372 @rmdir($newpathofdestdir);
1377 $result = @rename($newpathofsrcdir, $newpathofdestdir);
1380 if ($result && $renamedircontent) {
1381 if (file_exists($newpathofdestdir)) {
1382 $destbasename = basename($newpathofdestdir);
1384 if (!empty($files) && is_array($files)) {
1385 foreach ($files as $key => $file) {
1386 if (!file_exists($file[
"fullname"])) {
1389 $filepath = $file[
"path"];
1390 $oldname = $file[
"name"];
1392 $newname = str_replace($srcbasename, $destbasename, $oldname);
1393 if (!empty($newname) && $newname !== $oldname) {
1394 if ($file[
"type"] ==
"dir") {
1395 $res =
dol_move_dir($filepath.
'/'.$oldname, $filepath.
'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
1397 $moreinfo = array(
'gen_or_uploaded' =>
'unknown');
1398 $res =
dol_move($filepath.
'/'.$oldname, $filepath.
'/'.$newname,
'0', $overwriteifexists, 0, $indexdatabase, $moreinfo);
1425 return trim(basename($filename),
".\x00..\x20");
1441 if (!empty($reterrors)) {
1446 if (!class_exists(
'AntiVir')) {
1447 require_once DOL_DOCUMENT_ROOT.
'/core/class/antivir.class.php';
1450 $result = $antivir->dol_avscan_file($src_file);
1452 $reterrors = $antivir->errors;
1468 if (preg_match(
'/\.pdf$/i', $dest_file)) {
1470 dol_syslog(
"dolCheckOnFileName Check that pdf does not contains js code");
1472 $tmp = file_get_contents(trim($src_file));
1473 if (preg_match(
'/[\n\s]+\/JavaScript[\n\s]+/m', $tmp)) {
1474 return array(
'File is a PDF with javascript inside');
1477 dol_syslog(
"dolCheckOnFileName Check js into pdf disabled");
1506function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $keyforsourcefile =
'addedfile', $upload_dir =
'', $mode = 0)
1512 $file_name = $dest_file;
1515 if (empty($nohook)) {
1516 $reshook = $hookmanager->initHooks(array(
'fileslib'));
1518 $parameters = array(
'dest_file' => $dest_file,
'src_file' => $src_file,
'file_name' => $file_name,
'varfiles' => $keyforsourcefile,
'allowoverwrite' => $allowoverwrite);
1519 $reshook = $hookmanager->executeHooks(
'moveUploadedFile', $parameters,
$object);
1522 if (empty($reshook)) {
1524 if ($uploaderrorcode) {
1525 switch ($uploaderrorcode) {
1526 case UPLOAD_ERR_INI_SIZE:
1527 return 'ErrorFileSizeTooLarge';
1528 case UPLOAD_ERR_FORM_SIZE:
1529 return 'ErrorFileSizeTooLarge';
1530 case UPLOAD_ERR_PARTIAL:
1531 return 'ErrorPartialFile';
1532 case UPLOAD_ERR_NO_TMP_DIR:
1533 return 'ErrorNoTmpDir';
1534 case UPLOAD_ERR_CANT_WRITE:
1535 return 'ErrorFailedToWriteInDir';
1536 case UPLOAD_ERR_EXTENSION:
1537 return 'ErrorUploadBlockedByAddon';
1545 if (empty($disablevirusscan) && file_exists($src_file)) {
1547 if (count($checkvirusarray)) {
1548 dol_syslog(
'Files.lib::dol_move_uploaded_file File "'.$src_file.
'" (target name "'.$dest_file.
'") KO with antivirus: errors='.implode(
',', $checkvirusarray), LOG_WARNING);
1549 return 'ErrorFileIsInfectedWithAVirus: '.implode(
',', $checkvirusarray);
1558 $publicmediasdirwithslash =
$conf->medias->multidir_output[
$conf->entity];
1559 if (!preg_match(
'/\/$/', $publicmediasdirwithslash)) {
1560 $publicmediasdirwithslash .=
'/';
1563 if (strpos($upload_dir, $publicmediasdirwithslash) !== 0 || !
getDolGlobalInt(
"MAIN_DOCUMENT_DISABLE_NOEXE_IN_MEDIAS_DIR")) {
1564 $file_name .=
'.noexe';
1571 if (preg_match(
'/^\./', basename($src_file)) || preg_match(
'/\.\./', $src_file) || preg_match(
'/[<>|]/', $src_file)) {
1572 dol_syslog(
"Refused to deliver file ".$src_file, LOG_WARNING);
1578 if (preg_match(
'/^\./', basename($dest_file)) || preg_match(
'/\.\./', $dest_file) || preg_match(
'/[<>|]/', $dest_file)) {
1579 dol_syslog(
"Refused to deliver file ".$dest_file, LOG_WARNING);
1585 $errmsg = implode(
',', $hookmanager->errors);
1586 if (empty($errmsg)) {
1587 $errmsg =
'ErrorReturnedBySomeHooks';
1590 } elseif (empty($reshook)) {
1596 if (!is_writable(dirname($file_name_osencoded))) {
1597 dol_syslog(
"Files.lib::dol_move_uploaded_file Dir ".dirname($file_name_osencoded).
" is not writable. Return 'ErrorDirNotWritable'", LOG_WARNING);
1598 return 'ErrorDirNotWritable';
1602 if (!$allowoverwrite) {
1603 if (file_exists($file_name_osencoded)) {
1604 dol_syslog(
"Files.lib::dol_move_uploaded_file File ".$file_name.
" already exists. Return 'ErrorFileAlreadyExists'", LOG_WARNING);
1605 return 'ErrorFileAlreadyExists';
1608 if (is_dir($file_name_osencoded)) {
1609 dol_syslog(
"Files.lib::dol_move_uploaded_file A directory with name ".$file_name.
" already exists. Return 'ErrorDirWithFileNameAlreadyExists'", LOG_WARNING);
1610 return 'ErrorDirWithFileNameAlreadyExists';
1616 $return = move_uploaded_file($src_file_osencoded, $file_name_osencoded);
1618 $return = rename($src_file_osencoded, $file_name_osencoded);
1623 dol_syslog(
"Files.lib::dol_move_uploaded_file Success to move ".$src_file.
" to ".$file_name.
" - Umask=" .
getDolGlobalString(
'MAIN_UMASK'), LOG_DEBUG);
1624 return $successcode;
1626 dol_syslog(
"Files.lib::dol_move_uploaded_file Failed to move ".$src_file.
" to ".$file_name, LOG_ERR);
1631 return $successcode;
1649function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0,
$object =
null, $allowdotdot =
false, $indexdatabase = 1, $nolog = 0)
1652 global $hookmanager;
1654 if (empty($nolog)) {
1655 dol_syslog(
"dol_delete_file file=".$file.
" disableglob=".$disableglob.
" nophperrors=".$nophperrors.
" nohook=".$nohook);
1660 if ((!$allowdotdot && preg_match(
'/\.\./', $file)) || preg_match(
'/[<>|]/', $file)) {
1661 dol_syslog(
"Refused to delete file ".$file, LOG_WARNING);
1666 if (empty($nohook) && !empty($hookmanager)) {
1667 $hookmanager->initHooks(array(
'fileslib'));
1669 $parameters = array(
1671 'disableglob' => $disableglob,
1672 'nophperrors' => $nophperrors
1674 $reshook = $hookmanager->executeHooks(
'deleteFile', $parameters,
$object);
1677 if (empty($nohook) && $reshook != 0) {
1685 if (empty($disableglob) && !empty($file_osencoded)) {
1687 $globencoded = str_replace(
'[',
'\[', $file_osencoded);
1688 $globencoded = str_replace(
']',
'\]', $globencoded);
1689 $listoffiles = glob($globencoded);
1691 if (!empty($listoffiles) && is_array($listoffiles)) {
1692 foreach ($listoffiles as $filename) {
1694 $ok = @unlink($filename);
1696 $ok = unlink($filename);
1700 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1701 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);
1702 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1705 $ok = @unlink($filename);
1707 $ok = unlink($filename);
1712 if (empty($nolog)) {
1713 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1717 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1718 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1719 if (is_object(
$db) && $indexdatabase) {
1720 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1721 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1723 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1724 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1727 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1728 if ($result >= 0 && $ecmfile->id > 0) {
1729 $result = $ecmfile->delete($user);
1737 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1744 dol_syslog(
"No files to delete found", LOG_DEBUG);
1749 $ok = @unlink($file_osencoded);
1751 $ok = unlink($file_osencoded);
1754 $filename = $file_osencoded;
1757 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1758 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);
1759 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1762 $ok = @unlink($filename);
1764 $ok = unlink($filename);
1769 if (empty($nolog)) {
1770 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1774 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1775 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1776 if (is_object(
$db) && $indexdatabase) {
1777 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1778 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1780 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1781 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1784 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1785 if ($result >= 0 && $ecmfile->id > 0) {
1786 $result = $ecmfile->delete($user);
1794 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1815 if (preg_match(
'/\.\./', $dir) || preg_match(
'/[<>|]/', $dir)) {
1816 dol_syslog(
"Refused to delete dir ".$dir.
' (contains invalid char sequence)', LOG_WARNING);
1821 return ($nophperrors ? @rmdir($dir_osencoded) : rmdir($dir_osencoded));
1837function dol_delete_dir_recursive($dir, $count = 0, $nophperrors = 0, $onlysub = 0, &$countdeleted = 0, $indexdatabase = 1, $nolog = 0, $level = 0)
1839 if (empty($nolog) || empty($level)) {
1840 dol_syslog(
"functions.lib:dol_delete_dir_recursive ".$dir, LOG_DEBUG);
1842 if ($level > 1000) {
1843 dol_syslog(
"functions.lib:dol_delete_dir_recursive too many depth", LOG_WARNING);
1848 if ($handle = opendir(
"$dir_osencoded")) {
1849 while (
false !== ($item = readdir($handle))) {
1851 $item = mb_convert_encoding($item,
'UTF-8',
'ISO-8859-1');
1854 if ($item !=
"." && $item !=
"..") {
1856 $count =
dol_delete_dir_recursive(
"$dir/$item", $count, $nophperrors, 0, $countdeleted, $indexdatabase, $nolog, ($level + 1));
1859 $result =
dol_delete_file(
"$dir/$item", 1, $nophperrors, 0,
null,
false, $indexdatabase, $nolog);
1871 if (empty($onlysub)) {
1896 global $langs,
$conf;
1901 if (
$object->element ==
'order_supplier') {
1902 $dir =
$conf->fournisseur->commande->dir_output;
1903 } elseif (
$object->element ==
'invoice_supplier') {
1904 $dir =
$conf->fournisseur->facture->dir_output;
1905 } elseif (
$object->element ==
'project') {
1906 $dir =
$conf->project->dir_output;
1907 } elseif (
$object->element ==
'shipping') {
1908 $dir =
$conf->expedition->dir_output.
'/sending';
1909 } elseif (
$object->element ==
'delivery') {
1910 $dir =
$conf->expedition->dir_output.
'/receipt';
1911 } elseif (
$object->element ==
'fichinter') {
1912 $dir =
$conf->ficheinter->dir_output;
1914 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1918 $object->error = $langs->trans(
'ErrorObjectNoSupportedByFunction');
1923 $dir = $dir.
"/".$refsan;
1924 $filepreviewnew = $dir.
"/".$refsan.
".pdf_preview.png";
1925 $filepreviewnewbis = $dir.
"/".$refsan.
".pdf_preview-0.png";
1926 $filepreviewold = $dir.
"/".$refsan.
".pdf.png";
1929 if (file_exists($filepreviewnew) && is_writable($filepreviewnew)) {
1931 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnew);
1935 if (file_exists($filepreviewnewbis) && is_writable($filepreviewnewbis)) {
1937 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnewbis);
1942 if (file_exists($filepreviewold) && is_writable($filepreviewold)) {
1944 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewold);
1948 $multiple = $filepreviewold.
".";
1949 for ($i = 0; $i < 20; $i++) {
1950 $preview = $multiple.$i;
1952 if (file_exists($preview) && is_writable($preview)) {
1954 $object->error = $langs->trans(
"ErrorFailedToOpenFile", $preview);
1984 if (
$object->element ==
'order_supplier') {
1985 $dir =
$conf->fournisseur->dir_output.
'/commande';
1986 } elseif (
$object->element ==
'invoice_supplier') {
1987 $dir =
$conf->fournisseur->dir_output.
'/facture';
1988 } elseif (
$object->element ==
'project') {
1989 $dir =
$conf->project->dir_output;
1990 } elseif (
$object->element ==
'shipping') {
1991 $dir =
$conf->expedition->dir_output.
'/sending';
1992 } elseif (
$object->element ==
'delivery') {
1993 $dir =
$conf->expedition->dir_output.
'/receipt';
1994 } elseif (
$object->element ==
'fichinter') {
1995 $dir =
$conf->ficheinter->dir_output;
1997 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
2004 $dir = $dir.
"/".$objectref;
2005 $file = $dir.
"/".$objectref.
".meta";
2007 if (!is_dir($dir)) {
2014 $nblines = count(
$object->lines);
2019 $meta =
"REFERENCE=\"".$object->ref.
"\"
2021 NB_ITEMS=\"" . $nblines.
"\"
2022 CLIENT=\"" . $client.
"\"
2023 AMOUNT_EXCL_TAX=\"" .
$object->total_ht.
"\"
2024 AMOUNT=\"" .
$object->total_ttc.
"\"\n";
2026 for ($i = 0; $i < $nblines; $i++) {
2028 $meta .=
"ITEM_".$i.
"_QUANTITY=\"".
$object->lines[$i]->qty.
"\"
2029 ITEM_" . $i.
"_AMOUNT_WO_TAX=\"".
$object->lines[$i]->total_ht.
"\"
2030 ITEM_" . $i.
"_VAT=\"".
$object->lines[$i]->tva_tx.
"\"
2031 ITEM_" . $i.
"_DESCRIPTION=\"".str_replace(
"\r\n",
"", nl2br(
$object->lines[$i]->desc)).
"\"
2036 $fp = fopen($file,
"w");
2044 dol_syslog(
'FailedToDetectDirInDolMetaCreateFor'.
$object->element, LOG_WARNING);
2062 $listofpaths = array();
2063 $listofnames = array();
2064 $listofmimes = array();
2068 foreach ($listoffiles as $key => $val) {
2069 $listofpaths[] = $val[
'fullname'];
2070 $listofnames[] = $val[
'name'];
2074 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2075 $_SESSION[
"listofpaths".$keytoavoidconflict] = implode(
';', $listofpaths);
2076 $_SESSION[
"listofnames".$keytoavoidconflict] = implode(
';', $listofnames);
2077 $_SESSION[
"listofmimes".$keytoavoidconflict] = implode(
';', $listofmimes);
2101function dol_add_file_process($upload_dir, $allowoverwrite = 0, $updatesessionordb = 0, $keyforsourcefile =
'addedfile', $savingdocmask =
'', $link =
null, $trackid =
'', $generatethumbs = 1,
$object =
null, $forceFullTextIndexation =
'', $mode = 0)
2109 $_FILES = array($keyforsourcefile => array());
2110 $_FILES[$keyforsourcefile][
'tmp_name'] = $keyforsourcefile;
2111 $_FILES[$keyforsourcefile][
'name'] = $keyforsourcefile;
2115 if (!empty($_FILES[$keyforsourcefile])) {
2116 dol_syslog(
'dol_add_file_process varfiles = '.$keyforsourcefile.
' upload_dir='.$upload_dir.
' allowoverwrite='.$allowoverwrite.
' updatesessionordb='.$updatesessionordb.
' savingdocmask='.$savingdocmask, LOG_DEBUG);
2117 $maxfilesinform =
getDolGlobalInt(
"MAIN_SECURITY_MAX_ATTACHMENT_ON_FORMS", 10);
2118 if (is_array($_FILES[$keyforsourcefile][
"name"]) && count($_FILES[$keyforsourcefile][
"name"]) > $maxfilesinform) {
2119 $langs->load(
"errors");
2120 setEventMessages($langs->trans(
"ErrorTooMuchFileInForm", $maxfilesinform),
null,
"errors");
2128 $TFile = $_FILES[$keyforsourcefile];
2130 if (!is_array($TFile[
'name'])) {
2131 foreach ($TFile as $key => &$val) {
2136 $nbfile = count($TFile[
'name']);
2138 for ($i = 0; $i < $nbfile; $i++) {
2139 if (empty($TFile[
'name'][$i])) {
2144 $destfile = trim($TFile[
'name'][$i]);
2145 $destfull = $upload_dir.
"/".$destfile;
2146 $destfilewithoutext = preg_replace(
'/\.[^\.]+$/',
'', $destfile);
2148 if ($savingdocmask && strpos($savingdocmask, $destfilewithoutext) !== 0) {
2149 $destfile = trim(preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask));
2150 $destfull = $upload_dir.
"/".$destfile;
2153 $filenameto = basename($destfile);
2154 if (preg_match(
'/^\./', $filenameto)) {
2155 $langs->load(
"errors");
2156 setEventMessages($langs->trans(
"ErrorFilenameCantStartWithDot", $filenameto),
null,
'errors');
2160 $info = pathinfo($destfull);
2161 $destfull = $info[
'dirname'].
'/'.
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2162 $info = pathinfo($destfile);
2163 $destfile =
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2166 $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';
2167 $fileextensionrestriction =
getDolGlobalString(
"MAIN_FILE_EXTENSION_UPLOAD_RESTRICTION", $defaultexecutableextensions);
2168 if (!empty($fileextensionrestriction)) {
2169 $arrayofregexextension = explode(
",", $fileextensionrestriction);
2171 foreach ($arrayofregexextension as $fileextension) {
2172 if (preg_match(
'/\.'.preg_quote(trim($fileextension),
'/').
'$/i', $destfull)) {
2173 $langs->load(
"errors");
2174 setEventMessages($langs->trans(
"ErrorFilenameExtensionNotAllowed", $filenameto),
null,
'errors');
2186 global $dolibarr_main_restrict_os_commands;
2187 if (!empty($dolibarr_main_restrict_os_commands)) {
2188 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
2189 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
2190 if (in_array($destfile, $arrayofallowedcommand)) {
2191 $langs->load(
"errors");
2192 setEventMessages($langs->trans(
"ErrorFilenameReserved", $destfile),
null,
'errors');
2198 $resupload =
dol_move_uploaded_file($TFile[
'tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile[
'error'][$i], 0, $keyforsourcefile, $upload_dir, $mode);
2200 if (is_numeric($resupload) && $resupload > 0) {
2201 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2204 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
2205 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
2206 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
2207 $maxheightmini = $tmparraysize[
'maxheightmini'];
2212 if ($generatethumbs) {
2218 $imgThumbSmall =
vignette($destfull, $maxwidthsmall, $maxheightsmall,
'_small', $quality,
"thumbs");
2221 $imgThumbMini =
vignette($destfull, $maxwidthmini, $maxheightmini,
'_mini', $quality,
"thumbs");
2226 if (empty($updatesessionordb)) {
2227 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2229 $formmail->trackid = $trackid;
2230 $formmail->add_attached_files($destfull, $destfile, $TFile[
'type'][$i]);
2234 if ($updatesessionordb == 1) {
2236 if ($TFile[
'type'][$i] ==
'application/pdf' && strpos($_SERVER[
"REQUEST_URI"],
'product') !==
false &&
getDolGlobalString(
'PRODUCT_ALLOW_EXTERNAL_DOWNLOAD')) {
2241 if ($allowoverwrite) {
2245 $result =
addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ?
'.noexe' :
''), $TFile[
'name'][$i],
'uploaded', $sharefile,
$object, $forceFullTextIndexation);
2247 if ($allowoverwrite) {
2250 setEventMessages(
'WarningFailedToAddFileIntoDatabaseIndex',
null,
'warnings');
2257 $langs->load(
"errors");
2258 if (is_numeric($resupload) && $resupload < 0) {
2260 } elseif (preg_match(
'/ErrorFileIsInfectedWithAVirus/', $resupload)) {
2261 if (preg_match(
'/File is a PDF with javascript inside/', $resupload)) {
2262 setEventMessages($langs->trans(
"ErrorFileIsAnInfectedPDFWithJSInside"),
null,
'errors');
2276 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $upload_dir),
null,
'errors');
2279 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2281 $linkObject->entity =
$conf->entity;
2282 $linkObject->url = $link;
2283 $linkObject->objecttype =
GETPOST(
'objecttype',
'alpha');
2284 $linkObject->objectid =
GETPOSTINT(
'objectid');
2285 $linkObject->label =
GETPOST(
'label',
'alpha');
2286 $res = $linkObject->create($user);
2294 $langs->load(
"errors");
2295 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"File")),
null,
'errors');
2317 $keytodelete = $filenb;
2320 $listofpaths = array();
2321 $listofnames = array();
2322 $listofmimes = array();
2323 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2324 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
2325 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
2327 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
2328 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
2330 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
2331 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
2334 if ($keytodelete >= 0) {
2335 $pathtodelete = $listofpaths[$keytodelete];
2336 $filetodelete = $listofnames[$keytodelete];
2337 if (empty($donotdeletefile)) {
2343 if (empty($donotdeletefile)) {
2344 $langs->load(
"other");
2345 setEventMessages($langs->trans(
"FileWasRemoved", $filetodelete),
null,
'mesgs');
2347 if (empty($donotupdatesession)) {
2348 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2350 $formmail->trackid = $trackid;
2351 $formmail->remove_attached_files($keytodelete);
2379 dol_syslog(
"addFileIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2381 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2383 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2384 $filename = basename(preg_replace(
'/\.noexe$/',
'', $file));
2385 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2386 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2388 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
2390 $ecmfile->filepath = $rel_dir;
2391 $ecmfile->filename = $filename;
2392 $ecmfile->label = md5_file(
dol_osencode($dir.
'/'.$file));
2393 $ecmfile->fullpath_orig = $fullpathorig;
2394 $ecmfile->gen_or_uploaded = $mode;
2395 $ecmfile->description =
'';
2396 $ecmfile->keywords =
'';
2399 $ecmfile->src_object_id =
$object->id;
2400 if (isset(
$object->table_element)) {
2401 $ecmfile->src_object_type =
$object->table_element;
2403 dol_syslog(
'Error: object ' . get_class(
$object) .
' has no table_element attribute.');
2406 if (isset(
$object->src_object_description)) {
2407 $ecmfile->description =
$object->src_object_description;
2409 if (isset(
$object->src_object_keywords)) {
2410 $ecmfile->keywords =
$object->src_object_keywords;
2413 $ecmfile->entity =
$object->entity;
2422 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2428 if (empty($useFullTextIndexation) && $forceFullTextIndexation ==
'1') {
2430 $useFullTextIndexation =
'pdftotext';
2432 $useFullTextIndexation =
'docling';
2437 if ($useFullTextIndexation) {
2438 $ecmfile->filepath = $rel_dir;
2439 $ecmfile->filename = $filename;
2441 $filetoprocess = $dir.
'/'.$ecmfile->filename;
2443 $textforfulltextindex =
'';
2446 if (preg_match(
'/\.pdf/i', $filename)) {
2450 if (empty($result[
'error'])) {
2451 $textforfulltextindex = $result[
'content'];
2452 $filetoprocess = $result[
'keywords'];
2453 $cmd = $result[
'cmd'];
2460 $ecmfile->description =
'File content generated by '.$cmd;
2462 $ecmfile->content = $textforfulltextindex;
2463 $ecmfile->keywords = $keywords;
2467 $result = $ecmfile->create($user);
2493 dol_syslog(
"deleteFilesIntoDatabaseIndex: dir parameter can't be empty", LOG_ERR);
2497 dol_syslog(
"deleteFilesIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2501 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2503 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2505 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2506 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2509 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'ecm_files';
2511 $sql .=
' WHERE entity = ' . ((int)
$object->entity);
2513 $sql .=
' WHERE entity = ' . ((int)
$conf->entity);
2515 $sql .=
" AND filepath = '".$db->escape($rel_dir).
"'";
2517 $sql .=
" AND filename = '".$db->escape($file).
"'";
2520 $sql .=
" AND gen_or_uploaded = '".$db->escape($mode).
"'";
2523 $resql =
$db->query($sql);
2550 if (!is_file($filePath) || !is_readable($filePath)) {
2555 $handle = fopen($filePath,
'rb');
2559 $header = fread($handle, 5);
2562 if ($header !==
'%PDF-') {
2592 if (class_exists(
'Imagick')) {
2593 $image =
new Imagick();
2599 dol_syslog(
"We try to convert a PDF file with name ".$fileinput.
" but it is not a real PDF file (hack attempt ?).", LOG_WARNING);
2603 $filetoconvert = $fileinput.(($page !=
'') ?
'['.$page.
']' :
'');
2605 $ret = $image->readImage($filetoconvert);
2607 $ext = pathinfo($fileinput, PATHINFO_EXTENSION);
2608 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);
2613 $ret = $image->setImageFormat($ext);
2615 if (empty($fileoutput)) {
2616 $fileoutput = $fileinput.
".".$ext;
2619 $count = $image->getNumberImages();
2621 if (!
dol_is_file($fileoutput) || is_writable($fileoutput)) {
2623 $ret = $image->writeImages($fileoutput,
true);
2628 dol_syslog(
"Warning: Failed to write cache preview file '.$fileoutput.'. Check permission on file/dir", LOG_ERR);
2658function dol_compress_file($inputfile, $outputfile, $mode =
"gz", &$errorstring =
null)
2664 dol_syslog(
"dol_compress_file mode=".$mode.
" inputfile=".$inputfile.
" outputfile=".$outputfile);
2667 $compressdata =
null;
2668 if ($mode ==
'gz' && function_exists(
'gzencode')) {
2670 $compressdata = gzencode($data, 9);
2671 } elseif ($mode ==
'bz' && function_exists(
'bzcompress')) {
2673 $compressdata = bzcompress($data, 9);
2674 } elseif ($mode ==
'zstd' && function_exists(
'zstd_compress')) {
2676 $compressdata = zstd_compress($data, 9);
2677 } elseif ($mode ==
'zip') {
2678 if (class_exists(
'ZipArchive') &&
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS')) {
2681 $rootPath = realpath($inputfile);
2683 dol_syslog(
"Class ZipArchive is set so we zip using ZipArchive to zip into ".$outputfile.
' rootPath='.$rootPath);
2684 $zip =
new ZipArchive();
2686 if ($zip->open($outputfile, ZipArchive::CREATE) !==
true) {
2687 $errorstring =
"dol_compress_file failure - Failed to open file ".$outputfile.
"\n";
2691 $errormsg = $errorstring;
2698 $files =
new RecursiveIteratorIterator(
2699 new RecursiveDirectoryIterator($rootPath, FilesystemIterator::UNIX_PATHS),
2700 RecursiveIteratorIterator::LEAVES_ONLY
2702 '@phan-var-force SplFileInfo[] $files';
2704 foreach ($files as $name => $file) {
2706 if (!$file->isDir()) {
2708 $filePath = $file->getPath();
2709 $fileName = $file->getFilename();
2710 $fileFullRealPath = $file->getRealPath();
2713 $relativePath = substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($rootPath) + 1);
2716 $zip->addFile($fileFullRealPath, $relativePath);
2723 dol_syslog(
"dol_compress_file success - ".$zip->numFiles.
" files");
2727 if (defined(
'ODTPHP_PATHTOPCLZIP')) {
2730 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2731 $archive =
new PclZip($outputfile);
2733 $result = $archive->add($inputfile, PCLZIP_OPT_REMOVE_PATH, dirname($inputfile));
2735 if ($result === 0) {
2737 $errormsg = $archive->errorInfo(
true);
2739 if ($archive->errorCode() == PCLZIP_ERR_WRITE_OPEN_FAIL) {
2740 $errorstring =
"PCLZIP_ERR_WRITE_OPEN_FAIL";
2741 dol_syslog(
"dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL", LOG_ERR);
2745 $errorstring =
"dol_compress_file error archive->errorCode = ".$archive->errorCode().
" errormsg=".$errormsg;
2746 dol_syslog(
"dol_compress_file failure - ".$errormsg, LOG_ERR);
2749 dol_syslog(
"dol_compress_file success - ".count($result).
" files");
2755 if ($foundhandler && is_string($compressdata)) {
2756 $fp = fopen($outputfile,
"w");
2757 fwrite($fp, $compressdata);
2761 $errorstring =
"Try to zip with format ".$mode.
" with no handler for this format";
2765 $errormsg = $errorstring;
2769 global $langs, $errormsg;
2770 $langs->load(
"errors");
2771 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir");
2773 $errorstring =
"Failed to open file ".$outputfile;
2791 $fileinfo = pathinfo($inputfile);
2792 $fileinfo[
"extension"] = strtolower($fileinfo[
"extension"]);
2794 if ($fileinfo[
"extension"] ==
"zip") {
2795 if (defined(
'ODTPHP_PATHTOPCLZIP') && !
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS')) {
2796 dol_syslog(
"Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.
", so we use Pclzip to unzip into ".$outputdir);
2797 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2798 $archive =
new PclZip($inputfile);
2805 $result = $archive->extract(PCLZIP_OPT_PATH, $outputdir, PCLZIP_OPT_BY_PREG,
'/^((?!\.\.).)*$/');
2807 return array(
'error' => $e->getMessage());
2810 if (!is_array($result) && $result <= 0) {
2811 return array(
'error' => $archive->errorInfo(
true));
2816 foreach ($result as $key => $val) {
2817 if ($val[
'status'] ==
'path_creation_fail') {
2818 $langs->load(
"errors");
2820 $errmsg = $langs->trans(
"ErrorFailToCreateDir", $val[
'filename']);
2823 if ($val[
'status'] ==
'write_protected') {
2824 $langs->load(
"errors");
2826 $errmsg = $langs->trans(
"ErrorFailToCreateFile", $val[
'filename']);
2834 return array(
'error' => $errmsg);
2839 if (class_exists(
'ZipArchive')) {
2840 dol_syslog(
"Class ZipArchive is set so we unzip using ZipArchive to unzip into ".$outputdir);
2841 $zip =
new ZipArchive();
2842 $res = $zip->open($inputfile);
2843 if ($res ===
true) {
2849 for ($i = 0; $i < $zip->numFiles; $i++) {
2850 if (preg_match(
'/\.\./', $zip->getNameIndex($i))) {
2851 dol_syslog(
"Warning: Try to unzip a file with a transversal path ".$zip->getNameIndex($i), LOG_WARNING);
2854 $zip->extractTo($outputdir.
'/', array($zip->getNameIndex($i)));
2860 return array(
'error' =>
'ErrUnzipFails');
2864 return array(
'error' =>
'ErrNoZipEngine');
2865 } elseif (in_array($fileinfo[
"extension"], array(
'gz',
'bz2',
'zst'))) {
2866 include_once DOL_DOCUMENT_ROOT.
"/core/class/utils.class.php";
2874 $extension = strtolower(pathinfo($fileinfo[
"filename"], PATHINFO_EXTENSION));
2875 if ($extension ==
"tar") {
2878 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0, $outputfilename.
'.err', 0);
2879 if ($resarray[
"result"] != 0) {
2880 $resarray[
"error"] .= file_get_contents($outputfilename.
'.err');
2884 if ($fileinfo[
"extension"] ==
"gz") {
2886 } elseif ($fileinfo[
"extension"] ==
"bz2") {
2888 } elseif ($fileinfo[
"extension"] ==
"zst") {
2891 return array(
'error' =>
'ErrorBadFileExtension');
2894 $cmd .=
' > '.$outputfilename;
2896 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0,
null, 1, $outputfilename.
'.err');
2897 if ($resarray[
"result"] != 0) {
2898 $errfilecontent = @file_get_contents($outputfilename.
'.err');
2899 if ($errfilecontent) {
2900 $resarray[
"error"] .=
" - ".$errfilecontent;
2904 return $resarray[
"result"] != 0 ? array(
'error' => $resarray[
"error"]) : array();
2907 return array(
'error' =>
'ErrorBadFileExtension');
2923function dol_compress_dir($inputdir, $outputfile, $mode =
"zip", $excludefiles =
'', $rootdirinzip =
'', $newmask =
'0')
2927 dol_syslog(
"Try to zip dir ".$inputdir.
" into ".$outputfile.
" mode=".$mode);
2929 if (!
dol_is_dir(dirname($outputfile)) || !is_writable(dirname($outputfile))) {
2930 global $langs, $errormsg;
2931 $langs->load(
"errors");
2932 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir", $outputfile);
2937 if ($mode ==
'gz') {
2939 } elseif ($mode ==
'bz') {
2941 } elseif ($mode ==
'zip') {
2955 if (class_exists(
'ZipArchive')) {
2959 $zip =
new ZipArchive();
2960 $result = $zip->open($outputfile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
2961 if ($result !==
true) {
2962 global $langs, $errormsg;
2963 $langs->load(
"errors");
2964 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile);
2971 $files =
new RecursiveIteratorIterator(
2972 new RecursiveDirectoryIterator($inputdir, FilesystemIterator::UNIX_PATHS),
2973 RecursiveIteratorIterator::LEAVES_ONLY
2975 '@phan-var-force SplFileInfo[] $files';
2978 foreach ($files as $name => $file) {
2980 if (!$file->isDir()) {
2982 $filePath = $file->getPath();
2983 $fileName = $file->getFilename();
2984 $fileFullRealPath = $file->getRealPath();
2987 $relativePath = ($rootdirinzip ? $rootdirinzip.
'/' :
'').substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($inputdir) + 1);
2990 if (empty($excludefiles) || !preg_match($excludefiles, $fileFullRealPath)) {
2992 $zip->addFile($fileFullRealPath, $relativePath);
3003 if (empty($newmask)) {
3004 dol_syslog(
"Warning: dol_compress_dir called with empty value for newmask and no default value defined", LOG_WARNING);
3014 if (!$foundhandler) {
3015 dol_syslog(
"Try to zip with format ".$mode.
" with no handler for this format", LOG_ERR);
3021 global $langs, $errormsg;
3022 $langs->load(
"errors");
3023 dol_syslog(
"Failed to open file ".$outputfile, LOG_ERR);
3025 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile).
' - '.$e->getMessage();
3042function dol_most_recent_file($dir, $regexfilter =
'', $excludefilter = array(
'(\.meta|_preview.*\.png)$',
'^\.'), $nohook = 0, $mode = 0)
3044 $tmparray =
dol_dir_list($dir,
'files', 0, $regexfilter, $excludefilter,
'date', SORT_DESC, $mode, $nohook);
3045 return isset($tmparray[0]) ? $tmparray[0] :
null;
3063 global
$conf,
$db, $user, $hookmanager;
3064 global $dolibarr_main_data_root, $dolibarr_main_document_root_alt;
3067 if (!is_object($fuser)) {
3071 if (empty($modulepart)) {
3072 return 'ErrorBadParameter';
3074 if (empty($entity)) {
3085 if ($modulepart ==
'facture') {
3086 $modulepart =
'invoice';
3087 } elseif ($modulepart ==
'users') {
3088 $modulepart =
'user';
3089 } elseif ($modulepart ==
'tva') {
3090 $modulepart =
'tax-vat';
3091 } elseif ($modulepart ==
'expedition' && strpos($original_file,
'receipt/') === 0) {
3093 $modulepart =
'delivery';
3094 } elseif ($modulepart ==
'propale') {
3095 $modulepart =
'propal';
3099 dol_syslog(
'dol_check_secure_access_document modulepart='.$modulepart.
' original_file='.$original_file.
' entity='.$entity);
3103 $sqlprotectagainstexternals =
'';
3107 if (empty($refname)) {
3108 $refname = basename(dirname($original_file).
"/");
3109 if ($refname ==
'thumbs' || $refname ==
'temp') {
3111 $refname = basename(dirname(dirname($original_file)).
"/");
3118 $download =
'download';
3119 if ($mode ==
'write') {
3122 $download =
'upload';
3126 if ($modulepart ==
'common') {
3129 $original_file = DOL_DOCUMENT_ROOT.
'/public/theme/common/'.$original_file;
3130 } elseif ($modulepart ==
'medias' && !empty($dolibarr_main_data_root)) {
3132 if (empty($entity)) {
3136 if ($mode ==
'write') {
3137 if ($fuser->hasRight(
'website',
'write')) {
3143 $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;
3144 } elseif ($modulepart ==
'logs' && !empty($dolibarr_main_data_root)) {
3146 $accessallowed = ($user->admin && basename($original_file) == $original_file && preg_match(
'/^dolibarr.*\.(log|json)$/', basename($original_file)));
3147 $original_file = $dolibarr_main_data_root.
'/'.$original_file;
3148 } elseif ($modulepart ==
'doctemplates' && !empty($dolibarr_main_data_root)) {
3149 $accessallowed = $user->admin;
3150 $relative_file = $original_file;
3151 $ent = ($entity > 0 ? $entity :
$conf->entity);
3152 $path_with_entity = $dolibarr_main_data_root .
'/' . $ent .
'/doctemplates/' . $relative_file;
3153 if ($ent > 1 && file_exists(
dol_osencode($path_with_entity))) {
3154 $original_file = $path_with_entity;
3156 $original_file = $dolibarr_main_data_root .
'/doctemplates/' . $relative_file;
3158 } elseif ($modulepart ==
'doctemplateswebsite' && !empty($dolibarr_main_data_root)) {
3160 $accessallowed = ($fuser->hasRight(
'website',
'write') && preg_match(
'/\.jpg$/i', basename($original_file)));
3161 $original_file = $dolibarr_main_data_root.
'/doctemplates/websites/'.$original_file;
3162 } elseif ($modulepart ==
'packages' && !empty($dolibarr_main_data_root)) {
3165 $tmp = explode(
',', $dolibarr_main_document_root_alt);
3168 $accessallowed = ($user->admin && preg_match(
'/^module_.*\.zip$/', basename($original_file)));
3169 $original_file = $dirins.
'/'.$original_file;
3170 } elseif ($modulepart ==
'mycompany' && !empty(
$conf->mycompany->dir_output)) {
3173 $original_file =
$conf->mycompany->dir_output.
'/'.$original_file;
3174 } elseif ($modulepart ==
'userphoto' && !empty(
$conf->user->dir_output)) {
3177 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3180 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3181 } elseif ($modulepart ==
'userphotopublic' && !empty(
$conf->user->dir_output)) {
3186 if (preg_match(
'/^(\d+)\/photos\//', $original_file, $reg)) {
3187 if ((
int) $reg[1]) {
3189 $tmpobject->fetch((
int) $reg[1],
'',
'', 1);
3191 $securekey =
GETPOST(
'securekey',
'alpha', 1);
3193 global $dolibarr_main_cookie_cryptkey, $dolibarr_main_instance_unique_id;
3194 $valuetouse = $dolibarr_main_instance_unique_id ? $dolibarr_main_instance_unique_id : $dolibarr_main_cookie_cryptkey;
3195 $encodedsecurekey =
dol_hash($valuetouse.
'uservirtualcard'.$tmpobject->id.
'-'.$tmpobject->login,
'md5');
3196 if ($encodedsecurekey == $securekey) {
3205 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3206 } elseif (($modulepart ==
'companylogo') && !empty(
$conf->mycompany->dir_output)) {
3209 $original_file =
$conf->mycompany->dir_output.
'/logos/'.$original_file;
3210 } elseif ($modulepart ==
'memberphoto' && !empty(
$conf->member->dir_output)) {
3214 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3218 if (preg_match(
'/^MEM\d\d\d\d-\d\d\d\d\/photos\//', $original_file)) {
3221 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3222 } elseif ($modulepart ==
'apercufacture' && !empty(
$conf->invoice->multidir_output[$entity])) {
3224 if ($fuser->hasRight(
'facture', $lire)) {
3227 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3228 } elseif ($modulepart ==
'apercupropal' && !empty(
$conf->propal->multidir_output[$entity])) {
3230 if ($fuser->hasRight(
'propal', $lire)) {
3233 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3234 } elseif ($modulepart ==
'apercucommande' && !empty(
$conf->order->multidir_output[$entity])) {
3236 if ($fuser->hasRight(
'commande', $lire)) {
3239 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3240 } elseif (($modulepart ==
'apercufichinter' || $modulepart ==
'apercuficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3242 if ($fuser->hasRight(
'ficheinter', $lire)) {
3245 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3246 } elseif (($modulepart ==
'apercucontract') && !empty(
$conf->contract->multidir_output[$entity])) {
3248 if ($fuser->hasRight(
'contrat', $lire)) {
3251 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3252 } elseif (($modulepart ==
'apercusupplier_proposal') && !empty(
$conf->supplier_proposal->dir_output)) {
3254 if ($fuser->hasRight(
'supplier_proposal', $lire)) {
3257 $original_file =
$conf->supplier_proposal->dir_output.
'/'.$original_file;
3258 } elseif (($modulepart ==
'apercusupplier_order') && !empty(
$conf->fournisseur->commande->dir_output)) {
3260 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3263 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3264 } elseif (($modulepart ==
'apercusupplier_invoice') && !empty(
$conf->fournisseur->facture->dir_output)) {
3266 if ($fuser->hasRight(
'fournisseur', $lire)) {
3269 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3270 } elseif (($modulepart ==
'holiday') && !empty(
$conf->holiday->dir_output)) {
3271 if ($fuser->hasRight(
'holiday', $read) || $fuser->hasRight(
'holiday',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3274 if ($refname && !$fuser->hasRight(
'holiday',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3275 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
3277 $tmpholiday->fetch(0, $refname);
3278 $accessallowed =
checkUserAccessToObject($user, array(
'holiday'), $tmpholiday,
'holiday',
'',
'',
'rowid',
'');
3281 $original_file =
$conf->holiday->dir_output.
'/'.$original_file;
3282 } elseif (($modulepart ==
'salaries') && !empty(
$conf->salaries->dir_output)) {
3284 if ($fuser->hasRight(
'salaries', $read) || $fuser->hasRight(
'salaries',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3290 if ($refname && !$fuser->hasRight(
'salaries',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3291 include_once DOL_DOCUMENT_ROOT.
'/salaries/class/salary.class.php';
3293 $tmpsalary->fetch((
int) $refname);
3298 $accessallowed = ($tmpsalary->fk_user > 0 && in_array($tmpsalary->fk_user, $fuser->getAllChildIds(1))) ? 1 : 0;
3301 $original_file =
$conf->salaries->dir_output.
'/'.$original_file;
3302 } elseif (($modulepart ==
'expensereport') && !empty(
$conf->expensereport->dir_output)) {
3303 if ($fuser->hasRight(
'expensereport', $lire) || $fuser->hasRight(
'expensereport',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3306 if ($refname && !$fuser->hasRight(
'expensereport',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3307 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
3309 $tmpexpensereport->fetch(0, $refname);
3310 $accessallowed =
checkUserAccessToObject($user, array(
'expensereport'), $tmpexpensereport,
'expensereport',
'',
'',
'rowid',
'');
3313 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3314 } elseif (($modulepart ==
'apercuexpensereport') && !empty(
$conf->expensereport->dir_output)) {
3316 if ($fuser->hasRight(
'expensereport', $lire)) {
3319 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3320 } elseif ($modulepart ==
'propalstats' && !empty(
$conf->propal->multidir_temp[$entity])) {
3322 if ($fuser->hasRight(
'propal', $lire)) {
3325 $original_file =
$conf->propal->multidir_temp[$entity].
'/'.$original_file;
3326 } elseif ($modulepart ==
'orderstats' && !empty(
$conf->order->dir_temp)) {
3328 if ($fuser->hasRight(
'commande', $lire)) {
3331 $original_file =
$conf->order->dir_temp.
'/'.$original_file;
3332 } elseif ($modulepart ==
'orderstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3333 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3336 $original_file =
$conf->fournisseur->commande->dir_temp.
'/'.$original_file;
3337 } elseif ($modulepart ==
'billstats' && !empty(
$conf->invoice->dir_temp)) {
3339 if ($fuser->hasRight(
'facture', $lire)) {
3342 $original_file =
$conf->invoice->dir_temp.
'/'.$original_file;
3343 } elseif ($modulepart ==
'billstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3344 if ($fuser->hasRight(
'fournisseur',
'facture', $lire)) {
3347 $original_file =
$conf->fournisseur->facture->dir_temp.
'/'.$original_file;
3348 } elseif ($modulepart ==
'expeditionstats' && !empty(
$conf->expedition->dir_temp)) {
3350 if ($fuser->hasRight(
'expedition', $lire)) {
3353 $original_file =
$conf->expedition->dir_temp.
'/'.$original_file;
3354 } elseif ($modulepart ==
'tripsexpensesstats' && !empty(
$conf->deplacement->dir_temp)) {
3356 if ($fuser->hasRight(
'deplacement', $lire)) {
3359 $original_file =
$conf->deplacement->dir_temp.
'/'.$original_file;
3360 } elseif ($modulepart ==
'memberstats' && !empty(
$conf->member->dir_temp)) {
3362 if ($fuser->hasRight(
'adherent', $lire)) {
3365 $original_file =
$conf->member->dir_temp.
'/'.$original_file;
3366 } elseif (preg_match(
'/^productstats_/i', $modulepart) && !empty(
$conf->product->dir_temp)) {
3368 if ($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) {
3371 $original_file = (!empty(
$conf->product->multidir_temp[$entity]) ?
$conf->product->multidir_temp[$entity] :
$conf->service->multidir_temp[$entity]).
'/'.$original_file;
3372 } elseif (in_array($modulepart, array(
'tax',
'tax-vat',
'tva')) && !empty(
$conf->tax->dir_output)) {
3374 if ($fuser->hasRight(
'tax',
'charges', $lire)) {
3377 $modulepartsuffix = str_replace(
'tax-',
'', $modulepart);
3378 $original_file =
$conf->tax->dir_output.
'/'.($modulepartsuffix !=
'tax' ? $modulepartsuffix.
'/' :
'').$original_file;
3379 } elseif (($modulepart ==
'actions' || $modulepart ==
'actioncomm') && !empty(
$conf->agenda->dir_output)) {
3381 if ($fuser->hasRight(
'agenda',
'myactions', $read)) {
3384 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3385 include_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3387 $tmpobject->fetch((
int) $refname);
3388 $accessallowed =
checkUserAccessToObject($user, array(
'agenda'), $tmpobject->id,
'actioncomm&societe',
'myactions|allactions',
'fk_soc',
'id',
'');
3389 if ($user->socid && $tmpobject->socid) {
3394 $original_file =
$conf->agenda->dir_output.
'/'.$original_file;
3395 } elseif ($modulepart ==
'category' && !empty(
$conf->categorie->multidir_output[$entity])) {
3397 if (empty($entity) || empty(
$conf->categorie->multidir_output[$entity])) {
3398 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3400 if ($fuser->hasRight(
"categorie", $lire) || $fuser->hasRight(
"takepos",
"run")) {
3403 $original_file =
$conf->categorie->multidir_output[$entity].
'/'.$original_file;
3404 } elseif ($modulepart ==
'prelevement' && !empty(
$conf->prelevement->dir_output)) {
3406 if ($fuser->hasRight(
'prelevement',
'bons', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3409 $original_file =
$conf->prelevement->dir_output.
'/'.$original_file;
3410 } elseif ($modulepart ==
'graph_stock' && !empty(
$conf->stock->dir_temp)) {
3413 $original_file =
$conf->stock->dir_temp.
'/'.$original_file;
3414 } elseif ($modulepart ==
'graph_fourn' && !empty(
$conf->fournisseur->dir_temp)) {
3417 $original_file =
$conf->fournisseur->dir_temp.
'/'.$original_file;
3418 } elseif ($modulepart ==
'graph_product' && !empty(
$conf->product->dir_temp)) {
3421 $original_file =
$conf->product->multidir_temp[$entity].
'/'.$original_file;
3422 } elseif ($modulepart ==
'barcode') {
3427 $original_file =
'';
3428 } elseif ($modulepart ==
'iconmailing' && !empty(
$conf->mailing->dir_temp)) {
3431 $original_file =
$conf->mailing->dir_temp.
'/'.$original_file;
3432 } elseif ($modulepart ==
'scanner_user_temp' && !empty(
$conf->scanner->dir_temp)) {
3435 $original_file =
$conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3436 } elseif ($modulepart ==
'fckeditor' && !empty(
$conf->fckeditor->dir_output)) {
3439 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3440 } elseif ($modulepart ==
'user' && !empty(
$conf->user->dir_output)) {
3442 $canreaduser = (!empty($fuser->admin) || $fuser->hasRight(
'user',
'user', $lire));
3443 if ($fuser->id == (
int) $refname) {
3446 if ($canreaduser || preg_match(
'/^specimen/i', $original_file)) {
3449 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3450 } elseif (($modulepart ==
'company' || $modulepart ==
'societe' || $modulepart ==
'thirdparty') && !empty(
$conf->societe->multidir_output[$entity])) {
3452 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3453 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3455 if ($fuser->hasRight(
'societe', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3458 $original_file =
$conf->societe->multidir_output[$entity].
'/'.$original_file;
3459 $sqlprotectagainstexternals =
"SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX.
"societe WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'societe').
")";
3460 } elseif (($modulepart ==
'contact' || $modulepart ==
'socpeople') && !empty(
$conf->societe->multidir_output[$entity])) {
3462 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3463 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3465 if ($fuser->hasRight(
'societe',
'contact', $lire)) {
3468 $original_file =
$conf->societe->multidir_output[$entity].
'/contact/'.$original_file;
3469 $sqlprotectagainstexternals =
"SELECT fk_soc FROM ".MAIN_DB_PREFIX.
"socpepople WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'contact').
")";
3470 } elseif (($modulepart ==
'facture' || $modulepart ==
'invoice') && !empty(
$conf->invoice->multidir_output[$entity])) {
3472 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3475 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3476 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'invoice').
")";
3477 } elseif ($modulepart ==
'massfilesarea_proposals' && !empty(
$conf->propal->multidir_output[$entity])) {
3479 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3482 $original_file =
$conf->propal->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3483 } elseif ($modulepart ==
'massfilesarea_orders') {
3484 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3487 $original_file =
$conf->order->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3488 } elseif ($modulepart ==
'massfilesarea_sendings') {
3489 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3492 $original_file =
$conf->expedition->dir_output.
'/sending/temp/massgeneration/'.$user->id.
'/'.$original_file;
3493 } elseif ($modulepart ==
'massfilesarea_receipts') {
3494 if ($fuser->hasRight(
'reception', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3497 $original_file =
$conf->reception->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3498 } elseif ($modulepart ==
'massfilesarea_invoices') {
3499 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3502 $original_file =
$conf->invoice->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3503 } elseif ($modulepart ==
'massfilesarea_expensereport') {
3504 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3507 $original_file =
$conf->expensereport->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3508 } elseif ($modulepart ==
'massfilesarea_interventions') {
3509 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3512 $original_file =
$conf->ficheinter->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3513 } elseif ($modulepart ==
'massfilesarea_supplier_proposal' && !empty(
$conf->supplier_proposal->dir_output)) {
3514 if ($fuser->hasRight(
'supplier_proposal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3517 $original_file =
$conf->supplier_proposal->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3518 } elseif ($modulepart ==
'massfilesarea_supplier_order') {
3519 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3522 $original_file =
$conf->fournisseur->commande->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3523 } elseif ($modulepart ==
'massfilesarea_supplier_invoice') {
3524 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3527 $original_file =
$conf->fournisseur->facture->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3528 } elseif ($modulepart ==
'massfilesarea_contract' && !empty(
$conf->contract->dir_output)) {
3529 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3532 $original_file =
$conf->contract->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3533 } elseif ($modulepart ==
'massfilesarea_stock' && !empty(
$conf->stock->dir_output)) {
3534 if ($fuser->hasRight(
'stock', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3537 $original_file =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3538 } elseif (($modulepart ==
'fichinter' || $modulepart ==
'ficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3540 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3543 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3544 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"fichinter WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3545 } elseif ($modulepart ==
'deplacement' && !empty(
$conf->deplacement->dir_output)) {
3547 if ($fuser->hasRight(
'deplacement', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3550 $original_file =
$conf->deplacement->dir_output.
'/'.$original_file;
3552 } elseif (($modulepart ==
'propal' || $modulepart ==
'propale') && isset(
$conf->propal->multidir_output[$entity])) {
3554 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3557 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3558 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"propal WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'propal').
")";
3559 } elseif (($modulepart ==
'commande' || $modulepart ==
'order') && !empty(
$conf->order->multidir_output[$entity])) {
3561 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3564 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3565 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'order').
")";
3566 } elseif ($modulepart ==
'project' && !empty(
$conf->project->multidir_output[$entity])) {
3568 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3571 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3572 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
3574 $tmpproject->fetch(0, $refname);
3575 $accessallowed =
checkUserAccessToObject($user, array(
'projet'), $tmpproject->id,
'projet&project',
'',
'',
'rowid',
'');
3578 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3579 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3580 } elseif ($modulepart ==
'project_task' && !empty(
$conf->project->multidir_output[$entity])) {
3581 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3584 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3585 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
3587 $tmptask->fetch(0, $refname);
3588 $accessallowed =
checkUserAccessToObject($user, array(
'projet_task'), $tmptask->id,
'projet_task&project',
'',
'',
'rowid',
'');
3591 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3592 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3593 } elseif (($modulepart ==
'commande_fournisseur' || $modulepart ==
'order_supplier') && !empty(
$conf->fournisseur->commande->dir_output)) {
3595 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3598 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3599 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande_fournisseur WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3600 } elseif (($modulepart ==
'facture_fournisseur' || $modulepart ==
'invoice_supplier') && !empty(
$conf->fournisseur->facture->dir_output)) {
3602 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3605 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3606 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture_fourn WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3607 } elseif ($modulepart ==
'supplier_payment') {
3609 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3612 $original_file = preg_replace(
"/payment\//",
"", $original_file);
3613 $original_file =
$conf->fournisseur->payment->dir_output.
'/'.$original_file;
3614 $sqlprotectagainstexternals =
"SELECT f.fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"paiementfourn as p";
3615 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid";
3616 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"facture_fourn as f ON pf.fk_facturefourn = p.rowid";
3617 $sqlprotectagainstexternals .=
" WHERE p.ref = '".$db->escape($refname).
"' AND p.entity=".((int)
$conf->entity);
3618 } elseif ($modulepart ==
'payment') {
3620 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3623 $original_file =
$conf->compta->payment->dir_output.
'/'.$original_file;
3624 } elseif ($modulepart ==
'facture_paiement' && !empty(
$conf->invoice->dir_output)) {
3626 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3629 if ($fuser->socid > 0) {
3630 $original_file =
$conf->invoice->dir_output.
'/payments/private/'.$fuser->id.
'/'.$original_file;
3632 $original_file =
$conf->invoice->dir_output.
'/payments/'.$original_file;
3639 } elseif ($modulepart ==
'export_compta' && !empty(
$conf->accounting->dir_output)) {
3641 if ($fuser->hasRight(
'accounting',
'bind',
'write') || $fuser->hasRight(
'accounting',
'mouvements',
'export') || preg_match(
'/^specimen/i', $original_file)) {
3644 $original_file =
$conf->accounting->dir_output.
'/'.$original_file;
3645 } elseif (($modulepart ==
'expedition' || $modulepart ==
'shipment' || $modulepart ==
'shipping') && !empty(
$conf->expedition->dir_output)) {
3647 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3650 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'sending/') === 0 ?
'' :
'sending/').$original_file;
3652 } elseif (($modulepart ==
'livraison' || $modulepart ==
'delivery') && !empty(
$conf->expedition->dir_output)) {
3654 if ($fuser->hasRight(
'expedition',
'delivery', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3657 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'receipt/') === 0 ?
'' :
'receipt/').$original_file;
3658 } elseif ($modulepart ==
'actionsreport' && !empty(
$conf->agenda->dir_temp)) {
3660 if ($fuser->hasRight(
'agenda',
'allactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3663 $original_file =
$conf->agenda->dir_temp.
"/".$original_file;
3664 } elseif ($modulepart ==
'product' || $modulepart ==
'produit' || $modulepart ==
'service' || $modulepart ==
'produit|service') {
3666 if (empty($entity) || (empty(
$conf->product->multidir_output[$entity]) && empty(
$conf->service->multidir_output[$entity]))) {
3667 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3669 if (($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3673 $original_file =
$conf->product->multidir_output[$entity].
'/'.$original_file;
3675 $original_file =
$conf->service->multidir_output[$entity].
'/'.$original_file;
3677 } elseif ($modulepart ==
'product_batch' || $modulepart ==
'produitlot') {
3679 if (empty($entity) || (empty(
$conf->productbatch->multidir_output[$entity]))) {
3680 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3682 if (($fuser->hasRight(
'produit', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3686 $original_file =
$conf->productbatch->multidir_output[$entity].
'/'.$original_file;
3688 } elseif ($modulepart ==
'movement' || $modulepart ==
'mouvement') {
3690 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3691 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3693 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3697 $original_file =
$conf->stock->multidir_output[$entity].
'/movement/'.$original_file;
3699 } elseif ($modulepart ==
'entrepot') {
3701 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3702 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3704 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3708 $original_file =
$conf->stock->multidir_output[$entity].
'/'.$original_file;
3710 } elseif ($modulepart ==
'contract' && !empty(
$conf->contract->multidir_output[$entity])) {
3712 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3715 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3716 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"contrat WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'contract').
")";
3717 } elseif ($modulepart ==
'donation' && !empty(
$conf->don->dir_output)) {
3719 if ($fuser->hasRight(
'don', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3722 $original_file =
$conf->don->dir_output.
'/'.$original_file;
3723 } elseif ($modulepart ==
'dolresource' && !empty(
$conf->resource->dir_output)) {
3725 if ($fuser->hasRight(
'resource', $read) || preg_match(
'/^specimen/i', $original_file)) {
3728 $original_file =
$conf->resource->dir_output.
'/'.$original_file;
3729 } elseif (($modulepart ==
'remisecheque' || $modulepart ==
'chequereceipt') && !empty(
$conf->bank->dir_output)) {
3731 if ($fuser->hasRight(
'banque', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3734 $original_file =
$conf->bank->dir_output.
'/checkdeposits/'.$original_file;
3735 } elseif (($modulepart ==
'banque' || $modulepart ==
'bank') && !empty(
$conf->bank->dir_output)) {
3737 if ($fuser->hasRight(
'banque', $lire)) {
3740 $original_file =
$conf->bank->dir_output.
'/'.$original_file;
3741 } elseif ($modulepart ==
'export' && !empty(
$conf->export->dir_temp)) {
3744 $accessallowed = $user->hasRight(
'export',
'lire');
3745 $original_file =
$conf->export->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3746 } elseif ($modulepart ==
'import' && !empty(
$conf->import->dir_temp)) {
3748 $accessallowed = $user->hasRight(
'import',
'run');
3749 $original_file =
$conf->import->dir_temp.
'/'.$original_file;
3750 } elseif ($modulepart ==
'recruitment' && !empty(
$conf->recruitment->dir_output)) {
3752 $accessallowed = $user->hasRight(
'recruitment',
'recruitmentjobposition',
'read');
3753 $original_file =
$conf->recruitment->dir_output.
'/'.$original_file;
3754 } elseif ($modulepart ==
'hrm' && !empty(
$conf->hrm->dir_output)) {
3756 $accessallowed = $user->hasRight(
'hrm',
'all',
'read');
3757 $original_file =
$conf->hrm->dir_output.
'/'.$original_file;
3758 } elseif ($modulepart ==
'editor' && !empty(
$conf->fckeditor->dir_output)) {
3761 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3762 } elseif ($modulepart ==
'systemtools' && !empty(
$conf->admin->dir_output)) {
3764 if ($fuser->admin) {
3767 $original_file =
$conf->admin->dir_output.
'/'.$original_file;
3768 } elseif ($modulepart ==
'admin_temp' && !empty(
$conf->admin->dir_temp)) {
3770 if ($fuser->admin) {
3773 $original_file =
$conf->admin->dir_temp.
'/'.$original_file;
3774 } elseif ($modulepart ==
'bittorrent' && !empty(
$conf->bittorrent->dir_output)) {
3778 if (
dol_mimetype($original_file) ==
'application/x-bittorrent') {
3781 $original_file =
$conf->bittorrent->dir_output.
'/'.$dir.
'/'.$original_file;
3782 } elseif ($modulepart ==
'member' && !empty(
$conf->member->dir_output)) {
3784 if ($fuser->hasRight(
'adherent', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3787 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3788 } elseif ($modulepart ==
'ticket' && !empty(
$conf->ticket->multidir_output[$entity])) {
3790 if ($fuser->hasRight(
'ticket', $read)) {
3793 if (!isset($_SESSION[
'email_customer'])) {
3795 $sqlprotectagainstexternals =
"SELECT fk_soc FROM ".MAIN_DB_PREFIX.
"ticket WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3797 $email_split = explode(
'@', $_SESSION[
'email_customer']);
3799 $sqlprotectagainstexternals =
'SELECT t.rowid, t.fk_soc FROM '.MAIN_DB_PREFIX.
'ticket t';
3800 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'element_contact ec ON ec.element_id = t.rowid';
3801 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'socpeople c ON c.rowid = ec.fk_socpeople';
3802 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_type_contact tc ON tc.element = "ticket" AND tc.rowid = ec.fk_c_type_contact';
3803 $sqlprotectagainstexternals .=
" WHERE t.ref LIKE '".$db->escape($refname).
"'";
3804 $sqlprotectagainstexternals .=
' AND (';
3805 $sqlprotectagainstexternals .=
' (';
3806 $sqlprotectagainstexternals .=
' tc.rowid IS NOT NULL';
3807 $sqlprotectagainstexternals .=
" AND c.email = '".$db->escape($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
"'";
3808 $sqlprotectagainstexternals .=
' )';
3809 $sqlprotectagainstexternals .=
" OR t.origin_email = '".$db->escape($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
"'";
3810 $sqlprotectagainstexternals .=
' )';
3812 $original_file =
$conf->ticket->multidir_output[$entity].
'/'.$original_file;
3822 if (preg_match(
'/^specimen/i', $original_file)) {
3825 if ($fuser->admin) {
3829 $tmpmodulepart = explode(
'-', $modulepart);
3830 if (!empty($tmpmodulepart[1])) {
3831 $modulepart = $tmpmodulepart[0];
3832 $original_file = $tmpmodulepart[1].
'/'.$original_file;
3837 if (preg_match(
'/^([a-z]+)_user_temp$/i', $modulepart, $reg)) {
3838 $tmpmodule = $reg[1];
3839 if (empty(
$conf->$tmpmodule->dir_temp)) {
3840 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3843 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3846 $original_file =
$conf->{$reg[1]}->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3847 } elseif (preg_match(
'/^([a-z]+)_temp$/i', $modulepart, $reg)) {
3848 $tmpmodule = $reg[1];
3849 if (empty(
$conf->$tmpmodule->dir_temp)) {
3850 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3853 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3856 $original_file =
$conf->$tmpmodule->dir_temp.
'/'.$original_file;
3857 } elseif (preg_match(
'/^([a-z]+)_user$/i', $modulepart, $reg)) {
3858 $tmpmodule = $reg[1];
3859 if (empty(
$conf->$tmpmodule->dir_output)) {
3860 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3863 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3866 $original_file =
$conf->$tmpmodule->dir_output.
'/'.$fuser->id.
'/'.$original_file;
3867 } elseif (preg_match(
'/^massfilesarea_([a-z]+)$/i', $modulepart, $reg)) {
3868 $tmpmodule = $reg[1];
3869 if (empty(
$conf->$tmpmodule->dir_output)) {
3870 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3875 $partsofdirinoriginalfile = explode(
'/', $original_file);
3876 if (!empty($partsofdirinoriginalfile[1])) {
3877 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3878 if (($partofdirinoriginalfile && $fuser->hasRight($tmpmodule, $partofdirinoriginalfile,
'read')) || preg_match(
'/^specimen/i', $original_file)) {
3882 if ($fuser->hasRight($tmpmodule, $read) || preg_match(
'/^specimen/i', $original_file)) {
3885 $original_file =
$conf->$tmpmodule->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3887 if (empty(
$conf->$modulepart->dir_output)) {
3888 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.');
3893 $partsofdirinoriginalfile = explode(
'/', $original_file);
3894 if (!empty($partsofdirinoriginalfile[1])) {
3895 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3896 if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile,
'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile,
'read'))) {
3900 if (($fuser->hasRight($modulepart, $lire) || $fuser->hasRight($modulepart, $read)) || ($fuser->hasRight($modulepart,
'all', $lire) || $fuser->hasRight($modulepart,
'all', $read))) {
3904 if (is_array(
$conf->$modulepart->multidir_output) && !empty(
$conf->$modulepart->multidir_output[$entity])) {
3905 $original_file =
$conf->$modulepart->multidir_output[$entity].
'/'.$original_file;
3907 $original_file =
$conf->$modulepart->dir_output.
'/'.$original_file;
3911 $parameters = array(
3912 'modulepart' => $modulepart,
3913 'original_file' => $original_file,
3914 'entity' => $entity,
3919 $reshook = $hookmanager->executeHooks(
'checkSecureAccess', $parameters,
$object);
3921 if (!empty($hookmanager->resArray[
'original_file'])) {
3922 $original_file = $hookmanager->resArray[
'original_file'];
3924 if (!empty($hookmanager->resArray[
'accessallowed'])) {
3925 $accessallowed = $hookmanager->resArray[
'accessallowed'];
3927 if (!empty($hookmanager->resArray[
'sqlprotectagainstexternals'])) {
3928 $sqlprotectagainstexternals = $hookmanager->resArray[
'sqlprotectagainstexternals'];
3934 'accessallowed' => ($accessallowed ? 1 : 0),
3935 'sqlprotectagainstexternals' => $sqlprotectagainstexternals,
3936 'original_file' => $original_file
3955 dol_syslog(
"Failed to create the cache directory ".$directory, LOG_WARNING);
3958 $cachefile = $directory.$filename;
3960 file_put_contents($cachefile, json_encode(
$object), LOCK_EX);
3975 $cachefile = $directory.$filename;
3976 $refresh = !file_exists($cachefile) || ($now - $cachetime) >
dol_filemtime($cachefile);
3989 $cachefile = $directory.$filename;
3990 $object = json_decode(file_get_contents($cachefile));
4002 return preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'\//',
'', $pathfile);
4017function getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path =
'', $pathref =
'', &$checksumconcat = array())
4025 if (!empty($dir->md5file)) {
4026 $entry = $dir->md5file;
4028 } elseif (!empty($dir->sha256file)) {
4029 $entry = $dir->sha256file;
4033 foreach ($entry as $file) {
4034 $filename = $path.$file[
'name'];
4035 $file_list[
'insignature'][] = $filename;
4036 $expectedsize = (empty($file[
'size']) ?
'' : $file[
'size']);
4037 $expectedhash = (
string) $file;
4039 if (!file_exists($pathref.
'/'.$filename)) {
4040 $file_list[
'missing'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'algo' => (
string) $algo);
4042 $hash_local = hash_file($algo, $pathref.
'/'.$filename);
4044 if (
$conffile ==
'/etc/dolibarr/conf.php' && $filename ==
'/filefunc.inc.php') {
4045 $checksumconcat[] = $expectedhash;
4047 if ($hash_local != $expectedhash) {
4048 $file_list[
'updated'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'hash' => (
string) $hash_local,
'algo' => (
string) $algo);
4050 $checksumconcat[] = $hash_local;
4055 foreach ($dir->dir as $subdir) {
4056 getFilesUpdated($file_list, $subdir, $path.$subdir[
'name'].
'/', $pathref, $checksumconcat);
4074 $out .=
'<div id="'.$htmlname.
'Message" class="dragDropAreaMessage hidden"><span>'.
img_picto(
"",
'download').
'<br>'.$langs->trans(
"DropFileToAddItToObject").
'</span></div>';
4075 $out .=
"\n<!-- JS CODE TO ENABLE DRAG AND DROP OF FILE -->\n";
4078 jQuery(document).ready(function() {
4079 var enterTargetDragDrop = null;
4081 $("#'.$htmlname.
'").addClass("cssDragDropArea");
4083 $(".cssDragDropArea").on("dragenter", function(ev, ui) {
4084 var dataTransfer = ev.originalEvent.dataTransfer;
4085 var dataTypes = dataTransfer.types;
4086 //console.log(dataTransfer);
4087 //console.log(dataTypes);
4089 if (!dataTypes || ($.inArray(\'Files\', dataTypes) === -1)) {
4090 // The element dragged is not a file, so we avoid the "dragenter"
4091 ev.preventDefault();
4095 // Entering drop area. Highlight area
4096 console.log("dragAndDropFileUpload: We add class highlightDragDropArea")
4097 enterTargetDragDrop = ev.target;
4098 $(this).addClass("highlightDragDropArea");
4099 $("#'.$htmlname.
'Message").removeClass("hidden");
4100 ev.preventDefault();
4103 $(".cssDragDropArea").on("dragleave", function(ev) {
4104 // Going out of drop area. Remove Highlight
4105 if (enterTargetDragDrop == ev.target){
4106 console.log("dragAndDropFileUpload: We remove class highlightDragDropArea")
4107 $("#'.$htmlname.
'Message").addClass("hidden");
4108 $(this).removeClass("highlightDragDropArea");
4112 $(".cssDragDropArea").on("dragover", function(ev) {
4113 ev.preventDefault();
4117 $(".cssDragDropArea").on("drop", function(e) {
4120 fd = new FormData();
4124 fd.append("action", "linkit");
4126 var dataTransfer = e.originalEvent.dataTransfer;
4128 if (dataTransfer.files && dataTransfer.files.length){
4129 var droppedFiles = e.originalEvent.dataTransfer.files;
4130 $.each(droppedFiles, function(index,file){
4131 fd.append("files[]", file,file.name)
4134 $(".cssDragDropArea").removeClass("highlightDragDropArea");
4135 counterdragdrop = 0;
4137 url: "'.DOL_URL_ROOT.
'/core/ajax/fileupload.php",
4142 success:function() {
4143 console.log("Uploaded.", arguments);
4144 /* arguments[0] is the json string of files */
4145 /* arguments[1] is the value for variable "success", can be 0 or 1 */
4146 let listoffiles = JSON.parse(arguments[0]);
4147 console.log(listoffiles);
4149 for (let i = 0; i < listoffiles.length; i++) {
4150 console.log(listoffiles[i].error);
4151 if (listoffiles[i].error) {
4155 console.log(nboferror);
4156 if (nboferror > 0) {
4157 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorOnAtLeastOneFileUpload:warnings";
4159 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=UploadFileDragDropSuccess:mesgs";
4163 console.log("Error Uploading.", arguments)
4164 if (arguments[0].status == 403) {
4165 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadPermissionDenied:errors";
4167 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadFileDragDropPermissionDenied:errors";
4173 $out .=
"</script>\n";
4187function archiveOrBackupFile($srcfile, $max_versions = 5, $archivedir =
'', $suffix =
"v", $moveorcopy =
'move')
4189 $base_file_pattern = ($archivedir ? $archivedir : dirname($srcfile)).
'/'.basename($srcfile).
".".$suffix;
4190 $files_in_directory = glob($base_file_pattern .
"*");
4193 $files_with_timestamps = [];
4194 foreach ($files_in_directory as $file) {
4195 $files_with_timestamps[] = [
4197 'timestamp' => filemtime($file)
4203 while (count($files_with_timestamps) > 0) {
4204 $latest_file =
null;
4205 $latest_index =
null;
4208 foreach ($files_with_timestamps as $index => $file_info) {
4209 if ($latest_file ===
null || (is_array($latest_file) && $file_info[
'timestamp'] > $latest_file[
'timestamp'])) {
4210 $latest_file = $file_info;
4211 $latest_index = $index;
4216 if ($latest_file !==
null) {
4217 $sorted_files[] = $latest_file[
'file'];
4218 unset($files_with_timestamps[$latest_index]);
4223 if (count($sorted_files) >= $max_versions) {
4224 $oldest_files = array_slice($sorted_files, $max_versions - 1);
4225 foreach ($oldest_files as $oldest_file) {
4231 $new_backup = $srcfile .
".v" . $timestamp;
4234 if ($moveorcopy ==
'move') {
4235 $result =
dol_move($srcfile, $new_backup,
'0', 1, 0, 0);
4237 $result =
dol_copy($srcfile, $new_backup,
'0', 1, 0, 0);
4253function dolDocToText($filetoprocess, $useFullTextIndexation =
'pdftotext', $options =
'html')
4258 $keywords = array();
4259 $textforfulltextindex =
'';
4262 if (empty($useFullTextIndexation)) {
4263 $useFullTextIndexation =
'pdftotext';
4270 if (preg_match(
'/pdftotext/i', $useFullTextIndexation)) {
4271 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4273 $outputfile =
$conf->admin->dir_temp.
'/tmppdftotext.'.$user->id.
'.out';
4277 if ($options ==
'fulltext') {
4278 $params =
'-nodiag -layout';
4280 $params =
'-htmlmeta';
4285 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4287 if (empty($resultexec[
'error'])) {
4289 if ($options ==
'fulltext') {
4290 $textforfulltextindex = $resultexec[
'output'];
4292 if ($options ==
'html') {
4293 $txt = $resultexec[
'output'];
4294 if (preg_match(
'/<meta name="keywords" content="([^\/]+)"\s*\/>/i', $txt, $matches)) {
4295 $keywords = $matches[1];
4297 if (preg_match(
'/<pre>(.*)<\/pre>/si', $txt, $matches)) {
4309 if (preg_match(
'/docling/i', $useFullTextIndexation)) {
4310 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4312 $outputfile =
$conf->admin->dir_temp.
'/tmpdocling.'.$user->id.
'.out';
4318 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4320 if (!$resultexec[
'error']) {
4321 $txt = $resultexec[
'output'];
4329 $textforfulltextindex = $txt;
4336 return array(
'error' => $error,
'keywords' => $keywords,
'content' => $textforfulltextindex,
'cmd' => $cmd);
4348 $fp = fopen($fullpath,
"r");
4349 fseek($fp, -1, SEEK_END);
4352 while ($char ===
"\n" || $char ===
"\r") {
4353 fseek($fp, $pos--, SEEK_END);
4356 while ($char !==
"\n" && $char !==
false) {
4357 fseek($fp, $pos--, SEEK_END);
4366 $truncatePos = ftell($fp);
4369 $fp = fopen($fullpath,
"c+");
4370 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 salary payments.
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.
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.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0, $forbiddenfields=array())
forgeSQLFromUniversalSearchCriteria
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.