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[
'agenda_id'])) {
1289 $ecmfile->agenda_id = $moreinfo[
'agenda_id'];
1291 if (!empty($moreinfo) && !empty($moreinfo[
'position'])) {
1292 $ecmfile->position = $moreinfo[
'position'];
1294 if (!empty($moreinfo) && !empty($moreinfo[
'cover'])) {
1295 $ecmfile->cover = $moreinfo[
'cover'];
1297 if (!empty($moreinfo) && !empty($moreinfo[
'share'])) {
1298 $ecmfile->share = $moreinfo[
'share'];
1300 if (! empty($entity)) {
1301 $ecmfile->entity = $entity;
1304 $resultecm = $ecmfile->create($user);
1305 if ($resultecm < 0) {
1308 if (!empty($moreinfo) && !empty($moreinfo[
'array_options']) && is_array($moreinfo[
'array_options'])) {
1309 $ecmfile->array_options = $moreinfo[
'array_options'];
1310 $resultecm = $ecmfile->insertExtraFields();
1311 if ($resultecm < 0) {
1316 } elseif ($resultecm < 0) {
1320 if ($resultecm > 0) {
1328 if (empty($newmask)) {
1335 dolChmod($newpathofdestfile, $newmask);
1351function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase = 1, $renamedircontent = 1)
1355 dol_syslog(
"files.lib.php::dol_move_dir srcdir=".$srcdir.
" destdir=".$destdir.
" overwritifexists=".$overwriteifexists.
" indexdatabase=".$indexdatabase.
" renamedircontent=".$renamedircontent);
1357 $srcbasename = basename($srcdir);
1361 dol_syslog(
"files.lib.php::dol_move_dir srcdir does not exists. Move fails");
1365 if ($overwriteifexists || !$destexists) {
1372 if ($overwriteifexists) {
1373 if (strtoupper(substr(PHP_OS, 0, 3)) ===
'WIN') {
1374 if (is_dir($newpathofdestdir)) {
1375 @rmdir($newpathofdestdir);
1380 $result = @rename($newpathofsrcdir, $newpathofdestdir);
1383 if ($result && $renamedircontent) {
1384 if (file_exists($newpathofdestdir)) {
1385 $destbasename = basename($newpathofdestdir);
1387 if (!empty($files) && is_array($files)) {
1388 foreach ($files as $key => $file) {
1389 if (!file_exists($file[
"fullname"])) {
1392 $filepath = $file[
"path"];
1393 $oldname = $file[
"name"];
1395 $newname = str_replace($srcbasename, $destbasename, $oldname);
1396 if (!empty($newname) && $newname !== $oldname) {
1397 if ($file[
"type"] ==
"dir") {
1398 $res =
dol_move_dir($filepath.
'/'.$oldname, $filepath.
'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
1400 $moreinfo = array(
'gen_or_uploaded' =>
'unknown');
1401 $res =
dol_move($filepath.
'/'.$oldname, $filepath.
'/'.$newname,
'0', $overwriteifexists, 0, $indexdatabase, $moreinfo);
1428 return trim(basename($filename),
".\x00..\x20");
1444 if (!empty($reterrors)) {
1449 if (!class_exists(
'AntiVir')) {
1450 require_once DOL_DOCUMENT_ROOT.
'/core/class/antivir.class.php';
1453 $result = $antivir->dol_avscan_file($src_file);
1455 $reterrors = $antivir->errors;
1471 if (preg_match(
'/\.pdf$/i', $dest_file)) {
1473 dol_syslog(
"dolCheckOnFileName Check that pdf does not contains js code");
1475 $tmp = file_get_contents(trim($src_file));
1476 if (preg_match(
'/[\n\s]+\/JavaScript[\n\s]+/m', $tmp)) {
1477 return array(
'File is a PDF with javascript inside');
1480 dol_syslog(
"dolCheckOnFileName Check js into pdf disabled");
1509function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $keyforsourcefile =
'addedfile', $upload_dir =
'', $mode = 0)
1515 $file_name = $dest_file;
1518 if (empty($nohook)) {
1519 $reshook = $hookmanager->initHooks(array(
'fileslib'));
1521 $parameters = array(
'dest_file' => $dest_file,
'src_file' => $src_file,
'file_name' => $file_name,
'varfiles' => $keyforsourcefile,
'allowoverwrite' => $allowoverwrite);
1522 $reshook = $hookmanager->executeHooks(
'moveUploadedFile', $parameters,
$object);
1525 if (empty($reshook)) {
1527 if ($uploaderrorcode) {
1528 switch ($uploaderrorcode) {
1529 case UPLOAD_ERR_INI_SIZE:
1530 return 'ErrorFileSizeTooLarge';
1531 case UPLOAD_ERR_FORM_SIZE:
1532 return 'ErrorFileSizeTooLarge';
1533 case UPLOAD_ERR_PARTIAL:
1534 return 'ErrorPartialFile';
1535 case UPLOAD_ERR_NO_TMP_DIR:
1536 return 'ErrorNoTmpDir';
1537 case UPLOAD_ERR_CANT_WRITE:
1538 return 'ErrorFailedToWriteInDir';
1539 case UPLOAD_ERR_EXTENSION:
1540 return 'ErrorUploadBlockedByAddon';
1548 if (empty($disablevirusscan) && file_exists($src_file)) {
1550 if (count($checkvirusarray)) {
1551 dol_syslog(
'Files.lib::dol_move_uploaded_file File "'.$src_file.
'" (target name "'.$dest_file.
'") KO with antivirus: errors='.implode(
',', $checkvirusarray), LOG_WARNING);
1552 return 'ErrorFileIsInfectedWithAVirus: '.implode(
',', $checkvirusarray);
1561 $publicmediasdirwithslash =
$conf->medias->multidir_output[
$conf->entity];
1562 if (!preg_match(
'/\/$/', $publicmediasdirwithslash)) {
1563 $publicmediasdirwithslash .=
'/';
1566 if (strpos($upload_dir, $publicmediasdirwithslash) !== 0 || !
getDolGlobalInt(
"MAIN_DOCUMENT_DISABLE_NOEXE_IN_MEDIAS_DIR")) {
1567 $file_name .=
'.noexe';
1574 if (preg_match(
'/^\./', basename($src_file)) || preg_match(
'/\.\./', $src_file) || preg_match(
'/[<>|]/', $src_file)) {
1575 dol_syslog(
"Refused to deliver file ".$src_file, LOG_WARNING);
1581 if (preg_match(
'/^\./', basename($dest_file)) || preg_match(
'/\.\./', $dest_file) || preg_match(
'/[<>|]/', $dest_file)) {
1582 dol_syslog(
"Refused to deliver file ".$dest_file, LOG_WARNING);
1588 $errmsg = implode(
',', $hookmanager->errors);
1589 if (empty($errmsg)) {
1590 $errmsg =
'ErrorReturnedBySomeHooks';
1593 } elseif (empty($reshook)) {
1599 if (!is_writable(dirname($file_name_osencoded))) {
1600 dol_syslog(
"Files.lib::dol_move_uploaded_file Dir ".dirname($file_name_osencoded).
" is not writable. Return 'ErrorDirNotWritable'", LOG_WARNING);
1601 return 'ErrorDirNotWritable';
1605 if (!$allowoverwrite) {
1606 if (file_exists($file_name_osencoded)) {
1607 dol_syslog(
"Files.lib::dol_move_uploaded_file File ".$file_name.
" already exists. Return 'ErrorFileAlreadyExists'", LOG_WARNING);
1608 return 'ErrorFileAlreadyExists';
1611 if (is_dir($file_name_osencoded)) {
1612 dol_syslog(
"Files.lib::dol_move_uploaded_file A directory with name ".$file_name.
" already exists. Return 'ErrorDirWithFileNameAlreadyExists'", LOG_WARNING);
1613 return 'ErrorDirWithFileNameAlreadyExists';
1619 $return = move_uploaded_file($src_file_osencoded, $file_name_osencoded);
1621 $return = rename($src_file_osencoded, $file_name_osencoded);
1626 dol_syslog(
"Files.lib::dol_move_uploaded_file Success to move ".$src_file.
" to ".$file_name.
" - Umask=" .
getDolGlobalString(
'MAIN_UMASK'), LOG_DEBUG);
1627 return $successcode;
1629 dol_syslog(
"Files.lib::dol_move_uploaded_file Failed to move ".$src_file.
" to ".$file_name, LOG_ERR);
1634 return $successcode;
1652function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0,
$object =
null, $allowdotdot =
false, $indexdatabase = 1, $nolog = 0)
1655 global $hookmanager;
1657 if (empty($nolog)) {
1658 dol_syslog(
"dol_delete_file file=".$file.
" disableglob=".$disableglob.
" nophperrors=".$nophperrors.
" nohook=".$nohook);
1663 if ((!$allowdotdot && preg_match(
'/\.\./', $file)) || preg_match(
'/[<>|]/', $file)) {
1664 dol_syslog(
"Refused to delete file ".$file, LOG_WARNING);
1669 if (empty($nohook) && !empty($hookmanager)) {
1670 $hookmanager->initHooks(array(
'fileslib'));
1672 $parameters = array(
1674 'disableglob' => $disableglob,
1675 'nophperrors' => $nophperrors
1677 $reshook = $hookmanager->executeHooks(
'deleteFile', $parameters,
$object);
1680 if (empty($nohook) && $reshook != 0) {
1688 if (empty($disableglob) && !empty($file_osencoded)) {
1690 $globencoded = str_replace(
'[',
'\[', $file_osencoded);
1691 $globencoded = str_replace(
']',
'\]', $globencoded);
1692 $listoffiles = glob($globencoded);
1694 if (!empty($listoffiles) && is_array($listoffiles)) {
1695 foreach ($listoffiles as $filename) {
1697 $ok = @unlink($filename);
1699 $ok = unlink($filename);
1703 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1704 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);
1705 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1708 $ok = @unlink($filename);
1710 $ok = unlink($filename);
1715 if (empty($nolog)) {
1716 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1720 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1721 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1722 if (is_object(
$db) && $indexdatabase) {
1723 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1724 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1726 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1727 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1730 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1731 if ($result >= 0 && $ecmfile->id > 0) {
1732 $result = $ecmfile->delete($user);
1740 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1747 dol_syslog(
"No files to delete found", LOG_DEBUG);
1752 $ok = @unlink($file_osencoded);
1754 $ok = unlink($file_osencoded);
1757 $filename = $file_osencoded;
1760 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1761 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);
1762 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1765 $ok = @unlink($filename);
1767 $ok = unlink($filename);
1772 if (empty($nolog)) {
1773 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1777 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1778 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1779 if (is_object(
$db) && $indexdatabase) {
1780 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1781 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1783 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1784 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1787 $result = $ecmfile->fetch(0,
'', $rel_filetodelete,
'',
'',
'', 0, $entity);
1788 if ($result >= 0 && $ecmfile->id > 0) {
1789 $result = $ecmfile->delete($user);
1797 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1818 if (preg_match(
'/\.\./', $dir) || preg_match(
'/[<>|]/', $dir)) {
1819 dol_syslog(
"Refused to delete dir ".$dir.
' (contains invalid char sequence)', LOG_WARNING);
1824 return ($nophperrors ? @rmdir($dir_osencoded) : rmdir($dir_osencoded));
1840function dol_delete_dir_recursive($dir, $count = 0, $nophperrors = 0, $onlysub = 0, &$countdeleted = 0, $indexdatabase = 1, $nolog = 0, $level = 0)
1842 if (empty($nolog) || empty($level)) {
1843 dol_syslog(
"functions.lib:dol_delete_dir_recursive ".$dir, LOG_DEBUG);
1845 if ($level > 1000) {
1846 dol_syslog(
"functions.lib:dol_delete_dir_recursive too many depth", LOG_WARNING);
1851 if ($handle = opendir(
"$dir_osencoded")) {
1852 while (
false !== ($item = readdir($handle))) {
1854 $item = mb_convert_encoding($item,
'UTF-8',
'ISO-8859-1');
1857 if ($item !=
"." && $item !=
"..") {
1859 $count =
dol_delete_dir_recursive(
"$dir/$item", $count, $nophperrors, 0, $countdeleted, $indexdatabase, $nolog, ($level + 1));
1862 $result =
dol_delete_file(
"$dir/$item", 1, $nophperrors, 0,
null,
false, $indexdatabase, $nolog);
1874 if (empty($onlysub)) {
1899 global $langs,
$conf;
1904 if (
$object->element ==
'order_supplier') {
1905 $dir =
$conf->fournisseur->commande->dir_output;
1906 } elseif (
$object->element ==
'invoice_supplier') {
1907 $dir =
$conf->fournisseur->facture->dir_output;
1908 } elseif (
$object->element ==
'project') {
1909 $dir =
$conf->project->dir_output;
1910 } elseif (
$object->element ==
'shipping') {
1911 $dir =
$conf->expedition->dir_output.
'/sending';
1912 } elseif (
$object->element ==
'delivery') {
1913 $dir =
$conf->expedition->dir_output.
'/receipt';
1914 } elseif (
$object->element ==
'fichinter') {
1915 $dir =
$conf->ficheinter->dir_output;
1917 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
1921 $object->error = $langs->trans(
'ErrorObjectNoSupportedByFunction');
1926 $dir = $dir.
"/".$refsan;
1927 $filepreviewnew = $dir.
"/".$refsan.
".pdf_preview.png";
1928 $filepreviewnewbis = $dir.
"/".$refsan.
".pdf_preview-0.png";
1929 $filepreviewold = $dir.
"/".$refsan.
".pdf.png";
1932 if (file_exists($filepreviewnew) && is_writable($filepreviewnew)) {
1934 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnew);
1938 if (file_exists($filepreviewnewbis) && is_writable($filepreviewnewbis)) {
1940 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnewbis);
1945 if (file_exists($filepreviewold) && is_writable($filepreviewold)) {
1947 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewold);
1951 $multiple = $filepreviewold.
".";
1952 for ($i = 0; $i < 20; $i++) {
1953 $preview = $multiple.$i;
1955 if (file_exists($preview) && is_writable($preview)) {
1957 $object->error = $langs->trans(
"ErrorFailedToOpenFile", $preview);
1987 if (
$object->element ==
'order_supplier') {
1988 $dir =
$conf->fournisseur->dir_output.
'/commande';
1989 } elseif (
$object->element ==
'invoice_supplier') {
1990 $dir =
$conf->fournisseur->dir_output.
'/facture';
1991 } elseif (
$object->element ==
'project') {
1992 $dir =
$conf->project->dir_output;
1993 } elseif (
$object->element ==
'shipping') {
1994 $dir =
$conf->expedition->dir_output.
'/sending';
1995 } elseif (
$object->element ==
'delivery') {
1996 $dir =
$conf->expedition->dir_output.
'/receipt';
1997 } elseif (
$object->element ==
'fichinter') {
1998 $dir =
$conf->ficheinter->dir_output;
2000 $dir = empty(
$conf->$element->dir_output) ?
'' :
$conf->$element->dir_output;
2007 $dir = $dir.
"/".$objectref;
2008 $file = $dir.
"/".$objectref.
".meta";
2010 if (!is_dir($dir)) {
2017 $nblines = count(
$object->lines);
2022 $meta =
"REFERENCE=\"".$object->ref.
"\"
2024 NB_ITEMS=\"" . $nblines.
"\"
2025 CLIENT=\"" . $client.
"\"
2026 AMOUNT_EXCL_TAX=\"" .
$object->total_ht.
"\"
2027 AMOUNT=\"" .
$object->total_ttc.
"\"\n";
2029 for ($i = 0; $i < $nblines; $i++) {
2031 $meta .=
"ITEM_".$i.
"_QUANTITY=\"".
$object->lines[$i]->qty.
"\"
2032 ITEM_" . $i.
"_AMOUNT_WO_TAX=\"".
$object->lines[$i]->total_ht.
"\"
2033 ITEM_" . $i.
"_VAT=\"".
$object->lines[$i]->tva_tx.
"\"
2034 ITEM_" . $i.
"_DESCRIPTION=\"".str_replace(
"\r\n",
"", nl2br(
$object->lines[$i]->desc)).
"\"
2039 $fp = fopen($file,
"w");
2047 dol_syslog(
'FailedToDetectDirInDolMetaCreateFor'.
$object->element, LOG_WARNING);
2065 $listofpaths = array();
2066 $listofnames = array();
2067 $listofmimes = array();
2071 foreach ($listoffiles as $key => $val) {
2072 $listofpaths[] = $val[
'fullname'];
2073 $listofnames[] = $val[
'name'];
2077 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2078 $_SESSION[
"listofpaths".$keytoavoidconflict] = implode(
';', $listofpaths);
2079 $_SESSION[
"listofnames".$keytoavoidconflict] = implode(
';', $listofnames);
2080 $_SESSION[
"listofmimes".$keytoavoidconflict] = implode(
';', $listofmimes);
2104function dol_add_file_process($upload_dir, $allowoverwrite = 0, $updatesessionordb = 0, $keyforsourcefile =
'addedfile', $savingdocmask =
'', $link =
null, $trackid =
'', $generatethumbs = 1,
$object =
null, $forceFullTextIndexation =
'', $mode = 0)
2112 $_FILES = array($keyforsourcefile => array());
2113 $_FILES[$keyforsourcefile][
'tmp_name'] = $keyforsourcefile;
2114 $_FILES[$keyforsourcefile][
'name'] = $keyforsourcefile;
2118 if (!empty($_FILES[$keyforsourcefile])) {
2119 dol_syslog(
'dol_add_file_process varfiles = '.$keyforsourcefile.
' upload_dir='.$upload_dir.
' allowoverwrite='.$allowoverwrite.
' updatesessionordb='.$updatesessionordb.
' savingdocmask='.$savingdocmask, LOG_DEBUG);
2120 $maxfilesinform =
getDolGlobalInt(
"MAIN_SECURITY_MAX_ATTACHMENT_ON_FORMS", 10);
2121 if (is_array($_FILES[$keyforsourcefile][
"name"]) && count($_FILES[$keyforsourcefile][
"name"]) > $maxfilesinform) {
2122 $langs->load(
"errors");
2123 setEventMessages($langs->trans(
"ErrorTooMuchFileInForm", $maxfilesinform),
null,
"errors");
2131 $TFile = $_FILES[$keyforsourcefile];
2133 if (!is_array($TFile[
'name'])) {
2134 foreach ($TFile as $key => &$val) {
2139 $nbfile = count($TFile[
'name']);
2141 for ($i = 0; $i < $nbfile; $i++) {
2142 if (empty($TFile[
'name'][$i])) {
2147 $destfile = trim($TFile[
'name'][$i]);
2148 $destfull = $upload_dir.
"/".$destfile;
2149 $destfilewithoutext = preg_replace(
'/\.[^\.]+$/',
'', $destfile);
2151 if ($savingdocmask && strpos($savingdocmask, $destfilewithoutext) !== 0) {
2152 $destfile = trim(preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask));
2153 $destfull = $upload_dir.
"/".$destfile;
2156 $filenameto = basename($destfile);
2157 if (preg_match(
'/^\./', $filenameto)) {
2158 $langs->load(
"errors");
2159 setEventMessages($langs->trans(
"ErrorFilenameCantStartWithDot", $filenameto),
null,
'errors');
2163 $info = pathinfo($destfull);
2164 $destfull = $info[
'dirname'].
'/'.
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2165 $info = pathinfo($destfile);
2166 $destfile =
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
2169 $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';
2170 $fileextensionrestriction =
getDolGlobalString(
"MAIN_FILE_EXTENSION_UPLOAD_RESTRICTION", $defaultexecutableextensions);
2171 if (!empty($fileextensionrestriction)) {
2172 $arrayofregexextension = explode(
",", $fileextensionrestriction);
2174 foreach ($arrayofregexextension as $fileextension) {
2175 if (preg_match(
'/\.'.preg_quote(trim($fileextension),
'/').
'$/i', $destfull)) {
2176 $langs->load(
"errors");
2177 setEventMessages($langs->trans(
"ErrorFilenameExtensionNotAllowed", $filenameto),
null,
'errors');
2189 global $dolibarr_main_restrict_os_commands;
2190 if (!empty($dolibarr_main_restrict_os_commands)) {
2191 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
2192 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
2193 if (in_array($destfile, $arrayofallowedcommand)) {
2194 $langs->load(
"errors");
2195 setEventMessages($langs->trans(
"ErrorFilenameReserved", $destfile),
null,
'errors');
2201 $resupload =
dol_move_uploaded_file($TFile[
'tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile[
'error'][$i], 0, $keyforsourcefile, $upload_dir, $mode);
2203 if (is_numeric($resupload) && $resupload > 0) {
2204 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2207 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
2208 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
2209 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
2210 $maxheightmini = $tmparraysize[
'maxheightmini'];
2215 if ($generatethumbs) {
2221 $imgThumbSmall =
vignette($destfull, $maxwidthsmall, $maxheightsmall,
'_small', $quality,
"thumbs");
2224 $imgThumbMini =
vignette($destfull, $maxwidthmini, $maxheightmini,
'_mini', $quality,
"thumbs");
2229 if (empty($updatesessionordb)) {
2230 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2232 $formmail->trackid = $trackid;
2233 $formmail->add_attached_files($destfull, $destfile, $TFile[
'type'][$i]);
2237 if ($updatesessionordb == 1) {
2239 if ($TFile[
'type'][$i] ==
'application/pdf' && strpos($_SERVER[
"REQUEST_URI"],
'product') !==
false &&
getDolGlobalString(
'PRODUCT_ALLOW_EXTERNAL_DOWNLOAD')) {
2244 if ($allowoverwrite) {
2248 $result =
addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ?
'.noexe' :
''), $TFile[
'name'][$i],
'uploaded', $sharefile,
$object, $forceFullTextIndexation);
2250 if ($allowoverwrite) {
2253 setEventMessages(
'WarningFailedToAddFileIntoDatabaseIndex',
null,
'warnings');
2260 $langs->load(
"errors");
2261 if (is_numeric($resupload) && $resupload < 0) {
2263 } elseif (preg_match(
'/ErrorFileIsInfectedWithAVirus/', $resupload)) {
2264 if (preg_match(
'/File is a PDF with javascript inside/', $resupload)) {
2265 setEventMessages($langs->trans(
"ErrorFileIsAnInfectedPDFWithJSInside"),
null,
'errors');
2279 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $upload_dir),
null,
'errors');
2282 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2284 $linkObject->entity =
$conf->entity;
2285 $linkObject->url = $link;
2286 $linkObject->objecttype =
GETPOST(
'objecttype',
'alpha');
2287 $linkObject->objectid =
GETPOSTINT(
'objectid');
2288 $linkObject->label =
GETPOST(
'label',
'alpha');
2289 $res = $linkObject->create($user);
2297 $langs->load(
"errors");
2298 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"File")),
null,
'errors');
2320 $keytodelete = $filenb;
2323 $listofpaths = array();
2324 $listofnames = array();
2325 $listofmimes = array();
2326 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
2327 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
2328 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
2330 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
2331 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
2333 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
2334 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
2337 if ($keytodelete >= 0) {
2338 $pathtodelete = $listofpaths[$keytodelete];
2339 $filetodelete = $listofnames[$keytodelete];
2340 if (empty($donotdeletefile)) {
2346 if (empty($donotdeletefile)) {
2347 $langs->load(
"other");
2348 setEventMessages($langs->trans(
"FileWasRemoved", $filetodelete),
null,
'mesgs');
2350 if (empty($donotupdatesession)) {
2351 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
2353 $formmail->trackid = $trackid;
2354 $formmail->remove_attached_files($keytodelete);
2382 dol_syslog(
"addFileIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2384 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2386 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2387 $filename = basename(preg_replace(
'/\.noexe$/',
'', $file));
2388 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2389 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2391 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
2393 $ecmfile->filepath = $rel_dir;
2394 $ecmfile->filename = $filename;
2395 $ecmfile->label = md5_file(
dol_osencode($dir.
'/'.$file));
2396 $ecmfile->fullpath_orig = $fullpathorig;
2397 $ecmfile->gen_or_uploaded = $mode;
2398 $ecmfile->description =
'';
2399 $ecmfile->keywords =
'';
2402 $ecmfile->src_object_id =
$object->id;
2403 if (isset(
$object->table_element)) {
2404 $ecmfile->src_object_type =
$object->table_element;
2406 dol_syslog(
'Error: object ' . get_class(
$object) .
' has no table_element attribute.');
2409 if (isset(
$object->src_object_description)) {
2410 $ecmfile->description =
$object->src_object_description;
2412 if (isset(
$object->src_object_keywords)) {
2413 $ecmfile->keywords =
$object->src_object_keywords;
2416 $ecmfile->entity =
$object->entity;
2425 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2431 if (empty($useFullTextIndexation) && $forceFullTextIndexation ==
'1') {
2433 $useFullTextIndexation =
'pdftotext';
2435 $useFullTextIndexation =
'docling';
2440 if ($useFullTextIndexation) {
2441 $ecmfile->filepath = $rel_dir;
2442 $ecmfile->filename = $filename;
2444 $filetoprocess = $dir.
'/'.$ecmfile->filename;
2446 $textforfulltextindex =
'';
2449 if (preg_match(
'/\.pdf/i', $filename)) {
2453 if (empty($result[
'error'])) {
2454 $textforfulltextindex = $result[
'content'];
2455 $filetoprocess = $result[
'keywords'];
2456 $cmd = $result[
'cmd'];
2463 $ecmfile->description =
'File content generated by '.$cmd;
2465 $ecmfile->content = $textforfulltextindex;
2466 $ecmfile->keywords = $keywords;
2470 $result = $ecmfile->create($user);
2496 dol_syslog(
"deleteFilesIntoDatabaseIndex: dir parameter can't be empty", LOG_ERR);
2500 dol_syslog(
"deleteFilesIntoDatabaseIndex dir=".$dir.
" file=".$file, LOG_DEBUG);
2504 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2506 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
2508 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2509 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2512 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'ecm_files';
2514 $sql .=
' WHERE entity = ' . ((int)
$object->entity);
2516 $sql .=
' WHERE entity = ' . ((int)
$conf->entity);
2518 $sql .=
" AND filepath = '".$db->escape($rel_dir).
"'";
2520 $sql .=
" AND filename = '".$db->escape($file).
"'";
2523 $sql .=
" AND gen_or_uploaded = '".$db->escape($mode).
"'";
2526 $resql =
$db->query($sql);
2553 if (!is_file($filePath) || !is_readable($filePath)) {
2558 $handle = fopen($filePath,
'rb');
2562 $header = fread($handle, 5);
2565 if ($header !==
'%PDF-') {
2595 if (class_exists(
'Imagick')) {
2596 $image =
new Imagick();
2602 dol_syslog(
"We try to convert a PDF file with name ".$fileinput.
" but it is not a real PDF file (hack attempt ?).", LOG_WARNING);
2606 $filetoconvert = $fileinput.(($page !=
'') ?
'['.$page.
']' :
'');
2608 $ret = $image->readImage($filetoconvert);
2610 $ext = pathinfo($fileinput, PATHINFO_EXTENSION);
2611 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);
2616 $ret = $image->setImageFormat($ext);
2618 if (empty($fileoutput)) {
2619 $fileoutput = $fileinput.
".".$ext;
2622 $count = $image->getNumberImages();
2624 if (!
dol_is_file($fileoutput) || is_writable($fileoutput)) {
2626 $ret = $image->writeImages($fileoutput,
true);
2631 dol_syslog(
"Warning: Failed to write cache preview file '.$fileoutput.'. Check permission on file/dir", LOG_ERR);
2661function dol_compress_file($inputfile, $outputfile, $mode =
"gz", &$errorstring =
null)
2667 dol_syslog(
"dol_compress_file mode=".$mode.
" inputfile=".$inputfile.
" outputfile=".$outputfile);
2670 $compressdata =
null;
2671 if ($mode ==
'gz' && function_exists(
'gzencode')) {
2673 $compressdata = gzencode($data, 9);
2674 } elseif ($mode ==
'bz' && function_exists(
'bzcompress')) {
2676 $compressdata = bzcompress($data, 9);
2677 } elseif ($mode ==
'zstd' && function_exists(
'zstd_compress')) {
2679 $compressdata = zstd_compress($data, 9);
2680 } elseif ($mode ==
'zip') {
2681 if (class_exists(
'ZipArchive') &&
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS')) {
2684 $rootPath = realpath($inputfile);
2686 dol_syslog(
"Class ZipArchive is set so we zip using ZipArchive to zip into ".$outputfile.
' rootPath='.$rootPath);
2687 $zip =
new ZipArchive();
2689 if ($zip->open($outputfile, ZipArchive::CREATE) !==
true) {
2690 $errorstring =
"dol_compress_file failure - Failed to open file ".$outputfile.
"\n";
2694 $errormsg = $errorstring;
2701 $files =
new RecursiveIteratorIterator(
2702 new RecursiveDirectoryIterator($rootPath, FilesystemIterator::UNIX_PATHS),
2703 RecursiveIteratorIterator::LEAVES_ONLY
2705 '@phan-var-force SplFileInfo[] $files';
2707 foreach ($files as $name => $file) {
2709 if (!$file->isDir()) {
2711 $filePath = $file->getPath();
2712 $fileName = $file->getFilename();
2713 $fileFullRealPath = $file->getRealPath();
2716 $relativePath = substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($rootPath) + 1);
2719 $zip->addFile($fileFullRealPath, $relativePath);
2726 dol_syslog(
"dol_compress_file success - ".$zip->numFiles.
" files");
2730 if (defined(
'ODTPHP_PATHTOPCLZIP')) {
2733 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2734 $archive =
new PclZip($outputfile);
2736 $result = $archive->add($inputfile, PCLZIP_OPT_REMOVE_PATH, dirname($inputfile));
2738 if ($result === 0) {
2740 $errormsg = $archive->errorInfo(
true);
2742 if ($archive->errorCode() == PCLZIP_ERR_WRITE_OPEN_FAIL) {
2743 $errorstring =
"PCLZIP_ERR_WRITE_OPEN_FAIL";
2744 dol_syslog(
"dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL", LOG_ERR);
2748 $errorstring =
"dol_compress_file error archive->errorCode = ".$archive->errorCode().
" errormsg=".$errormsg;
2749 dol_syslog(
"dol_compress_file failure - ".$errormsg, LOG_ERR);
2752 dol_syslog(
"dol_compress_file success - ".count($result).
" files");
2758 if ($foundhandler && is_string($compressdata)) {
2759 $fp = fopen($outputfile,
"w");
2760 fwrite($fp, $compressdata);
2764 $errorstring =
"Try to zip with format ".$mode.
" with no handler for this format";
2768 $errormsg = $errorstring;
2772 global $langs, $errormsg;
2773 $langs->load(
"errors");
2774 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir");
2776 $errorstring =
"Failed to open file ".$outputfile;
2794 $fileinfo = pathinfo($inputfile);
2795 $fileinfo[
"extension"] = strtolower($fileinfo[
"extension"]);
2797 if ($fileinfo[
"extension"] ==
"zip") {
2798 if (defined(
'ODTPHP_PATHTOPCLZIP') && !
getDolGlobalString(
'MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS')) {
2799 dol_syslog(
"Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.
", so we use Pclzip to unzip into ".$outputdir);
2800 include_once ODTPHP_PATHTOPCLZIP.
'pclzip.lib.php';
2801 $archive =
new PclZip($inputfile);
2808 $result = $archive->extract(PCLZIP_OPT_PATH, $outputdir, PCLZIP_OPT_BY_PREG,
'/^((?!\.\.).)*$/');
2810 return array(
'error' => $e->getMessage());
2813 if (!is_array($result) && $result <= 0) {
2814 return array(
'error' => $archive->errorInfo(
true));
2819 foreach ($result as $key => $val) {
2820 if ($val[
'status'] ==
'path_creation_fail') {
2821 $langs->load(
"errors");
2823 $errmsg = $langs->trans(
"ErrorFailToCreateDir", $val[
'filename']);
2826 if ($val[
'status'] ==
'write_protected') {
2827 $langs->load(
"errors");
2829 $errmsg = $langs->trans(
"ErrorFailToCreateFile", $val[
'filename']);
2837 return array(
'error' => $errmsg);
2842 if (class_exists(
'ZipArchive')) {
2843 dol_syslog(
"Class ZipArchive is set so we unzip using ZipArchive to unzip into ".$outputdir);
2844 $zip =
new ZipArchive();
2845 $res = $zip->open($inputfile);
2846 if ($res ===
true) {
2852 for ($i = 0; $i < $zip->numFiles; $i++) {
2853 if (preg_match(
'/\.\./', $zip->getNameIndex($i))) {
2854 dol_syslog(
"Warning: Try to unzip a file with a transversal path ".$zip->getNameIndex($i), LOG_WARNING);
2857 $zip->extractTo($outputdir.
'/', array($zip->getNameIndex($i)));
2863 return array(
'error' =>
'ErrUnzipFails');
2867 return array(
'error' =>
'ErrNoZipEngine');
2868 } elseif (in_array($fileinfo[
"extension"], array(
'gz',
'bz2',
'zst'))) {
2869 include_once DOL_DOCUMENT_ROOT.
"/core/class/utils.class.php";
2877 $extension = strtolower(pathinfo($fileinfo[
"filename"], PATHINFO_EXTENSION));
2878 if ($extension ==
"tar") {
2881 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0, $outputfilename.
'.err', 0);
2882 if ($resarray[
"result"] != 0) {
2883 $resarray[
"error"] .= file_get_contents($outputfilename.
'.err');
2887 if ($fileinfo[
"extension"] ==
"gz") {
2889 } elseif ($fileinfo[
"extension"] ==
"bz2") {
2891 } elseif ($fileinfo[
"extension"] ==
"zst") {
2894 return array(
'error' =>
'ErrorBadFileExtension');
2897 $cmd .=
' > '.$outputfilename;
2899 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0,
null, 1, $outputfilename.
'.err');
2900 if ($resarray[
"result"] != 0) {
2901 $errfilecontent = @file_get_contents($outputfilename.
'.err');
2902 if ($errfilecontent) {
2903 $resarray[
"error"] .=
" - ".$errfilecontent;
2907 return $resarray[
"result"] != 0 ? array(
'error' => $resarray[
"error"]) : array();
2910 return array(
'error' =>
'ErrorBadFileExtension');
2926function dol_compress_dir($inputdir, $outputfile, $mode =
"zip", $excludefiles =
'', $rootdirinzip =
'', $newmask =
'0')
2930 dol_syslog(
"Try to zip dir ".$inputdir.
" into ".$outputfile.
" mode=".$mode);
2932 if (!
dol_is_dir(dirname($outputfile)) || !is_writable(dirname($outputfile))) {
2933 global $langs, $errormsg;
2934 $langs->load(
"errors");
2935 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir", $outputfile);
2940 if ($mode ==
'gz') {
2942 } elseif ($mode ==
'bz') {
2944 } elseif ($mode ==
'zip') {
2958 if (class_exists(
'ZipArchive')) {
2962 $zip =
new ZipArchive();
2963 $result = $zip->open($outputfile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
2964 if ($result !==
true) {
2965 global $langs, $errormsg;
2966 $langs->load(
"errors");
2967 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile);
2974 $files =
new RecursiveIteratorIterator(
2975 new RecursiveDirectoryIterator($inputdir, FilesystemIterator::UNIX_PATHS),
2976 RecursiveIteratorIterator::LEAVES_ONLY
2978 '@phan-var-force SplFileInfo[] $files';
2981 foreach ($files as $name => $file) {
2983 if (!$file->isDir()) {
2985 $filePath = $file->getPath();
2986 $fileName = $file->getFilename();
2987 $fileFullRealPath = $file->getRealPath();
2990 $relativePath = ($rootdirinzip ? $rootdirinzip.
'/' :
'').substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($inputdir) + 1);
2993 if (empty($excludefiles) || !preg_match($excludefiles, $fileFullRealPath)) {
2995 $zip->addFile($fileFullRealPath, $relativePath);
3006 if (empty($newmask)) {
3007 dol_syslog(
"Warning: dol_compress_dir called with empty value for newmask and no default value defined", LOG_WARNING);
3017 if (!$foundhandler) {
3018 dol_syslog(
"Try to zip with format ".$mode.
" with no handler for this format", LOG_ERR);
3024 global $langs, $errormsg;
3025 $langs->load(
"errors");
3026 dol_syslog(
"Failed to open file ".$outputfile, LOG_ERR);
3028 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile).
' - '.$e->getMessage();
3045function dol_most_recent_file($dir, $regexfilter =
'', $excludefilter = array(
'(\.meta|_preview.*\.png)$',
'^\.'), $nohook = 0, $mode = 0)
3047 $tmparray =
dol_dir_list($dir,
'files', 0, $regexfilter, $excludefilter,
'date', SORT_DESC, $mode, $nohook);
3048 return isset($tmparray[0]) ? $tmparray[0] :
null;
3066 global
$conf,
$db, $user, $hookmanager;
3067 global $dolibarr_main_data_root, $dolibarr_main_document_root_alt;
3070 if (!is_object($fuser)) {
3074 if (empty($modulepart)) {
3075 return 'ErrorBadParameter';
3077 if (empty($entity)) {
3088 if ($modulepart ==
'facture') {
3089 $modulepart =
'invoice';
3090 } elseif ($modulepart ==
'users') {
3091 $modulepart =
'user';
3092 } elseif ($modulepart ==
'tva') {
3093 $modulepart =
'tax-vat';
3094 } elseif ($modulepart ==
'expedition' && strpos($original_file,
'receipt/') === 0) {
3096 $modulepart =
'delivery';
3097 } elseif ($modulepart ==
'propale') {
3098 $modulepart =
'propal';
3102 dol_syslog(
'dol_check_secure_access_document modulepart='.$modulepart.
' original_file='.$original_file.
' entity='.$entity);
3106 $sqlprotectagainstexternals =
'';
3110 if (empty($refname)) {
3111 $refname = basename(dirname($original_file).
"/");
3112 if ($refname ==
'thumbs' || $refname ==
'temp') {
3114 $refname = basename(dirname(dirname($original_file)).
"/");
3121 $download =
'download';
3122 if ($mode ==
'write') {
3125 $download =
'upload';
3129 if ($modulepart ==
'common') {
3132 $original_file = DOL_DOCUMENT_ROOT.
'/public/theme/common/'.$original_file;
3133 } elseif ($modulepart ==
'medias' && !empty($dolibarr_main_data_root)) {
3135 if (empty($entity)) {
3139 if ($mode ==
'write') {
3140 if ($fuser->hasRight(
'website',
'write')) {
3146 $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;
3147 } elseif ($modulepart ==
'logs' && !empty($dolibarr_main_data_root)) {
3149 $accessallowed = ($user->admin && basename($original_file) == $original_file && preg_match(
'/^dolibarr.*\.(log|json)$/', basename($original_file)));
3150 $original_file = $dolibarr_main_data_root.
'/'.$original_file;
3151 } elseif ($modulepart ==
'doctemplates' && !empty($dolibarr_main_data_root)) {
3152 $accessallowed = $user->admin;
3153 $relative_file = $original_file;
3154 $ent = ($entity > 0 ? $entity :
$conf->entity);
3155 $path_with_entity = $dolibarr_main_data_root .
'/' . $ent .
'/doctemplates/' . $relative_file;
3156 if ($ent > 1 && file_exists(
dol_osencode($path_with_entity))) {
3157 $original_file = $path_with_entity;
3159 $original_file = $dolibarr_main_data_root .
'/doctemplates/' . $relative_file;
3161 } elseif ($modulepart ==
'doctemplateswebsite' && !empty($dolibarr_main_data_root)) {
3163 $accessallowed = ($fuser->hasRight(
'website',
'write') && preg_match(
'/\.jpg$/i', basename($original_file)));
3164 $original_file = $dolibarr_main_data_root.
'/doctemplates/websites/'.$original_file;
3165 } elseif ($modulepart ==
'packages' && !empty($dolibarr_main_data_root)) {
3168 $tmp = explode(
',', $dolibarr_main_document_root_alt);
3171 $accessallowed = ($user->admin && preg_match(
'/^module_.*\.zip$/', basename($original_file)));
3172 $original_file = $dirins.
'/'.$original_file;
3173 } elseif ($modulepart ==
'mycompany' && !empty(
$conf->mycompany->dir_output)) {
3176 $original_file =
$conf->mycompany->dir_output.
'/'.$original_file;
3177 } elseif ($modulepart ==
'userphoto' && !empty(
$conf->user->dir_output)) {
3180 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3183 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3184 } elseif ($modulepart ==
'userphotopublic' && !empty(
$conf->user->dir_output)) {
3189 if (preg_match(
'/^(\d+)\/photos\//', $original_file, $reg)) {
3190 if ((
int) $reg[1]) {
3192 $tmpobject->fetch((
int) $reg[1],
'',
'', 1);
3194 $securekey =
GETPOST(
'securekey',
'alpha', 1);
3196 global $dolibarr_main_cookie_cryptkey, $dolibarr_main_instance_unique_id;
3197 $valuetouse = $dolibarr_main_instance_unique_id ? $dolibarr_main_instance_unique_id : $dolibarr_main_cookie_cryptkey;
3198 $encodedsecurekey =
dol_hash($valuetouse.
'uservirtualcard'.$tmpobject->id.
'-'.$tmpobject->login,
'md5');
3199 if ($encodedsecurekey == $securekey) {
3208 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3209 } elseif (($modulepart ==
'companylogo') && !empty(
$conf->mycompany->dir_output)) {
3212 $original_file =
$conf->mycompany->dir_output.
'/logos/'.$original_file;
3213 } elseif ($modulepart ==
'memberphoto' && !empty(
$conf->member->dir_output)) {
3217 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
3221 if (preg_match(
'/^MEM\d\d\d\d-\d\d\d\d\/photos\//', $original_file)) {
3224 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3225 } elseif ($modulepart ==
'apercufacture' && !empty(
$conf->invoice->multidir_output[$entity])) {
3227 if ($fuser->hasRight(
'facture', $lire)) {
3230 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3231 } elseif ($modulepart ==
'apercupropal' && !empty(
$conf->propal->multidir_output[$entity])) {
3233 if ($fuser->hasRight(
'propal', $lire)) {
3236 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3237 } elseif ($modulepart ==
'apercucommande' && !empty(
$conf->order->multidir_output[$entity])) {
3239 if ($fuser->hasRight(
'commande', $lire)) {
3242 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3243 } elseif (($modulepart ==
'apercufichinter' || $modulepart ==
'apercuficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3245 if ($fuser->hasRight(
'ficheinter', $lire)) {
3248 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3249 } elseif (($modulepart ==
'apercucontract') && !empty(
$conf->contract->multidir_output[$entity])) {
3251 if ($fuser->hasRight(
'contrat', $lire)) {
3254 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3255 } elseif (($modulepart ==
'apercusupplier_proposal') && !empty(
$conf->supplier_proposal->dir_output)) {
3257 if ($fuser->hasRight(
'supplier_proposal', $lire)) {
3260 $original_file =
$conf->supplier_proposal->dir_output.
'/'.$original_file;
3261 } elseif (($modulepart ==
'apercusupplier_order') && !empty(
$conf->fournisseur->commande->dir_output)) {
3263 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3266 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3267 } elseif (($modulepart ==
'apercusupplier_invoice') && !empty(
$conf->fournisseur->facture->dir_output)) {
3269 if ($fuser->hasRight(
'fournisseur', $lire)) {
3272 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3273 } elseif (($modulepart ==
'holiday') && !empty(
$conf->holiday->dir_output)) {
3274 if ($fuser->hasRight(
'holiday', $read) || $fuser->hasRight(
'holiday',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3277 if ($refname && !$fuser->hasRight(
'holiday',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3278 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
3280 $tmpholiday->fetch(0, $refname);
3281 $accessallowed =
checkUserAccessToObject($user, array(
'holiday'), $tmpholiday,
'holiday',
'',
'',
'rowid',
'');
3284 $original_file =
$conf->holiday->dir_output.
'/'.$original_file;
3285 } elseif (($modulepart ==
'salaries') && !empty(
$conf->salaries->dir_output)) {
3287 if ($fuser->hasRight(
'salaries', $read) || $fuser->hasRight(
'salaries',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3293 if ($refname && !$fuser->hasRight(
'salaries',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3294 include_once DOL_DOCUMENT_ROOT.
'/salaries/class/salary.class.php';
3296 $tmpsalary->fetch((
int) $refname);
3301 $accessallowed = ($tmpsalary->fk_user > 0 && in_array($tmpsalary->fk_user, $fuser->getAllChildIds(1))) ? 1 : 0;
3304 $original_file =
$conf->salaries->dir_output.
'/'.$original_file;
3305 } elseif (($modulepart ==
'expensereport') && !empty(
$conf->expensereport->dir_output)) {
3306 if ($fuser->hasRight(
'expensereport', $lire) || $fuser->hasRight(
'expensereport',
'readall') || preg_match(
'/^specimen/i', $original_file)) {
3309 if ($refname && !$fuser->hasRight(
'expensereport',
'readall') && !preg_match(
'/^specimen/i', $original_file)) {
3310 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
3312 $tmpexpensereport->fetch(0, $refname);
3313 $accessallowed =
checkUserAccessToObject($user, array(
'expensereport'), $tmpexpensereport,
'expensereport',
'',
'',
'rowid',
'');
3316 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3317 } elseif (($modulepart ==
'apercuexpensereport') && !empty(
$conf->expensereport->dir_output)) {
3319 if ($fuser->hasRight(
'expensereport', $lire)) {
3322 $original_file =
$conf->expensereport->dir_output.
'/'.$original_file;
3323 } elseif ($modulepart ==
'propalstats' && !empty(
$conf->propal->multidir_temp[$entity])) {
3325 if ($fuser->hasRight(
'propal', $lire)) {
3328 $original_file =
$conf->propal->multidir_temp[$entity].
'/'.$original_file;
3329 } elseif ($modulepart ==
'orderstats' && !empty(
$conf->order->dir_temp)) {
3331 if ($fuser->hasRight(
'commande', $lire)) {
3334 $original_file =
$conf->order->dir_temp.
'/'.$original_file;
3335 } elseif ($modulepart ==
'orderstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3336 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
3339 $original_file =
$conf->fournisseur->commande->dir_temp.
'/'.$original_file;
3340 } elseif ($modulepart ==
'billstats' && !empty(
$conf->invoice->dir_temp)) {
3342 if ($fuser->hasRight(
'facture', $lire)) {
3345 $original_file =
$conf->invoice->dir_temp.
'/'.$original_file;
3346 } elseif ($modulepart ==
'billstatssupplier' && !empty(
$conf->fournisseur->dir_output)) {
3347 if ($fuser->hasRight(
'fournisseur',
'facture', $lire)) {
3350 $original_file =
$conf->fournisseur->facture->dir_temp.
'/'.$original_file;
3351 } elseif ($modulepart ==
'expeditionstats' && !empty(
$conf->expedition->dir_temp)) {
3353 if ($fuser->hasRight(
'expedition', $lire)) {
3356 $original_file =
$conf->expedition->dir_temp.
'/'.$original_file;
3357 } elseif ($modulepart ==
'tripsexpensesstats' && !empty(
$conf->deplacement->dir_temp)) {
3359 if ($fuser->hasRight(
'deplacement', $lire)) {
3362 $original_file =
$conf->deplacement->dir_temp.
'/'.$original_file;
3363 } elseif ($modulepart ==
'memberstats' && !empty(
$conf->member->dir_temp)) {
3365 if ($fuser->hasRight(
'adherent', $lire)) {
3368 $original_file =
$conf->member->dir_temp.
'/'.$original_file;
3369 } elseif (preg_match(
'/^productstats_/i', $modulepart) && !empty(
$conf->product->dir_temp)) {
3371 if ($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) {
3374 $original_file = (!empty(
$conf->product->multidir_temp[$entity]) ?
$conf->product->multidir_temp[$entity] :
$conf->service->multidir_temp[$entity]).
'/'.$original_file;
3375 } elseif (in_array($modulepart, array(
'tax',
'tax-vat',
'tva')) && !empty(
$conf->tax->dir_output)) {
3377 if ($fuser->hasRight(
'tax',
'charges', $lire)) {
3380 $modulepartsuffix = str_replace(
'tax-',
'', $modulepart);
3381 $original_file =
$conf->tax->dir_output.
'/'.($modulepartsuffix !=
'tax' ? $modulepartsuffix.
'/' :
'').$original_file;
3382 } elseif (($modulepart ==
'actions' || $modulepart ==
'actioncomm') && !empty(
$conf->agenda->dir_output)) {
3384 if ($fuser->hasRight(
'agenda',
'myactions', $read)) {
3387 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3388 include_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
3390 $tmpobject->fetch((
int) $refname);
3391 $accessallowed =
checkUserAccessToObject($user, array(
'agenda'), $tmpobject->id,
'actioncomm&societe',
'myactions|allactions',
'fk_soc',
'id',
'');
3392 if ($user->socid && $tmpobject->socid) {
3397 $original_file =
$conf->agenda->dir_output.
'/'.$original_file;
3398 } elseif ($modulepart ==
'category' && !empty(
$conf->categorie->multidir_output[$entity])) {
3400 if (empty($entity) || empty(
$conf->categorie->multidir_output[$entity])) {
3401 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3403 if ($fuser->hasRight(
"categorie", $lire) || $fuser->hasRight(
"takepos",
"run")) {
3406 $original_file =
$conf->categorie->multidir_output[$entity].
'/'.$original_file;
3407 } elseif ($modulepart ==
'prelevement' && !empty(
$conf->prelevement->dir_output)) {
3409 if ($fuser->hasRight(
'prelevement',
'bons', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3412 $original_file =
$conf->prelevement->dir_output.
'/'.$original_file;
3413 } elseif ($modulepart ==
'graph_stock' && !empty(
$conf->stock->dir_temp)) {
3416 $original_file =
$conf->stock->dir_temp.
'/'.$original_file;
3417 } elseif ($modulepart ==
'graph_fourn' && !empty(
$conf->fournisseur->dir_temp)) {
3420 $original_file =
$conf->fournisseur->dir_temp.
'/'.$original_file;
3421 } elseif ($modulepart ==
'graph_product' && !empty(
$conf->product->dir_temp)) {
3424 $original_file =
$conf->product->multidir_temp[$entity].
'/'.$original_file;
3425 } elseif ($modulepart ==
'barcode') {
3430 $original_file =
'';
3431 } elseif ($modulepart ==
'iconmailing' && !empty(
$conf->mailing->dir_temp)) {
3434 $original_file =
$conf->mailing->dir_temp.
'/'.$original_file;
3435 } elseif ($modulepart ==
'scanner_user_temp' && !empty(
$conf->scanner->dir_temp)) {
3438 $original_file =
$conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3439 } elseif ($modulepart ==
'fckeditor' && !empty(
$conf->fckeditor->dir_output)) {
3442 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3443 } elseif ($modulepart ==
'user' && !empty(
$conf->user->dir_output)) {
3445 $canreaduser = (!empty($fuser->admin) || $fuser->hasRight(
'user',
'user', $lire));
3446 if ($fuser->id == (
int) $refname) {
3449 if ($canreaduser || preg_match(
'/^specimen/i', $original_file)) {
3452 $original_file =
$conf->user->dir_output.
'/'.$original_file;
3453 } elseif (($modulepart ==
'company' || $modulepart ==
'societe' || $modulepart ==
'thirdparty') && !empty(
$conf->societe->multidir_output[$entity])) {
3455 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3456 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3458 if ($fuser->hasRight(
'societe', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3461 $original_file =
$conf->societe->multidir_output[$entity].
'/'.$original_file;
3462 $sqlprotectagainstexternals =
"SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX.
"societe WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'societe').
")";
3463 } elseif (($modulepart ==
'contact' || $modulepart ==
'socpeople') && !empty(
$conf->societe->multidir_output[$entity])) {
3465 if (empty($entity) || empty(
$conf->societe->multidir_output[$entity])) {
3466 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3468 if ($fuser->hasRight(
'societe',
'contact', $lire)) {
3471 $original_file =
$conf->societe->multidir_output[$entity].
'/contact/'.$original_file;
3472 $sqlprotectagainstexternals =
"SELECT fk_soc FROM ".MAIN_DB_PREFIX.
"socpeople WHERE rowid = ".((int) $refname).
" AND entity IN (".
getEntity(
'contact').
")";
3473 } elseif (($modulepart ==
'facture' || $modulepart ==
'invoice') && !empty(
$conf->invoice->multidir_output[$entity])) {
3475 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3478 $original_file =
$conf->invoice->multidir_output[$entity].
'/'.$original_file;
3479 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'invoice').
")";
3480 } elseif ($modulepart ==
'massfilesarea_proposals' && !empty(
$conf->propal->multidir_output[$entity])) {
3482 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3485 $original_file =
$conf->propal->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3486 } elseif ($modulepart ==
'massfilesarea_orders') {
3487 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3490 $original_file =
$conf->order->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3491 } elseif ($modulepart ==
'massfilesarea_sendings') {
3492 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3495 $original_file =
$conf->expedition->dir_output.
'/sending/temp/massgeneration/'.$user->id.
'/'.$original_file;
3496 } elseif ($modulepart ==
'massfilesarea_receipts') {
3497 if ($fuser->hasRight(
'reception', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3500 $original_file =
$conf->reception->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3501 } elseif ($modulepart ==
'massfilesarea_invoices') {
3502 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3505 $original_file =
$conf->invoice->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3506 } elseif ($modulepart ==
'massfilesarea_expensereport') {
3507 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3510 $original_file =
$conf->expensereport->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3511 } elseif ($modulepart ==
'massfilesarea_interventions') {
3512 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3515 $original_file =
$conf->ficheinter->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3516 } elseif ($modulepart ==
'massfilesarea_supplier_proposal' && !empty(
$conf->supplier_proposal->dir_output)) {
3517 if ($fuser->hasRight(
'supplier_proposal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3520 $original_file =
$conf->supplier_proposal->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3521 } elseif ($modulepart ==
'massfilesarea_supplier_order') {
3522 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3525 $original_file =
$conf->fournisseur->commande->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3526 } elseif ($modulepart ==
'massfilesarea_supplier_invoice') {
3527 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3530 $original_file =
$conf->fournisseur->facture->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3531 } elseif ($modulepart ==
'massfilesarea_contract' && !empty(
$conf->contract->dir_output)) {
3532 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3535 $original_file =
$conf->contract->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3536 } elseif ($modulepart ==
'massfilesarea_stock' && !empty(
$conf->stock->dir_output)) {
3537 if ($fuser->hasRight(
'stock', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3540 $original_file =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3541 } elseif (($modulepart ==
'fichinter' || $modulepart ==
'ficheinter') && !empty(
$conf->ficheinter->multidir_output[$entity])) {
3543 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3546 $original_file =
$conf->ficheinter->multidir_output[$entity].
'/'.$original_file;
3547 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"fichinter WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3548 } elseif ($modulepart ==
'deplacement' && !empty(
$conf->deplacement->dir_output)) {
3550 if ($fuser->hasRight(
'deplacement', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3553 $original_file =
$conf->deplacement->dir_output.
'/'.$original_file;
3555 } elseif (($modulepart ==
'propal' || $modulepart ==
'propale') && isset(
$conf->propal->multidir_output[$entity])) {
3557 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3560 $original_file =
$conf->propal->multidir_output[$entity].
'/'.$original_file;
3561 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"propal WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'propal').
")";
3562 } elseif (($modulepart ==
'commande' || $modulepart ==
'order') && !empty(
$conf->order->multidir_output[$entity])) {
3564 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3567 $original_file =
$conf->order->multidir_output[$entity].
'/'.$original_file;
3568 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'order').
")";
3569 } elseif ($modulepart ==
'project' && !empty(
$conf->project->multidir_output[$entity])) {
3571 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3574 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3575 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
3577 $tmpproject->fetch(0, $refname);
3578 $accessallowed =
checkUserAccessToObject($user, array(
'projet'), $tmpproject->id,
'projet&project',
'',
'',
'rowid',
'');
3581 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3582 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3583 } elseif ($modulepart ==
'project_task' && !empty(
$conf->project->multidir_output[$entity])) {
3584 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3587 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3588 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
3590 $tmptask->fetch(0, $refname);
3591 $accessallowed =
checkUserAccessToObject($user, array(
'projet_task'), $tmptask->id,
'projet_task&project',
'',
'',
'rowid',
'');
3594 $original_file =
$conf->project->multidir_output[$entity].
'/'.$original_file;
3595 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3596 } elseif (($modulepart ==
'commande_fournisseur' || $modulepart ==
'order_supplier' || $modulepart ==
'supplier_order') && !empty(
$conf->fournisseur->commande->dir_output)) {
3598 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3601 $original_file =
$conf->fournisseur->commande->dir_output.
'/'.$original_file;
3602 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande_fournisseur WHERE ref='".
$db->escape($refname).
"' AND entity = ".((int)
$conf->entity);
3603 } elseif (($modulepart ==
'facture_fournisseur' || $modulepart ==
'invoice_supplier' || $modulepart ==
'supplier_invoice') && !empty(
$conf->fournisseur->facture->dir_output)) {
3605 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3608 $original_file =
$conf->fournisseur->facture->dir_output.
'/'.$original_file;
3609 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture_fourn WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3610 } elseif ($modulepart ==
'supplier_payment') {
3612 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3615 $original_file = preg_replace(
"/payment\//",
"", $original_file);
3616 $original_file =
$conf->fournisseur->payment->dir_output.
'/'.$original_file;
3617 $sqlprotectagainstexternals =
"SELECT f.fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"paiementfourn as p";
3618 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"paiementfourn_facturefourn as pf ON pf.fk_paiementfourn = p.rowid";
3619 $sqlprotectagainstexternals .=
" INNER JOIN ".MAIN_DB_PREFIX.
"facture_fourn as f ON pf.fk_facturefourn = p.rowid";
3620 $sqlprotectagainstexternals .=
" WHERE p.ref = '".$db->escape($refname).
"' AND p.entity=".((int)
$conf->entity);
3621 } elseif ($modulepart ==
'payment') {
3623 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3626 $original_file =
$conf->compta->payment->dir_output.
'/'.$original_file;
3627 } elseif ($modulepart ==
'facture_paiement' && !empty(
$conf->invoice->dir_output)) {
3629 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3632 if ($fuser->socid > 0) {
3633 $original_file =
$conf->invoice->dir_output.
'/payments/private/'.$fuser->id.
'/'.$original_file;
3635 $original_file =
$conf->invoice->dir_output.
'/payments/'.$original_file;
3642 } elseif ($modulepart ==
'accounting' && !empty(
$conf->accounting->dir_output)) {
3644 if ($fuser->hasRight(
'accounting',
'bind',
'write') || $fuser->hasRight(
'accounting',
'mouvements',
'export') || preg_match(
'/^specimen/i', $original_file)) {
3647 $original_file =
$conf->accounting->dir_output.
'/'.$original_file;
3648 } elseif (($modulepart ==
'expedition' || $modulepart ==
'shipment' || $modulepart ==
'shipping') && !empty(
$conf->expedition->dir_output)) {
3650 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3653 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'sending/') === 0 ?
'' :
'sending/').$original_file;
3655 } elseif (($modulepart ==
'livraison' || $modulepart ==
'delivery') && !empty(
$conf->expedition->dir_output)) {
3657 if ($fuser->hasRight(
'expedition',
'delivery', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3660 $original_file =
$conf->expedition->dir_output.
"/".(strpos($original_file,
'receipt/') === 0 ?
'' :
'receipt/').$original_file;
3661 } elseif ($modulepart ==
'actionsreport' && !empty(
$conf->agenda->dir_temp)) {
3663 if ($fuser->hasRight(
'agenda',
'allactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3666 $original_file =
$conf->agenda->dir_temp.
"/".$original_file;
3667 } elseif ($modulepart ==
'product' || $modulepart ==
'produit' || $modulepart ==
'service' || $modulepart ==
'produit|service') {
3669 if (empty($entity) || (empty(
$conf->product->multidir_output[$entity]) && empty(
$conf->service->multidir_output[$entity]))) {
3670 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3672 if (($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3676 $original_file =
$conf->product->multidir_output[$entity].
'/'.$original_file;
3678 $original_file =
$conf->service->multidir_output[$entity].
'/'.$original_file;
3680 } elseif ($modulepart ==
'product_batch' || $modulepart ==
'produitlot') {
3682 if (empty($entity) || (empty(
$conf->productbatch->multidir_output[$entity]))) {
3683 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3685 if (($fuser->hasRight(
'produit', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3689 $original_file =
$conf->productbatch->multidir_output[$entity].
'/'.$original_file;
3691 } elseif ($modulepart ==
'movement' || $modulepart ==
'mouvement') {
3693 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3694 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3696 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3700 $original_file =
$conf->stock->multidir_output[$entity].
'/movement/'.$original_file;
3702 } elseif ($modulepart ==
'entrepot') {
3704 if (empty($entity) || empty(
$conf->stock->multidir_output[$entity])) {
3705 return array(
'accessallowed' => 0,
'error' =>
'Value entity must be provided');
3707 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3711 $original_file =
$conf->stock->multidir_output[$entity].
'/'.$original_file;
3713 } elseif ($modulepart ==
'contract' && !empty(
$conf->contract->multidir_output[$entity])) {
3715 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3718 $original_file =
$conf->contract->multidir_output[$entity].
'/'.$original_file;
3719 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"contrat WHERE ref='".
$db->escape($refname).
"' AND entity IN (".
getEntity(
'contract').
")";
3720 } elseif ($modulepart ==
'donation' && !empty(
$conf->don->dir_output)) {
3722 if ($fuser->hasRight(
'don', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3725 $original_file =
$conf->don->dir_output.
'/'.$original_file;
3726 } elseif ($modulepart ==
'dolresource' && !empty(
$conf->resource->dir_output)) {
3728 if ($fuser->hasRight(
'resource', $read) || preg_match(
'/^specimen/i', $original_file)) {
3731 $original_file =
$conf->resource->dir_output.
'/'.$original_file;
3732 } elseif (($modulepart ==
'remisecheque' || $modulepart ==
'chequereceipt') && !empty(
$conf->bank->dir_output)) {
3734 if ($fuser->hasRight(
'banque', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3737 $original_file =
$conf->bank->dir_output.
'/checkdeposits/'.$original_file;
3738 } elseif (($modulepart ==
'banque' || $modulepart ==
'bank') && !empty(
$conf->bank->dir_output)) {
3741 if ($fuser->hasRight(
'banque', ($mode ==
'read' ?
'lire' :
'modifier'))) {
3744 $original_file =
$conf->bank->dir_output.
'/'.$original_file;
3745 } elseif ($modulepart ==
'export' && !empty(
$conf->export->dir_temp)) {
3748 $accessallowed = $user->hasRight(
'export',
'lire');
3749 $original_file =
$conf->export->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3750 } elseif ($modulepart ==
'import' && !empty(
$conf->import->dir_temp)) {
3752 $accessallowed = $user->hasRight(
'import',
'run');
3753 $original_file =
$conf->import->dir_temp.
'/'.$original_file;
3754 } elseif ($modulepart ==
'recruitment' && !empty(
$conf->recruitment->dir_output)) {
3756 $accessallowed = $user->hasRight(
'recruitment',
'recruitmentjobposition',
'read');
3757 $original_file =
$conf->recruitment->dir_output.
'/'.$original_file;
3758 } elseif ($modulepart ==
'hrm' && !empty(
$conf->hrm->dir_output)) {
3760 $accessallowed = $user->hasRight(
'hrm',
'all',
'read');
3761 $original_file =
$conf->hrm->dir_output.
'/'.$original_file;
3762 } elseif ($modulepart ==
'editor' && !empty(
$conf->fckeditor->dir_output)) {
3765 $original_file =
$conf->fckeditor->dir_output.
'/'.$original_file;
3766 } elseif ($modulepart ==
'systemtools' && !empty(
$conf->admin->dir_output)) {
3768 if ($fuser->admin) {
3771 $original_file =
$conf->admin->dir_output.
'/'.$original_file;
3772 } elseif ($modulepart ==
'admin_temp' && !empty(
$conf->admin->dir_temp)) {
3774 if ($fuser->admin) {
3777 $original_file =
$conf->admin->dir_temp.
'/'.$original_file;
3778 } elseif ($modulepart ==
'bittorrent' && !empty(
$conf->bittorrent->dir_output)) {
3782 if (
dol_mimetype($original_file) ==
'application/x-bittorrent') {
3785 $original_file =
$conf->bittorrent->dir_output.
'/'.$dir.
'/'.$original_file;
3786 } elseif ($modulepart ==
'member' && !empty(
$conf->member->dir_output)) {
3788 if ($fuser->hasRight(
'adherent', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3791 $original_file =
$conf->member->dir_output.
'/'.$original_file;
3792 } elseif ($modulepart ==
'ticket' && !empty(
$conf->ticket->multidir_output[$entity])) {
3794 if ($fuser->hasRight(
'ticket', $read)) {
3797 if (!isset($_SESSION[
'email_customer'])) {
3799 $sqlprotectagainstexternals =
"SELECT fk_soc FROM ".MAIN_DB_PREFIX.
"ticket WHERE ref='".
$db->escape($refname).
"' AND entity=".((int)
$conf->entity);
3801 $email_split = explode(
'@', $_SESSION[
'email_customer']);
3803 $sqlprotectagainstexternals =
'SELECT t.rowid, t.fk_soc FROM '.MAIN_DB_PREFIX.
'ticket t';
3804 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'element_contact ec ON ec.element_id = t.rowid';
3805 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'socpeople c ON c.rowid = ec.fk_socpeople';
3806 $sqlprotectagainstexternals .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_type_contact tc ON tc.element = "ticket" AND tc.rowid = ec.fk_c_type_contact';
3807 $sqlprotectagainstexternals .=
" WHERE t.ref LIKE '".$db->escape($refname).
"'";
3808 $sqlprotectagainstexternals .=
' AND (';
3809 $sqlprotectagainstexternals .=
' (';
3810 $sqlprotectagainstexternals .=
' tc.rowid IS NOT NULL';
3811 $sqlprotectagainstexternals .=
" AND c.email = '".$db->escape($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
"'";
3812 $sqlprotectagainstexternals .=
' )';
3813 $sqlprotectagainstexternals .=
" OR t.origin_email = '".$db->escape($email_split[0]).
'@'.
$db->sanitize($email_split[1]).
"'";
3814 $sqlprotectagainstexternals .=
' )';
3816 $original_file =
$conf->ticket->multidir_output[$entity].
'/'.$original_file;
3826 if (preg_match(
'/^specimen/i', $original_file)) {
3829 if ($fuser->admin) {
3833 $tmpmodulepart = explode(
'-', $modulepart);
3834 if (!empty($tmpmodulepart[1])) {
3835 $modulepart = $tmpmodulepart[0];
3836 $original_file = $tmpmodulepart[1].
'/'.$original_file;
3841 if (preg_match(
'/^([a-z]+)_user_temp$/i', $modulepart, $reg)) {
3842 $tmpmodule = $reg[1];
3843 if (empty(
$conf->$tmpmodule->dir_temp)) {
3844 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3847 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3850 $original_file =
$conf->{$reg[1]}->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3851 } elseif (preg_match(
'/^([a-z]+)_temp$/i', $modulepart, $reg)) {
3852 $tmpmodule = $reg[1];
3853 if (empty(
$conf->$tmpmodule->dir_temp)) {
3854 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3857 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3860 $original_file =
$conf->$tmpmodule->dir_temp.
'/'.$original_file;
3861 } elseif (preg_match(
'/^([a-z]+)_user$/i', $modulepart, $reg)) {
3862 $tmpmodule = $reg[1];
3863 if (empty(
$conf->$tmpmodule->dir_output)) {
3864 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3867 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3870 $original_file =
$conf->$tmpmodule->dir_output.
'/'.$fuser->id.
'/'.$original_file;
3871 } elseif (preg_match(
'/^massfilesarea_([a-z]+)$/i', $modulepart, $reg)) {
3872 $tmpmodule = $reg[1];
3873 if (empty(
$conf->$tmpmodule->dir_output)) {
3874 dol_print_error(
null,
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3879 $partsofdirinoriginalfile = explode(
'/', $original_file);
3880 if (!empty($partsofdirinoriginalfile[1])) {
3881 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3882 if (($partofdirinoriginalfile && $fuser->hasRight($tmpmodule, $partofdirinoriginalfile,
'read')) || preg_match(
'/^specimen/i', $original_file)) {
3886 if ($fuser->hasRight($tmpmodule, $read) || preg_match(
'/^specimen/i', $original_file)) {
3889 $original_file =
$conf->$tmpmodule->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3891 if (empty(
$conf->$modulepart->dir_output)) {
3892 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.');
3897 $partsofdirinoriginalfile = explode(
'/', $original_file);
3898 if (!empty($partsofdirinoriginalfile[1])) {
3899 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3900 if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile,
'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile,
'read'))) {
3904 if (($fuser->hasRight($modulepart, $lire) || $fuser->hasRight($modulepart, $read)) || ($fuser->hasRight($modulepart,
'all', $lire) || $fuser->hasRight($modulepart,
'all', $read))) {
3908 if (is_array(
$conf->$modulepart->multidir_output) && !empty(
$conf->$modulepart->multidir_output[$entity])) {
3909 $original_file =
$conf->$modulepart->multidir_output[$entity].
'/'.$original_file;
3911 $original_file =
$conf->$modulepart->dir_output.
'/'.$original_file;
3915 $parameters = array(
3916 'modulepart' => $modulepart,
3917 'original_file' => $original_file,
3918 'entity' => $entity,
3923 $reshook = $hookmanager->executeHooks(
'checkSecureAccess', $parameters,
$object);
3925 if (!empty($hookmanager->resArray[
'original_file'])) {
3926 $original_file = $hookmanager->resArray[
'original_file'];
3928 if (!empty($hookmanager->resArray[
'accessallowed'])) {
3929 $accessallowed = $hookmanager->resArray[
'accessallowed'];
3931 if (!empty($hookmanager->resArray[
'sqlprotectagainstexternals'])) {
3932 $sqlprotectagainstexternals = $hookmanager->resArray[
'sqlprotectagainstexternals'];
3938 'accessallowed' => ($accessallowed ? 1 : 0),
3939 'sqlprotectagainstexternals' => $sqlprotectagainstexternals,
3940 'original_file' => $original_file
3959 dol_syslog(
"Failed to create the cache directory ".$directory, LOG_WARNING);
3962 $cachefile = $directory.$filename;
3964 file_put_contents($cachefile, json_encode(
$object), LOCK_EX);
3979 $cachefile = $directory.$filename;
3980 $refresh = !file_exists($cachefile) || ($now - $cachetime) >
dol_filemtime($cachefile);
3993 $cachefile = $directory.$filename;
3994 $object = json_decode(file_get_contents($cachefile));
4006 return preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'\//',
'', $pathfile);
4021function getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path =
'', $pathref =
'', &$checksumconcat = array())
4029 if (!empty($dir->md5file)) {
4030 $entry = $dir->md5file;
4032 } elseif (!empty($dir->sha256file)) {
4033 $entry = $dir->sha256file;
4037 foreach ($entry as $file) {
4038 $filename = $path.$file[
'name'];
4039 $file_list[
'insignature'][] = $filename;
4040 $expectedsize = (empty($file[
'size']) ?
'' : $file[
'size']);
4041 $expectedhash = (
string) $file;
4043 if (!file_exists($pathref.
'/'.$filename)) {
4044 $file_list[
'missing'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'algo' => (
string) $algo);
4046 $hash_local = hash_file($algo, $pathref.
'/'.$filename);
4048 if (
$conffile ==
'/etc/dolibarr/conf.php' && $filename ==
'/filefunc.inc.php') {
4049 $checksumconcat[] = $expectedhash;
4051 if ($hash_local != $expectedhash) {
4052 $file_list[
'updated'][] = array(
'filename' => $filename,
'expectedhash' => $expectedhash,
'expectedsize' => $expectedsize,
'hash' => (
string) $hash_local,
'algo' => (
string) $algo);
4054 $checksumconcat[] = $hash_local;
4059 foreach ($dir->dir as $subdir) {
4060 getFilesUpdated($file_list, $subdir, $path.$subdir[
'name'].
'/', $pathref, $checksumconcat);
4078 $out .=
'<div id="'.$htmlname.
'Message" class="dragDropAreaMessage hidden"><span>'.
img_picto(
"",
'download').
'<br>'.$langs->trans(
"DropFileToAddItToObject").
'</span></div>';
4079 $out .=
"\n<!-- JS CODE TO ENABLE DRAG AND DROP OF FILE -->\n";
4082 jQuery(document).ready(function() {
4083 var enterTargetDragDrop = null;
4085 $("#'.$htmlname.
'").addClass("cssDragDropArea");
4087 $(".cssDragDropArea").on("dragenter", function(ev, ui) {
4088 var dataTransfer = ev.originalEvent.dataTransfer;
4089 var dataTypes = dataTransfer.types;
4090 //console.log(dataTransfer);
4091 //console.log(dataTypes);
4093 if (!dataTypes || ($.inArray(\'Files\', dataTypes) === -1)) {
4094 // The element dragged is not a file, so we avoid the "dragenter"
4095 ev.preventDefault();
4099 // Entering drop area. Highlight area
4100 console.log("dragAndDropFileUpload: We add class highlightDragDropArea")
4101 enterTargetDragDrop = ev.target;
4102 $(this).addClass("highlightDragDropArea");
4103 $("#'.$htmlname.
'Message").removeClass("hidden");
4104 ev.preventDefault();
4107 $(".cssDragDropArea").on("dragleave", function(ev) {
4108 // Going out of drop area. Remove Highlight
4109 if (enterTargetDragDrop == ev.target){
4110 console.log("dragAndDropFileUpload: We remove class highlightDragDropArea")
4111 $("#'.$htmlname.
'Message").addClass("hidden");
4112 $(this).removeClass("highlightDragDropArea");
4116 $(".cssDragDropArea").on("dragover", function(ev) {
4117 ev.preventDefault();
4121 $(".cssDragDropArea").on("drop", function(e) {
4124 fd = new FormData();
4128 fd.append("action", "linkit");
4130 var dataTransfer = e.originalEvent.dataTransfer;
4132 if (dataTransfer.files && dataTransfer.files.length){
4133 var droppedFiles = e.originalEvent.dataTransfer.files;
4134 $.each(droppedFiles, function(index,file){
4135 fd.append("files[]", file,file.name)
4138 $(".cssDragDropArea").removeClass("highlightDragDropArea");
4139 counterdragdrop = 0;
4141 url: "'.DOL_URL_ROOT.
'/core/ajax/fileupload.php",
4146 success:function() {
4147 console.log("Uploaded.", arguments);
4148 /* arguments[0] is the json string of files */
4149 /* arguments[1] is the value for variable "success", can be 0 or 1 */
4150 let listoffiles = JSON.parse(arguments[0]);
4151 console.log(listoffiles);
4153 for (let i = 0; i < listoffiles.length; i++) {
4154 console.log(listoffiles[i].error);
4155 if (listoffiles[i].error) {
4159 console.log(nboferror);
4160 if (nboferror > 0) {
4161 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorOnAtLeastOneFileUpload:warnings";
4163 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=UploadFileDragDropSuccess:mesgs";
4167 console.log("Error Uploading.", arguments)
4168 if (arguments[0].status == 403) {
4169 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadPermissionDenied:errors";
4171 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js((
string)
$object->id).
'&seteventmessages=ErrorUploadFileDragDropPermissionDenied:errors";
4177 $out .=
"</script>\n";
4191function archiveOrBackupFile($srcfile, $max_versions = 5, $archivedir =
'', $suffix =
"v", $moveorcopy =
'move')
4193 $base_file_pattern = ($archivedir ? $archivedir : dirname($srcfile)).
'/'.basename($srcfile).
".".$suffix;
4194 $files_in_directory = glob($base_file_pattern .
"*");
4197 $files_with_timestamps = [];
4198 foreach ($files_in_directory as $file) {
4199 $files_with_timestamps[] = [
4201 'timestamp' => filemtime($file)
4207 while (count($files_with_timestamps) > 0) {
4208 $latest_file =
null;
4209 $latest_index =
null;
4212 foreach ($files_with_timestamps as $index => $file_info) {
4213 if ($latest_file ===
null || (is_array($latest_file) && $file_info[
'timestamp'] > $latest_file[
'timestamp'])) {
4214 $latest_file = $file_info;
4215 $latest_index = $index;
4220 if ($latest_file !==
null) {
4221 $sorted_files[] = $latest_file[
'file'];
4222 unset($files_with_timestamps[$latest_index]);
4227 if (count($sorted_files) >= $max_versions) {
4228 $oldest_files = array_slice($sorted_files, $max_versions - 1);
4229 foreach ($oldest_files as $oldest_file) {
4235 $new_backup = $srcfile .
".v" . $timestamp;
4238 if ($moveorcopy ==
'move') {
4239 $result =
dol_move($srcfile, $new_backup,
'0', 1, 0, 0);
4241 $result =
dol_copy($srcfile, $new_backup,
'0', 1, 0, 0);
4257function dolDocToText($filetoprocess, $useFullTextIndexation =
'pdftotext', $options =
'html')
4262 $keywords = array();
4263 $textforfulltextindex =
'';
4266 if (empty($useFullTextIndexation)) {
4267 $useFullTextIndexation =
'pdftotext';
4274 if (preg_match(
'/pdftotext/i', $useFullTextIndexation)) {
4275 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4277 $outputfile =
$conf->admin->dir_temp.
'/tmppdftotext.'.$user->id.
'.out';
4281 if ($options ==
'fulltext') {
4282 $params =
'-nodiag -layout';
4284 $params =
'-htmlmeta';
4289 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4291 if (empty($resultexec[
'error'])) {
4293 if ($options ==
'fulltext') {
4294 $textforfulltextindex = $resultexec[
'output'];
4296 if ($options ==
'html') {
4297 $txt = $resultexec[
'output'];
4298 if (preg_match(
'/<meta name="keywords" content="([^\/]+)"\s*\/>/i', $txt, $matches)) {
4299 $keywords = $matches[1];
4301 if (preg_match(
'/<pre>(.*)<\/pre>/si', $txt, $matches)) {
4313 if (preg_match(
'/docling/i', $useFullTextIndexation)) {
4314 include_once DOL_DOCUMENT_ROOT.
'/core/class/utils.class.php';
4316 $outputfile =
$conf->admin->dir_temp.
'/tmpdocling.'.$user->id.
'.out';
4322 $resultexec = $utils->executeCLI($cmd, $outputfile, 0,
null, 1);
4324 if (!$resultexec[
'error']) {
4325 $txt = $resultexec[
'output'];
4333 $textforfulltextindex = $txt;
4340 return array(
'error' => $error,
'keywords' => $keywords,
'content' => $textforfulltextindex,
'cmd' => $cmd);
4352 $fp = fopen($fullpath,
"r");
4353 fseek($fp, -1, SEEK_END);
4356 while ($char ===
"\n" || $char ===
"\r") {
4357 fseek($fp, $pos--, SEEK_END);
4360 while ($char !==
"\n" && $char !==
false) {
4361 fseek($fp, $pos--, SEEK_END);
4370 $truncatePos = ftell($fp);
4373 $fp = fopen($fullpath,
"c+");
4374 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.