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";