39 return preg_replace(
'/^.*\/([^\/]+)$/',
'$1', rtrim($pathfile,
'/'));
62 function dol_dir_list($path, $types =
"all", $recursive = 0, $filter =
"", $excludefilter =
null, $sortcriteria =
"name", $sortorder = SORT_ASC, $mode = 0, $nohook = 0, $relativename =
"", $donotfollowsymlinks = 0, $nbsecondsold = 0)
64 global $db, $hookmanager;
67 if ($recursive <= 1) {
68 dol_syslog(
"files.lib.php::dol_dir_list path=".$path.
" types=".$types.
" recursive=".$recursive.
" filter=".$filter.
" excludefilter=".json_encode($excludefilter));
72 $loaddate = ($mode == 1 || $mode == 2 || $nbsecondsold) ?
true :
false;
73 $loadsize = ($mode == 1 || $mode == 3) ?
true :
false;
74 $loadperm = ($mode == 1 || $mode == 4) ?
true :
false;
77 $path = preg_replace(
'/([\\/]+)$/i',
'', $path);
84 if (is_object($hookmanager) && !$nohook) {
85 $hookmanager->resArray = array();
87 $hookmanager->initHooks(array(
'fileslib'));
92 'recursive' => $recursive,
94 'excludefilter' => $excludefilter,
95 'sortcriteria' => $sortcriteria,
96 'sortorder' => $sortorder,
97 'loaddate' => $loaddate,
98 'loadsize' => $loadsize,
101 $reshook = $hookmanager->executeHooks(
'getDirList', $parameters, $object);
105 if (empty($reshook)) {
106 if (!is_dir($newpath)) {
110 if ($dir = opendir($newpath)) {
114 while (
false !== ($file = readdir($dir))) {
116 $file = utf8_encode($file);
118 $fullpathfile = ($newpath ? $newpath.
'/' :
'').$file;
123 $excludefilterarray = array(
'^\.');
124 if (is_array($excludefilter)) {
125 $excludefilterarray = array_merge($excludefilterarray, $excludefilter);
126 } elseif ($excludefilter) {
127 $excludefilterarray[] = $excludefilter;
130 foreach ($excludefilterarray as $filt) {
131 if (preg_match(
'/'.$filt.
'/i', $file) || preg_match(
'/'.$filt.
'/i', $fullpathfile)) {
141 if ($isdir && (($types ==
"directories") || ($types ==
"all") || $recursive > 0)) {
143 if (($types ==
"directories") || ($types ==
"all")) {
144 if ($loaddate || $sortcriteria ==
'date') {
147 if ($loadsize || $sortcriteria ==
'size') {
150 if ($loadperm || $sortcriteria ==
'perm') {
154 if (!$filter || preg_match(
'/'.$filter.
'/i', $file)) {
156 preg_match(
'/([^\/]+)\/[^\/]+$/', $path.
'/'.$file, $reg);
157 $level1name = (isset($reg[1]) ? $reg[1] :
'');
158 $file_list[] = array(
161 "level1name" => $level1name,
162 "relativename" => ($relativename ? $relativename.
'/' :
'').$file,
163 "fullname" => $path.
'/'.$file,
173 if ($recursive > 0) {
174 if (empty($donotfollowsymlinks) || !is_link($path.
"/".$file)) {
176 $file_list = array_merge($file_list,
dol_dir_list($path.
"/".$file, $types, $recursive + 1, $filter, $excludefilter, $sortcriteria, $sortorder, $mode, $nohook, ($relativename !=
'' ? $relativename.
'/' :
'').$file, $donotfollowsymlinks, $nbsecondsold));
179 } elseif (!$isdir && (($types ==
"files") || ($types ==
"all"))) {
181 if ($loaddate || $sortcriteria ==
'date') {
184 if ($loadsize || $sortcriteria ==
'size') {
188 if (!$filter || preg_match(
'/'.$filter.
'/i', $file)) {
189 if (empty($nbsecondsold) || $filedate <= ($now - $nbsecondsold)) {
190 preg_match(
'/([^\/]+)\/[^\/]+$/', $path.
'/'.$file, $reg);
191 $level1name = (isset($reg[1]) ? $reg[1] :
'');
192 $file_list[] = array(
195 "level1name" => $level1name,
196 "relativename" => ($relativename ? $relativename.
'/' :
'').$file,
197 "fullname" => $path.
'/'.$file,
210 if (!empty($sortcriteria) && $sortorder) {
211 $file_list =
dol_sort_array($file_list, $sortcriteria, ($sortorder == SORT_ASC ?
'asc' :
'desc'));
216 if (is_object($hookmanager) && is_array($hookmanager->resArray)) {
217 $file_list = array_merge($file_list, $hookmanager->resArray);
237 function dol_dir_list_in_database($path, $filter =
"", $excludefilter =
null, $sortcriteria =
"name", $sortorder = SORT_ASC, $mode = 0)
241 $sql =
" SELECT rowid, label, entity, filename, filepath, fullpath_orig, keywords, cover, gen_or_uploaded, extraparams,";
242 $sql .=
" date_c, tms as date_m, fk_user_c, fk_user_m, acl, position, share";
244 $sql .=
", description";
246 $sql .=
" FROM ".MAIN_DB_PREFIX.
"ecm_files";
247 $sql .=
" WHERE entity = ".$conf->entity;
248 if (preg_match(
'/%$/', $path)) {
249 $sql .=
" AND filepath LIKE '".$db->escape($path).
"'";
251 $sql .=
" AND filepath = '".$db->escape($path).
"'";
254 $resql = $db->query(
$sql);
256 $file_list = array();
257 $num = $db->num_rows($resql);
260 $obj = $db->fetch_object($resql);
263 preg_match(
'/([^\/]+)\/[^\/]+$/', DOL_DATA_ROOT.
'/'.$obj->filepath.
'/'.$obj->filename, $reg);
264 $level1name = (isset($reg[1]) ? $reg[1] :
'');
265 $file_list[] = array(
266 "rowid" => $obj->rowid,
267 "label" => $obj->label,
268 "name" => $obj->filename,
269 "path" => DOL_DATA_ROOT.
'/'.$obj->filepath,
270 "level1name" => $level1name,
271 "fullname" => DOL_DATA_ROOT.
'/'.$obj->filepath.
'/'.$obj->filename,
272 "fullpath_orig" => $obj->fullpath_orig,
273 "date_c" => $db->jdate($obj->date_c),
274 "date_m" => $db->jdate($obj->date_m),
276 "keywords" => $obj->keywords,
277 "cover" => $obj->cover,
278 "position" => (
int) $obj->position,
280 "share" => $obj->share,
281 "description" => ($mode ? $obj->description :
'')
288 if (!empty($sortcriteria)) {
290 foreach ($file_list as $key => $row) {
291 $myarray[$key] = (isset($row[$sortcriteria]) ? $row[$sortcriteria] :
'');
295 array_multisort($myarray, $sortorder, $file_list);
317 global $conf, $db, $user;
323 if ($modulepart ==
'produit' &&
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO')) {
325 if (!empty($object->id)) {
327 $upload_dirold = $conf->product->multidir_output[$object->entity].
'/'.substr(substr(
"000".$object->id, -2), 1, 1).
'/'.substr(substr(
"000".$object->id, -2), 0, 1).
'/'.$object->id.
"/photos";
329 $upload_dirold = $conf->service->multidir_output[$object->entity].
'/'.substr(substr(
"000".$object->id, -2), 1, 1).
'/'.substr(substr(
"000".$object->id, -2), 0, 1).
'/'.$object->id.
"/photos";
332 $relativedirold = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dirold);
333 $relativedirold = preg_replace(
'/^[\\/]/',
'', $relativedirold);
335 $filearrayindatabase = array_merge($filearrayindatabase,
dol_dir_list_in_database($relativedirold,
'',
null,
'name', SORT_ASC));
344 foreach ($filearray as $key => $val) {
345 $tmpfilename = preg_replace(
'/\.noexe$/',
'', $filearray[$key][
'name']);
348 foreach ($filearrayindatabase as $key2 => $val2) {
349 if (($filearrayindatabase[$key2][
'path'] == $filearray[$key][
'path']) && ($filearrayindatabase[$key2][
'name'] == $tmpfilename)) {
350 $filearray[$key][
'position_name'] = ($filearrayindatabase[$key2][
'position'] ? $filearrayindatabase[$key2][
'position'] :
'0').
'_'.$filearrayindatabase[$key2][
'name'];
351 $filearray[$key][
'position'] = $filearrayindatabase[$key2][
'position'];
352 $filearray[$key][
'cover'] = $filearrayindatabase[$key2][
'cover'];
353 $filearray[$key][
'keywords'] = $filearrayindatabase[$key2][
'keywords'];
354 $filearray[$key][
'acl'] = $filearrayindatabase[$key2][
'acl'];
355 $filearray[$key][
'rowid'] = $filearrayindatabase[$key2][
'rowid'];
356 $filearray[$key][
'label'] = $filearrayindatabase[$key2][
'label'];
357 $filearray[$key][
'share'] = $filearrayindatabase[$key2][
'share'];
364 $filearray[$key][
'position'] =
'999999';
365 $filearray[$key][
'cover'] = 0;
366 $filearray[$key][
'acl'] =
'';
368 $rel_filename = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filearray[$key][
'fullname']);
370 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filename)) {
371 dol_syslog(
"list_of_documents We found a file called '".$filearray[$key][
'name'].
"' not indexed into database. We add it");
372 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
376 $filename = basename($rel_filename);
377 $rel_dir = dirname($rel_filename);
378 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
379 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
381 $ecmfile->filepath = $rel_dir;
382 $ecmfile->filename = $filename;
383 $ecmfile->label = md5_file(
dol_osencode($filearray[$key][
'fullname']));
384 $ecmfile->fullpath_orig = $filearray[$key][
'fullname'];
385 $ecmfile->gen_or_uploaded =
'unknown';
386 $ecmfile->description =
'';
387 $ecmfile->keywords =
'';
388 $result = $ecmfile->create($user);
392 $filearray[$key][
'rowid'] = $result;
395 $filearray[$key][
'rowid'] = 0;
412 global $sortorder, $sortfield;
414 $sortorder = strtoupper($sortorder);
416 if ($sortorder ==
'ASC') {
424 if ($sortfield ==
'name') {
425 if ($a->name == $b->name) {
428 return ($a->name < $b->name) ? $retup : $retdown;
430 if ($sortfield ==
'date') {
431 if ($a->date == $b->date) {
434 return ($a->date < $b->date) ? $retup : $retdown;
436 if ($sortfield ==
'size') {
437 if ($a->size == $b->size) {
440 return ($a->size < $b->size) ? $retup : $retdown;
456 if (is_dir($newfolder)) {
471 if (!is_readable($dir)) {
474 return (count(scandir($dir)) == 2);
486 return is_file($newpathoffile);
498 return is_link($newpathoffile);
509 $tmpprot = array(
'file',
'http',
'https',
'ftp',
'zlib',
'data',
'ssh',
'ssh2',
'ogg',
'expect');
510 foreach ($tmpprot as $prot) {
511 if (preg_match(
'/^'.$prot.
':/i', $url)) {
527 if (is_dir($newfolder)) {
528 $handle = opendir($newfolder);
529 $folder_content =
'';
530 while ((gettype($name = readdir($handle)) !=
"boolean")) {
531 $name_array[] = $name;
533 foreach ($name_array as $temp) {
534 $folder_content .= $temp;
539 if ($folder_content ==
"...") {
562 $fp = fopen($newfile,
'r');
567 if (!$line ===
false) {
590 return filesize($newpathoffile);
602 return @filemtime($newpathoffile);
614 return fileperms($newpathoffile);
629 function dolReplaceInFile($srcfile, $arrayreplacement, $destfile =
'', $newmask = 0, $indexdatabase = 0, $arrayreplacementisregex = 0)
633 dol_syslog(
"files.lib.php::dolReplaceInFile srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" indexdatabase=".$indexdatabase.
" arrayreplacementisregex=".$arrayreplacementisregex);
635 if (empty($srcfile)) {
638 if (empty($destfile)) {
639 $destfile = $srcfile;
643 if (($destfile != $srcfile) && $destexists) {
649 dol_syslog(
"files.lib.php::dolReplaceInFile failed to read src file", LOG_WARNING);
653 $tmpdestfile = $destfile.
'.tmp';
658 $newdirdestfile = dirname($newpathofdestfile);
660 if ($destexists && !is_writable($newpathofdestfile)) {
661 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to overwrite target file", LOG_WARNING);
664 if (!is_writable($newdirdestfile)) {
665 dol_syslog(
"files.lib.php::dolReplaceInFile failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
672 $content = file_get_contents($newpathofsrcfile,
'r');
674 if (empty($arrayreplacementisregex)) {
677 foreach ($arrayreplacement as $key => $value) {
678 $content = preg_replace($key, $value, $content);
682 file_put_contents($newpathoftmpdestfile, $content);
683 dolChmod($newpathoftmpdestfile, $newmask);
686 $result =
dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile) ? 1 : 0), 0, $indexdatabase);
688 dol_syslog(
"files.lib.php::dolReplaceInFile failed to move tmp file to final dest", LOG_WARNING);
691 if (empty($newmask) && !empty($conf->global->MAIN_UMASK)) {
692 $newmask = $conf->global->MAIN_UMASK;
694 if (empty($newmask)) {
695 dol_syslog(
"Warning: dolReplaceInFile called with empty value for newmask and no default value defined", LOG_WARNING);
699 dolChmod($newpathofdestfile, $newmask);
717 function dol_copy($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 0)
719 global $conf, $db, $user;
721 dol_syslog(
"files.lib.php::dol_copy srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
723 if (empty($srcfile) || empty($destfile)) {
728 if (!$overwriteifexists && $destexists) {
734 $newdirdestfile = dirname($newpathofdestfile);
736 if ($destexists && !is_writable($newpathofdestfile)) {
737 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to overwrite target file", LOG_WARNING);
740 if (!is_writable($newdirdestfile)) {
741 dol_syslog(
"files.lib.php::dol_copy failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING);
746 $testvirusarray = array();
749 if (count($testvirusarray)) {
750 dol_syslog(
"files.lib.php::dol_copy canceled because a virus was found into source file. we ignore the copy request.", LOG_WARNING);
756 $result = @copy($newpathofsrcfile, $newpathofdestfile);
759 dol_syslog(
"files.lib.php::dol_copy failed to copy", LOG_WARNING);
762 if (empty($newmask) && !empty($conf->global->MAIN_UMASK)) {
763 $newmask = $conf->global->MAIN_UMASK;
765 if (empty($newmask)) {
766 dol_syslog(
"Warning: dol_copy called with empty value for newmask and no default value defined", LOG_WARNING);
770 dolChmod($newpathofdestfile, $newmask);
772 if ($result && $indexdatabase) {
774 $rel_filetocopyafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $newpathofdestfile);
775 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetocopyafter)) {
776 $rel_filetocopyafter = preg_replace(
'/^[\\/]/',
'', $rel_filetocopyafter);
779 dol_syslog(
"Try to copy also entries in database for: ".$rel_filetocopyafter, LOG_DEBUG);
780 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
783 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetocopyafter);
784 if ($resultecmtarget > 0) {
785 dol_syslog(
"ECM dest file found, remove it", LOG_DEBUG);
786 $ecmfiletarget->delete($user);
788 dol_syslog(
"ECM dest file not found, create it", LOG_DEBUG);
792 $resultecm = $ecmSrcfile->fetch(0,
'', $srcfile);
796 dol_syslog(
"Fetch src file error", LOG_DEBUG);
800 $filename = basename($rel_filetocopyafter);
801 $rel_dir = dirname($rel_filetocopyafter);
802 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
803 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
805 $ecmfile->filepath = $rel_dir;
806 $ecmfile->filename = $filename;
808 $ecmfile->fullpath_orig = $srcfile;
809 $ecmfile->gen_or_uploaded =
'copy';
810 $ecmfile->description = $ecmSrcfile->description;
811 $ecmfile->keywords = $ecmSrcfile->keywords;
812 $resultecm = $ecmfile->create($user);
813 if ($resultecm < 0) {
817 dol_syslog(
"Create ECM file error", LOG_DEBUG);
821 if ($resultecm > 0) {
845 function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement =
null, $excludesubdir = 0, $excludefileext =
null)
851 dol_syslog(
"files.lib.php::dolCopyDir srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwriteifexists=".$overwriteifexists);
853 if (empty($srcfile) || empty($destfile)) {
863 $dirmaskdec = octdec($newmask);
864 if (empty($newmask) && !empty($conf->global->MAIN_UMASK)) {
865 $dirmaskdec = octdec($conf->global->MAIN_UMASK);
867 $dirmaskdec |= octdec(
'0200');
868 dol_mkdir($destfile,
'', decoct($dirmaskdec));
875 if (is_dir($ossrcfile)) {
876 $dir_handle = opendir($ossrcfile);
877 while ($file = readdir($dir_handle)) {
878 if ($file !=
"." && $file !=
".." && !is_link($ossrcfile.
"/".$file)) {
879 if (is_dir($ossrcfile.
"/".$file)) {
880 if (empty($excludesubdir) || ($excludesubdir == 2 && strlen($file) == 2)) {
883 if (is_array($arrayreplacement)) {
884 foreach ($arrayreplacement as $key => $val) {
885 $newfile = str_replace($key, $val, $newfile);
889 $tmpresult =
dolCopyDir($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists, $arrayreplacement, $excludesubdir, $excludefileext);
894 if (is_array($excludefileext)) {
895 $extension = pathinfo($file, PATHINFO_EXTENSION);
896 if (in_array($extension, $excludefileext)) {
903 if (is_array($arrayreplacement)) {
904 foreach ($arrayreplacement as $key => $val) {
905 $newfile = str_replace($key, $val, $newfile);
908 $tmpresult =
dol_copy($srcfile.
"/".$file, $destfile.
"/".$newfile, $newmask, $overwriteifexists);
911 if ($result > 0 && $tmpresult >= 0) {
914 $result = $tmpresult;
921 closedir($dir_handle);
947 function dol_move($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $testvirus = 0, $indexdatabase = 1)
949 global $user, $db, $conf;
952 dol_syslog(
"files.lib.php::dol_move srcfile=".$srcfile.
" destfile=".$destfile.
" newmask=".$newmask.
" overwritifexists=".$overwriteifexists);
957 dol_syslog(
"files.lib.php::dol_move srcfile does not exists. we ignore the move request.");
961 if ($overwriteifexists || !$destexists) {
966 $testvirusarray = array();
969 if (count($testvirusarray)) {
970 dol_syslog(
"files.lib.php::dol_move canceled because a virus was found into source file. we ignore the move request.", LOG_WARNING);
975 global $dolibarr_main_restrict_os_commands;
976 if (!empty($dolibarr_main_restrict_os_commands)) {
977 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
978 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
979 if (in_array(basename($destfile), $arrayofallowedcommand)) {
982 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);
987 $result = @rename($newpathofsrcfile, $newpathofdestfile);
990 dol_syslog(
"files.lib.php::dol_move Failed. We try to delete target first and move after.", LOG_WARNING);
993 $result = @rename($newpathofsrcfile, $newpathofdestfile);
995 dol_syslog(
"files.lib.php::dol_move Failed.", LOG_WARNING);
1000 if ($result && $indexdatabase) {
1002 $rel_filetorenamebefore = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $srcfile);
1003 $rel_filetorenameafter = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $destfile);
1004 if (!preg_match(
'/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/', $rel_filetorenameafter)) {
1005 $rel_filetorenamebefore = preg_replace(
'/^[\\/]/',
'', $rel_filetorenamebefore);
1006 $rel_filetorenameafter = preg_replace(
'/^[\\/]/',
'', $rel_filetorenameafter);
1009 dol_syslog(
"Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore.
" after = ".$rel_filetorenameafter, LOG_DEBUG);
1010 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1012 $ecmfiletarget =
new EcmFiles($db);
1013 $resultecmtarget = $ecmfiletarget->fetch(0,
'', $rel_filetorenameafter);
1014 if ($resultecmtarget > 0) {
1015 $ecmfiletarget->delete($user);
1019 $resultecm = $ecmfile->fetch(0,
'', $rel_filetorenamebefore);
1020 if ($resultecm > 0) {
1021 $filename = basename($rel_filetorenameafter);
1022 $rel_dir = dirname($rel_filetorenameafter);
1023 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1024 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1026 $ecmfile->filepath = $rel_dir;
1027 $ecmfile->filename = $filename;
1029 $resultecm = $ecmfile->update($user);
1030 } elseif ($resultecm == 0) {
1031 $filename = basename($rel_filetorenameafter);
1032 $rel_dir = dirname($rel_filetorenameafter);
1033 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1034 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1036 $ecmfile->filepath = $rel_dir;
1037 $ecmfile->filename = $filename;
1039 $ecmfile->fullpath_orig = $srcfile;
1040 $ecmfile->gen_or_uploaded =
'unknown';
1041 $ecmfile->description =
'';
1042 $ecmfile->keywords =
'';
1043 $resultecm = $ecmfile->create($user);
1044 if ($resultecm < 0) {
1047 } elseif ($resultecm < 0) {
1051 if ($resultecm > 0) {
1059 if (empty($newmask)) {
1060 $newmask = empty($conf->global->MAIN_UMASK) ?
'0755' : $conf->global->MAIN_UMASK;
1066 dolChmod($newpathofdestfile, $newmask);
1083 function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase = 1, $renamedircontent = 1)
1086 global $user, $db, $conf;
1089 dol_syslog(
"files.lib.php::dol_move_dir srcdir=".$srcdir.
" destdir=".$destdir.
" overwritifexists=".$overwriteifexists.
" indexdatabase=".$indexdatabase.
" renamedircontent=".$renamedircontent);
1091 $srcbasename = basename($srcdir);
1095 dol_syslog(
"files.lib.php::dol_move_dir srcdir does not exists. we ignore the move request.");
1099 if ($overwriteifexists || !$destexists) {
1103 $result = @rename($newpathofsrcdir, $newpathofdestdir);
1105 if ($result && $renamedircontent) {
1106 if (file_exists($newpathofdestdir)) {
1107 $destbasename = basename($newpathofdestdir);
1109 if (!empty($files) && is_array($files)) {
1110 foreach ($files as $key => $file) {
1111 if (!file_exists($file[
"fullname"]))
continue;
1112 $filepath = $file[
"path"];
1113 $oldname = $file[
"name"];
1115 $newname = str_replace($srcbasename, $destbasename, $oldname);
1116 if (!empty($newname) && $newname !== $oldname) {
1117 if ($file[
"type"] ==
"dir") {
1118 $res =
dol_move_dir($filepath.
'/'.$oldname, $filepath.
'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
1120 $res =
dol_move($filepath.
'/'.$oldname, $filepath.
'/'.$newname, 0, $overwriteifexists, 0, $indexdatabase);
1147 return trim(basename($filename),
".\x00..\x20");
1161 if (!empty($conf->global->MAIN_ANTIVIRUS_COMMAND)) {
1162 if (!class_exists(
'AntiVir')) {
1163 require_once DOL_DOCUMENT_ROOT.
'/core/class/antivir.class.php';
1166 $result = $antivir->dol_avscan_file($src_file);
1168 $reterrors = $antivir->errors;
1196 function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan = 0, $uploaderrorcode = 0, $nohook = 0, $varfiles =
'addedfile', $upload_dir =
'')
1198 global $conf, $db, $user, $langs;
1199 global $object, $hookmanager;
1202 $file_name = $dest_file;
1205 if (empty($nohook)) {
1206 $reshook = $hookmanager->initHooks(array(
'fileslib'));
1208 $parameters = array(
'dest_file' => $dest_file,
'src_file' => $src_file,
'file_name' => $file_name,
'varfiles' => $varfiles,
'allowoverwrite' => $allowoverwrite);
1209 $reshook = $hookmanager->executeHooks(
'moveUploadedFile', $parameters, $object);
1212 if (empty($reshook)) {
1214 if ($uploaderrorcode) {
1215 switch ($uploaderrorcode) {
1216 case UPLOAD_ERR_INI_SIZE:
1217 return 'ErrorFileSizeTooLarge';
1218 case UPLOAD_ERR_FORM_SIZE:
1219 return 'ErrorFileSizeTooLarge';
1220 case UPLOAD_ERR_PARTIAL:
1221 return 'ErrorPartialFile';
1222 case UPLOAD_ERR_NO_TMP_DIR:
1223 return 'ErrorNoTmpDir';
1224 case UPLOAD_ERR_CANT_WRITE:
1225 return 'ErrorFailedToWriteInDir';
1226 case UPLOAD_ERR_EXTENSION:
1227 return 'ErrorUploadBlockedByAddon';
1235 if (empty($disablevirusscan) && file_exists($src_file)) {
1237 if (count($checkvirusarray)) {
1238 dol_syslog(
'Files.lib::dol_move_uploaded_file File "'.$src_file.
'" (target name "'.$dest_file.
'") KO with antivirus: errors='.join(
',', $checkvirusarray), LOG_WARNING);
1239 return 'ErrorFileIsInfectedWithAVirus: '.join(
',', $checkvirusarray);
1248 $publicmediasdirwithslash = $conf->medias->multidir_output[$conf->entity];
1249 if (!preg_match(
'/\/$/', $publicmediasdirwithslash)) {
1250 $publicmediasdirwithslash .=
'/';
1253 if (strpos($upload_dir, $publicmediasdirwithslash) !== 0 || !
getDolGlobalInt(
"MAIN_DOCUMENT_DISABLE_NOEXE_IN_MEDIAS_DIR")) {
1254 $file_name .=
'.noexe';
1261 if (preg_match(
'/^\./', basename($src_file)) || preg_match(
'/\.\./', $src_file) || preg_match(
'/[<>|]/', $src_file)) {
1262 dol_syslog(
"Refused to deliver file ".$src_file, LOG_WARNING);
1268 if (preg_match(
'/^\./', basename($dest_file)) || preg_match(
'/\.\./', $dest_file) || preg_match(
'/[<>|]/', $dest_file)) {
1269 dol_syslog(
"Refused to deliver file ".$dest_file, LOG_WARNING);
1275 $errmsg = join(
',', $hookmanager->errors);
1276 if (empty($errmsg)) {
1277 $errmsg =
'ErrorReturnedBySomeHooks';
1280 } elseif (empty($reshook)) {
1286 if (!is_writable(dirname($file_name_osencoded))) {
1287 dol_syslog(
"Files.lib::dol_move_uploaded_file Dir ".dirname($file_name_osencoded).
" is not writable. Return 'ErrorDirNotWritable'", LOG_WARNING);
1288 return 'ErrorDirNotWritable';
1292 if (!$allowoverwrite) {
1293 if (file_exists($file_name_osencoded)) {
1294 dol_syslog(
"Files.lib::dol_move_uploaded_file File ".$file_name.
" already exists. Return 'ErrorFileAlreadyExists'", LOG_WARNING);
1295 return 'ErrorFileAlreadyExists';
1298 if (is_dir($file_name_osencoded)) {
1299 dol_syslog(
"Files.lib::dol_move_uploaded_file A directory with name ".$file_name.
" already exists. Return 'ErrorDirWithFileNameAlreadyExists'", LOG_WARNING);
1300 return 'ErrorDirWithFileNameAlreadyExists';
1305 $return = move_uploaded_file($src_file_osencoded, $file_name_osencoded);
1308 dol_syslog(
"Files.lib::dol_move_uploaded_file Success to move ".$src_file.
" to ".$file_name.
" - Umask=".$conf->global->MAIN_UMASK, LOG_DEBUG);
1309 return $successcode;
1311 dol_syslog(
"Files.lib::dol_move_uploaded_file Failed to move ".$src_file.
" to ".$file_name, LOG_ERR);
1316 return $successcode;
1334 function dol_delete_file($file, $disableglob = 0, $nophperrors = 0, $nohook = 0, $object =
null, $allowdotdot =
false, $indexdatabase = 1, $nolog = 0)
1336 global $db, $conf, $user, $langs;
1337 global $hookmanager;
1340 $langs->loadLangs(array(
'other',
'errors'));
1342 if (empty($nolog)) {
1343 dol_syslog(
"dol_delete_file file=".$file.
" disableglob=".$disableglob.
" nophperrors=".$nophperrors.
" nohook=".$nohook);
1348 if ((!$allowdotdot && preg_match(
'/\.\./', $file)) || preg_match(
'/[<>|]/', $file)) {
1349 dol_syslog(
"Refused to delete file ".$file, LOG_WARNING);
1354 if (empty($nohook)) {
1355 $hookmanager->initHooks(array(
'fileslib'));
1357 $parameters = array(
1359 'disableglob'=> $disableglob,
1360 'nophperrors' => $nophperrors
1362 $reshook = $hookmanager->executeHooks(
'deleteFile', $parameters, $object);
1365 if (empty($nohook) && $reshook != 0) {
1373 if (empty($disableglob) && !empty($file_osencoded)) {
1375 $globencoded = str_replace(
'[',
'\[', $file_osencoded);
1376 $globencoded = str_replace(
']',
'\]', $globencoded);
1377 $listofdir = glob($globencoded);
1378 if (!empty($listofdir) && is_array($listofdir)) {
1379 foreach ($listofdir as $filename) {
1381 $ok = @unlink($filename);
1383 $ok = unlink($filename);
1387 if (!$ok && file_exists(dirname($filename)) && !(fileperms(dirname($filename)) & 0200)) {
1388 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);
1389 dolChmod(dirname($filename), decoct(fileperms(dirname($filename)) | 0200));
1392 $ok = @unlink($filename);
1394 $ok = unlink($filename);
1399 if (empty($nolog)) {
1400 dol_syslog(
"Removed file ".$filename, LOG_DEBUG);
1404 $rel_filetodelete = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filename);
1405 if (!preg_match(
'/(\/temp\/|\/thumbs\/|\.meta$)/', $rel_filetodelete)) {
1406 if (is_object($db) && $indexdatabase) {
1407 $rel_filetodelete = preg_replace(
'/^[\\/]/',
'', $rel_filetodelete);
1408 $rel_filetodelete = preg_replace(
'/\.noexe$/',
'', $rel_filetodelete);
1410 dol_syslog(
"Try to remove also entries in database for full relative path = ".$rel_filetodelete, LOG_DEBUG);
1411 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1413 $result = $ecmfile->fetch(0,
'', $rel_filetodelete);
1414 if ($result >= 0 && $ecmfile->id > 0) {
1415 $result = $ecmfile->delete($user);
1423 dol_syslog(
"Failed to remove file ".$filename, LOG_WARNING);
1429 dol_syslog(
"No files to delete found", LOG_DEBUG);
1434 $ok = @unlink($file_osencoded);
1436 $ok = unlink($file_osencoded);
1439 if (empty($nolog)) {
1440 dol_syslog(
"Removed file ".$file_osencoded, LOG_DEBUG);
1443 dol_syslog(
"Failed to remove file ".$file_osencoded, LOG_WARNING);
1464 if (preg_match(
'/\.\./', $dir) || preg_match(
'/[<>|]/', $dir)) {
1465 dol_syslog(
"Refused to delete dir ".$dir.
' (contains invalid char sequence)', LOG_WARNING);
1470 return ($nophperrors ? @rmdir($dir_osencoded) : rmdir($dir_osencoded));
1485 function dol_delete_dir_recursive($dir, $count = 0, $nophperrors = 0, $onlysub = 0, &$countdeleted = 0, $indexdatabase = 1, $nolog = 0)
1487 if (empty($nolog)) {
1488 dol_syslog(
"functions.lib:dol_delete_dir_recursive ".$dir, LOG_DEBUG);
1492 if ($handle = opendir(
"$dir_osencoded")) {
1493 while (
false !== ($item = readdir($handle))) {
1495 $item = utf8_encode($item);
1498 if ($item !=
"." && $item !=
"..") {
1502 $result =
dol_delete_file(
"$dir/$item", 1, $nophperrors, 0,
null,
false, $indexdatabase, $nolog);
1514 if (empty($onlysub)) {
1539 global $langs, $conf;
1542 $element = $object->element;
1544 if ($object->element ==
'order_supplier') {
1545 $dir = $conf->fournisseur->commande->dir_output;
1546 } elseif ($object->element ==
'invoice_supplier') {
1547 $dir = $conf->fournisseur->facture->dir_output;
1548 } elseif ($object->element ==
'project') {
1549 $dir = $conf->project->dir_output;
1550 } elseif ($object->element ==
'shipping') {
1551 $dir = $conf->expedition->dir_output.
'/sending';
1552 } elseif ($object->element ==
'delivery') {
1553 $dir = $conf->expedition->dir_output.
'/receipt';
1554 } elseif ($object->element ==
'fichinter') {
1555 $dir = $conf->ficheinter->dir_output;
1557 $dir = empty($conf->$element->dir_output) ?
'' : $conf->$element->dir_output;
1561 return 'ErrorObjectNoSupportedByFunction';
1565 $dir = $dir.
"/".$refsan;
1566 $filepreviewnew = $dir.
"/".$refsan.
".pdf_preview.png";
1567 $filepreviewnewbis = $dir.
"/".$refsan.
".pdf_preview-0.png";
1568 $filepreviewold = $dir.
"/".$refsan.
".pdf.png";
1571 if (file_exists($filepreviewnew) && is_writable($filepreviewnew)) {
1573 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnew);
1577 if (file_exists($filepreviewnewbis) && is_writable($filepreviewnewbis)) {
1579 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewnewbis);
1584 if (file_exists($filepreviewold) && is_writable($filepreviewold)) {
1586 $object->error = $langs->trans(
"ErrorFailedToDeleteFile", $filepreviewold);
1590 $multiple = $filepreviewold.
".";
1591 for ($i = 0; $i < 20; $i++) {
1592 $preview = $multiple.$i;
1594 if (file_exists($preview) && is_writable($preview)) {
1596 $object->error = $langs->trans(
"ErrorFailedToOpenFile", $preview);
1619 if (empty($conf->global->MAIN_DOC_CREATE_METAFILE)) {
1624 $element = $object->element;
1626 if ($object->element ==
'order_supplier') {
1627 $dir = $conf->fournisseur->dir_output.
'/commande';
1628 } elseif ($object->element ==
'invoice_supplier') {
1629 $dir = $conf->fournisseur->dir_output.
'/facture';
1630 } elseif ($object->element ==
'project') {
1631 $dir = $conf->project->dir_output;
1632 } elseif ($object->element ==
'shipping') {
1633 $dir = $conf->expedition->dir_output.
'/sending';
1634 } elseif ($object->element ==
'delivery') {
1635 $dir = $conf->expedition->dir_output.
'/receipt';
1636 } elseif ($object->element ==
'fichinter') {
1637 $dir = $conf->ficheinter->dir_output;
1639 $dir = empty($conf->$element->dir_output) ?
'' : $conf->$element->dir_output;
1643 $object->fetch_thirdparty();
1646 $dir = $dir.
"/".$objectref;
1647 $file = $dir.
"/".$objectref.
".meta";
1649 if (!is_dir($dir)) {
1654 if (is_countable($object->lines) && count($object->lines) > 0) {
1655 $nblines = count($object->lines);
1657 $client = $object->thirdparty->name.
" ".$object->thirdparty->address.
" ".$object->thirdparty->zip.
" ".$object->thirdparty->town;
1658 $meta =
"REFERENCE=\"".$object->ref.
"\"
1660 NB_ITEMS=\"" . $nblines.
"\"
1661 CLIENT=\"" . $client.
"\"
1662 AMOUNT_EXCL_TAX=\"" . $object->total_ht.
"\"
1663 AMOUNT=\"" . $object->total_ttc.
"\"\n";
1665 for ($i = 0; $i < $nblines; $i++) {
1667 $meta .=
"ITEM_".$i.
"_QUANTITY=\"".$object->lines[$i]->qty.
"\"
1668 ITEM_" . $i.
"_AMOUNT_WO_TAX=\"".$object->lines[$i]->total_ht.
"\"
1669 ITEM_" . $i.
"_VAT=\"".$object->lines[$i]->tva_tx.
"\"
1670 ITEM_" . $i.
"_DESCRIPTION=\"".str_replace(
"\r\n",
"", nl2br($object->lines[$i]->desc)).
"\"
1675 $fp = fopen($file,
"w");
1683 dol_syslog(
'FailedToDetectDirInDolMetaCreateFor'.$object->element, LOG_WARNING);
1701 $listofpaths = array();
1702 $listofnames = array();
1703 $listofmimes = array();
1707 foreach ($listoffiles as $key => $val) {
1708 $listofpaths[] = $val[
'fullname'];
1709 $listofnames[] = $val[
'name'];
1713 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
1714 $_SESSION[
"listofpaths".$keytoavoidconflict] = join(
';', $listofpaths);
1715 $_SESSION[
"listofnames".$keytoavoidconflict] = join(
';', $listofnames);
1716 $_SESSION[
"listofmimes".$keytoavoidconflict] = join(
';', $listofmimes);
1737 function dol_add_file_process($upload_dir, $allowoverwrite = 0, $donotupdatesession = 0, $varfiles =
'addedfile', $savingdocmask =
'', $link =
null, $trackid =
'', $generatethumbs = 1, $object =
null)
1740 global $db, $user, $conf, $langs;
1744 if (!empty($_FILES[$varfiles])) {
1745 dol_syslog(
'dol_add_file_process upload_dir='.$upload_dir.
' allowoverwrite='.$allowoverwrite.
' donotupdatesession='.$donotupdatesession.
' savingdocmask='.$savingdocmask, LOG_DEBUG);
1746 $maxfilesinform =
getDolGlobalInt(
"MAIN_SECURITY_MAX_ATTACHMENT_ON_FORMS", 10);
1747 if (is_array($_FILES[$varfiles][
"name"]) && count($_FILES[$varfiles][
"name"]) > $maxfilesinform) {
1748 $langs->load(
"errors");
1749 setEventMessages($langs->trans(
"ErrorTooMuchFileInForm", $maxfilesinform),
null,
"errors");
1755 $TFile = $_FILES[$varfiles];
1756 if (!is_array($TFile[
'name'])) {
1757 foreach ($TFile as $key => &$val) {
1762 $nbfile = count($TFile[
'name']);
1764 for ($i = 0; $i < $nbfile; $i++) {
1765 if (empty($TFile[
'name'][$i])) {
1770 $destfull = $upload_dir.
"/".$TFile[
'name'][$i];
1771 $destfile = $TFile[
'name'][$i];
1772 $destfilewithoutext = preg_replace(
'/\.[^\.]+$/',
'', $destfile);
1774 if ($savingdocmask && strpos($savingdocmask, $destfilewithoutext) !== 0) {
1775 $destfull = $upload_dir.
"/".preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask);
1776 $destfile = preg_replace(
'/__file__/', $TFile[
'name'][$i], $savingdocmask);
1779 $filenameto = basename($destfile);
1780 if (preg_match(
'/^\./', $filenameto)) {
1781 $langs->load(
"errors");
1782 setEventMessages($langs->trans(
"ErrorFilenameCantStartWithDot", $filenameto),
null,
'errors');
1787 $info = pathinfo($destfull);
1788 $destfull = $info[
'dirname'].
'/'.
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
1789 $info = pathinfo($destfile);
1790 $destfile =
dol_sanitizeFileName($info[
'filename'].($info[
'extension'] !=
'' ? (
'.'.strtolower($info[
'extension'])) :
''));
1798 global $dolibarr_main_restrict_os_commands;
1799 if (!empty($dolibarr_main_restrict_os_commands)) {
1800 $arrayofallowedcommand = explode(
',', $dolibarr_main_restrict_os_commands);
1801 $arrayofallowedcommand = array_map(
'trim', $arrayofallowedcommand);
1802 if (in_array($destfile, $arrayofallowedcommand)) {
1803 $langs->load(
"errors");
1804 setEventMessages($langs->trans(
"ErrorFilenameReserved", $destfile),
null,
'errors');
1810 $resupload =
dol_move_uploaded_file($TFile[
'tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile[
'error'][$i], 0, $varfiles, $upload_dir);
1812 if (is_numeric($resupload) && $resupload > 0) {
1813 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1816 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
1817 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
1818 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
1819 $maxheightmini = $tmparraysize[
'maxheightmini'];
1824 if ($generatethumbs) {
1830 $imgThumbSmall =
vignette($destfull, $maxwidthsmall, $maxheightsmall,
'_small', $quality,
"thumbs");
1833 $imgThumbMini =
vignette($destfull, $maxwidthmini, $maxheightmini,
'_mini', $quality,
"thumbs");
1838 if (empty($donotupdatesession)) {
1839 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
1841 $formmail->trackid = $trackid;
1842 $formmail->add_attached_files($destfull, $destfile, $TFile[
'type'][$i]);
1846 if ($donotupdatesession == 1) {
1848 if ($TFile[
'type'][$i] ==
'application/pdf' && strpos($_SERVER[
"REQUEST_URI"],
'product') !==
false && !empty($conf->global->PRODUCT_ALLOW_EXTERNAL_DOWNLOAD)) $sharefile = 1;
1849 $result =
addFileIntoDatabaseIndex($upload_dir, basename($destfile).($resupload == 2 ?
'.noexe' :
''), $TFile[
'name'][$i],
'uploaded', $sharefile, $object);
1851 if ($allowoverwrite) {
1854 setEventMessages(
'WarningFailedToAddFileIntoDatabaseIndex',
null,
'warnings');
1861 $langs->load(
"errors");
1862 if ($resupload < 0) {
1864 } elseif (preg_match(
'/ErrorFileIsInfectedWithAVirus/', $resupload)) {
1865 setEventMessages($langs->trans(
"ErrorFileIsInfectedWithAVirus"),
null,
'errors');
1877 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $upload_dir),
null,
'errors');
1880 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
1881 $linkObject =
new Link($db);
1882 $linkObject->entity = $conf->entity;
1883 $linkObject->url = $link;
1884 $linkObject->objecttype =
GETPOST(
'objecttype',
'alpha');
1885 $linkObject->objectid =
GETPOST(
'objectid',
'int');
1886 $linkObject->label =
GETPOST(
'label',
'alpha');
1887 $res = $linkObject->create($user);
1888 $langs->load(
'link');
1895 $langs->load(
"errors");
1896 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"File")),
null,
'errors');
1916 global $db, $user, $conf, $langs, $_FILES;
1918 $keytodelete = $filenb;
1921 $listofpaths = array();
1922 $listofnames = array();
1923 $listofmimes = array();
1924 $keytoavoidconflict = empty($trackid) ?
'' :
'-'.$trackid;
1925 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
1926 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
1928 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
1929 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
1931 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
1932 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
1935 if ($keytodelete >= 0) {
1936 $pathtodelete = $listofpaths[$keytodelete];
1937 $filetodelete = $listofnames[$keytodelete];
1938 if (empty($donotdeletefile)) {
1944 if (empty($donotdeletefile)) {
1945 $langs->load(
"other");
1946 setEventMessages($langs->trans(
"FileWasRemoved", $filetodelete),
null,
'mesgs');
1948 if (empty($donotupdatesession)) {
1949 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formmail.class.php';
1951 $formmail->trackid = $trackid;
1952 $formmail->remove_attached_files($keytodelete);
1974 global $db, $user, $conf;
1978 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
1980 if (!preg_match(
'/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
1981 $filename = basename(preg_replace(
'/\.noexe$/',
'', $file));
1982 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
1983 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
1985 include_once DOL_DOCUMENT_ROOT.
'/ecm/class/ecmfiles.class.php';
1987 $ecmfile->filepath = $rel_dir;
1988 $ecmfile->filename = $filename;
1989 $ecmfile->label = md5_file(
dol_osencode($dir.
'/'.$file));
1990 $ecmfile->fullpath_orig = $fullpathorig;
1991 $ecmfile->gen_or_uploaded = $mode;
1992 $ecmfile->description =
'';
1993 $ecmfile->keywords =
'';
1995 if (is_object($object) && $object->id > 0) {
1996 $ecmfile->src_object_id = $object->id;
1997 if (isset($object->table_element)) {
1998 $ecmfile->src_object_type = $object->table_element;
2000 dol_syslog(
'Error: object ' . get_class($object) .
' has no table_element attribute.');
2003 if (isset($object->src_object_description)) $ecmfile->description = $object->src_object_description;
2004 if (isset($object->src_object_keywords)) $ecmfile->keywords = $object->src_object_keywords;
2007 if (!empty($conf->global->MAIN_FORCE_SHARING_ON_ANY_UPLOADED_FILE)) {
2012 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2016 $result = $ecmfile->create($user);
2035 global $conf, $db, $user;
2040 dol_syslog(
"deleteFilesIntoDatabaseIndex: dir parameter can't be empty", LOG_ERR);
2046 $rel_dir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $dir);
2048 $filename = basename($file);
2049 $rel_dir = preg_replace(
'/[\\/]$/',
'', $rel_dir);
2050 $rel_dir = preg_replace(
'/^[\\/]/',
'', $rel_dir);
2053 $sql =
'DELETE FROM '.MAIN_DB_PREFIX.
'ecm_files';
2054 $sql .=
' WHERE entity = '.$conf->entity;
2055 $sql .=
" AND filepath = '".$db->escape($rel_dir).
"'";
2057 $sql .=
" AND filename = '".$db->escape($file).
"'";
2060 $sql .=
" AND gen_or_uploaded = '".$db->escape($mode).
"'";
2063 $resql = $db->query(
$sql);
2066 dol_syslog(__METHOD__.
' '.$db->lasterror(), LOG_ERR);
2094 if (class_exists(
'Imagick')) {
2095 $image =
new Imagick();
2097 $filetoconvert = $fileinput.(($page !=
'') ?
'['.$page.
']' :
'');
2099 $ret = $image->readImage($filetoconvert);
2101 $ext = pathinfo($fileinput, PATHINFO_EXTENSION);
2102 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.
" convertion in /etc/ImageMagick*/policy.xml): ".$e->getMessage(), LOG_WARNING);
2106 $ret = $image->setImageFormat($ext);
2108 if (empty($fileoutput)) {
2109 $fileoutput = $fileinput.
".".$ext;
2112 $count = $image->getNumberImages();
2114 if (!
dol_is_file($fileoutput) || is_writeable($fileoutput)) {
2116 $ret = $image->writeImages($fileoutput,
true);
2121 dol_syslog(
"Warning: Failed to write cache preview file '.$fileoutput.'. Check permission on file/dir", LOG_ERR);
2151 function dol_compress_file($inputfile, $outputfile, $mode =
"gz", &$errorstring =
null)
2158 dol_syslog(
"dol_compress_file mode=".$mode.
" inputfile=".$inputfile.
" outputfile=".$outputfile);
2161 if ($mode ==
'gz' && function_exists(
'gzencode')) {
2163 $compressdata = gzencode($data, 9);
2164 } elseif ($mode ==
'bz' && function_exists(
'bzcompress')) {
2166 $compressdata = bzcompress($data, 9);
2167 } elseif ($mode ==
'zstd' && function_exists(
'zstd_compress')) {
2169 $compressdata = zstd_compress($data, 9);
2170 } elseif ($mode ==
'zip') {
2171 if (class_exists(
'ZipArchive') && !empty($conf->global->MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS)) {
2174 $rootPath = realpath($inputfile);
2176 dol_syslog(
"Class ZipArchive is set so we zip using ZipArchive to zip into ".$outputfile.
' rootPath='.$rootPath);
2177 $zip =
new ZipArchive;
2179 if ($zip->open($outputfile, ZipArchive::CREATE) !==
true) {
2180 $errorstring =
"dol_compress_file failure - Failed to open file ".$outputfile.
"\n";
2184 $errormsg = $errorstring;
2191 $files =
new RecursiveIteratorIterator(
2192 new RecursiveDirectoryIterator($rootPath),
2193 RecursiveIteratorIterator::LEAVES_ONLY
2196 foreach ($files as $name => $file) {
2198 if (!$file->isDir()) {
2200 $filePath = $file->getPath();
2201 $fileName = $file->getFilename();
2202 $fileFullRealPath = $file->getRealPath();
2205 $relativePath = substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($rootPath) + 1);
2208 $zip->addFile($fileFullRealPath, $relativePath);
2215 dol_syslog(
"dol_compress_file success - ".count($zip->numFiles).
" files");
2219 if (defined(
'ODTPHP_PATHTOPCLZIP')) {
2222 include_once ODTPHP_PATHTOPCLZIP.
'/pclzip.lib.php';
2223 $archive =
new PclZip($outputfile);
2224 $result = $archive->add($inputfile, PCLZIP_OPT_REMOVE_PATH, dirname($inputfile));
2226 if ($result === 0) {
2228 $errormsg = $archive->errorInfo(
true);
2230 if ($archive->errorCode() == PCLZIP_ERR_WRITE_OPEN_FAIL) {
2231 $errorstring =
"PCLZIP_ERR_WRITE_OPEN_FAIL";
2232 dol_syslog(
"dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL", LOG_ERR);
2236 $errorstring =
"dol_compress_file error archive->errorCode = ".$archive->errorCode().
" errormsg=".$errormsg;
2237 dol_syslog(
"dol_compress_file failure - ".$errormsg, LOG_ERR);
2240 dol_syslog(
"dol_compress_file success - ".count($result).
" files");
2246 if ($foundhandler) {
2247 $fp = fopen($outputfile,
"w");
2248 fwrite($fp, $compressdata);
2252 $errorstring =
"Try to zip with format ".$mode.
" with no handler for this format";
2256 $errormsg = $errorstring;
2260 global $langs, $errormsg;
2261 $langs->load(
"errors");
2262 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir");
2264 $errorstring =
"Failed to open file ".$outputfile;
2280 global $conf, $langs, $db;
2282 $fileinfo = pathinfo($inputfile);
2283 $fileinfo[
"extension"] = strtolower($fileinfo[
"extension"]);
2285 if ($fileinfo[
"extension"] ==
"zip") {
2286 if (defined(
'ODTPHP_PATHTOPCLZIP') && empty($conf->global->MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS)) {
2287 dol_syslog(
"Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.
", so we use Pclzip to unzip into ".$outputdir);
2288 include_once ODTPHP_PATHTOPCLZIP.
'/pclzip.lib.php';
2289 $archive =
new PclZip($inputfile);
2295 $result = $archive->extract(PCLZIP_OPT_PATH, $outputdir, PCLZIP_OPT_BY_PREG,
'/^((?!\.\.).)*$/');
2297 if (!is_array($result) && $result <= 0) {
2298 return array(
'error'=>$archive->errorInfo(
true));
2303 foreach ($result as $key => $val) {
2304 if ($val[
'status'] ==
'path_creation_fail') {
2305 $langs->load(
"errors");
2307 $errmsg = $langs->trans(
"ErrorFailToCreateDir", $val[
'filename']);
2315 return array(
'error'=>$errmsg);
2320 if (class_exists(
'ZipArchive')) {
2321 dol_syslog(
"Class ZipArchive is set so we unzip using ZipArchive to unzip into ".$outputdir);
2322 $zip =
new ZipArchive;
2323 $res = $zip->open($inputfile);
2324 if ($res ===
true) {
2330 for ($i = 0; $i < $zip->numFiles; $i++) {
2331 if (preg_match(
'/\.\./', $zip->getNameIndex($i))) {
2332 dol_syslog(
"Warning: Try to unzip a file with a transversal path ".$zip->getNameIndex($i), LOG_WARNING);
2335 $zip->extractTo($outputdir.
'/', array($zip->getNameIndex($i)));
2341 return array(
'error'=>
'ErrUnzipFails');
2345 return array(
'error'=>
'ErrNoZipEngine');
2346 } elseif (in_array($fileinfo[
"extension"], array(
'gz',
'bz2',
'zst'))) {
2347 include_once DOL_DOCUMENT_ROOT.
"/core/class/utils.class.php";
2348 $utils =
new Utils($db);
2355 $extension = strtolower(pathinfo($fileinfo[
"filename"], PATHINFO_EXTENSION));
2356 if ($extension ==
"tar") {
2359 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0, $outputfilename.
'.err', 0);
2360 if ($resarray[
"result"] != 0) {
2361 $resarray[
"error"] .= file_get_contents($outputfilename.
'.err');
2365 if ($fileinfo[
"extension"] ==
"gz") {
2367 } elseif ($fileinfo[
"extension"] ==
"bz2") {
2369 } elseif ($fileinfo[
"extension"] ==
"zst") {
2372 return array(
'error'=>
'ErrorBadFileExtension');
2375 $cmd .=
' > '.$outputfilename;
2377 $resarray = $utils->executeCLI($cmd, $outputfilename.
'.tmp', 0,
null, 1, $outputfilename.
'.err');
2378 if ($resarray[
"result"] != 0) {
2379 $errfilecontent = @file_get_contents($outputfilename.
'.err');
2380 if ($errfilecontent) {
2381 $resarray[
"error"] .=
" - ".$errfilecontent;
2385 return $resarray[
"result"] != 0 ? array(
'error' => $resarray[
"error"]) : array();
2388 return array(
'error'=>
'ErrorBadFileExtension');
2404 function dol_compress_dir($inputdir, $outputfile, $mode =
"zip", $excludefiles =
'', $rootdirinzip =
'', $newmask = 0)
2410 dol_syslog(
"Try to zip dir ".$inputdir.
" into ".$outputfile.
" mode=".$mode);
2412 if (!
dol_is_dir(dirname($outputfile)) || !is_writable(dirname($outputfile))) {
2413 global $langs, $errormsg;
2414 $langs->load(
"errors");
2415 $errormsg = $langs->trans(
"ErrorFailedToWriteInDir", $outputfile);
2420 if ($mode ==
'gz') {
2422 } elseif ($mode ==
'bz') {
2424 } elseif ($mode ==
'zip') {
2438 if (class_exists(
'ZipArchive')) {
2442 $zip =
new ZipArchive();
2443 $result = $zip->open($outputfile, ZipArchive::CREATE | ZipArchive::OVERWRITE);
2445 global $langs, $errormsg;
2446 $langs->load(
"errors");
2447 $errormsg = $langs->trans(
"ErrorFailedToWriteInFile", $outputfile);
2454 $files =
new RecursiveIteratorIterator(
2455 new RecursiveDirectoryIterator($inputdir),
2456 RecursiveIteratorIterator::LEAVES_ONLY
2460 foreach ($files as $name => $file) {
2462 if (!$file->isDir()) {
2464 $filePath = $file->getPath();
2465 $fileName = $file->getFilename();
2466 $fileFullRealPath = $file->getRealPath();
2469 $relativePath = ($rootdirinzip ? $rootdirinzip.
'/' :
'').substr(($filePath ? $filePath.
'/' :
'').$fileName, strlen($inputdir) + 1);
2472 if (empty($excludefiles) || !preg_match($excludefiles, $fileFullRealPath)) {
2474 $zip->addFile($fileFullRealPath, $relativePath);
2482 if (empty($newmask) && !empty($conf->global->MAIN_UMASK)) {
2483 $newmask = $conf->global->MAIN_UMASK;
2485 if (empty($newmask)) {
2486 dol_syslog(
"Warning: dol_copy called with empty value for newmask and no default value defined", LOG_WARNING);
2496 if (!$foundhandler) {
2497 dol_syslog(
"Try to zip with format ".$mode.
" with no handler for this format", LOG_ERR);
2503 global $langs, $errormsg;
2504 $langs->load(
"errors");
2505 dol_syslog(
"Failed to open file ".$outputfile, LOG_ERR);
2507 $errormsg = $langs->trans(
"ErrorFailedToBuildArchive", $outputfile).
' - '.$e->getMessage();
2524 function dol_most_recent_file($dir, $regexfilter =
'', $excludefilter = array(
'(\.meta|_preview.*\.png)$',
'^\.'), $nohook =
false, $mode =
'')
2526 $tmparray =
dol_dir_list($dir,
'files', 0, $regexfilter, $excludefilter,
'date', SORT_DESC, $mode, $nohook);
2527 return isset($tmparray[0])?$tmparray[0]:
null;
2545 global $conf, $db, $user, $hookmanager;
2546 global $dolibarr_main_data_root, $dolibarr_main_document_root_alt;
2549 if (!is_object($fuser)) {
2553 if (empty($modulepart)) {
2554 return 'ErrorBadParameter';
2556 if (empty($entity)) {
2564 if ($modulepart ==
'users') {
2565 $modulepart =
'user';
2567 if ($modulepart ==
'tva') {
2568 $modulepart =
'tax-vat';
2571 if ($modulepart ==
'expedition' && strpos($original_file,
'receipt/') === 0) {
2572 $modulepart =
'delivery';
2576 dol_syslog(
'dol_check_secure_access_document modulepart='.$modulepart.
' original_file='.$original_file.
' entity='.$entity);
2580 $sqlprotectagainstexternals =
'';
2584 if (empty($refname)) {
2585 $refname = basename(dirname($original_file).
"/");
2586 if ($refname ==
'thumbs') {
2588 $refname = basename(dirname(dirname($original_file)).
"/");
2595 $download =
'download';
2596 if ($mode ==
'write') {
2599 $download =
'upload';
2603 if ($modulepart ==
'medias' && !empty($dolibarr_main_data_root)) {
2604 if (empty($entity) || empty($conf->medias->multidir_output[$entity])) {
2605 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
2608 $original_file = $conf->medias->multidir_output[$entity].
'/'.$original_file;
2609 } elseif ($modulepart ==
'logs' && !empty($dolibarr_main_data_root)) {
2611 $accessallowed = ($user->admin && basename($original_file) == $original_file && preg_match(
'/^dolibarr.*\.(log|json)$/', basename($original_file)));
2612 $original_file = $dolibarr_main_data_root.
'/'.$original_file;
2613 } elseif ($modulepart ==
'doctemplates' && !empty($dolibarr_main_data_root)) {
2615 $accessallowed = $user->admin;
2616 $original_file = $dolibarr_main_data_root.
'/doctemplates/'.$original_file;
2617 } elseif ($modulepart ==
'doctemplateswebsite' && !empty($dolibarr_main_data_root)) {
2619 $accessallowed = ($fuser->rights->website->write && preg_match(
'/\.jpg$/i', basename($original_file)));
2620 $original_file = $dolibarr_main_data_root.
'/doctemplates/websites/'.$original_file;
2621 } elseif ($modulepart ==
'packages' && !empty($dolibarr_main_data_root)) {
2624 $tmp = explode(
',', $dolibarr_main_document_root_alt);
2627 $accessallowed = ($user->admin && preg_match(
'/^module_.*\.zip$/', basename($original_file)));
2628 $original_file = $dirins.
'/'.$original_file;
2629 } elseif ($modulepart ==
'mycompany' && !empty($conf->mycompany->dir_output)) {
2632 $original_file = $conf->mycompany->dir_output.
'/'.$original_file;
2633 } elseif ($modulepart ==
'userphoto' && !empty($conf->user->dir_output)) {
2636 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
2639 $original_file = $conf->user->dir_output.
'/'.$original_file;
2640 } elseif ($modulepart ==
'userphotopublic' && !empty($conf->user->dir_output)) {
2644 if (preg_match(
'/^(\d+)\/photos\//', $original_file, $reg)) {
2646 $tmpobject =
new User($db);
2647 $tmpobject->fetch($reg[0],
'',
'', 1);
2649 $securekey =
GETPOST(
'securekey',
'alpha', 1);
2651 global $dolibarr_main_instance_unique_id;
2652 $encodedsecurekey =
dol_hash($dolibarr_main_instance_unique_id.
'uservirtualcard'.$tmpobject->id.
'-'.$tmpobject->login,
'md5');
2653 if ($encodedsecurekey == $securekey) {
2662 $original_file = $conf->user->dir_output.
'/'.$original_file;
2663 } elseif (($modulepart ==
'companylogo') && !empty($conf->mycompany->dir_output)) {
2666 $original_file = $conf->mycompany->dir_output.
'/logos/'.$original_file;
2667 } elseif ($modulepart ==
'memberphoto' && !empty($conf->adherent->dir_output)) {
2670 if (preg_match(
'/^\d+\/photos\//', $original_file)) {
2673 $original_file = $conf->adherent->dir_output.
'/'.$original_file;
2674 } elseif ($modulepart ==
'apercufacture' && !empty($conf->facture->multidir_output[$entity])) {
2676 if ($fuser->hasRight(
'facture', $lire)) {
2679 $original_file = $conf->facture->multidir_output[$entity].
'/'.$original_file;
2680 } elseif ($modulepart ==
'apercupropal' && !empty($conf->propal->multidir_output[$entity])) {
2682 if ($fuser->hasRight(
'propal', $lire)) {
2685 $original_file = $conf->propal->multidir_output[$entity].
'/'.$original_file;
2686 } elseif ($modulepart ==
'apercucommande' && !empty($conf->commande->multidir_output[$entity])) {
2688 if ($fuser->hasRight(
'commande', $lire)) {
2691 $original_file = $conf->commande->multidir_output[$entity].
'/'.$original_file;
2692 } elseif (($modulepart ==
'apercufichinter' || $modulepart ==
'apercuficheinter') && !empty($conf->ficheinter->dir_output)) {
2694 if ($fuser->hasRight(
'ficheinter', $lire)) {
2697 $original_file = $conf->ficheinter->dir_output.
'/'.$original_file;
2698 } elseif (($modulepart ==
'apercucontract') && !empty($conf->contrat->multidir_output[$entity])) {
2700 if ($fuser->hasRight(
'contrat', $lire)) {
2703 $original_file = $conf->contrat->multidir_output[$entity].
'/'.$original_file;
2704 } elseif (($modulepart ==
'apercusupplier_proposal' || $modulepart ==
'apercusupplier_proposal') && !empty($conf->supplier_proposal->dir_output)) {
2706 if ($fuser->hasRight(
'supplier_proposal', $lire)) {
2709 $original_file = $conf->supplier_proposal->dir_output.
'/'.$original_file;
2710 } elseif (($modulepart ==
'apercusupplier_order' || $modulepart ==
'apercusupplier_order') && !empty($conf->fournisseur->commande->dir_output)) {
2712 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
2715 $original_file = $conf->fournisseur->commande->dir_output.
'/'.$original_file;
2716 } elseif (($modulepart ==
'apercusupplier_invoice' || $modulepart ==
'apercusupplier_invoice') && !empty($conf->fournisseur->facture->dir_output)) {
2718 if ($fuser->hasRight(
'fournisseur', $lire)) {
2721 $original_file = $conf->fournisseur->facture->dir_output.
'/'.$original_file;
2722 } elseif (($modulepart ==
'holiday') && !empty($conf->holiday->dir_output)) {
2723 if ($fuser->hasRight(
'holiday', $read) || !empty($fuser->rights->holiday->readall) || preg_match(
'/^specimen/i', $original_file)) {
2726 if ($refname && empty($fuser->rights->holiday->readall) && !preg_match(
'/^specimen/i', $original_file)) {
2727 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
2728 $tmpholiday =
new Holiday($db);
2729 $tmpholiday->fetch(
'', $refname);
2730 $accessallowed =
checkUserAccessToObject($user, array(
'holiday'), $tmpholiday,
'holiday',
'',
'',
'rowid',
'');
2733 $original_file = $conf->holiday->dir_output.
'/'.$original_file;
2734 } elseif (($modulepart ==
'expensereport') && !empty($conf->expensereport->dir_output)) {
2735 if ($fuser->hasRight(
'expensereport', $lire) || !empty($fuser->rights->expensereport->readall) || preg_match(
'/^specimen/i', $original_file)) {
2738 if ($refname && empty($fuser->rights->expensereport->readall) && !preg_match(
'/^specimen/i', $original_file)) {
2739 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
2741 $tmpexpensereport->fetch(
'', $refname);
2742 $accessallowed =
checkUserAccessToObject($user, array(
'expensereport'), $tmpexpensereport,
'expensereport',
'',
'',
'rowid',
'');
2745 $original_file = $conf->expensereport->dir_output.
'/'.$original_file;
2746 } elseif (($modulepart ==
'apercuexpensereport') && !empty($conf->expensereport->dir_output)) {
2748 if ($fuser->hasRight(
'expensereport', $lire)) {
2751 $original_file = $conf->expensereport->dir_output.
'/'.$original_file;
2752 } elseif ($modulepart ==
'propalstats' && !empty($conf->propal->multidir_temp[$entity])) {
2754 if ($fuser->hasRight(
'propal', $lire)) {
2757 $original_file = $conf->propal->multidir_temp[$entity].
'/'.$original_file;
2758 } elseif ($modulepart ==
'orderstats' && !empty($conf->commande->dir_temp)) {
2760 if ($fuser->hasRight(
'commande', $lire)) {
2763 $original_file = $conf->commande->dir_temp.
'/'.$original_file;
2764 } elseif ($modulepart ==
'orderstatssupplier' && !empty($conf->fournisseur->dir_output)) {
2765 if ($fuser->hasRight(
'fournisseur',
'commande', $lire)) {
2768 $original_file = $conf->fournisseur->commande->dir_temp.
'/'.$original_file;
2769 } elseif ($modulepart ==
'billstats' && !empty($conf->facture->dir_temp)) {
2771 if ($fuser->hasRight(
'facture', $lire)) {
2774 $original_file = $conf->facture->dir_temp.
'/'.$original_file;
2775 } elseif ($modulepart ==
'billstatssupplier' && !empty($conf->fournisseur->dir_output)) {
2776 if ($fuser->hasRight(
'fournisseur',
'facture', $lire)) {
2779 $original_file = $conf->fournisseur->facture->dir_temp.
'/'.$original_file;
2780 } elseif ($modulepart ==
'expeditionstats' && !empty($conf->expedition->dir_temp)) {
2782 if ($fuser->hasRight(
'expedition', $lire)) {
2785 $original_file = $conf->expedition->dir_temp.
'/'.$original_file;
2786 } elseif ($modulepart ==
'tripsexpensesstats' && !empty($conf->deplacement->dir_temp)) {
2788 if ($fuser->hasRight(
'deplacement', $lire)) {
2791 $original_file = $conf->deplacement->dir_temp.
'/'.$original_file;
2792 } elseif ($modulepart ==
'memberstats' && !empty($conf->adherent->dir_temp)) {
2794 if ($fuser->hasRight(
'adherent', $lire)) {
2797 $original_file = $conf->adherent->dir_temp.
'/'.$original_file;
2798 } elseif (preg_match(
'/^productstats_/i', $modulepart) && !empty($conf->product->dir_temp)) {
2800 if ($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) {
2803 $original_file = (!empty($conf->product->multidir_temp[$entity]) ? $conf->product->multidir_temp[$entity] : $conf->service->multidir_temp[$entity]).
'/'.$original_file;
2804 } elseif (in_array($modulepart, array(
'tax',
'tax-vat',
'tva')) && !empty($conf->tax->dir_output)) {
2806 if ($fuser->hasRight(
'tax',
'charges', $lire)) {
2809 $modulepartsuffix = str_replace(
'tax-',
'', $modulepart);
2810 $original_file = $conf->tax->dir_output.
'/'.($modulepartsuffix !=
'tax' ? $modulepartsuffix.
'/' :
'').$original_file;
2811 } elseif ($modulepart ==
'actions' && !empty($conf->agenda->dir_output)) {
2813 if ($fuser->hasRight(
'agenda',
'myactions', $read)) {
2816 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
2817 include_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
2819 $tmpobject->fetch((
int) $refname);
2820 $accessallowed =
checkUserAccessToObject($user, array(
'agenda'), $tmpobject->id,
'actioncomm&societe',
'myactions|allactions',
'fk_soc',
'id',
'');
2821 if ($user->socid && $tmpobject->socid) {
2826 $original_file = $conf->agenda->dir_output.
'/'.$original_file;
2827 } elseif ($modulepart ==
'category' && !empty($conf->categorie->multidir_output[$entity])) {
2829 if (empty($entity) || empty($conf->categorie->multidir_output[$entity])) {
2830 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
2832 if ($fuser->hasRight(
"categorie", $lire) || $fuser->hasRight(
"takepos",
"run")) {
2835 $original_file = $conf->categorie->multidir_output[$entity].
'/'.$original_file;
2836 } elseif ($modulepart ==
'prelevement' && !empty($conf->prelevement->dir_output)) {
2838 if ($fuser->rights->prelevement->bons->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
2841 $original_file = $conf->prelevement->dir_output.
'/'.$original_file;
2842 } elseif ($modulepart ==
'graph_stock' && !empty($conf->stock->dir_temp)) {
2845 $original_file = $conf->stock->dir_temp.
'/'.$original_file;
2846 } elseif ($modulepart ==
'graph_fourn' && !empty($conf->fournisseur->dir_temp)) {
2849 $original_file = $conf->fournisseur->dir_temp.
'/'.$original_file;
2850 } elseif ($modulepart ==
'graph_product' && !empty($conf->product->dir_temp)) {
2853 $original_file = $conf->product->multidir_temp[$entity].
'/'.$original_file;
2854 } elseif ($modulepart ==
'barcode') {
2859 $original_file =
'';
2860 } elseif ($modulepart ==
'iconmailing' && !empty($conf->mailing->dir_temp)) {
2863 $original_file = $conf->mailing->dir_temp.
'/'.$original_file;
2864 } elseif ($modulepart ==
'scanner_user_temp' && !empty($conf->scanner->dir_temp)) {
2867 $original_file = $conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
2868 } elseif ($modulepart ==
'fckeditor' && !empty($conf->fckeditor->dir_output)) {
2871 $original_file = $conf->fckeditor->dir_output.
'/'.$original_file;
2872 } elseif ($modulepart ==
'user' && !empty($conf->user->dir_output)) {
2874 $canreaduser = (!empty($fuser->admin) || $fuser->rights->user->user->{$lire});
2875 if ($fuser->id == (
int) $refname) {
2878 if ($canreaduser || preg_match(
'/^specimen/i', $original_file)) {
2881 $original_file = $conf->user->dir_output.
'/'.$original_file;
2882 } elseif (($modulepart ==
'company' || $modulepart ==
'societe' || $modulepart ==
'thirdparty') && !empty($conf->societe->multidir_output[$entity])) {
2884 if (empty($entity) || empty($conf->societe->multidir_output[$entity])) {
2885 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
2887 if ($fuser->rights->societe->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
2890 $original_file = $conf->societe->multidir_output[$entity].
'/'.$original_file;
2891 $sqlprotectagainstexternals =
"SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX.
"societe WHERE rowid='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'societe').
")";
2892 } elseif ($modulepart ==
'contact' && !empty($conf->societe->multidir_output[$entity])) {
2894 if (empty($entity) || empty($conf->societe->multidir_output[$entity])) {
2895 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
2897 if ($fuser->hasRight(
'societe', $lire)) {
2900 $original_file = $conf->societe->multidir_output[$entity].
'/contact/'.$original_file;
2901 } elseif (($modulepart ==
'facture' || $modulepart ==
'invoice') && !empty($conf->facture->multidir_output[$entity])) {
2903 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2906 $original_file = $conf->facture->multidir_output[$entity].
'/'.$original_file;
2907 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'invoice').
")";
2908 } elseif ($modulepart ==
'massfilesarea_proposals' && !empty($conf->propal->multidir_output[$entity])) {
2910 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2913 $original_file = $conf->propal->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2914 } elseif ($modulepart ==
'massfilesarea_orders') {
2915 if ($fuser->hasRight(
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2918 $original_file = $conf->commande->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2919 } elseif ($modulepart ==
'massfilesarea_sendings') {
2920 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2923 $original_file = $conf->expedition->dir_output.
'/sending/temp/massgeneration/'.$user->id.
'/'.$original_file;
2924 } elseif ($modulepart ==
'massfilesarea_invoices') {
2925 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2928 $original_file = $conf->facture->multidir_output[$entity].
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2929 } elseif ($modulepart ==
'massfilesarea_expensereport') {
2930 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2933 $original_file = $conf->expensereport->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2934 } elseif ($modulepart ==
'massfilesarea_interventions') {
2935 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2938 $original_file = $conf->ficheinter->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2939 } elseif ($modulepart ==
'massfilesarea_supplier_proposal' && !empty($conf->supplier_proposal->dir_output)) {
2940 if ($fuser->hasRight(
'supplier_proposal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2943 $original_file = $conf->supplier_proposal->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2944 } elseif ($modulepart ==
'massfilesarea_supplier_order') {
2945 if ($fuser->hasRight(
'fournisseur',
'commande', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2948 $original_file = $conf->fournisseur->commande->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2949 } elseif ($modulepart ==
'massfilesarea_supplier_invoice') {
2950 if ($fuser->hasRight(
'fournisseur',
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2953 $original_file = $conf->fournisseur->facture->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2954 } elseif ($modulepart ==
'massfilesarea_contract' && !empty($conf->contrat->dir_output)) {
2955 if ($fuser->hasRight(
'contrat', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2958 $original_file = $conf->contrat->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
2959 } elseif (($modulepart ==
'fichinter' || $modulepart ==
'ficheinter') && !empty($conf->ficheinter->dir_output)) {
2961 if ($fuser->hasRight(
'ficheinter', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2964 $original_file = $conf->ficheinter->dir_output.
'/'.$original_file;
2965 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"fichinter WHERE ref='".$db->escape($refname).
"' AND entity=".$conf->entity;
2966 } elseif ($modulepart ==
'deplacement' && !empty($conf->deplacement->dir_output)) {
2968 if ($fuser->hasRight(
'deplacement', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2971 $original_file = $conf->deplacement->dir_output.
'/'.$original_file;
2973 } elseif (($modulepart ==
'propal' || $modulepart ==
'propale') && isset($conf->propal->multidir_output[$entity])) {
2975 if ($fuser->hasRight(
'propal', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2978 $original_file = $conf->propal->multidir_output[$entity].
'/'.$original_file;
2979 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"propal WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'propal').
")";
2980 } elseif (($modulepart ==
'commande' || $modulepart ==
'order') && !empty($conf->commande->multidir_output[$entity])) {
2982 if ($fuser->rights->commande->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
2985 $original_file = $conf->commande->multidir_output[$entity].
'/'.$original_file;
2986 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'order').
")";
2987 } elseif ($modulepart ==
'project' && !empty($conf->project->multidir_output[$entity])) {
2989 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
2992 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
2993 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
2994 $tmpproject =
new Project($db);
2995 $tmpproject->fetch(
'', $refname);
2996 $accessallowed =
checkUserAccessToObject($user, array(
'projet'), $tmpproject->id,
'projet&project',
'',
'',
'rowid',
'');
2999 $original_file = $conf->project->multidir_output[$entity].
'/'.$original_file;
3000 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3001 } elseif ($modulepart ==
'project_task' && !empty($conf->project->multidir_output[$entity])) {
3002 if ($fuser->hasRight(
'projet', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3005 if ($refname && !preg_match(
'/^specimen/i', $original_file)) {
3006 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
3007 $tmptask =
new Task($db);
3008 $tmptask->fetch(
'', $refname);
3009 $accessallowed =
checkUserAccessToObject($user, array(
'projet_task'), $tmptask->id,
'projet_task&project',
'',
'',
'rowid',
'');
3012 $original_file = $conf->project->multidir_output[$entity].
'/'.$original_file;
3013 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"projet WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'project').
")";
3014 } elseif (($modulepart ==
'commande_fournisseur' || $modulepart ==
'order_supplier') && !empty($conf->fournisseur->commande->dir_output)) {
3016 if ($fuser->rights->fournisseur->commande->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
3019 $original_file = $conf->fournisseur->commande->dir_output.
'/'.$original_file;
3020 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"commande_fournisseur WHERE ref='".$db->escape($refname).
"' AND entity=".$conf->entity;
3021 } elseif (($modulepart ==
'facture_fournisseur' || $modulepart ==
'invoice_supplier') && !empty($conf->fournisseur->facture->dir_output)) {
3023 if ($fuser->rights->fournisseur->facture->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
3026 $original_file = $conf->fournisseur->facture->dir_output.
'/'.$original_file;
3027 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"facture_fourn WHERE ref='".$db->escape($refname).
"' AND entity=".$conf->entity;
3028 } elseif ($modulepart ==
'supplier_payment') {
3030 if ($fuser->rights->fournisseur->facture->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
3033 $original_file = $conf->fournisseur->payment->dir_output.
'/'.$original_file;
3034 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"paiementfournisseur WHERE ref='".$db->escape($refname).
"' AND entity=".$conf->entity;
3035 } elseif ($modulepart ==
'facture_paiement' && !empty($conf->facture->dir_output)) {
3037 if ($fuser->hasRight(
'facture', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3040 if ($fuser->socid > 0) {
3041 $original_file = $conf->facture->dir_output.
'/payments/private/'.$fuser->id.
'/'.$original_file;
3043 $original_file = $conf->facture->dir_output.
'/payments/'.$original_file;
3045 } elseif ($modulepart ==
'export_compta' && !empty($conf->accounting->dir_output)) {
3047 if ($fuser->rights->accounting->bind->write || preg_match(
'/^specimen/i', $original_file)) {
3050 $original_file = $conf->accounting->dir_output.
'/'.$original_file;
3051 } elseif (($modulepart ==
'expedition' || $modulepart ==
'shipment') && !empty($conf->expedition->dir_output)) {
3053 if ($fuser->hasRight(
'expedition', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3056 $original_file = $conf->expedition->dir_output.
"/".(strpos($original_file,
'sending/') === 0 ?
'' :
'sending/').$original_file;
3058 } elseif (($modulepart ==
'livraison' || $modulepart ==
'delivery') && !empty($conf->expedition->dir_output)) {
3060 if ($fuser->hasRight(
'expedition',
'delivery', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3063 $original_file = $conf->expedition->dir_output.
"/".(strpos($original_file,
'receipt/') === 0 ?
'' :
'receipt/').$original_file;
3064 } elseif ($modulepart ==
'actions' && !empty($conf->agenda->dir_output)) {
3066 if ($fuser->hasRight(
'agenda',
'myactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3069 $original_file = $conf->agenda->dir_output.
'/'.$original_file;
3070 } elseif ($modulepart ==
'actionsreport' && !empty($conf->agenda->dir_temp)) {
3072 if ($fuser->hasRight(
'agenda',
'allactions', $read) || preg_match(
'/^specimen/i', $original_file)) {
3075 $original_file = $conf->agenda->dir_temp.
"/".$original_file;
3076 } elseif ($modulepart ==
'product' || $modulepart ==
'produit' || $modulepart ==
'service' || $modulepart ==
'produit|service') {
3078 if (empty($entity) || (empty($conf->product->multidir_output[$entity]) && empty($conf->service->multidir_output[$entity]))) {
3079 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
3081 if (($fuser->hasRight(
'produit', $lire) || $fuser->hasRight(
'service', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3085 $original_file = $conf->product->multidir_output[$entity].
'/'.$original_file;
3087 $original_file = $conf->service->multidir_output[$entity].
'/'.$original_file;
3089 } elseif ($modulepart ==
'product_batch' || $modulepart ==
'produitlot') {
3091 if (empty($entity) || (empty($conf->productbatch->multidir_output[$entity]))) {
3092 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
3094 if (($fuser->hasRight(
'produit', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3098 $original_file = $conf->productbatch->multidir_output[$entity].
'/'.$original_file;
3100 } elseif ($modulepart ==
'movement' || $modulepart ==
'mouvement') {
3102 if (empty($entity) || empty($conf->stock->multidir_output[$entity])) {
3103 return array(
'accessallowed'=>0,
'error'=>
'Value entity must be provided');
3105 if (($fuser->hasRight(
'stock', $lire) || $fuser->hasRight(
'stock',
'movement', $lire) || $fuser->hasRight(
'stock',
'mouvement', $lire)) || preg_match(
'/^specimen/i', $original_file)) {
3109 $original_file = $conf->stock->multidir_output[$entity].
'/movement/'.$original_file;
3111 } elseif ($modulepart ==
'contract' && !empty($conf->contrat->multidir_output[$entity])) {
3113 if ($fuser->rights->contrat->{$lire} || preg_match(
'/^specimen/i', $original_file)) {
3116 $original_file = $conf->contrat->multidir_output[$entity].
'/'.$original_file;
3117 $sqlprotectagainstexternals =
"SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX.
"contrat WHERE ref='".$db->escape($refname).
"' AND entity IN (".
getEntity(
'contract').
")";
3118 } elseif ($modulepart ==
'donation' && !empty($conf->don->dir_output)) {
3120 if ($fuser->hasRight(
'don', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3123 $original_file = $conf->don->dir_output.
'/'.$original_file;
3124 } elseif ($modulepart ==
'dolresource' && !empty($conf->resource->dir_output)) {
3126 if ($fuser->hasRight(
'resource', $read) || preg_match(
'/^specimen/i', $original_file)) {
3129 $original_file = $conf->resource->dir_output.
'/'.$original_file;
3130 } elseif (($modulepart ==
'remisecheque' || $modulepart ==
'chequereceipt') && !empty($conf->bank->dir_output)) {
3132 if ($fuser->hasRight(
'banque', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3136 $original_file = $conf->bank->dir_output.
'/checkdeposits/'.$original_file;
3137 } elseif (($modulepart ==
'banque' || $modulepart ==
'bank') && !empty($conf->bank->dir_output)) {
3139 if ($fuser->hasRight(
'banque', $lire)) {
3142 $original_file = $conf->bank->dir_output.
'/'.$original_file;
3143 } elseif ($modulepart ==
'export' && !empty($conf->export->dir_temp)) {
3146 $accessallowed = $user->rights->export->lire;
3147 $original_file = $conf->export->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3148 } elseif ($modulepart ==
'import' && !empty($conf->import->dir_temp)) {
3150 $accessallowed = $user->rights->import->run;
3151 $original_file = $conf->import->dir_temp.
'/'.$original_file;
3152 } elseif ($modulepart ==
'recruitment' && !empty($conf->recruitment->dir_output)) {
3154 $accessallowed = $user->hasRight(
'recruitment',
'recruitmentjobposition',
'read');
3155 $original_file = $conf->recruitment->dir_output.
'/'.$original_file;
3156 } elseif ($modulepart ==
'editor' && !empty($conf->fckeditor->dir_output)) {
3159 $original_file = $conf->fckeditor->dir_output.
'/'.$original_file;
3160 } elseif ($modulepart ==
'systemtools' && !empty($conf->admin->dir_output)) {
3162 if ($fuser->admin) {
3165 $original_file = $conf->admin->dir_output.
'/'.$original_file;
3166 } elseif ($modulepart ==
'admin_temp' && !empty($conf->admin->dir_temp)) {
3168 if ($fuser->admin) {
3171 $original_file = $conf->admin->dir_temp.
'/'.$original_file;
3172 } elseif ($modulepart ==
'bittorrent' && !empty($conf->bittorrent->dir_output)) {
3176 if (
dol_mimetype($original_file) ==
'application/x-bittorrent') {
3179 $original_file = $conf->bittorrent->dir_output.
'/'.$dir.
'/'.$original_file;
3180 } elseif ($modulepart ==
'member' && !empty($conf->adherent->dir_output)) {
3182 if ($fuser->hasRight(
'adherent', $lire) || preg_match(
'/^specimen/i', $original_file)) {
3185 $original_file = $conf->adherent->dir_output.
'/'.$original_file;
3186 } elseif ($modulepart ==
'scanner_user_temp' && !empty($conf->scanner->dir_temp)) {
3189 $original_file = $conf->scanner->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3199 if (preg_match(
'/^specimen/i', $original_file)) {
3202 if ($fuser->admin) {
3206 $tmpmodulepart = explode(
'-', $modulepart);
3207 if (!empty($tmpmodulepart[1])) {
3208 $modulepart = $tmpmodulepart[0];
3209 $original_file = $tmpmodulepart[1].
'/'.$original_file;
3214 if (preg_match(
'/^([a-z]+)_user_temp$/i', $modulepart, $reg)) {
3215 $tmpmodule = $reg[1];
3216 if (empty($conf->$tmpmodule->dir_temp)) {
3217 dol_print_error(
'',
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3220 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3223 $original_file = $conf->{$reg[1]}->dir_temp.
'/'.$fuser->id.
'/'.$original_file;
3224 } elseif (preg_match(
'/^([a-z]+)_temp$/i', $modulepart, $reg)) {
3225 $tmpmodule = $reg[1];
3226 if (empty($conf->$tmpmodule->dir_temp)) {
3227 dol_print_error(
'',
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3230 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3233 $original_file = $conf->$tmpmodule->dir_temp.
'/'.$original_file;
3234 } elseif (preg_match(
'/^([a-z]+)_user$/i', $modulepart, $reg)) {
3235 $tmpmodule = $reg[1];
3236 if (empty($conf->$tmpmodule->dir_output)) {
3237 dol_print_error(
'',
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3240 if ($fuser->hasRight($tmpmodule, $lire) || $fuser->hasRight($tmpmodule, $read) || $fuser->hasRight($tmpmodule, $download)) {
3243 $original_file = $conf->$tmpmodule->dir_output.
'/'.$fuser->id.
'/'.$original_file;
3244 } elseif (preg_match(
'/^massfilesarea_([a-z]+)$/i', $modulepart, $reg)) {
3245 $tmpmodule = $reg[1];
3246 if (empty($conf->$tmpmodule->dir_output)) {
3247 dol_print_error(
'',
'Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.
')');
3250 if ($fuser->hasRight($tmpmodule, $lire) || preg_match(
'/^specimen/i', $original_file)) {
3253 $original_file = $conf->$tmpmodule->dir_output.
'/temp/massgeneration/'.$user->id.
'/'.$original_file;
3255 if (empty($conf->$modulepart->dir_output)) {
3256 dol_print_error(
'',
'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.');
3261 $partsofdirinoriginalfile = explode(
'/', $original_file);
3262 if (!empty($partsofdirinoriginalfile[1])) {
3263 $partofdirinoriginalfile = $partsofdirinoriginalfile[0];
3264 if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile,
'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile,
'read'))) {
3268 if ($fuser->hasRight($modulepart, $lire) || $fuser->hasRight($modulepart, $read)) {
3272 if (is_array($conf->$modulepart->multidir_output) && !empty($conf->$modulepart->multidir_output[$entity])) {
3273 $original_file = $conf->$modulepart->multidir_output[$entity].
'/'.$original_file;
3275 $original_file = $conf->$modulepart->dir_output.
'/'.$original_file;
3279 $parameters = array(
3280 'modulepart' => $modulepart,
3281 'original_file' => $original_file,
3282 'entity' => $entity,
3287 $reshook = $hookmanager->executeHooks(
'checkSecureAccess', $parameters, $object);
3289 if (!empty($hookmanager->resArray[
'original_file'])) {
3290 $original_file = $hookmanager->resArray[
'original_file'];
3292 if (!empty($hookmanager->resArray[
'accessallowed'])) {
3293 $accessallowed = $hookmanager->resArray[
'accessallowed'];
3295 if (!empty($hookmanager->resArray[
'sqlprotectagainstexternals'])) {
3296 $sqlprotectagainstexternals = $hookmanager->resArray[
'sqlprotectagainstexternals'];
3302 'accessallowed' => ($accessallowed ? 1 : 0),
3303 'sqlprotectagainstexternals' => $sqlprotectagainstexternals,
3304 'original_file' => $original_file
3323 $cachefile = $directory.$filename;
3324 file_put_contents($cachefile, serialize($object), LOCK_EX);
3339 $cachefile = $directory.$filename;
3340 $refresh = !file_exists($cachefile) || ($now - $cachetime) >
dol_filemtime($cachefile);
3353 $cachefile = $directory.$filename;
3354 $object = unserialize(file_get_contents($cachefile));
3366 return preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'\//',
'', $pathfile);
3381 function getFilesUpdated(&$file_list, SimpleXMLElement $dir, $path =
'', $pathref =
'', &$checksumconcat = array())
3385 $exclude =
'install';
3387 foreach ($dir->md5file as $file) {
3388 $filename = $path.$file[
'name'];
3389 $file_list[
'insignature'][] = $filename;
3390 $expectedsize = (empty($file[
'size']) ?
'' : $file[
'size']);
3391 $expectedmd5 = (string) $file;
3395 if (!file_exists($pathref.
'/'.$filename)) {
3396 $file_list[
'missing'][] = array(
'filename'=>$filename,
'expectedmd5'=>$expectedmd5,
'expectedsize'=>$expectedsize);
3398 $md5_local = md5_file($pathref.
'/'.$filename);
3400 if ($conffile ==
'/etc/dolibarr/conf.php' && $filename ==
'/filefunc.inc.php') {
3401 $checksumconcat[] = $expectedmd5;
3403 if ($md5_local != $expectedmd5) {
3404 $file_list[
'updated'][] = array(
'filename'=>$filename,
'expectedmd5'=>$expectedmd5,
'expectedsize'=>$expectedsize,
'md5'=>(
string) $md5_local);
3406 $checksumconcat[] = $md5_local;
3411 foreach ($dir->dir as $subdir) {
3412 getFilesUpdated($file_list, $subdir, $path.$subdir[
'name'].
'/', $pathref, $checksumconcat);
3427 global $object, $langs;
3430 $out .=
'<div id="'.$htmlname.
'Message" class="dragDropAreaMessage hidden"><span>'.
img_picto(
"",
'download').
'<br>'.$langs->trans(
"DropFileToAddItToObject").
'</span></div>';
3431 $out .=
"\n<!-- JS CODE TO ENABLE DRAG AND DROP OF FILE -->\n";
3434 jQuery(document).ready(function() {
3435 var enterTargetDragDrop = null;
3437 $("#'.$htmlname.
'").addClass("cssDragDropArea");
3439 $(".cssDragDropArea").on("dragenter", function(ev, ui) {
3440 var dataTransfer = ev.originalEvent.dataTransfer;
3441 var dataTypes = dataTransfer.types;
3442 //console.log(dataTransfer);
3443 //console.log(dataTypes);
3445 if (!dataTypes || ($.inArray(\'Files\', dataTypes) === -1)) {
3446 // The element dragged is not a file, so we avoid the "dragenter"
3447 ev.preventDefault();
3451 // Entering drop area. Highlight area
3452 console.log("dragAndDropFileUpload: We add class highlightDragDropArea")
3453 enterTargetDragDrop = ev.target;
3454 $(this).addClass("highlightDragDropArea");
3455 $("#'.$htmlname.
'Message").removeClass("hidden");
3456 ev.preventDefault();
3459 $(".cssDragDropArea").on("dragleave", function(ev) {
3460 // Going out of drop area. Remove Highlight
3461 if (enterTargetDragDrop == ev.target){
3462 console.log("dragAndDropFileUpload: We remove class highlightDragDropArea")
3463 $("#'.$htmlname.
'Message").addClass("hidden");
3464 $(this).removeClass("highlightDragDropArea");
3468 $(".cssDragDropArea").on("dragover", function(ev) {
3469 ev.preventDefault();
3473 $(".cssDragDropArea").on("drop", function(e) {
3474 console.log("Trigger event file dropped. fk_element='.
dol_escape_js($object->id).
' element='.
dol_escape_js($object->element).
'");
3476 fd = new FormData();
3478 fd.append("element", "'.
dol_escape_js($object->element).
'");
3480 fd.append("action", "linkit");
3482 var dataTransfer = e.originalEvent.dataTransfer;
3484 if (dataTransfer.files && dataTransfer.files.length){
3485 var droppedFiles = e.originalEvent.dataTransfer.files;
3486 $.each(droppedFiles, function(index,file){
3487 fd.append("files[]", file,file.name)
3490 $(".cssDragDropArea").removeClass("highlightDragDropArea");
3491 counterdragdrop = 0;
3493 url: "'.DOL_URL_ROOT.
'/core/ajax/fileupload.php",
3498 success:function() {
3499 console.log("Uploaded.", arguments);
3500 /* arguments[0] is the json string of files */
3501 /* arguments[1] is the value for variable "success", can be 0 or 1 */
3502 let listoffiles = JSON.parse(arguments[0]);
3503 console.log(listoffiles);
3505 for (let i = 0; i < listoffiles.length; i++) {
3506 console.log(listoffiles[i].error);
3507 if (listoffiles[i].error) {
3511 console.log(nboferror);
3512 if (nboferror > 0) {
3513 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js($object->id).
'&seteventmessages=ErrorOnAtLeastOneFileUpload:warnings";
3515 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js($object->id).
'&seteventmessages=UploadFileDragDropSuccess:mesgs";
3519 console.log("Error Uploading.", arguments)
3520 if (arguments[0].status == 403) {
3521 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js($object->id).
'&seteventmessages=ErrorUploadPermissionDenied:errors";
3523 window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?id='.
dol_escape_js($object->id).
'&seteventmessages=ErrorUploadFileDragDropPermissionDenied:errors";
3529 $out .=
"</script>\n";
Class to manage agenda events (actions)
Class to manage ECM files.
Class to manage Trips and Expenses.
Class of the module paid holiday.
Class to manage projects.
Class to manage Dolibarr users.
Class to manage utility methods.
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
dirbasename($pathfile)
Return the relative dirname (relative to DOL_DATA_ROOT) of a full path string.
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.
dol_meta_create($object)
Create a meta file with document file into same directory.
dolCheckVirus($src_file)
Check virus into a file.
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_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
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_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $varfiles='addedfile', $upload_dir='')
Make control on an uploaded file from an GUI page and move it to final destination.
dol_move_dir($srcdir, $destdir, $overwriteifexists=1, $indexdatabase=1, $renamedircontent=1)
Move a directory into another name.
dol_fileperm($pathoffile)
Return permissions of a file.
dol_delete_dir($dir, $nophperrors=0)
Remove a directory (not recursive, so content must be empty).
dol_check_secure_access_document($modulepart, $original_file, $entity, $fuser='', $refname='', $mode='read')
Security check when accessing to a document (used by document.php, viewimage.php and webservices to g...
dol_uncompress($inputfile, $outputdir)
Uncompress a file.
dol_init_file_process($pathtoscan='', $trackid='')
Scan a directory and init $_SESSION to manage uploaded files with list of all found files.
addFileIntoDatabaseIndex($dir, $file, $fullpathorig='', $mode='uploaded', $setsharekey=0, $object=null)
Add a file into database index.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert an image file or a PDF into another image format.
dol_most_recent_file($dir, $regexfilter='', $excludefilter=array('(\.meta|_preview.*\.png)$', '^\.'), $nohook=false, $mode='')
Return file(s) into a directory (by default most recent)
dol_is_url($url)
Return if path is an URL.
dol_filecache($directory, $filename, $object)
Store object in file.
dol_dir_list_in_database($path, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0)
Scan a directory and return a list of files/directories.
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.
dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0, $indexdatabase=0, $arrayreplacementisregex=0)
Make replacement of strings into a file.
dol_copy($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0, $indexdatabase=0)
Copy a file to another file.
dol_unescapefile($filename)
Unescape a file submitted by upload.
dol_dir_list($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_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).
dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement=null, $excludesubdir=0, $excludefileext=null)
Copy a dir to another dir.
deleteFilesIntoDatabaseIndex($dir, $file, $mode='uploaded')
Delete files into database index using search criterias.
dol_readcachefile($directory, $filename)
Read object from cachefile.
dol_is_dir($folder)
Test if filename is a directory.
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir)
Complete $filearray with data from database.
dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesession=0, $varfiles='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null)
Get and save an upload file (for example after submitting a new file a mail form).
dol_cache_refresh($directory, $filename, $cachetime)
Test if Refresh needed.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0, $indexdatabase=1)
Move a file into another name.
dol_is_dir_empty($dir)
Return if path is empty.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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 second index function, which produces ascending (default) or descending output...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isAFileWithExecutableContent($filename)
Return if a file can contains executable content.
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_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
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).
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.
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')
Returns a hash (non reversible encryption) of a string.