2008-04-28 22:49:59 +02:00
< ? php
2016-02-11 20:01:51 +01:00
/* Copyright ( C ) 2008 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2012 - 2015 Regis Houssin < regis . houssin @ inodbox . com >
2016-12-10 14:47:18 +01:00
* Copyright ( C ) 2012 - 2016 Juanjo Menent < jmenent @ 2 byte . es >
2016-02-11 20:01:51 +01:00
* Copyright ( C ) 2015 Marcos García < marcosgdf @ gmail . com >
* Copyright ( C ) 2016 Raphaël Doursenaud < rdoursenaud @ gpcsolutions . fr >
2019-02-02 08:59:37 +01:00
* Copyright ( C ) 2019 Frédéric France < frederic . france @ netlogic . fr >
2008-04-28 22:49:59 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-04-28 22:49:59 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2008-04-28 22:49:59 +02:00
*/
/**
2011-10-24 12:59:44 +02:00
* \file htdocs / core / lib / files . lib . php
2008-11-16 02:09:04 +01:00
* \brief Library for file managing functions
*/
2008-04-28 22:49:59 +02:00
2012-06-24 19:32:19 +02:00
/**
* Make a basename working with all page code ( default PHP basenamed fails with cyrillic ) .
* We supose dir separator for input is '/' .
*
* @ param string $pathfile String to find basename .
* @ return string Basename of input
*/
function dol_basename ( $pathfile )
{
2019-01-27 11:55:16 +01:00
return preg_replace ( '/^.*\/([^\/]+)$/' , '$1' , rtrim ( $pathfile , '/' ));
2012-06-24 19:32:19 +02:00
}
2011-06-01 16:05:08 +02:00
2008-04-29 23:13:49 +02:00
/**
2010-10-03 17:42:01 +02:00
* Scan a directory and return a list of files / directories .
* Content for string is UTF8 and dir separator is " / " .
2011-12-17 01:16:33 +01:00
*
2016-12-13 00:15:21 +01:00
* @ param string $path Starting path from which to search . This is a full path .
2014-04-23 15:53:45 +02:00
* @ param string $types Can be " directories " , " files " , or " all "
* @ param int $recursive Determines whether subdirectories are searched
2017-06-01 12:11:45 +02:00
* @ param string $filter Regex filter to restrict list . This regex value must be escaped for '/' by doing preg_quote ( $var , '/' ), since this char is used for preg_match function ,
2017-05-11 13:01:49 +02:00
* but must not contains the start and end '/' . Filter is checked into basename only .
2017-11-19 16:26:39 +01:00
* @ param array $excludefilter Array of Regex for exclude filter ( example : array ( '(\.meta|_preview.*\.png)$' , '^\.' )) . Exclude is checked both into fullpath and into basename ( So '^xxx' may exclude 'xxx/dirscanned/...' and dirscanned / xxx ' ) .
2017-10-16 08:52:00 +02:00
* @ param string $sortcriteria Sort criteria ( '' , 'fullname' , 'relativename' , 'name' , 'date' , 'size' )
2014-04-23 15:53:45 +02:00
* @ param string $sortorder Sort order ( SORT_ASC , SORT_DESC )
* @ param int $mode 0 = Return array minimum keys loaded ( faster ), 1 = Force all keys like date and size to be loaded ( slower ), 2 = Force load of date only , 3 = Force load of size only
* @ param int $nohook Disable all hooks
2017-07-17 10:26:36 +02:00
* @ param string $relativename For recursive purpose only . Must be " " at first call .
2018-03-03 11:22:15 +01:00
* @ param string $donotfollowsymlinks Do not follow symbolic links
2016-12-13 00:15:21 +01:00
* @ return array Array of array ( 'name' => 'xxx' , 'fullname' => '/abc/xxx' , 'date' => 'yyy' , 'size' => 99 , 'type' => 'dir|file' , ... )
2019-03-11 01:01:15 +01:00
* @ see dol_dir_list_in_database ()
2008-04-29 23:13:49 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_dir_list ( $path , $types = " all " , $recursive = 0 , $filter = " " , $excludefilter = null , $sortcriteria = " name " , $sortorder = SORT_ASC , $mode = 0 , $nohook = 0 , $relativename = " " , $donotfollowsymlinks = 0 )
2008-04-29 23:13:49 +02:00
{
2012-09-05 10:17:02 +02:00
global $db , $hookmanager ;
2012-09-11 17:01:54 +02:00
global $object ;
2012-09-05 10:17:02 +02:00
2012-07-13 10:15:47 +02:00
dol_syslog ( " files.lib.php::dol_dir_list path= " . $path . " types= " . $types . " recursive= " . $recursive . " filter= " . $filter . " excludefilter= " . json_encode ( $excludefilter ));
2012-10-03 20:10:29 +02:00
//print 'xxx'."files.lib.php::dol_dir_list path=".$path." types=".$types." recursive=".$recursive." filter=".$filter." excludefilter=".json_encode($excludefilter);
2008-04-29 23:13:49 +02:00
2010-10-03 17:42:01 +02:00
$loaddate = ( $mode == 1 || $mode == 2 ) ? true : false ;
$loadsize = ( $mode == 1 || $mode == 3 ) ? true : false ;
2009-02-24 23:52:55 +01:00
2008-04-29 23:13:49 +02:00
// Clean parameters
2019-01-27 11:55:16 +01:00
$path = preg_replace ( '/([\\/]+)$/i' , '' , $path );
2009-12-15 12:02:01 +01:00
$newpath = dol_osencode ( $path );
2009-02-24 23:52:55 +01:00
2017-02-27 02:04:47 +01:00
$reshook = 0 ;
$file_list = array ();
2017-06-01 12:11:45 +02:00
2017-06-09 00:27:19 +02:00
if ( is_object ( $hookmanager ) && ! $nohook )
2013-01-25 19:12:54 +01:00
{
2017-10-07 13:09:31 +02:00
$hookmanager -> resArray = array ();
2017-06-09 00:27:19 +02:00
2017-10-07 13:09:31 +02:00
$hookmanager -> initHooks ( array ( 'fileslib' ));
2012-09-17 19:32:45 +02:00
$parameters = array (
'path' => $newpath ,
'types' => $types ,
'recursive' => $recursive ,
'filter' => $filter ,
'excludefilter' => $excludefilter ,
'sortcriteria' => $sortcriteria ,
'sortorder' => $sortorder ,
'loaddate' => $loaddate ,
2015-07-14 15:52:51 +02:00
'loadsize' => $loadsize ,
'mode' => $mode
2012-09-17 19:32:45 +02:00
);
2017-02-27 02:04:47 +01:00
$reshook = $hookmanager -> executeHooks ( 'getDirList' , $parameters , $object );
2012-09-17 19:32:45 +02:00
}
2012-09-05 10:17:02 +02:00
2012-09-05 14:30:12 +02:00
// $hookmanager->resArray may contain array stacked by other modules
2017-02-27 02:04:47 +01:00
if ( empty ( $reshook ))
2008-04-29 23:13:49 +02:00
{
2012-09-07 17:23:16 +02:00
if ( ! is_dir ( $newpath )) return array ();
if ( $dir = opendir ( $newpath ))
{
$filedate = '' ;
$filesize = '' ;
2017-02-06 13:37:23 +01:00
while ( false !== ( $file = readdir ( $dir ))) // $file is always a basename (into directory $newpath)
2012-09-07 17:23:16 +02:00
{
if ( ! utf8_check ( $file )) $file = utf8_encode ( $file ); // To be sure data is stored in utf8 in memory
2017-11-19 16:26:39 +01:00
$fullpathfile = ( $newpath ? $newpath . '/' : '' ) . $file ;
2012-09-07 17:23:16 +02:00
$qualified = 1 ;
// Define excludefilterarray
$excludefilterarray = array ( '^\.' );
if ( is_array ( $excludefilter ))
{
2019-01-27 11:55:16 +01:00
$excludefilterarray = array_merge ( $excludefilterarray , $excludefilter );
2012-09-07 17:23:16 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $excludefilter ) $excludefilterarray [] = $excludefilter ;
2012-09-07 17:23:16 +02:00
// Check if file is qualified
foreach ( $excludefilterarray as $filt )
{
2017-11-19 16:26:39 +01:00
if ( preg_match ( '/' . $filt . '/i' , $file ) || preg_match ( '/' . $filt . '/i' , $fullpathfile )) {
2012-09-07 17:23:16 +02:00
$qualified = 0 ; break ;
}
}
2017-11-19 16:26:39 +01:00
//print $fullpathfile.' '.$file.' '.$qualified.'<br>';
2012-09-07 17:23:16 +02:00
if ( $qualified )
{
$isdir = is_dir ( dol_osencode ( $path . " / " . $file ));
// Check whether this is a file or directory and whether we're interested in that type
if ( $isdir && (( $types == " directories " ) || ( $types == " all " ) || $recursive ))
{
// Add entry into file_list array
if (( $types == " directories " ) || ( $types == " all " ))
{
if ( $loaddate || $sortcriteria == 'date' ) $filedate = dol_filemtime ( $path . " / " . $file );
if ( $loadsize || $sortcriteria == 'size' ) $filesize = dol_filesize ( $path . " / " . $file );
2019-01-27 11:55:16 +01:00
if ( ! $filter || preg_match ( '/' . $filter . '/i' , $file )) // We do not search key $filter into all $path, only into $file part
2012-09-07 17:23:16 +02:00
{
2019-01-27 11:55:16 +01:00
preg_match ( '/([^\/]+)\/[^\/]+$/' , $path . '/' . $file , $reg );
2013-07-14 00:40:22 +02:00
$level1name = ( isset ( $reg [ 1 ]) ? $reg [ 1 ] : '' );
2012-09-07 17:23:16 +02:00
$file_list [] = array (
" name " => $file ,
2014-10-27 03:24:45 +01:00
" path " => $path ,
2013-07-14 00:40:22 +02:00
" level1name " => $level1name ,
2017-07-17 10:26:36 +02:00
" relativename " => ( $relativename ? $relativename . '/' : '' ) . $file ,
2012-09-07 17:23:16 +02:00
" fullname " => $path . '/' . $file ,
" date " => $filedate ,
" size " => $filesize ,
" type " => 'dir'
);
}
}
// if we're in a directory and we want recursive behavior, call this function again
if ( $recursive )
{
2018-03-03 11:22:15 +01:00
if ( empty ( $donotfollowsymlinks ) || ! is_link ( $path . " / " . $file ))
{
//var_dump('eee '. $path."/".$file. ' '.is_dir($path."/".$file).' '.is_link($path."/".$file));
$file_list = array_merge ( $file_list , dol_dir_list ( $path . " / " . $file , $types , $recursive , $filter , $excludefilter , $sortcriteria , $sortorder , $mode , $nohook , ( $relativename != '' ? $relativename . '/' : '' ) . $file , $donotfollowsymlinks ));
}
2012-09-07 17:23:16 +02:00
}
}
2019-01-27 10:49:34 +01:00
elseif ( ! $isdir && (( $types == " files " ) || ( $types == " all " )))
2012-09-07 17:23:16 +02:00
{
// Add file into file_list array
if ( $loaddate || $sortcriteria == 'date' ) $filedate = dol_filemtime ( $path . " / " . $file );
if ( $loadsize || $sortcriteria == 'size' ) $filesize = dol_filesize ( $path . " / " . $file );
2019-01-27 11:55:16 +01:00
if ( ! $filter || preg_match ( '/' . $filter . '/i' , $file )) // We do not search key $filter into $path, only into $file
2012-09-07 17:23:16 +02:00
{
2019-01-27 11:55:16 +01:00
preg_match ( '/([^\/]+)\/[^\/]+$/' , $path . '/' . $file , $reg );
2013-07-14 00:40:22 +02:00
$level1name = ( isset ( $reg [ 1 ]) ? $reg [ 1 ] : '' );
2012-09-07 17:23:16 +02:00
$file_list [] = array (
" name " => $file ,
2014-10-27 03:24:45 +01:00
" path " => $path ,
2013-07-14 00:40:22 +02:00
" level1name " => $level1name ,
2017-07-17 10:26:36 +02:00
" relativename " => ( $relativename ? $relativename . '/' : '' ) . $file ,
2012-09-07 17:23:16 +02:00
" fullname " => $path . '/' . $file ,
" date " => $filedate ,
" size " => $filesize ,
" type " => 'file'
);
}
}
}
}
closedir ( $dir );
// Obtain a list of columns
2019-04-13 12:41:50 +02:00
if ( ! empty ( $sortcriteria ) && $sortorder )
2012-09-07 17:23:16 +02:00
{
2019-04-13 12:41:50 +02:00
$file_list = dol_sort_array ( $file_list , $sortcriteria , ( $sortorder == SORT_ASC ? 'asc' : 'desc' ));
2012-09-07 17:23:16 +02:00
}
2012-09-05 10:17:02 +02:00
}
2008-04-29 23:13:49 +02:00
}
2017-06-01 12:11:45 +02:00
2017-06-09 00:27:19 +02:00
if ( is_object ( $hookmanager ) && is_array ( $hookmanager -> resArray )) $file_list = array_merge ( $file_list , $hookmanager -> resArray );
2017-06-01 12:11:45 +02:00
2017-02-27 02:04:47 +01:00
return $file_list ;
2008-04-29 23:13:49 +02:00
}
2015-08-25 17:05:08 +02:00
2016-12-13 00:15:21 +01:00
/**
* Scan a directory and return a list of files / directories .
* Content for string is UTF8 and dir separator is " / " .
*
2016-12-31 16:16:20 +01:00
* @ param string $path Starting path from which to search . Example : 'produit/MYPROD'
2016-12-13 00:15:21 +01:00
* @ param string $filter Regex filter to restrict list . This regex value must be escaped for '/' , since this char is used for preg_match function
2017-04-12 11:30:33 +02:00
* @ param array | null $excludefilter Array of Regex for exclude filter ( example : array ( '(\.meta|_preview.*\.png)$' , '^\.' ))
2016-12-13 00:15:21 +01:00
* @ param string $sortcriteria Sort criteria ( " " , " fullname " , " name " , " date " , " size " )
* @ param string $sortorder Sort order ( SORT_ASC , SORT_DESC )
* @ param int $mode 0 = Return array minimum keys loaded ( faster ), 1 = Force all keys like description
* @ return array Array of array ( 'name' => 'xxx' , 'fullname' => '/abc/xxx' , 'type' => 'dir|file' , ... )
2019-03-11 01:01:15 +01:00
* @ see dol_dir_list ()
2016-12-13 00:15:21 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_dir_list_in_database ( $path , $filter = " " , $excludefilter = null , $sortcriteria = " name " , $sortorder = SORT_ASC , $mode = 0 )
2016-12-13 00:15:21 +01:00
{
2017-10-07 13:09:31 +02:00
global $conf , $db ;
2018-02-13 13:55:36 +01:00
$sql = " SELECT rowid, label, entity, filename, filepath, fullpath_orig, keywords, cover, gen_or_uploaded, extraparams, date_c, date_m, fk_user_c, fk_user_m, " ;
$sql .= " acl, position, share " ;
2017-10-07 13:09:31 +02:00
if ( $mode ) $sql .= " , description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " ecm_files " ;
$sql .= " WHERE filepath = ' " . $db -> escape ( $path ) . " ' " ;
$sql .= " AND entity = " . $conf -> entity ;
$resql = $db -> query ( $sql );
if ( $resql )
{
$file_list = array ();
$num = $db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num )
{
$obj = $db -> fetch_object ( $resql );
if ( $obj )
{
2019-01-27 11:55:16 +01:00
preg_match ( '/([^\/]+)\/[^\/]+$/' , DOL_DATA_ROOT . '/' . $obj -> filepath . '/' . $obj -> filename , $reg );
2017-10-07 13:09:31 +02:00
$level1name = ( isset ( $reg [ 1 ]) ? $reg [ 1 ] : '' );
$file_list [] = array (
" rowid " => $obj -> rowid ,
" label " => $obj -> label , // md5
" name " => $obj -> filename ,
" path " => DOL_DATA_ROOT . '/' . $obj -> filepath ,
" level1name " => $level1name ,
" fullname " => DOL_DATA_ROOT . '/' . $obj -> filepath . '/' . $obj -> filename ,
" fullpath_orig " => $obj -> fullpath_orig ,
" date_c " => $db -> jdate ( $obj -> date_c ),
" date_m " => $db -> jdate ( $obj -> date_m ),
" type " => 'file' ,
" keywords " => $obj -> keywords ,
" cover " => $obj -> cover ,
" position " => ( int ) $obj -> position ,
2018-02-13 13:55:36 +01:00
" acl " => $obj -> acl ,
" share " => $obj -> share
2017-10-07 13:09:31 +02:00
);
}
$i ++ ;
}
// Obtain a list of columns
if ( ! empty ( $sortcriteria ))
{
$myarray = array ();
foreach ( $file_list as $key => $row )
{
$myarray [ $key ] = ( isset ( $row [ $sortcriteria ]) ? $row [ $sortcriteria ] : '' );
}
// Sort the data
if ( $sortorder ) array_multisort ( $myarray , $sortorder , $file_list );
}
return $file_list ;
}
else
{
dol_print_error ( $db );
return array ();
}
2016-12-13 00:15:21 +01:00
}
2017-06-01 12:11:45 +02:00
2016-12-13 00:15:21 +01:00
2017-08-18 16:10:21 +02:00
/**
* Complete $filearray with data from database .
* This will call doldir_list_indatabase to complate filearray .
2017-08-21 00:40:32 +02:00
*
2018-03-08 16:34:16 +01:00
* @ param array $filearray Array of files get using dol_dir_list
2017-08-22 09:47:33 +02:00
* @ param string $relativedir Relative dir from DOL_DATA_ROOT
2017-08-18 16:10:21 +02:00
* @ return void
*/
function completeFileArrayWithDatabaseInfo ( & $filearray , $relativedir )
{
2018-03-08 16:33:51 +01:00
global $conf , $db , $user ;
2017-08-21 00:40:32 +02:00
2017-08-18 16:10:21 +02:00
$filearrayindatabase = dol_dir_list_in_database ( $relativedir , '' , null , 'name' , SORT_ASC );
2018-03-08 16:33:51 +01:00
// TODO Remove this when PRODUCT_USE_OLD_PATH_FOR_PHOTO will be removed
global $modulepart ;
if ( $modulepart == 'produit' && ! empty ( $conf -> global -> PRODUCT_USE_OLD_PATH_FOR_PHOTO )) {
global $object ;
if ( ! empty ( $object -> id ))
{
2019-01-27 11:55:16 +01:00
if ( ! empty ( $conf -> product -> enabled )) $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 " ;
else $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 " ;
2018-03-08 16:33:51 +01:00
2019-01-27 11:55:16 +01:00
$relativedirold = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $upload_dirold );
$relativedirold = preg_replace ( '/^[\\/]/' , '' , $relativedirold );
2018-03-08 16:33:51 +01:00
$filearrayindatabase = array_merge ( $filearrayindatabase , dol_dir_list_in_database ( $relativedirold , '' , null , 'name' , SORT_ASC ));
}
}
2017-08-18 16:10:21 +02:00
//var_dump($filearray);
//var_dump($filearrayindatabase);
// Complete filearray with properties found into $filearrayindatabase
foreach ( $filearray as $key => $val )
{
$found = 0 ;
// Search if it exists into $filearrayindatabase
foreach ( $filearrayindatabase as $key2 => $val2 )
{
if ( $filearrayindatabase [ $key2 ][ 'name' ] == $filearray [ $key ][ 'name' ])
{
$filearray [ $key ][ 'position_name' ] = ( $filearrayindatabase [ $key2 ][ 'position' ] ? $filearrayindatabase [ $key2 ][ 'position' ] : '0' ) . '_' . $filearrayindatabase [ $key2 ][ 'name' ];
$filearray [ $key ][ 'position' ] = $filearrayindatabase [ $key2 ][ 'position' ];
$filearray [ $key ][ 'cover' ] = $filearrayindatabase [ $key2 ][ 'cover' ];
$filearray [ $key ][ 'acl' ] = $filearrayindatabase [ $key2 ][ 'acl' ];
$filearray [ $key ][ 'rowid' ] = $filearrayindatabase [ $key2 ][ 'rowid' ];
$filearray [ $key ][ 'label' ] = $filearrayindatabase [ $key2 ][ 'label' ];
2018-02-13 13:55:36 +01:00
$filearray [ $key ][ 'share' ] = $filearrayindatabase [ $key2 ][ 'share' ];
2017-08-18 16:10:21 +02:00
$found = 1 ;
break ;
}
}
if ( ! $found ) // This happen in transition toward version 6, or if files were added manually into os dir.
{
$filearray [ $key ][ 'position' ] = '999999' ; // File not indexed are at end. So if we add a file, it will not replace an existing position
$filearray [ $key ][ 'cover' ] = 0 ;
$filearray [ $key ][ 'acl' ] = '' ;
2019-01-27 11:55:16 +01:00
$rel_filename = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $filearray [ $key ][ 'fullname' ]);
2017-08-18 23:16:40 +02:00
if ( ! preg_match ( '/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/' , $rel_filetorenameafter )) // If not a tmp file
2017-08-18 16:10:21 +02:00
{
dol_syslog ( " list_of_documents We found a file called ' " . $filearray [ $key ][ 'name' ] . " ' not indexed into database. We add it " );
include_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php' ;
$ecmfile = new EcmFiles ( $db );
// Add entry into database
$filename = basename ( $rel_filename );
$rel_dir = dirname ( $rel_filename );
$rel_dir = preg_replace ( '/[\\/]$/' , '' , $rel_dir );
$rel_dir = preg_replace ( '/^[\\/]/' , '' , $rel_dir );
$ecmfile -> filepath = $rel_dir ;
$ecmfile -> filename = $filename ;
$ecmfile -> label = md5_file ( dol_osencode ( $filearray [ $key ][ 'fullname' ])); // $destfile is a full path to file
$ecmfile -> fullpath_orig = $filearray [ $key ][ 'fullname' ];
$ecmfile -> gen_or_uploaded = 'unknown' ;
$ecmfile -> description = '' ; // indexed content
$ecmfile -> keyword = '' ; // keyword content
$result = $ecmfile -> create ( $user );
if ( $result < 0 )
{
setEventMessages ( $ecmfile -> error , $ecmfile -> errors , 'warnings' );
}
else
{
$filearray [ $key ][ 'rowid' ] = $result ;
}
}
else
{
$filearray [ $key ][ 'rowid' ] = 0 ; // Should not happened
}
}
}
/*var_dump($filearray);*/
}
2008-04-29 23:13:49 +02:00
/**
2010-07-28 00:38:28 +02:00
* Fast compare of 2 files identified by their properties -> name , -> date and -> size
2011-12-17 01:16:33 +01:00
*
2011-11-12 12:59:06 +01:00
* @ param string $a File 1
* @ param string $b File 2
* @ return int 1 , 0 , 1
2008-04-29 23:13:49 +02:00
*/
2008-04-28 22:49:59 +02:00
function dol_compare_file ( $a , $b )
{
global $sortorder ;
global $sortfield ;
2009-02-24 23:52:55 +01:00
2008-04-28 22:49:59 +02:00
$sortorder = strtoupper ( $sortorder );
2009-02-24 23:52:55 +01:00
2008-04-28 22:49:59 +02:00
if ( $sortorder == 'ASC' ) { $retup =- 1 ; $retdown = 1 ; }
else { $retup = 1 ; $retdown =- 1 ; }
2009-02-24 23:52:55 +01:00
2008-04-28 22:49:59 +02:00
if ( $sortfield == 'name' )
{
if ( $a -> name == $b -> name ) return 0 ;
return ( $a -> name < $b -> name ) ? $retup : $retdown ;
}
if ( $sortfield == 'date' )
{
if ( $a -> date == $b -> date ) return 0 ;
return ( $a -> date < $b -> date ) ? $retup : $retdown ;
}
if ( $sortfield == 'size' )
{
if ( $a -> size == $b -> size ) return 0 ;
return ( $a -> size < $b -> size ) ? $retup : $retdown ;
}
}
2008-11-16 02:09:04 +01:00
2010-08-21 17:30:17 +02:00
/**
2011-11-12 12:59:06 +01:00
* Test if filename is a directory
2011-08-26 19:59:14 +02:00
*
2011-11-12 12:59:06 +01:00
* @ param string $folder Name of folder
* @ return boolean True if it ' s a directory , False if not found
2010-08-21 17:30:17 +02:00
*/
function dol_is_dir ( $folder )
{
2017-10-07 13:09:31 +02:00
$newfolder = dol_osencode ( $folder );
if ( is_dir ( $newfolder )) return true ;
else return false ;
2010-08-21 17:30:17 +02:00
}
2019-03-10 19:33:28 +01:00
/**
* Return if path is empty
*
* @ param string $dir Path of Directory
* @ return boolean True or false
*/
2019-03-11 01:01:15 +01:00
function dol_is_dir_empty ( $dir )
{
2019-03-10 19:33:28 +01:00
if ( ! is_readable ( $dir )) return false ;
return ( count ( scandir ( $dir )) == 2 );
}
2010-09-29 15:14:48 +02:00
/**
* Return if path is a file
2011-08-26 19:59:14 +02:00
*
2011-11-12 12:59:06 +01:00
* @ param string $pathoffile Path of file
* @ return boolean True or false
2010-09-29 15:14:48 +02:00
*/
function dol_is_file ( $pathoffile )
{
2017-10-07 13:09:31 +02:00
$newpathoffile = dol_osencode ( $pathoffile );
return is_file ( $newpathoffile );
2010-09-29 15:14:48 +02:00
}
2010-08-21 17:30:17 +02:00
2018-04-25 17:59:05 +02:00
/**
* Return if path is a symbolic link
*
* @ param string $pathoffile Path of file
* @ return boolean True or false
*/
function dol_is_link ( $pathoffile )
{
$newpathoffile = dol_osencode ( $pathoffile );
return is_link ( $newpathoffile );
}
2011-08-26 19:59:14 +02:00
/**
* Return if path is an URL
*
2011-11-12 12:59:06 +01:00
* @ param string $url Url
* @ return boolean True or false
2011-08-26 19:59:14 +02:00
*/
function dol_is_url ( $url )
{
2017-10-07 13:09:31 +02:00
$tmpprot = array ( 'file' , 'http' , 'https' , 'ftp' , 'zlib' , 'data' , 'ssh' , 'ssh2' , 'ogg' , 'expect' );
foreach ( $tmpprot as $prot )
{
2019-01-27 11:55:16 +01:00
if ( preg_match ( '/^' . $prot . ':/i' , $url )) return true ;
2017-10-07 13:09:31 +02:00
}
return false ;
2011-08-26 19:59:14 +02:00
}
2008-11-16 02:09:04 +01:00
/**
2010-09-29 15:14:48 +02:00
* Test if a folder is empty
2011-08-26 19:59:14 +02:00
*
2011-11-12 12:59:06 +01:00
* @ param string $folder Name of folder
* @ return boolean True if dir is empty or non - existing , False if it contains files
2008-11-16 02:09:04 +01:00
*/
function dol_dir_is_emtpy ( $folder )
{
2009-12-15 12:02:01 +01:00
$newfolder = dol_osencode ( $folder );
2009-10-04 17:52:16 +02:00
if ( is_dir ( $newfolder ))
2008-11-16 02:09:04 +01:00
{
2009-10-04 17:52:16 +02:00
$handle = opendir ( $newfolder );
2017-10-07 13:09:31 +02:00
$folder_content = '' ;
2012-02-04 14:39:47 +01:00
while (( gettype ( $name = readdir ( $handle )) != " boolean " ))
2009-10-04 17:52:16 +02:00
{
2008-11-16 02:09:04 +01:00
$name_array [] = $name ;
}
2009-10-04 17:52:16 +02:00
foreach ( $name_array as $temp ) $folder_content .= $temp ;
2008-11-16 02:09:04 +01:00
2017-10-07 13:09:31 +02:00
closedir ( $handle );
2013-11-08 14:42:28 +01:00
2009-10-04 17:52:16 +02:00
if ( $folder_content == " ... " ) return true ;
else return false ;
2008-11-16 02:09:04 +01:00
}
else
2009-10-04 14:16:45 +02:00
return true ; // Dir does not exists
2008-11-16 02:09:04 +01:00
}
2009-09-30 18:02:54 +02:00
/**
2010-09-29 15:14:48 +02:00
* Count number of lines in a file
2011-12-17 01:16:33 +01:00
*
2011-11-12 12:59:06 +01:00
* @ param string $file Filename
* @ return int < 0 if KO , Number of lines in files if OK
2019-03-11 01:01:15 +01:00
* @ see dol_nboflines ()
2009-09-30 18:02:54 +02:00
*/
function dol_count_nb_of_line ( $file )
{
$nb = 0 ;
2009-10-04 17:52:16 +02:00
2009-12-15 12:02:01 +01:00
$newfile = dol_osencode ( $file );
2009-09-30 18:02:54 +02:00
//print 'x'.$file;
2019-01-27 11:55:16 +01:00
$fp = fopen ( $newfile , 'r' );
2009-09-30 18:02:54 +02:00
if ( $fp )
{
2009-10-04 17:52:16 +02:00
while ( ! feof ( $fp ))
{
$line = fgets ( $fp );
2017-10-07 13:09:31 +02:00
// We increase count only if read was success. We need test because feof return true only after fgets so we do n+1 fgets for a file with n lines.
2012-01-20 10:09:19 +01:00
if ( ! $line === false ) $nb ++ ;
2009-10-04 17:52:16 +02:00
}
fclose ( $fp );
2009-09-30 18:02:54 +02:00
}
else
{
$nb =- 1 ;
}
return $nb ;
}
2009-10-04 19:18:09 +02:00
/**
* Return size of a file
2011-12-17 01:16:33 +01:00
*
2013-11-07 21:24:01 +01:00
* @ param string $pathoffile Path of file
2015-04-06 12:25:30 +02:00
* @ return integer File size
2019-08-12 22:19:24 +02:00
* @ see dol_print_size ()
2009-10-04 19:18:09 +02:00
*/
function dol_filesize ( $pathoffile )
{
2009-12-15 12:02:01 +01:00
$newpathoffile = dol_osencode ( $pathoffile );
2009-10-13 23:46:09 +02:00
return filesize ( $newpathoffile );
2009-10-04 19:18:09 +02:00
}
/**
* Return time of a file
2011-12-17 01:16:33 +01:00
*
2011-11-12 12:59:06 +01:00
* @ param string $pathoffile Path of file
2013-11-07 21:12:11 +01:00
* @ return int Time of file
2009-10-04 19:18:09 +02:00
*/
2009-10-04 20:01:30 +02:00
function dol_filemtime ( $pathoffile )
2009-10-04 19:18:09 +02:00
{
2009-12-15 12:02:01 +01:00
$newpathoffile = dol_osencode ( $pathoffile );
2011-06-10 22:32:22 +02:00
return @ filemtime ( $newpathoffile ); // @Is to avoid errors if files does not exists
2009-10-04 19:18:09 +02:00
}
2010-02-10 18:44:25 +01:00
2017-05-11 13:01:49 +02:00
/**
* Make replacement of strings into a file .
*
2019-03-17 19:33:25 +01:00
* @ param string $srcfile Source file ( can ' t be a directory )
* @ param array $arrayreplacement Array with strings to replace . Example : array ( 'valuebefore' => 'valueafter' , ... )
* @ param string $destfile Destination file ( can ' t be a directory ) . If empty , will be same than source file .
* @ param int $newmask Mask for new file ( 0 by default means $conf -> global -> MAIN_UMASK ) . Example : '0666'
* @ param int $indexdatabase 1 = index new file into database .
* @ param int $arrayreplacementisregex 1 = Array of replacement is regex
* @ return int < 0 if error , 0 if nothing done ( dest file already exists ), > 0 if OK
* @ see dol_copy ()
2017-05-11 13:01:49 +02:00
*/
2019-03-17 19:33:25 +01:00
function dolReplaceInFile ( $srcfile , $arrayreplacement , $destfile = '' , $newmask = 0 , $indexdatabase = 0 , $arrayreplacementisregex = 0 )
2017-05-11 13:01:49 +02:00
{
2017-10-07 13:09:31 +02:00
global $conf ;
2017-05-11 13:01:49 +02:00
2019-03-17 19:33:25 +01:00
dol_syslog ( " files.lib.php::dolReplaceInFile srcfile= " . $srcfile . " destfile= " . $destfile . " newmask= " . $newmask . " indexdatabase= " . $indexdatabase . " arrayreplacementisregex= " . $arrayreplacementisregex );
2017-05-11 13:01:49 +02:00
2017-10-07 13:09:31 +02:00
if ( empty ( $srcfile )) return - 1 ;
if ( empty ( $destfile )) $destfile = $srcfile ;
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
$destexists = dol_is_file ( $destfile );
if (( $destfile != $srcfile ) && $destexists ) return 0 ;
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
$tmpdestfile = $destfile . '.tmp' ;
2017-05-11 13:01:49 +02:00
2017-10-07 13:09:31 +02:00
$newpathofsrcfile = dol_osencode ( $srcfile );
$newpathoftmpdestfile = dol_osencode ( $tmpdestfile );
$newpathofdestfile = dol_osencode ( $destfile );
$newdirdestfile = dirname ( $newpathofdestfile );
2017-05-11 13:01:49 +02:00
2017-10-07 13:09:31 +02:00
if ( $destexists && ! is_writable ( $newpathofdestfile ))
{
dol_syslog ( " files.lib.php::dolReplaceInFile failed Permission denied to overwrite target file " , LOG_WARNING );
return - 1 ;
}
if ( ! is_writable ( $newdirdestfile ))
{
dol_syslog ( " files.lib.php::dolReplaceInFile failed Permission denied to write into target directory " . $newdirdestfile , LOG_WARNING );
return - 2 ;
}
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
dol_delete_file ( $tmpdestfile );
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
// Create $newpathoftmpdestfile from $newpathofsrcfile
2018-08-16 21:48:16 +02:00
$content = file_get_contents ( $newpathofsrcfile , 'r' );
2017-06-01 12:11:45 +02:00
2019-03-17 19:33:25 +01:00
if ( empty ( $arrayreplacementisregex ))
{
2019-10-20 11:17:54 +02:00
$content = make_substitutions ( $content , $arrayreplacement , null );
2019-03-17 19:33:25 +01:00
}
else
{
foreach ( $arrayreplacement as $key => $value )
{
$content = preg_replace ( $key , $value , $content );
}
}
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
file_put_contents ( $newpathoftmpdestfile , $content );
@ chmod ( $newpathoftmpdestfile , octdec ( $newmask ));
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
// Rename
$result = dol_move ( $newpathoftmpdestfile , $newpathofdestfile , $newmask , (( $destfile == $srcfile ) ? 1 : 0 ), 0 , $indexdatabase );
if ( ! $result )
{
dol_syslog ( " files.lib.php::dolReplaceInFile failed to move tmp file to final dest " , LOG_WARNING );
return - 3 ;
}
if ( empty ( $newmask ) && ! empty ( $conf -> global -> MAIN_UMASK )) $newmask = $conf -> global -> MAIN_UMASK ;
if ( empty ( $newmask )) // This should no happen
{
dol_syslog ( " Warning: dolReplaceInFile called with empty value for newmask and no default value defined " , LOG_WARNING );
$newmask = '0664' ;
}
2017-05-11 13:01:49 +02:00
2017-10-07 13:09:31 +02:00
@ chmod ( $newpathofdestfile , octdec ( $newmask ));
2017-05-11 13:01:49 +02:00
2017-10-07 13:09:31 +02:00
return 1 ;
2017-05-11 13:01:49 +02:00
}
2017-07-22 01:00:43 +02:00
2009-12-15 21:45:21 +01:00
/**
2012-02-05 19:37:52 +01:00
* Copy a file to another file .
2012-02-04 14:39:47 +01:00
*
* @ param string $srcfile Source file ( can ' t be a directory )
* @ param string $destfile Destination file ( can ' t be a directory )
2015-04-03 23:42:56 +02:00
* @ param int $newmask Mask for new file ( 0 by default means $conf -> global -> MAIN_UMASK ) . Example : '0666'
2012-02-04 14:39:47 +01:00
* @ param int $overwriteifexists Overwrite file if exists ( 1 by default )
2012-02-05 19:37:52 +01:00
* @ return int < 0 if error , 0 if nothing done ( dest file already exists and overwriteifexists = 0 ), > 0 if OK
2019-03-11 01:01:15 +01:00
* @ see dol_delete_file () dolCopyDir ()
2009-12-15 21:45:21 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_copy ( $srcfile , $destfile , $newmask = 0 , $overwriteifexists = 1 )
2009-12-15 21:45:21 +01:00
{
2010-02-13 22:26:52 +01:00
global $conf ;
2012-12-29 12:16:45 +01:00
dol_syslog ( " files.lib.php::dol_copy srcfile= " . $srcfile . " destfile= " . $destfile . " newmask= " . $newmask . " overwriteifexists= " . $overwriteifexists );
2015-04-03 23:42:56 +02:00
if ( empty ( $srcfile ) || empty ( $destfile )) return - 1 ;
2012-02-05 19:37:52 +01:00
$destexists = dol_is_file ( $destfile );
if ( ! $overwriteifexists && $destexists ) return 0 ;
$newpathofsrcfile = dol_osencode ( $srcfile );
2017-10-07 13:09:31 +02:00
$newpathofdestfile = dol_osencode ( $destfile );
$newdirdestfile = dirname ( $newpathofdestfile );
if ( $destexists && ! is_writable ( $newpathofdestfile ))
{
dol_syslog ( " files.lib.php::dol_copy failed Permission denied to overwrite target file " , LOG_WARNING );
return - 1 ;
}
if ( ! is_writable ( $newdirdestfile ))
{
dol_syslog ( " files.lib.php::dol_copy failed Permission denied to write into target directory " . $newdirdestfile , LOG_WARNING );
return - 2 ;
}
// Copy with overwriting if exists
$result =@ copy ( $newpathofsrcfile , $newpathofdestfile );
2012-02-05 19:37:52 +01:00
//$result=copy($newpathofsrcfile, $newpathofdestfile); // To see errors, remove @
if ( ! $result )
2010-03-21 21:29:29 +01:00
{
2017-10-07 13:09:31 +02:00
dol_syslog ( " files.lib.php::dol_copy failed to copy " , LOG_WARNING );
return - 3 ;
2010-03-21 21:29:29 +01:00
}
2012-02-05 19:37:52 +01:00
if ( empty ( $newmask ) && ! empty ( $conf -> global -> MAIN_UMASK )) $newmask = $conf -> global -> MAIN_UMASK ;
2014-04-02 13:17:20 +02:00
if ( empty ( $newmask )) // This should no happen
{
dol_syslog ( " Warning: dol_copy called with empty value for newmask and no default value defined " , LOG_WARNING );
2014-04-30 13:50:25 +02:00
$newmask = '0664' ;
2014-04-02 13:17:20 +02:00
}
2014-04-30 13:50:25 +02:00
2012-02-05 19:37:52 +01:00
@ chmod ( $newpathofdestfile , octdec ( $newmask ));
2010-02-13 22:26:52 +01:00
2012-02-05 19:37:52 +01:00
return 1 ;
2009-12-15 21:45:21 +01:00
}
2009-10-04 19:18:09 +02:00
2015-04-03 23:42:56 +02:00
/**
2017-08-21 00:40:32 +02:00
* Copy a dir to another dir . This include recursive subdirectories .
2015-04-03 23:42:56 +02:00
*
* @ param string $srcfile Source file ( a directory )
* @ param string $destfile Destination file ( a directory )
* @ param int $newmask Mask for new file ( 0 by default means $conf -> global -> MAIN_UMASK ) . Example : '0666'
* @ param int $overwriteifexists Overwrite file if exists ( 1 by default )
2017-05-28 14:43:17 +02:00
* @ param array $arrayreplacement Array to use to replace filenames with another one during the copy ( works only on file names , not on directory names ) .
* @ return int < 0 if error , 0 if nothing done ( all files already exists and overwriteifexists = 0 ), > 0 if OK
2019-03-11 01:01:15 +01:00
* @ see dol_copy ()
2015-04-03 23:42:56 +02:00
*/
2019-01-27 15:20:16 +01:00
function dolCopyDir ( $srcfile , $destfile , $newmask , $overwriteifexists , $arrayreplacement = null )
2015-04-03 23:42:56 +02:00
{
global $conf ;
$result = 0 ;
2017-02-11 15:40:25 +01:00
dol_syslog ( " files.lib.php::dolCopyDir srcfile= " . $srcfile . " destfile= " . $destfile . " newmask= " . $newmask . " overwriteifexists= " . $overwriteifexists );
2015-04-03 23:42:56 +02:00
if ( empty ( $srcfile ) || empty ( $destfile )) return - 1 ;
$destexists = dol_is_dir ( $destfile );
2017-05-30 01:32:36 +02:00
//if (! $overwriteifexists && $destexists) return 0; // The overwriteifexists is for files only, so propagated to dol_copy only.
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
if ( ! $destexists )
{
// We must set mask just before creating dir, becaause it can be set differently by dol_copy
umask ( 0 );
$dirmaskdec = octdec ( $newmask );
if ( empty ( $newmask ) && ! empty ( $conf -> global -> MAIN_UMASK )) $dirmaskdec = octdec ( $conf -> global -> MAIN_UMASK );
$dirmaskdec |= octdec ( '0200' ); // Set w bit required to be able to create content for recursive subdirs files
dol_mkdir ( $destfile , '' , decoct ( $dirmaskdec ));
}
2017-06-01 12:11:45 +02:00
2017-05-28 14:43:17 +02:00
$ossrcfile = dol_osencode ( $srcfile );
$osdestfile = dol_osencode ( $destfile );
2015-04-03 23:42:56 +02:00
2017-10-07 13:09:31 +02:00
// Recursive function to copy all subdirectories and contents:
2017-05-28 14:43:17 +02:00
if ( is_dir ( $ossrcfile ))
2015-04-03 23:42:56 +02:00
{
2017-10-07 13:09:31 +02:00
$dir_handle = opendir ( $ossrcfile );
while ( $file = readdir ( $dir_handle ))
{
if ( $file != " . " && $file != " .. " && ! is_link ( $ossrcfile . " / " . $file ))
{
if ( is_dir ( $ossrcfile . " / " . $file ))
{
//var_dump("xxx dolCopyDir $srcfile/$file, $destfile/$file, $newmask, $overwriteifexists");
$tmpresult = dolCopyDir ( $srcfile . " / " . $file , $destfile . " / " . $file , $newmask , $overwriteifexists , $arrayreplacement );
}
else
2015-04-03 23:42:56 +02:00
{
2017-05-28 14:43:17 +02:00
$newfile = $file ;
// Replace destination filename with a new one
if ( is_array ( $arrayreplacement ))
{
foreach ( $arrayreplacement as $key => $val )
{
$newfile = str_replace ( $key , $val , $newfile );
}
}
2017-10-07 13:09:31 +02:00
$tmpresult = dol_copy ( $srcfile . " / " . $file , $destfile . " / " . $newfile , $newmask , $overwriteifexists );
}
// Set result
if ( $result > 0 && $tmpresult >= 0 )
{
// Do nothing, so we don't set result to 0 if tmpresult is 0 and result was success in a previous pass
}
else
{
$result = $tmpresult ;
}
if ( $result < 0 ) break ;
}
}
closedir ( $dir_handle );
}
else
2015-04-03 23:42:56 +02:00
{
2017-05-28 14:43:17 +02:00
// Source directory does not exists
2017-10-07 13:09:31 +02:00
$result = - 2 ;
}
2015-04-03 23:42:56 +02:00
2017-10-07 13:09:31 +02:00
return $result ;
2015-04-03 23:42:56 +02:00
}
2010-10-03 18:59:24 +02:00
/**
2012-09-07 10:30:02 +02:00
* Move a file into another name .
2017-06-01 12:11:45 +02:00
* Note :
2017-05-21 14:06:43 +02:00
* - This function differs from dol_move_uploaded_file , because it can be called in any context .
2017-08-18 16:10:21 +02:00
* - Database indexes for files are updated .
2017-06-01 12:11:45 +02:00
* - Test on antivirus is done only if param testvirus is provided and an antivirus was set .
2011-12-17 01:16:33 +01:00
*
2015-04-03 23:42:56 +02:00
* @ param string $srcfile Source file ( can ' t be a directory . use native php @ rename () to move a directory )
* @ param string $destfile Destination file ( can ' t be a directory . use native php @ rename () to move a directory )
2015-10-14 23:50:36 +02:00
* @ param integer $newmask Mask in octal string for new file ( 0 by default means $conf -> global -> MAIN_UMASK )
2011-11-12 12:59:06 +01:00
* @ param int $overwriteifexists Overwrite file if exists ( 1 by default )
2017-05-21 18:30:43 +02:00
* @ param int $testvirus Do an antivirus test . Move is canceled if a virus is found .
2017-05-28 14:43:17 +02:00
* @ param int $indexdatabase Index new file into database .
2011-11-12 12:59:06 +01:00
* @ return boolean True if OK , false if KO
2019-03-11 01:01:15 +01:00
* @ see dol_move_uploaded_file ()
2010-10-03 18:59:24 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_move ( $srcfile , $destfile , $newmask = 0 , $overwriteifexists = 1 , $testvirus = 0 , $indexdatabase = 1 )
2010-10-03 18:59:24 +02:00
{
2017-10-07 13:09:31 +02:00
global $user , $db , $conf ;
$result = false ;
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
dol_syslog ( " files.lib.php::dol_move srcfile= " . $srcfile . " destfile= " . $destfile . " newmask= " . $newmask . " overwritifexists= " . $overwriteifexists );
$srcexists = dol_is_file ( $srcfile );
$destexists = dol_is_file ( $destfile );
if ( ! $srcexists )
{
dol_syslog ( " files.lib.php::dol_move srcfile does not exists. we ignore the move request. " );
return false ;
}
if ( $overwriteifexists || ! $destexists )
{
$newpathofsrcfile = dol_osencode ( $srcfile );
$newpathofdestfile = dol_osencode ( $destfile );
// Check virus
$testvirusarray = array ();
if ( $testvirus )
{
$testvirusarray = dolCheckVirus ( $newpathofsrcfile );
if ( count ( $testvirusarray ))
{
dol_syslog ( " files.lib.php::dol_move canceled because a virus was found into source file. we ignore the move request. " , LOG_WARNING );
return false ;
}
}
$result =@ rename ( $newpathofsrcfile , $newpathofdestfile ); // To see errors, remove @
if ( ! $result )
{
if ( $destexists )
{
dol_syslog ( " files.lib.php::dol_move Failed. We try to delete target first and move after. " , LOG_WARNING );
// We force delete and try again. Rename function sometimes fails to replace dest file with some windows NTFS partitions.
dol_delete_file ( $destfile );
$result =@ rename ( $newpathofsrcfile , $newpathofdestfile ); // To see errors, remove @
}
else dol_syslog ( " files.lib.php::dol_move Failed. " , LOG_WARNING );
}
// Move ok
if ( $result && $indexdatabase )
{
// Rename entry into ecm database
2019-01-27 11:55:16 +01:00
$rel_filetorenamebefore = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $srcfile );
$rel_filetorenameafter = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $destfile );
2017-10-07 13:09:31 +02:00
if ( ! preg_match ( '/([\\/]temp[\\/]|[\\/]thumbs|\.meta$)/' , $rel_filetorenameafter )) // If not a tmp file
{
$rel_filetorenamebefore = preg_replace ( '/^[\\/]/' , '' , $rel_filetorenamebefore );
$rel_filetorenameafter = preg_replace ( '/^[\\/]/' , '' , $rel_filetorenameafter );
//var_dump($rel_filetorenamebefore.' - '.$rel_filetorenameafter);
dol_syslog ( " Try to rename also entries in database for full relative path before = " . $rel_filetorenamebefore . " after = " . $rel_filetorenameafter , LOG_DEBUG );
include_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php' ;
$ecmfiletarget = new EcmFiles ( $db );
$resultecmtarget = $ecmfiletarget -> fetch ( 0 , '' , $rel_filetorenameafter );
if ( $resultecmtarget > 0 ) // An entry for target name already exists for target, we delete it, a new one will be created.
{
$ecmfiletarget -> delete ( $user );
}
$ecmfile = new EcmFiles ( $db );
$resultecm = $ecmfile -> fetch ( 0 , '' , $rel_filetorenamebefore );
if ( $resultecm > 0 ) // If an entry was found for src file, we use it to move entry
{
$filename = basename ( $rel_filetorenameafter );
$rel_dir = dirname ( $rel_filetorenameafter );
$rel_dir = preg_replace ( '/[\\/]$/' , '' , $rel_dir );
$rel_dir = preg_replace ( '/^[\\/]/' , '' , $rel_dir );
$ecmfile -> filepath = $rel_dir ;
$ecmfile -> filename = $filename ;
$resultecm = $ecmfile -> update ( $user );
}
elseif ( $resultecm == 0 ) // If no entry were found for src files, create/update target file
{
$filename = basename ( $rel_filetorenameafter );
$rel_dir = dirname ( $rel_filetorenameafter );
$rel_dir = preg_replace ( '/[\\/]$/' , '' , $rel_dir );
$rel_dir = preg_replace ( '/^[\\/]/' , '' , $rel_dir );
$ecmfile -> filepath = $rel_dir ;
$ecmfile -> filename = $filename ;
$ecmfile -> label = md5_file ( dol_osencode ( $destfile )); // $destfile is a full path to file
$ecmfile -> fullpath_orig = $srcfile ;
$ecmfile -> gen_or_uploaded = 'unknown' ;
$ecmfile -> description = '' ; // indexed content
$ecmfile -> keyword = '' ; // keyword content
$resultecm = $ecmfile -> create ( $user );
if ( $resultecm < 0 )
{
setEventMessages ( $ecmfile -> error , $ecmfile -> errors , 'warnings' );
}
}
elseif ( $resultecm < 0 )
{
setEventMessages ( $ecmfile -> error , $ecmfile -> errors , 'warnings' );
}
if ( $resultecm > 0 ) $result = true ;
else $result = false ;
}
}
2010-10-03 18:59:24 +02:00
2017-10-07 13:09:31 +02:00
if ( empty ( $newmask )) $newmask = empty ( $conf -> global -> MAIN_UMASK ) ? '0755' : $conf -> global -> MAIN_UMASK ;
$newmaskdec = octdec ( $newmask );
// Currently method is restricted to files (dol_delete_files previously used is for files, and mask usage if for files too)
// to allow mask usage for dir, we shoul introduce a new param "isdir" to 1 to complete newmask like this
// if ($isdir) $newmaskdec |= octdec('0111'); // Set x bit required for directories
@ chmod ( $newpathofdestfile , $newmaskdec );
}
return $result ;
2010-10-03 18:59:24 +02:00
}
2010-05-01 16:28:48 +02:00
2012-05-30 12:43:23 +02:00
/**
2012-06-10 13:22:28 +02:00
* Unescape a file submitted by upload .
* PHP escape char " (%22) or char ' (%27) into $FILES .
2012-05-30 12:43:23 +02:00
*
* @ param string $filename Filename
2012-06-10 13:22:28 +02:00
* @ return string Filename sanitized
2012-05-30 12:43:23 +02:00
*/
function dol_unescapefile ( $filename )
{
2012-07-02 19:30:37 +02:00
// Remove path information and dots around the filename, to prevent uploading
// into different directories or replacing hidden system files.
// Also remove control characters and spaces (\x00..\x20) around the filename:
2012-06-01 10:16:42 +02:00
return trim ( basename ( $filename ), " . \x00 .. \x20 " );
2012-05-30 12:43:23 +02:00
}
2017-05-21 14:06:43 +02:00
/**
* Check virus into a file
2017-06-01 12:11:45 +02:00
*
2017-05-21 14:06:43 +02:00
* @ param string $src_file Source file to check
* @ return array Array of errors or empty array if not virus found
*/
function dolCheckVirus ( $src_file )
{
2017-10-07 13:09:31 +02:00
global $conf ;
if ( ! empty ( $conf -> global -> MAIN_ANTIVIRUS_COMMAND ))
{
if ( ! class_exists ( 'AntiVir' )) {
require_once DOL_DOCUMENT_ROOT . '/core/class/antivir.class.php' ;
}
$antivir = new AntiVir ( $db );
$result = $antivir -> dol_avscan_file ( $src_file );
if ( $result < 0 ) // If virus or error, we stop here
{
$reterrors = $antivir -> errors ;
return $reterrors ;
}
}
return array ();
2017-05-21 14:06:43 +02:00
}
2012-09-07 17:23:16 +02:00
/**
* Make control on an uploaded file from an GUI page and move it to final destination .
* If there is errors ( virus found , antivir in error , bad filename ), file is not moved .
2017-06-01 12:11:45 +02:00
* Note :
2017-05-21 14:06:43 +02:00
* - This function can be used only into a HTML page context . Use dol_move if you are outside .
* - Test on antivirus is always done ( if antivirus set ) .
2018-02-23 19:55:15 +01:00
* - Database of files is NOT updated ( this is done by dol_add_file_process () that calls this function ) .
2019-08-16 21:45:13 +02:00
* - Extension . noexe may be added if file is executable and MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED is not set .
2012-09-07 17:23:16 +02:00
*
* @ param string $src_file Source full path filename ( $_FILES [ 'field' ][ 'tmp_name' ])
* @ param string $dest_file Target full path filename ( $_FILES [ 'field' ][ 'name' ])
* @ param int $allowoverwrite 1 = Overwrite target file if it already exists
* @ param int $disablevirusscan 1 = Disable virus scan
2015-04-06 12:25:30 +02:00
* @ param integer $uploaderrorcode Value of PHP upload error code ( $_FILES [ 'field' ][ 'error' ])
2012-09-12 12:27:11 +02:00
* @ param int $nohook Disable all hooks
2012-09-07 17:23:16 +02:00
* @ param string $varfiles _FILES var name
2012-09-07 10:30:02 +02:00
* @ return int > 0 if OK , < 0 or string if KO
2019-03-11 01:01:15 +01:00
* @ see dol_move ()
2012-09-07 17:23:16 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_move_uploaded_file ( $src_file , $dest_file , $allowoverwrite , $disablevirusscan = 0 , $uploaderrorcode = 0 , $nohook = 0 , $varfiles = 'addedfile' )
2012-09-07 17:23:16 +02:00
{
2012-09-12 12:27:11 +02:00
global $conf , $db , $user , $langs ;
global $object , $hookmanager ;
2012-09-07 17:23:16 +02:00
2014-08-28 11:20:13 +02:00
$reshook = 0 ;
2012-09-07 17:23:16 +02:00
$file_name = $dest_file ;
2012-09-12 12:27:11 +02:00
if ( empty ( $nohook ))
2012-09-12 12:41:44 +02:00
{
2013-04-12 13:18:24 +02:00
$reshook = $hookmanager -> initHooks ( array ( 'fileslib' ));
2010-05-01 16:28:48 +02:00
2013-03-26 17:47:37 +01:00
$parameters = array ( 'dest_file' => $dest_file , 'src_file' => $src_file , 'file_name' => $file_name , 'varfiles' => $varfiles , 'allowoverwrite' => $allowoverwrite );
2013-04-12 13:18:24 +02:00
$reshook = $hookmanager -> executeHooks ( 'moveUploadedFile' , $parameters , $object );
2010-05-01 16:28:48 +02:00
}
2017-06-01 12:11:45 +02:00
2017-05-21 14:06:43 +02:00
if ( empty ( $reshook ))
{
2017-10-07 13:09:31 +02:00
// If an upload error has been reported
if ( $uploaderrorcode )
{
switch ( $uploaderrorcode )
{
case UPLOAD_ERR_INI_SIZE : // 1
return 'ErrorFileSizeTooLarge' ;
case UPLOAD_ERR_FORM_SIZE : // 2
return 'ErrorFileSizeTooLarge' ;
case UPLOAD_ERR_PARTIAL : // 3
return 'ErrorPartialFile' ;
case UPLOAD_ERR_NO_TMP_DIR : //
return 'ErrorNoTmpDir' ;
case UPLOAD_ERR_CANT_WRITE :
return 'ErrorFailedToWriteInDir' ;
case UPLOAD_ERR_EXTENSION :
return 'ErrorUploadBlockedByAddon' ;
default :
break ;
}
}
// If we need to make a virus scan
if ( empty ( $disablevirusscan ) && file_exists ( $src_file ))
{
$checkvirusarray = dolCheckVirus ( $src_file );
if ( count ( $checkvirusarray ))
{
2019-10-20 11:17:54 +02:00
dol_syslog ( 'Files.lib::dol_move_uploaded_file File "' . $src_file . '" (target name "' . $dest_file . '") KO with antivirus: errors=' . join ( ',' , $checkvirusarray ), LOG_WARNING );
return 'ErrorFileIsInfectedWithAVirus: ' . join ( ',' , $checkvirusarray );
2017-10-07 13:09:31 +02:00
}
}
// Security:
// Disallow file with some extensions. We rename them.
// Because if we put the documents directory into a directory inside web root (very bad), this allows to execute on demand arbitrary code.
2019-05-21 13:53:12 +02:00
if ( isAFileWithExecutableContent ( $dest_file ) && empty ( $conf -> global -> MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED ))
2017-10-07 13:09:31 +02:00
{
$file_name .= '.noexe' ;
}
// Security:
// We refuse cache files/dirs, upload using .. and pipes into filenames.
2019-08-16 21:45:13 +02:00
if ( preg_match ( '/^\./' , basename ( $src_file )) || preg_match ( '/\.\./' , $src_file ) || preg_match ( '/[<>|]/' , $src_file ))
2017-10-07 13:09:31 +02:00
{
dol_syslog ( " Refused to deliver file " . $src_file , LOG_WARNING );
return - 1 ;
}
// Security:
2019-08-16 21:45:13 +02:00
// We refuse cache files/dirs, upload using .. and pipes into filenames.
if ( preg_match ( '/^\./' , basename ( $dest_file )) || preg_match ( '/\.\./' , $dest_file ) || preg_match ( '/[<>|]/' , $dest_file ))
2017-10-07 13:09:31 +02:00
{
dol_syslog ( " Refused to deliver file " . $dest_file , LOG_WARNING );
return - 2 ;
}
2017-05-21 14:06:43 +02:00
}
2017-06-01 12:11:45 +02:00
2014-08-28 11:20:13 +02:00
if ( $reshook < 0 ) // At least one blocking error returned by one hook
{
$errmsg = join ( ',' , $hookmanager -> errors );
if ( empty ( $errmsg )) $errmsg = 'ErrorReturnedBySomeHooks' ; // Should not occurs. Added if hook is bugged and does not set ->errors when there is error.
return $errmsg ;
}
elseif ( empty ( $reshook ))
2010-05-01 16:28:48 +02:00
{
2012-09-12 12:41:44 +02:00
// The file functions must be in OS filesystem encoding.
$src_file_osencoded = dol_osencode ( $src_file );
$file_name_osencoded = dol_osencode ( $file_name );
// Check if destination dir is writable
2017-11-06 11:47:03 +01:00
if ( ! is_writable ( dirname ( $file_name_osencoded )))
{
dol_syslog ( " Files.lib::dol_move_uploaded_file Dir " . dirname ( $file_name_osencoded ) . " is not writable. Return 'ErrorDirNotWritable' " , LOG_WARNING );
return 'ErrorDirNotWritable' ;
}
2012-09-12 12:41:44 +02:00
// Check if destination file already exists
if ( ! $allowoverwrite )
{
if ( file_exists ( $file_name_osencoded ))
{
dol_syslog ( " Files.lib::dol_move_uploaded_file File " . $file_name . " already exists. Return 'ErrorFileAlreadyExists' " , LOG_WARNING );
return 'ErrorFileAlreadyExists' ;
}
}
// Move file
$return = move_uploaded_file ( $src_file_osencoded , $file_name_osencoded );
if ( $return )
{
if ( ! empty ( $conf -> global -> MAIN_UMASK )) @ chmod ( $file_name_osencoded , octdec ( $conf -> global -> MAIN_UMASK ));
dol_syslog ( " Files.lib::dol_move_uploaded_file Success to move " . $src_file . " to " . $file_name . " - Umask= " . $conf -> global -> MAIN_UMASK , LOG_DEBUG );
return 1 ; // Success
}
else
{
dol_syslog ( " Files.lib::dol_move_uploaded_file Failed to move " . $src_file . " to " . $file_name , LOG_ERR );
return - 3 ; // Unknown error
2011-07-05 18:10:56 +02:00
}
2010-05-01 16:28:48 +02:00
}
2014-08-28 11:20:13 +02:00
return 1 ; // Success
2010-05-01 16:28:48 +02:00
}
2011-03-09 16:48:25 +01:00
/**
2017-08-18 16:10:21 +02:00
* Remove a file or several files with a mask .
2017-08-21 00:40:32 +02:00
* This delete file physically but also database indexes .
2011-10-14 16:02:18 +02:00
*
2015-05-29 17:11:42 +02:00
* @ param string $file File to delete or mask of files to delete
* @ param int $disableglob Disable usage of glob like * so function is an exact delete function that will return error if no file found
2011-11-12 12:59:06 +01:00
* @ param int $nophperrors Disable all PHP output errors
2012-09-12 12:27:11 +02:00
* @ param int $nohook Disable all hooks
2012-09-11 17:01:54 +02:00
* @ param object $object Current object in use
2018-07-27 12:33:36 +02:00
* @ param boolean $allowdotdot Allow to delete file path with .. inside . Never use this , it is reserved for migration purpose .
2018-09-26 01:45:24 +02:00
* @ param int $indexdatabase Try to remove also index entries .
2015-05-29 17:11:42 +02:00
* @ return boolean True if no error ( file is deleted or if glob is used and there ' s nothing to delete ), False if error
2019-03-11 01:01:15 +01:00
* @ see dol_delete_dir ()
2011-03-09 16:48:25 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_delete_file ( $file , $disableglob = 0 , $nophperrors = 0 , $nohook = 0 , $object = null , $allowdotdot = false , $indexdatabase = 1 )
2011-03-09 16:48:25 +01:00
{
2012-09-12 12:27:11 +02:00
global $db , $conf , $user , $langs ;
global $hookmanager ;
2012-07-29 12:54:19 +02:00
2018-09-14 10:20:21 +02:00
// Load translation files required by the page
$langs -> loadLangs ( array ( 'other' , 'errors' ));
2012-09-12 12:27:11 +02:00
2014-01-19 22:43:36 +01:00
dol_syslog ( " dol_delete_file file= " . $file . " disableglob= " . $disableglob . " nophperrors= " . $nophperrors . " nohook= " . $nohook );
2017-03-10 14:04:06 +01:00
// Security:
2017-03-10 14:08:53 +01:00
// We refuse transversal using .. and pipes into filenames.
2019-01-27 11:55:16 +01:00
if (( ! $allowdotdot && preg_match ( '/\.\./' , $file )) || preg_match ( '/[<>|]/' , $file ))
2017-03-10 14:04:06 +01:00
{
2017-10-07 13:09:31 +02:00
dol_syslog ( " Refused to delete file " . $file , LOG_WARNING );
2018-04-22 20:57:43 +02:00
return false ;
2017-03-10 14:04:06 +01:00
}
2017-06-01 12:11:45 +02:00
2012-09-12 12:27:11 +02:00
if ( empty ( $nohook ))
2012-09-11 17:01:54 +02:00
{
2012-09-12 12:41:44 +02:00
$hookmanager -> initHooks ( array ( 'fileslib' ));
$parameters = array (
2012-09-12 14:49:36 +02:00
'GET' => $_GET ,
2012-09-12 12:41:44 +02:00
'file' => $file ,
'disableglob' => $disableglob ,
'nophperrors' => $nophperrors
);
2012-09-12 12:27:11 +02:00
$reshook = $hookmanager -> executeHooks ( 'deleteFile' , $parameters , $object );
2012-09-11 17:01:54 +02:00
}
2015-05-29 17:11:42 +02:00
if ( empty ( $nohook ) && $reshook != 0 ) // reshook = 0 to do standard actions, 1 = ok, -1 = ko
2012-09-11 17:01:54 +02:00
{
2015-05-29 17:11:42 +02:00
if ( $reshook < 0 ) return false ;
return true ;
2012-09-11 17:01:54 +02:00
}
else
{
2012-09-12 12:41:44 +02:00
$error = 0 ;
2013-04-30 17:24:11 +02:00
//print "x".$file." ".$disableglob;exit;
2012-09-12 12:41:44 +02:00
$file_osencoded = dol_osencode ( $file ); // New filename encoded in OS filesystem encoding charset
if ( empty ( $disableglob ) && ! empty ( $file_osencoded ))
{
2015-05-29 17:11:42 +02:00
$ok = true ;
2019-01-27 11:55:16 +01:00
$globencoded = str_replace ( '[' , '\[' , $file_osencoded );
$globencoded = str_replace ( ']' , '\]' , $globencoded );
2013-09-04 16:49:20 +02:00
$listofdir = glob ( $globencoded );
if ( ! empty ( $listofdir ) && is_array ( $listofdir ))
2012-09-12 12:41:44 +02:00
{
2013-09-04 16:49:20 +02:00
foreach ( $listofdir as $filename )
{
2014-03-04 23:56:35 +01:00
if ( $nophperrors ) $ok =@ unlink ( $filename );
else $ok = unlink ( $filename );
2017-06-01 12:11:45 +02:00
if ( $ok )
2016-12-08 21:58:52 +01:00
{
2017-10-07 13:09:31 +02:00
dol_syslog ( " Removed file " . $filename , LOG_DEBUG );
// Delete entry into ecm database
2019-01-27 11:55:16 +01:00
$rel_filetodelete = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $filename );
2017-10-07 13:09:31 +02:00
if ( ! preg_match ( '/(\/temp\/|\/thumbs\/|\.meta$)/' , $rel_filetodelete )) // If not a tmp file
{
$rel_filetodelete = preg_replace ( '/^[\\/]/' , '' , $rel_filetodelete );
2018-09-26 01:45:24 +02:00
if ( is_object ( $db ) && $indexdatabase ) // $db may not be defined when lib is in a context with define('NOREQUIREDB',1)
2017-10-07 13:09:31 +02:00
{
2018-06-05 18:05:33 +02:00
dol_syslog ( " Try to remove also entries in database for full relative path = " . $rel_filetodelete , LOG_DEBUG );
include_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php' ;
$ecmfile = new EcmFiles ( $db );
$result = $ecmfile -> fetch ( 0 , '' , $rel_filetodelete );
if ( $result >= 0 && $ecmfile -> id > 0 )
{
$result = $ecmfile -> delete ( $user );
}
if ( $result < 0 )
{
setEventMessages ( $ecmfile -> error , $ecmfile -> errors , 'warnings' );
}
2017-10-07 13:09:31 +02:00
}
}
2016-12-08 21:58:52 +01:00
}
2019-09-03 22:39:24 +02:00
else
{
dol_syslog ( " Failed to remove file " . $filename , LOG_WARNING );
// TODO Failure to remove can be because file was already removed or because of permission
// If error because it does not exists, we should return true, and we should return false if this is a permission problem
}
2013-09-04 16:49:20 +02:00
}
2012-09-12 12:41:44 +02:00
}
2017-05-11 13:01:49 +02:00
else dol_syslog ( " No files to delete found " , LOG_DEBUG );
2012-09-12 12:41:44 +02:00
}
else
{
2015-05-29 17:11:42 +02:00
$ok = false ;
2014-03-04 23:56:35 +01:00
if ( $nophperrors ) $ok =@ unlink ( $file_osencoded );
else $ok = unlink ( $file_osencoded );
2012-09-12 12:41:44 +02:00
if ( $ok ) dol_syslog ( " Removed file " . $file_osencoded , LOG_DEBUG );
2017-06-01 12:11:45 +02:00
else dol_syslog ( " Failed to remove file " . $file_osencoded , LOG_WARNING );
2012-09-12 12:41:44 +02:00
}
2012-09-12 12:27:11 +02:00
return $ok ;
}
2011-03-09 16:48:25 +01:00
}
/**
* Remove a directory ( not recursive , so content must be empty ) .
* If directory is not empty , return false
2011-10-14 16:02:18 +02:00
*
2011-11-12 12:59:06 +01:00
* @ param string $dir Directory to delete
* @ param int $nophperrors Disable all PHP output errors
* @ return boolean True if success , false if error
2019-03-11 01:01:15 +01:00
* @ see dol_delete_file () dolCopyDir ()
2011-03-09 16:48:25 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_delete_dir ( $dir , $nophperrors = 0 )
2011-03-09 16:48:25 +01:00
{
2017-03-10 14:08:53 +01:00
// Security:
// We refuse transversal using .. and pipes into filenames.
2019-01-27 11:55:16 +01:00
if ( preg_match ( '/\.\./' , $dir ) || preg_match ( '/[<>|]/' , $dir ))
2017-03-10 14:08:53 +01:00
{
2017-10-07 13:09:31 +02:00
dol_syslog ( " Refused to delete dir " . $dir , LOG_WARNING );
2018-04-22 20:57:43 +02:00
return false ;
2017-03-10 14:08:53 +01:00
}
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
$dir_osencoded = dol_osencode ( $dir );
return ( $nophperrors ? @ rmdir ( $dir_osencoded ) : rmdir ( $dir_osencoded ));
2011-03-09 16:48:25 +01:00
}
/**
2014-08-28 11:20:13 +02:00
* Remove a directory $dir and its subdirectories ( or only files and subdirectories )
2012-02-04 14:39:47 +01:00
*
* @ param string $dir Dir to delete
2017-07-13 00:18:58 +02:00
* @ param int $count Counter to count nb of elements found to delete
2012-02-04 14:39:47 +01:00
* @ param int $nophperrors Disable all PHP output errors
2014-08-28 11:20:13 +02:00
* @ param int $onlysub Delete only files and subdir , not main directory
2017-07-13 00:18:58 +02:00
* @ param int $countdeleted Counter to count nb of elements found really deleted
2018-09-08 14:10:29 +02:00
* @ return int Number of files and directory we try to remove . NB really removed is returned into var by reference $countdeleted .
2011-03-09 16:48:25 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_delete_dir_recursive ( $dir , $count = 0 , $nophperrors = 0 , $onlysub = 0 , & $countdeleted = 0 )
2011-03-09 16:48:25 +01:00
{
2019-01-27 11:55:16 +01:00
dol_syslog ( " functions.lib:dol_delete_dir_recursive " . $dir , LOG_DEBUG );
2017-10-07 13:09:31 +02:00
if ( dol_is_dir ( $dir ))
{
$dir_osencoded = dol_osencode ( $dir );
if ( $handle = opendir ( " $dir_osencoded " ))
{
while ( false !== ( $item = readdir ( $handle )))
{
if ( ! utf8_check ( $item )) $item = utf8_encode ( $item ); // should be useless
2014-08-28 11:20:13 +02:00
2017-10-07 13:09:31 +02:00
if ( $item != " . " && $item != " .. " )
{
if ( is_dir ( dol_osencode ( " $dir / $item " )) && ! is_link ( dol_osencode ( " $dir / $item " )))
{
$count = dol_delete_dir_recursive ( " $dir / $item " , $count , $nophperrors , 0 , $countdeleted );
}
else
{
$result = dol_delete_file ( " $dir / $item " , 1 , $nophperrors );
$count ++ ;
if ( $result ) $countdeleted ++ ;
2018-03-21 13:30:30 +01:00
//else print 'Error on '.$item."\n";
2017-10-07 13:09:31 +02:00
}
}
}
closedir ( $handle );
2011-03-09 16:48:25 +01:00
2017-10-07 13:09:31 +02:00
if ( empty ( $onlysub ))
{
$result = dol_delete_dir ( $dir , $nophperrors );
$count ++ ;
if ( $result ) $countdeleted ++ ;
2018-03-21 13:30:30 +01:00
//else print 'Error on '.$dir."\n";
2017-10-07 13:09:31 +02:00
}
}
}
return $count ;
2011-03-09 16:48:25 +01:00
}
2011-10-14 16:02:18 +02:00
2011-09-17 02:04:44 +02:00
/**
2018-01-13 15:48:30 +01:00
* Delete all preview files linked to object instance .
* Note that preview image of PDF files is generated when required , by dol_banner_tab () for example .
2011-10-14 16:02:18 +02:00
*
2013-11-07 21:23:29 +01:00
* @ param object $object Object to clean
2011-09-17 02:04:44 +02:00
* @ return int 0 if error , 1 if OK
2019-03-11 01:01:15 +01:00
* @ see dol_convert_file ()
2011-09-17 02:04:44 +02:00
*/
function dol_delete_preview ( $object )
{
global $langs , $conf ;
2012-04-28 18:21:51 +02:00
2012-09-19 13:30:59 +02:00
// Define parent dir of elements
$element = $object -> element ;
2011-09-17 02:04:44 +02:00
2017-10-07 13:09:31 +02:00
if ( $object -> element == 'order_supplier' ) $dir = $conf -> fournisseur -> commande -> dir_output ;
elseif ( $object -> element == 'invoice_supplier' ) $dir = $conf -> fournisseur -> facture -> dir_output ;
elseif ( $object -> element == 'project' ) $dir = $conf -> projet -> dir_output ;
elseif ( $object -> element == 'shipping' ) $dir = $conf -> expedition -> dir_output . '/sending' ;
elseif ( $object -> element == 'delivery' ) $dir = $conf -> expedition -> dir_output . '/receipt' ;
elseif ( $object -> element == 'fichinter' ) $dir = $conf -> ficheinter -> dir_output ;
else $dir = empty ( $conf -> $element -> dir_output ) ? '' : $conf -> $element -> dir_output ;
2012-03-22 08:33:44 +01:00
2017-10-07 13:09:31 +02:00
if ( empty ( $dir )) return 'ErrorObjectNoSupportedByFunction' ;
2011-10-14 16:02:18 +02:00
2011-09-17 02:04:44 +02:00
$refsan = dol_sanitizeFileName ( $object -> ref );
$dir = $dir . " / " . $refsan ;
2018-01-13 15:48:30 +01:00
$filepreviewnew = $dir . " / " . $refsan . " .pdf_preview.png " ;
$filepreviewnewbis = $dir . " / " . $refsan . " .pdf_preview-0.png " ;
$filepreviewold = $dir . " / " . $refsan . " .pdf.png " ;
2011-09-17 02:04:44 +02:00
2018-01-13 15:48:30 +01:00
// For new preview files
if ( file_exists ( $filepreviewnew ) && is_writable ( $filepreviewnew ))
2011-09-17 02:04:44 +02:00
{
2019-01-27 11:55:16 +01:00
if ( ! dol_delete_file ( $filepreviewnew , 1 ))
2011-09-17 02:04:44 +02:00
{
2019-01-27 11:55:16 +01:00
$object -> error = $langs -> trans ( " ErrorFailedToDeleteFile " , $filepreviewnew );
2018-01-13 15:48:30 +01:00
return 0 ;
}
}
if ( file_exists ( $filepreviewnewbis ) && is_writable ( $filepreviewnewbis ))
{
2019-01-27 11:55:16 +01:00
if ( ! dol_delete_file ( $filepreviewnewbis , 1 ))
2018-01-13 15:48:30 +01:00
{
2019-01-27 11:55:16 +01:00
$object -> error = $langs -> trans ( " ErrorFailedToDeleteFile " , $filepreviewnewbis );
2018-01-13 15:48:30 +01:00
return 0 ;
}
}
// For old preview files
if ( file_exists ( $filepreviewold ) && is_writable ( $filepreviewold ))
{
2019-01-27 11:55:16 +01:00
if ( ! dol_delete_file ( $filepreviewold , 1 ))
2018-01-13 15:48:30 +01:00
{
2019-01-27 11:55:16 +01:00
$object -> error = $langs -> trans ( " ErrorFailedToDeleteFile " , $filepreviewold );
2011-09-17 02:04:44 +02:00
return 0 ;
}
}
else
{
2018-01-13 15:48:30 +01:00
$multiple = $filepreviewold . " . " ;
2011-09-17 02:04:44 +02:00
for ( $i = 0 ; $i < 20 ; $i ++ )
{
$preview = $multiple . $i ;
if ( file_exists ( $preview ) && is_writable ( $preview ))
{
2019-01-27 11:55:16 +01:00
if ( ! dol_delete_file ( $preview , 1 ) )
2011-09-17 02:04:44 +02:00
{
2019-01-27 11:55:16 +01:00
$object -> error = $langs -> trans ( " ErrorFailedToOpenFile " , $preview );
2011-09-17 02:04:44 +02:00
return 0 ;
}
}
}
}
return 1 ;
}
2011-11-04 00:27:30 +01:00
/**
2011-11-04 08:21:47 +01:00
* Create a meta file with document file into same directory .
2017-08-18 23:16:40 +02:00
* This make " grep " search possible .
* This feature to generate the meta file is enabled only if option MAIN_DOC_CREATE_METAFILE is set .
2011-11-04 08:21:47 +01:00
*
2015-04-06 12:25:30 +02:00
* @ param CommonObject $object Object
2017-08-18 23:16:40 +02:00
* @ return int 0 if do nothing , > 0 if we update meta file too , < 0 if KO
2011-11-04 08:21:47 +01:00
*/
2011-11-04 00:27:30 +01:00
function dol_meta_create ( $object )
{
2012-09-07 10:30:02 +02:00
global $conf ;
2011-12-17 01:16:33 +01:00
2017-08-21 00:40:32 +02:00
// Create meta file
2012-09-19 13:30:59 +02:00
if ( empty ( $conf -> global -> MAIN_DOC_CREATE_METAFILE )) return 0 ; // By default, no metafile.
2011-12-17 01:16:33 +01:00
2012-09-07 10:30:02 +02:00
// Define parent dir of elements
$element = $object -> element ;
2012-09-19 13:30:59 +02:00
2012-09-19 17:53:09 +02:00
if ( $object -> element == 'order_supplier' ) $dir = $conf -> fournisseur -> dir_output . '/commande' ;
elseif ( $object -> element == 'invoice_supplier' ) $dir = $conf -> fournisseur -> dir_output . '/facture' ;
elseif ( $object -> element == 'project' ) $dir = $conf -> projet -> dir_output ;
elseif ( $object -> element == 'shipping' ) $dir = $conf -> expedition -> dir_output . '/sending' ;
elseif ( $object -> element == 'delivery' ) $dir = $conf -> expedition -> dir_output . '/receipt' ;
elseif ( $object -> element == 'fichinter' ) $dir = $conf -> ficheinter -> dir_output ;
2012-09-19 13:30:59 +02:00
else $dir = empty ( $conf -> $element -> dir_output ) ? '' : $conf -> $element -> dir_output ;
2012-09-07 10:30:02 +02:00
if ( $dir )
2011-11-04 08:29:10 +01:00
{
2012-09-07 10:30:02 +02:00
$object -> fetch_thirdparty ();
2017-08-18 23:16:40 +02:00
$objectref = dol_sanitizeFileName ( $object -> ref );
$dir = $dir . " / " . $objectref ;
$file = $dir . " / " . $objectref . " .meta " ;
2011-12-17 01:16:33 +01:00
2011-11-04 08:29:10 +01:00
if ( ! is_dir ( $dir ))
{
2012-02-19 18:34:22 +01:00
dol_mkdir ( $dir );
2011-11-04 08:29:10 +01:00
}
2011-12-17 01:16:33 +01:00
2011-11-04 08:29:10 +01:00
if ( is_dir ( $dir ))
{
2019-06-29 16:29:32 +02:00
$nblines = count ( $object -> lines );
2016-04-17 15:24:22 +02:00
$client = $object -> thirdparty -> name . " " . $object -> thirdparty -> address . " " . $object -> thirdparty -> zip . " " . $object -> thirdparty -> town ;
2011-11-04 08:29:10 +01:00
$meta = " REFERENCE= \" " . $object -> ref . " \"
2019-01-27 11:55:16 +01:00
DATE = \ " " . dol_print_date ( $object -> date , '' ) . " \"
2019-06-29 16:29:32 +02:00
NB_ITEMS = \ " " . $nblines . " \"
2011-11-04 00:27:30 +01:00
CLIENT = \ " " . $client . " \"
2017-09-22 11:28:53 +02:00
AMOUNT_EXCL_TAX = \ " " . $object -> total_ht . " \"
AMOUNT = \ " " . $object -> total_ttc . " \" \n " ;
2011-12-17 01:16:33 +01:00
2019-06-29 16:29:32 +02:00
for ( $i = 0 ; $i < $nblines ; $i ++ )
2011-11-04 08:29:10 +01:00
{
//Pour les articles
$meta .= " ITEM_ " . $i . " _QUANTITY= \" " . $object -> lines [ $i ] -> qty . " \"
2017-08-18 23:16:40 +02:00
ITEM_ " . $i . " _AMOUNT_WO_TAX = \ " " . $object -> lines [ $i ] -> total_ht . " \"
ITEM_ " . $i . " _VAT = \ " " . $object -> lines [ $i ] -> tva_tx . " \"
2019-01-27 11:55:16 +01:00
ITEM_ " . $i . " _DESCRIPTION = \ " " . str_replace ( " \r \n " , " " , nl2br ( $object -> lines [ $i ] -> desc )) . " \"
2011-11-04 08:29:10 +01:00
" ;
}
}
2011-12-17 01:16:33 +01:00
2019-01-27 11:55:16 +01:00
$fp = fopen ( $file , " w " );
fputs ( $fp , $meta );
2011-11-04 08:29:10 +01:00
fclose ( $fp );
if ( ! empty ( $conf -> global -> MAIN_UMASK ))
@ chmod ( $file , octdec ( $conf -> global -> MAIN_UMASK ));
2012-09-07 10:30:02 +02:00
return 1 ;
2011-11-04 08:29:10 +01:00
}
2017-08-21 00:40:32 +02:00
else
2017-08-18 23:16:40 +02:00
{
dol_syslog ( 'FailedToDetectDirInDolMetaCreateFor' . $object -> element , LOG_WARNING );
}
2012-09-07 10:30:02 +02:00
return 0 ;
2011-11-04 00:27:30 +01:00
}
2010-05-01 16:28:48 +02:00
2011-11-21 13:17:14 +01:00
/**
2016-06-24 16:10:52 +02:00
* Scan a directory and init $_SESSION to manage uploaded files with list of all found files .
* Note : Only email module seems to use this . Other feature initialize the $_SESSION doing $formmail -> clear_attached_files (); $formmail -> add_attached_files ()
2011-11-21 13:17:14 +01:00
*
* @ param string $pathtoscan Path to scan
2016-06-24 16:10:52 +02:00
* @ param string $trackid Track id ( used to prefix name of session vars to avoid conflict )
2011-11-21 13:17:14 +01:00
* @ return void
*/
2019-01-27 15:20:16 +01:00
function dol_init_file_process ( $pathtoscan = '' , $trackid = '' )
2011-11-21 13:17:14 +01:00
{
$listofpaths = array ();
$listofnames = array ();
$listofmimes = array ();
if ( $pathtoscan )
{
2019-01-27 11:55:16 +01:00
$listoffiles = dol_dir_list ( $pathtoscan , 'files' );
2011-11-21 13:17:14 +01:00
foreach ( $listoffiles as $key => $val )
{
2011-12-17 01:16:33 +01:00
$listofpaths [] = $val [ 'fullname' ];
2011-11-21 13:17:14 +01:00
$listofnames [] = $val [ 'name' ];
$listofmimes [] = dol_mimetype ( $val [ 'name' ]);
}
}
2017-10-07 13:09:31 +02:00
$keytoavoidconflict = empty ( $trackid ) ? '' : '-' . $trackid ;
2019-01-27 11:55:16 +01:00
$_SESSION [ " listofpaths " . $keytoavoidconflict ] = join ( ';' , $listofpaths );
$_SESSION [ " listofnames " . $keytoavoidconflict ] = join ( ';' , $listofnames );
$_SESSION [ " listofmimes " . $keytoavoidconflict ] = join ( ';' , $listofmimes );
2011-11-21 13:17:14 +01:00
}
2010-05-12 13:29:21 +02:00
/**
2017-08-18 23:16:40 +02:00
* Get and save an upload file ( for example after submitting a new file a mail form ) . Database index of file is also updated if donotupdatesession is set .
2010-05-12 13:29:21 +02:00
* All information used are in db , conf , langs , user and _FILES .
2012-07-29 14:15:29 +02:00
* Note : This function can be used only into a HTML page context .
2011-10-14 16:02:18 +02:00
*
2016-12-20 19:42:25 +01:00
* @ param string $upload_dir Directory where to store uploaded file ( note : used to forge $destpath = $upload_dir + filename )
2011-09-24 04:01:26 +02:00
* @ param int $allowoverwrite 1 = Allow overwrite existing file
2018-08-16 21:48:16 +02:00
* @ param int $donotupdatesession 1 = Do no edit _SESSION variable but update database index . 0 = Update _SESSION and not database index . - 1 = Do not update SESSION neither db .
2012-07-29 16:44:19 +02:00
* @ param string $varfiles _FILES var name
2013-10-29 17:50:39 +01:00
* @ param string $savingdocmask Mask to use to define output filename . For example 'XXXXX-__YYYYMMDD__-__file__'
2016-12-08 21:58:52 +01:00
* @ param string $link Link to add ( to add a link instead of a file )
2016-06-24 16:10:52 +02:00
* @ param string $trackid Track id ( used to prefix name of session vars to avoid conflict )
2017-08-01 18:32:21 +02:00
* @ param int $generatethumbs 1 = Generate also thumbs for uploaded image files
2017-02-22 20:35:42 +01:00
* @ return int <= 0 if KO , > 0 if OK
2010-05-12 13:29:21 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_add_file_process ( $upload_dir , $allowoverwrite = 0 , $donotupdatesession = 0 , $varfiles = 'addedfile' , $savingdocmask = '' , $link = null , $trackid = '' , $generatethumbs = 1 )
2010-05-12 13:29:21 +02:00
{
2012-09-12 14:55:39 +02:00
global $db , $user , $conf , $langs ;
2010-05-12 13:29:21 +02:00
2017-02-22 20:35:42 +01:00
$res = 0 ;
2017-06-01 12:11:45 +02:00
2012-09-06 21:12:02 +02:00
if ( ! empty ( $_FILES [ $varfiles ])) // For view $_FILES[$varfiles]['error']
2010-05-12 13:29:21 +02:00
{
2013-10-29 17:50:39 +01:00
dol_syslog ( 'dol_add_file_process upload_dir=' . $upload_dir . ' allowoverwrite=' . $allowoverwrite . ' donotupdatesession=' . $donotupdatesession . ' savingdocmask=' . $savingdocmask , LOG_DEBUG );
2011-07-10 22:03:38 +02:00
if ( dol_mkdir ( $upload_dir ) >= 0 )
2010-05-12 13:29:21 +02:00
{
2015-12-10 13:48:37 +01:00
$TFile = $_FILES [ $varfiles ];
if ( ! is_array ( $TFile [ 'name' ]))
2013-10-29 17:50:39 +01:00
{
2015-12-10 13:48:37 +01:00
foreach ( $TFile as $key => & $val )
2012-07-29 16:44:19 +02:00
{
2015-12-10 13:48:37 +01:00
$val = array ( $val );
2010-05-12 13:29:21 +02:00
}
}
2017-06-01 12:11:45 +02:00
2015-12-10 13:48:37 +01:00
$nbfile = count ( $TFile [ 'name' ]);
2017-11-05 01:06:34 +01:00
$nbok = 0 ;
2015-12-10 13:48:37 +01:00
for ( $i = 0 ; $i < $nbfile ; $i ++ )
2010-05-12 13:29:21 +02:00
{
2016-12-31 03:43:22 +01:00
// Define $destfull (path to file including filename) and $destfile (only filename)
$destfull = $upload_dir . " / " . $TFile [ 'name' ][ $i ];
2015-12-10 13:48:37 +01:00
$destfile = $TFile [ 'name' ][ $i ];
2017-06-01 12:11:45 +02:00
2015-12-10 13:48:37 +01:00
if ( $savingdocmask )
2010-05-12 13:29:21 +02:00
{
2019-01-27 11:55:16 +01:00
$destfull = $upload_dir . " / " . preg_replace ( '/__file__/' , $TFile [ 'name' ][ $i ], $savingdocmask );
$destfile = preg_replace ( '/__file__/' , $TFile [ 'name' ][ $i ], $savingdocmask );
2010-05-12 13:29:21 +02:00
}
2016-04-02 15:00:58 +02:00
2017-10-03 09:35:45 +02:00
// dol_sanitizeFileName the file name and lowercase extension
2016-12-31 03:43:22 +01:00
$info = pathinfo ( $destfull );
2019-04-05 19:39:04 +02:00
$destfull = $info [ 'dirname' ] . '/' . dol_sanitizeFileName ( $info [ 'filename' ] . ( $info [ 'extension' ] != '' ? ( '.' . strtolower ( $info [ 'extension' ])) : '' ));
2016-04-02 15:54:51 +02:00
$info = pathinfo ( $destfile );
2019-05-13 12:22:14 +02:00
2019-04-05 19:39:04 +02:00
$destfile = dol_sanitizeFileName ( $info [ 'filename' ] . ( $info [ 'extension' ] != '' ? ( '.' . strtolower ( $info [ 'extension' ])) : '' ));
2016-12-08 21:58:52 +01:00
2019-05-13 12:00:13 +02:00
// We apply dol_string_nohtmltag also to clean file names (this remove duplicate spaces) because
// this function is also applied when we make try to download file (by the GETPOST(filename, 'alphanohtml') call).
2019-05-07 14:33:17 +02:00
$destfile = dol_string_nohtmltag ( $destfile );
$destfull = dol_string_nohtmltag ( $destfull );
2019-05-13 12:22:14 +02:00
2016-12-31 03:43:22 +01:00
$resupload = dol_move_uploaded_file ( $TFile [ 'tmp_name' ][ $i ], $destfull , $allowoverwrite , 0 , $TFile [ 'error' ][ $i ], 0 , $varfiles );
2017-06-01 12:11:45 +02:00
2016-12-31 03:43:22 +01:00
if ( is_numeric ( $resupload ) && $resupload > 0 ) // $resupload can be 'ErrorFileAlreadyExists'
2010-05-12 13:29:21 +02:00
{
2016-01-23 11:51:56 +01:00
global $maxwidthsmall , $maxheightsmall , $maxwidthmini , $maxheightmini ;
2017-06-01 12:11:45 +02:00
2015-12-10 13:48:37 +01:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php' ;
2017-06-01 12:11:45 +02:00
2016-12-20 19:42:25 +01:00
// Generate thumbs.
2017-08-01 18:32:21 +02:00
if ( $generatethumbs )
2016-12-20 19:42:25 +01:00
{
2017-08-01 18:32:21 +02:00
if ( image_format_supported ( $destfull ) == 1 )
{
2017-10-07 13:09:31 +02:00
// Create thumbs
// We can't use $object->addThumbs here because there is no $object known
// Used on logon for example
$imgThumbSmall = vignette ( $destfull , $maxwidthsmall , $maxheightsmall , '_small' , 50 , " thumbs " );
// Create mini thumbs for image (Ratio is near 16/9)
// Used on menu or for setup page for example
$imgThumbMini = vignette ( $destfull , $maxwidthmini , $maxheightmini , '_mini' , 50 , " thumbs " );
2017-08-01 18:32:21 +02:00
}
2016-12-20 19:42:25 +01:00
}
2017-06-01 12:11:45 +02:00
2016-12-20 19:42:25 +01:00
// Update session
2015-12-10 13:48:37 +01:00
if ( empty ( $donotupdatesession ))
{
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
$formmail = new FormMail ( $db );
2016-06-24 16:10:52 +02:00
$formmail -> trackid = $trackid ;
2016-12-31 03:43:22 +01:00
$formmail -> add_attached_files ( $destfull , $destfile , $TFile [ 'type' ][ $i ]);
2015-12-10 13:48:37 +01:00
}
2017-06-01 12:11:45 +02:00
2016-12-20 19:42:25 +01:00
// Update table of files
2018-08-16 21:48:16 +02:00
if ( $donotupdatesession == 1 )
2016-12-08 21:58:52 +01:00
{
2018-02-23 19:55:15 +01:00
$result = addFileIntoDatabaseIndex ( $upload_dir , basename ( $destfile ), $TFile [ 'name' ][ $i ], 'uploaded' , 0 );
if ( $result < 0 )
2017-10-07 13:09:31 +02:00
{
2018-02-23 19:55:15 +01:00
setEventMessages ( 'FailedToAddFileIntoDatabaseIndex' , '' , 'warnings' );
2017-10-07 13:09:31 +02:00
}
2016-12-08 21:58:52 +01:00
}
2016-12-20 19:42:25 +01:00
2017-11-05 01:06:34 +01:00
$nbok ++ ;
2010-05-12 13:29:21 +02:00
}
2015-12-10 13:48:37 +01:00
else
2010-05-12 13:29:21 +02:00
{
2015-12-10 13:48:37 +01:00
$langs -> load ( " errors " );
if ( $resupload < 0 ) // Unknown error
{
setEventMessages ( $langs -> trans ( " ErrorFileNotUploaded " ), null , 'errors' );
}
2019-01-27 23:23:38 +01:00
elseif ( preg_match ( '/ErrorFileIsInfectedWithAVirus/' , $resupload )) // Files infected by a virus
2015-12-10 13:48:37 +01:00
{
setEventMessages ( $langs -> trans ( " ErrorFileIsInfectedWithAVirus " ), null , 'errors' );
}
else // Known error
{
setEventMessages ( $langs -> trans ( $resupload ), null , 'errors' );
}
2010-05-12 13:29:21 +02:00
}
}
2017-11-05 01:06:34 +01:00
if ( $nbok > 0 )
{
$res = 1 ;
setEventMessages ( $langs -> trans ( " FileTransferComplete " ), null , 'mesgs' );
}
2010-05-12 13:29:21 +02:00
}
2013-07-29 16:47:47 +02:00
} elseif ( $link ) {
2017-01-20 10:27:37 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php' ;
$linkObject = new Link ( $db );
$linkObject -> entity = $conf -> entity ;
$linkObject -> url = $link ;
$linkObject -> objecttype = GETPOST ( 'objecttype' , 'alpha' );
$linkObject -> objectid = GETPOST ( 'objectid' , 'int' );
$linkObject -> label = GETPOST ( 'label' , 'alpha' );
$res = $linkObject -> create ( $user );
$langs -> load ( 'link' );
if ( $res > 0 ) {
setEventMessages ( $langs -> trans ( " LinkComplete " ), null , 'mesgs' );
} else {
setEventMessages ( $langs -> trans ( " ErrorFileNotLinked " ), null , 'errors' );
2013-07-29 16:47:47 +02:00
}
2013-09-18 14:56:08 +02:00
}
2010-05-12 13:29:21 +02:00
else
{
$langs -> load ( " errors " );
2015-10-17 16:18:33 +02:00
setEventMessages ( $langs -> trans ( " ErrorFieldRequired " , $langs -> transnoentities ( " File " )), null , 'errors' );
2010-05-12 13:29:21 +02:00
}
2017-06-01 12:11:45 +02:00
2017-02-22 20:35:42 +01:00
return $res ;
2010-05-12 13:29:21 +02:00
}
/**
* Remove an uploaded file ( for example after submitting a new file a mail form ) .
* All information used are in db , conf , langs , user and _FILES .
2011-12-17 01:16:33 +01:00
*
2011-11-12 12:59:06 +01:00
* @ param int $filenb File nb to delete
2018-08-16 21:48:16 +02:00
* @ param int $donotupdatesession - 1 or 1 = Do not update _SESSION variable
2011-11-12 12:59:06 +01:00
* @ param int $donotdeletefile 1 = Do not delete physically file
2016-06-24 16:10:52 +02:00
* @ param string $trackid Track id ( used to prefix name of session vars to avoid conflict )
2012-07-29 12:54:19 +02:00
* @ return void
2010-05-12 13:29:21 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_remove_file_process ( $filenb , $donotupdatesession = 0 , $donotdeletefile = 1 , $trackid = '' )
2010-05-12 13:29:21 +02:00
{
global $db , $user , $conf , $langs , $_FILES ;
$keytodelete = $filenb ;
$keytodelete -- ;
$listofpaths = array ();
$listofnames = array ();
$listofmimes = array ();
2017-10-07 13:09:31 +02:00
$keytoavoidconflict = empty ( $trackid ) ? '' : '-' . $trackid ;
2019-01-27 11:55:16 +01:00
if ( ! empty ( $_SESSION [ " listofpaths " . $keytoavoidconflict ])) $listofpaths = explode ( ';' , $_SESSION [ " listofpaths " . $keytoavoidconflict ]);
if ( ! empty ( $_SESSION [ " listofnames " . $keytoavoidconflict ])) $listofnames = explode ( ';' , $_SESSION [ " listofnames " . $keytoavoidconflict ]);
if ( ! empty ( $_SESSION [ " listofmimes " . $keytoavoidconflict ])) $listofmimes = explode ( ';' , $_SESSION [ " listofmimes " . $keytoavoidconflict ]);
2010-05-12 13:29:21 +02:00
if ( $keytodelete >= 0 )
{
$pathtodelete = $listofpaths [ $keytodelete ];
$filetodelete = $listofnames [ $keytodelete ];
2019-01-27 11:55:16 +01:00
if ( empty ( $donotdeletefile )) $result = dol_delete_file ( $pathtodelete , 1 ); // The delete of ecm database is inside the function dol_delete_file
2011-07-10 22:03:38 +02:00
else $result = 0 ;
2010-05-12 13:29:21 +02:00
if ( $result >= 0 )
{
2012-07-29 16:44:19 +02:00
if ( empty ( $donotdeletefile ))
{
2012-07-29 15:47:24 +02:00
$langs -> load ( " other " );
2019-01-27 11:55:16 +01:00
setEventMessages ( $langs -> trans ( " FileWasRemoved " , $filetodelete ), null , 'mesgs' );
2012-07-29 15:47:24 +02:00
}
2010-05-12 13:29:21 +02:00
if ( empty ( $donotupdatesession ))
{
2012-08-23 02:04:35 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
2010-05-12 13:29:21 +02:00
$formmail = new FormMail ( $db );
2016-06-24 16:10:52 +02:00
$formmail -> trackid = $trackid ;
2010-05-12 13:29:21 +02:00
$formmail -> remove_attached_files ( $keytodelete );
}
}
}
}
2018-02-23 19:55:15 +01:00
/**
* Add a file into database index .
* Called by dol_add_file_process when uploading a file and on other cases .
* See also commonGenerateDocument that also add / update database index when a file is generated .
*
* @ param string $dir Directory name ( full real path without ending / )
* @ param string $file File name
* @ param string $fullpathorig Full path of origin for file ( can be '' )
* @ param string $mode How file was created ( 'uploaded' , 'generated' , ... )
* @ param int $setsharekey Set also the share key
* @ return int < 0 if KO , 0 if nothing done , > 0 if OK
*/
2019-01-27 15:20:16 +01:00
function addFileIntoDatabaseIndex ( $dir , $file , $fullpathorig = '' , $mode = 'uploaded' , $setsharekey = 0 )
2018-02-23 19:55:15 +01:00
{
global $db , $user ;
$result = 0 ;
2019-01-27 11:55:16 +01:00
$rel_dir = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $dir );
2018-02-23 19:55:15 +01:00
if ( ! preg_match ( '/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/' , $rel_dir )) // If not a tmp dir
{
$filename = basename ( $file );
$rel_dir = preg_replace ( '/[\\/]$/' , '' , $rel_dir );
$rel_dir = preg_replace ( '/^[\\/]/' , '' , $rel_dir );
include_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php' ;
$ecmfile = new EcmFiles ( $db );
$ecmfile -> filepath = $rel_dir ;
$ecmfile -> filename = $filename ;
$ecmfile -> label = md5_file ( dol_osencode ( $dir . '/' . $file )); // MD5 of file content
$ecmfile -> fullpath_orig = $fullpathorig ;
$ecmfile -> gen_or_uploaded = $mode ;
$ecmfile -> description = '' ; // indexed content
$ecmfile -> keyword = '' ; // keyword content
if ( $setsharekey )
{
require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php' ;
$ecmfile -> share = getRandomPassword ( true );
}
$result = $ecmfile -> create ( $user );
if ( $result < 0 )
{
dol_syslog ( $ecmfile -> error );
}
}
return $result ;
}
/**
* Delete files into database index using search criterias .
*
* @ param string $dir Directory name ( full real path without ending / )
* @ param string $file File name
* @ param string $mode How file was created ( 'uploaded' , 'generated' , ... )
* @ return int < 0 if KO , 0 if nothing done , > 0 if OK
*/
2019-01-27 15:20:16 +01:00
function deleteFilesIntoDatabaseIndex ( $dir , $file , $mode = 'uploaded' )
2018-02-23 19:55:15 +01:00
{
global $conf , $db , $user ;
$error = 0 ;
if ( empty ( $dir ))
{
dol_syslog ( " deleteFilesIntoDatabaseIndex: dir parameter can't be empty " , LOG_ERR );
return - 1 ;
}
$db -> begin ();
2019-01-27 11:55:16 +01:00
$rel_dir = preg_replace ( '/^' . preg_quote ( DOL_DATA_ROOT , '/' ) . '/' , '' , $dir );
2018-02-23 19:55:15 +01:00
$filename = basename ( $file );
$rel_dir = preg_replace ( '/[\\/]$/' , '' , $rel_dir );
$rel_dir = preg_replace ( '/^[\\/]/' , '' , $rel_dir );
if ( ! $error )
{
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . 'ecm_files' ;
$sql .= ' WHERE entity = ' . $conf -> entity ;
$sql .= " AND filepath = ' " . $db -> escape ( $rel_dir ) . " ' " ;
if ( $file ) $sql .= " AND filename = ' " . $db -> escape ( $file ) . " ' " ;
if ( $mode ) $sql .= " AND gen_or_uploaded = ' " . $db -> escape ( $mode ) . " ' " ;
$resql = $db -> query ( $sql );
if ( ! $resql )
{
$error ++ ;
dol_syslog ( __METHOD__ . ' ' . $db -> lasterror (), LOG_ERR );
}
}
// Commit or rollback
if ( $error ) {
$db -> rollback ();
return - 1 * $error ;
} else {
$db -> commit ();
return 1 ;
}
}
2011-03-04 14:54:47 +01:00
/**
2017-09-18 16:06:58 +02:00
* Convert an image file into another format .
2011-10-14 16:02:18 +02:00
* This need Imagick php extension .
*
2014-04-30 13:50:25 +02:00
* @ param string $fileinput Input file name
* @ param string $ext Format of target file ( It is also extension added to file if fileoutput is not provided ) .
* @ param string $fileoutput Output filename
2019-03-24 14:53:26 +01:00
* @ param string $page Page number if we convert a PDF into png
2017-08-29 13:41:44 +02:00
* @ return int < 0 if KO , 0 = Nothing done , > 0 if OK
2011-03-04 14:54:47 +01:00
*/
2019-03-24 16:11:12 +01:00
function dol_convert_file ( $fileinput , $ext = 'png' , $fileoutput = '' , $page = '' )
2011-03-04 14:54:47 +01:00
{
global $langs ;
2017-08-29 13:41:44 +02:00
if ( class_exists ( 'Imagick' ))
2011-03-04 14:54:47 +01:00
{
2019-03-24 13:27:26 +01:00
$image = new Imagick ();
2017-09-18 16:06:58 +02:00
try {
2019-03-24 14:53:26 +01:00
$filetoconvert = $fileinput . (( $page != '' ) ? '[' . $page . ']' : '' );
//var_dump($filetoconvert);
$ret = $image -> readImage ( $filetoconvert );
2017-09-18 16:06:58 +02:00
} catch ( Exception $e ) {
2019-03-24 14:26:16 +01:00
$ext = pathinfo ( $fileinput , PATHINFO_EXTENSION );
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 );
2017-09-18 16:06:58 +02:00
return 0 ;
}
2011-03-04 14:54:47 +01:00
if ( $ret )
{
2019-03-24 13:27:26 +01:00
$ret = $image -> setImageFormat ( $ext );
2017-08-29 13:41:44 +02:00
if ( $ret )
{
if ( empty ( $fileoutput )) $fileoutput = $fileinput . " . " . $ext ;
2014-04-30 13:50:25 +02:00
2017-08-29 13:41:44 +02:00
$count = $image -> getNumberImages ();
2018-02-02 10:33:41 +01:00
if ( ! dol_is_file ( $fileoutput ) || is_writeable ( $fileoutput ))
{
2019-10-29 11:11:13 +01:00
try {
2019-10-31 21:16:41 +01:00
$ret = $image -> writeImages ( $fileoutput , true );
2019-10-29 11:11:13 +01:00
}
catch ( Exception $e )
{
dol_syslog ( $e -> getMessage (), LOG_WARNING );
}
2018-02-02 10:33:41 +01:00
}
else
{
dol_syslog ( " Warning: Failed to write cache preview file '. $fileoutput .'. Check permission on file/dir " , LOG_ERR );
}
2017-08-29 13:41:44 +02:00
if ( $ret ) return $count ;
else return - 3 ;
}
else
{
return - 2 ;
}
2011-03-04 14:54:47 +01:00
}
else
{
2017-08-29 13:41:44 +02:00
return - 1 ;
2011-03-04 14:54:47 +01:00
}
}
else
{
2017-08-29 13:41:44 +02:00
return 0 ;
2011-03-04 14:54:47 +01:00
}
}
2011-10-14 16:02:18 +02:00
/**
2019-09-04 19:55:15 +02:00
* Compress a file .
* An error string may be returned into parameters .
2011-10-14 16:02:18 +02:00
*
2012-02-04 14:39:47 +01:00
* @ param string $inputfile Source file name
* @ param string $outputfile Target file name
2012-04-28 18:21:51 +02:00
* @ param string $mode 'gz' or 'bz' or 'zip'
2019-09-04 19:55:15 +02:00
* @ param string $errorstring Error string
2012-02-04 14:39:47 +01:00
* @ return int < 0 if KO , > 0 if OK
2011-10-14 16:02:18 +02:00
*/
2019-09-04 19:55:15 +02:00
function dol_compress_file ( $inputfile , $outputfile , $mode = " gz " , & $errorstring = null )
2011-10-14 16:02:18 +02:00
{
2019-08-14 03:43:15 +02:00
global $conf ;
2017-10-07 13:09:31 +02:00
$foundhandler = 0 ;
2011-10-14 16:02:18 +02:00
2017-10-07 13:09:31 +02:00
try
{
2019-08-14 01:43:06 +02:00
dol_syslog ( " dol_compress_file mode= " . $mode . " inputfile= " . $inputfile . " outputfile= " . $outputfile );
2017-10-07 13:09:31 +02:00
$data = implode ( " " , file ( dol_osencode ( $inputfile )));
if ( $mode == 'gz' ) { $foundhandler = 1 ; $compressdata = gzencode ( $data , 9 ); }
elseif ( $mode == 'bz' ) { $foundhandler = 1 ; $compressdata = bzcompress ( $data , 9 ); }
elseif ( $mode == 'zip' )
{
2019-08-14 03:43:15 +02:00
if ( class_exists ( 'ZipArchive' ) && ! empty ( $conf -> global -> MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS ))
{
$foundhandler = 1 ;
$rootPath = realpath ( $inputfile );
dol_syslog ( " Class ZipArchive is set so we zip using ZipArchive to zip into " . $outputfile . ' rootPath=' . $rootPath );
$zip = new ZipArchive ;
2019-08-16 17:35:12 +02:00
if ( $zip -> open ( $outputfile , ZipArchive :: CREATE ) !== true ) {
2019-09-04 19:55:15 +02:00
$errorstring = " dol_compress_file failure - Failed to open file " . $outputfile . " \n " ;
dol_syslog ( $errorstring , LOG_ERR );
global $errormsg ;
$errormsg = $errorstring ;
2019-08-14 03:43:15 +02:00
return - 6 ;
}
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator (
new RecursiveDirectoryIterator ( $rootPath ),
RecursiveIteratorIterator :: LEAVES_ONLY
);
foreach ( $files as $name => $file )
{
// Skip directories (they would be added automatically)
if ( ! $file -> isDir ())
{
// Get real and relative path for current file
$filePath = $file -> getRealPath ();
$relativePath = substr ( $filePath , strlen ( $rootPath ) + 1 );
// Add current file to archive
$zip -> addFile ( $filePath , $relativePath );
}
}
// Zip archive will be created only after closing object
$zip -> close ();
dol_syslog ( " dol_compress_file success - " . count ( $zip -> numFiles ) . " files " );
return 1 ;
}
2017-10-07 13:09:31 +02:00
if ( defined ( 'ODTPHP_PATHTOPCLZIP' ))
{
$foundhandler = 1 ;
include_once ODTPHP_PATHTOPCLZIP . '/pclzip.lib.php' ;
$archive = new PclZip ( $outputfile );
2019-08-14 01:43:06 +02:00
$result = $archive -> add ( $inputfile , PCLZIP_OPT_REMOVE_PATH , dirname ( $inputfile ));
if ( $result === 0 )
{
global $errormsg ;
$errormsg = $archive -> errorInfo ( true );
2019-09-04 19:55:15 +02:00
2019-08-14 01:43:06 +02:00
if ( $archive -> errorCode () == PCLZIP_ERR_WRITE_OPEN_FAIL )
{
2019-09-04 19:55:15 +02:00
$errorstring = " PCLZIP_ERR_WRITE_OPEN_FAIL " ;
dol_syslog ( " dol_compress_file error - archive->errorCode() = PCLZIP_ERR_WRITE_OPEN_FAIL " , LOG_ERR );
2019-08-14 01:43:06 +02:00
return - 4 ;
}
2019-09-04 19:55:15 +02:00
$errorstring = " dol_compress_file error archive->errorCode = " . $archive -> errorCode () . " errormsg= " . $errormsg ;
dol_syslog ( " dol_compress_file failure - " . $errormsg , LOG_ERR );
2019-08-14 01:43:06 +02:00
return - 3 ;
}
else
{
dol_syslog ( " dol_compress_file success - " . count ( $result ) . " files " );
return 1 ;
}
2017-10-07 13:09:31 +02:00
}
}
if ( $foundhandler )
{
$fp = fopen ( $outputfile , " w " );
fwrite ( $fp , $compressdata );
fclose ( $fp );
return 1 ;
}
else
{
2019-09-04 19:55:15 +02:00
$errorstring = " Try to zip with format " . $mode . " with no handler for this format " ;
dol_syslog ( $errorstring , LOG_ERR );
global $errormsg ;
$errormsg = $errorstring ;
2017-10-07 13:09:31 +02:00
return - 2 ;
}
}
catch ( Exception $e )
{
global $langs , $errormsg ;
$langs -> load ( " errors " );
$errormsg = $langs -> trans ( " ErrorFailedToWriteInDir " );
2019-09-04 19:55:15 +02:00
$errorstring = " Failed to open file " . $outputfile ;
dol_syslog ( $errorstring , LOG_ERR );
2017-10-07 13:09:31 +02:00
return - 1 ;
}
2011-10-14 16:02:18 +02:00
}
2012-04-28 18:21:51 +02:00
/**
* Uncompress a file
*
* @ param string $inputfile File to uncompress
* @ param string $outputdir Target dir name
* @ return array array ( 'error' => 'Error code' ) or array () if no error
*/
2019-01-27 15:20:16 +01:00
function dol_uncompress ( $inputfile , $outputdir )
2012-04-28 18:21:51 +02:00
{
2019-08-14 04:00:08 +02:00
global $conf , $langs ;
2017-10-07 13:09:31 +02:00
2019-08-14 04:00:08 +02:00
if ( defined ( 'ODTPHP_PATHTOPCLZIP' ) && empty ( $conf -> global -> MAIN_USE_ZIPARCHIVE_FOR_ZIP_UNCOMPRESS ))
2017-10-07 13:09:31 +02:00
{
dol_syslog ( " Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to " . ODTPHP_PATHTOPCLZIP . " , so we use Pclzip to unzip into " . $outputdir );
include_once ODTPHP_PATHTOPCLZIP . '/pclzip.lib.php' ;
$archive = new PclZip ( $inputfile );
$result = $archive -> extract ( PCLZIP_OPT_PATH , $outputdir );
//var_dump($result);
if ( ! is_array ( $result ) && $result <= 0 ) return array ( 'error' => $archive -> errorInfo ( true ));
else
2015-04-03 18:42:07 +02:00
{
$ok = 1 ; $errmsg = '' ;
// Loop on each file to check result for unzipping file
foreach ( $result as $key => $val )
{
if ( $val [ 'status' ] == 'path_creation_fail' )
{
$langs -> load ( " errors " );
$ok = 0 ;
$errmsg = $langs -> trans ( " ErrorFailToCreateDir " , $val [ 'filename' ]);
break ;
}
}
if ( $ok ) return array ();
else return array ( 'error' => $errmsg );
}
2017-10-07 13:09:31 +02:00
}
if ( class_exists ( 'ZipArchive' ))
{
dol_syslog ( " Class ZipArchive is set so we unzip using ZipArchive to unzip into " . $outputdir );
$zip = new ZipArchive ;
$res = $zip -> open ( $inputfile );
2018-04-16 13:51:16 +02:00
if ( $res === true )
2017-10-07 13:09:31 +02:00
{
$zip -> extractTo ( $outputdir . '/' );
$zip -> close ();
return array ();
}
else
{
return array ( 'error' => 'ErrUnzipFails' );
}
}
return array ( 'error' => 'ErrNoZipEngine' );
2012-04-28 18:21:51 +02:00
}
2012-03-16 00:34:41 +01:00
2017-05-31 00:20:35 +02:00
/**
* Compress a directory and subdirectories into a package file .
*
* @ param string $inputdir Source dir name
2017-07-17 11:05:38 +02:00
* @ param string $outputfile Target file name ( output directory must exists and be writable )
2017-05-31 00:20:35 +02:00
* @ param string $mode 'zip'
2019-09-03 22:39:24 +02:00
* @ param string $excludefiles A regex pattern . For example : '/\.log$|\/temp\//'
2017-05-31 00:20:35 +02:00
* @ return int < 0 if KO , > 0 if OK
*/
2019-09-03 22:39:24 +02:00
function dol_compress_dir ( $inputdir , $outputfile , $mode = " zip " , $excludefiles = '' )
2017-05-31 00:20:35 +02:00
{
2017-10-07 13:09:31 +02:00
$foundhandler = 0 ;
2017-05-31 00:20:35 +02:00
2019-09-05 13:42:58 +02:00
dol_syslog ( " Try to zip dir " . $inputdir . " into " . $outputfile . " mode= " . $mode );
2017-07-17 11:05:38 +02:00
2017-10-07 13:09:31 +02:00
if ( ! dol_is_dir ( dirname ( $outputfile )) || ! is_writable ( dirname ( $outputfile )))
{
global $langs , $errormsg ;
$langs -> load ( " errors " );
2019-01-27 11:55:16 +01:00
$errormsg = $langs -> trans ( " ErrorFailedToWriteInDir " , $outputfile );
2017-07-17 11:05:38 +02:00
return - 3 ;
2017-10-07 13:09:31 +02:00
}
try
{
if ( $mode == 'gz' ) { $foundhandler = 0 ; }
elseif ( $mode == 'bz' ) { $foundhandler = 0 ; }
elseif ( $mode == 'zip' )
{
/* if ( defined ( 'ODTPHP_PATHTOPCLZIP' ))
2017-05-31 00:20:35 +02:00
{
$foundhandler = 0 ; // TODO implement this
include_once ODTPHP_PATHTOPCLZIP . '/pclzip.lib.php' ;
$archive = new PclZip ( $outputfile );
$archive -> add ( $inputfile , PCLZIP_OPT_REMOVE_PATH , dirname ( $inputfile ));
//$archive->add($inputfile);
return 1 ;
}
else */
2019-09-03 22:39:24 +02:00
//if (class_exists('ZipArchive') && ! empty($conf->global->MAIN_USE_ZIPARCHIVE_FOR_ZIP_COMPRESS))
2017-10-07 13:09:31 +02:00
if ( class_exists ( 'ZipArchive' ))
{
$foundhandler = 1 ;
2017-06-01 12:11:45 +02:00
2017-10-07 13:09:31 +02:00
// Initialize archive object
$zip = new ZipArchive ();
$result = $zip -> open ( $outputfile , ZipArchive :: CREATE | ZipArchive :: OVERWRITE );
2019-09-03 22:39:24 +02:00
if ( ! $result )
{
global $langs , $errormsg ;
$langs -> load ( " errors " );
$errormsg = $langs -> trans ( " ErrorFailedToWriteInFile " , $outputfile );
return - 4 ;
}
2017-10-07 13:09:31 +02:00
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator (
new RecursiveDirectoryIterator ( $inputdir ),
RecursiveIteratorIterator :: LEAVES_ONLY
);
foreach ( $files as $name => $file )
{
// Skip directories (they would be added automatically)
if ( ! $file -> isDir ())
{
// Get real and relative path for current file
$filePath = $file -> getRealPath ();
$relativePath = substr ( $filePath , strlen ( $inputdir ) + 1 );
2019-09-03 22:39:24 +02:00
if ( empty ( $excludefiles ) || ! preg_match ( $excludefiles , $filePath ))
{
// Add current file to archive
$zip -> addFile ( $filePath , $relativePath );
}
2017-10-07 13:09:31 +02:00
}
}
// Zip archive will be created only after closing object
$zip -> close ();
return 1 ;
}
}
if ( ! $foundhandler )
{
2019-01-27 11:55:16 +01:00
dol_syslog ( " Try to zip with format " . $mode . " with no handler for this format " , LOG_ERR );
2017-10-07 13:09:31 +02:00
return - 2 ;
}
else
{
return 0 ;
}
}
catch ( Exception $e )
{
global $langs , $errormsg ;
$langs -> load ( " errors " );
dol_syslog ( " Failed to open file " . $outputfile , LOG_ERR );
dol_syslog ( $e -> getMessage (), LOG_ERR );
2019-01-27 11:55:16 +01:00
$errormsg = $langs -> trans ( " ErrorFailedToWriteInDir " , $outputfile );
2017-10-07 13:09:31 +02:00
return - 1 ;
}
2017-05-31 00:20:35 +02:00
}
2012-03-16 00:34:41 +01:00
/**
2013-03-30 14:10:15 +01:00
* Return file ( s ) into a directory ( by default most recent )
2012-03-16 00:34:41 +01:00
*
2014-04-23 15:53:45 +02:00
* @ param string $dir Directory to scan
* @ param string $regexfilter Regex filter to restrict list . This regex value must be escaped for '/' , since this char is used for preg_match function
2017-04-12 11:30:33 +02:00
* @ param array $excludefilter Array of Regex for exclude filter ( example : array ( '(\.meta|_preview.*\.png)$' , '^\.' )) . This regex value must be escaped for '/' , since this char is used for preg_match function
2014-04-23 15:53:45 +02:00
* @ param int $nohook Disable all hooks
2017-06-11 12:26:51 +02:00
* @ param int $mode 0 = Return array minimum keys loaded ( faster ), 1 = Force all keys like date and size to be loaded ( slower ), 2 = Force load of date only , 3 = Force load of size only
2014-04-23 15:53:45 +02:00
* @ return string Full path to most recent file
2012-03-16 00:34:41 +01:00
*/
2019-01-27 15:20:16 +01:00
function dol_most_recent_file ( $dir , $regexfilter = '' , $excludefilter = array ( '(\.meta|_preview.*\.png)$' , '^\.' ), $nohook = false , $mode = '' )
2012-03-16 00:34:41 +01:00
{
2019-01-27 11:55:16 +01:00
$tmparray = dol_dir_list ( $dir , 'files' , 0 , $regexfilter , $excludefilter , 'date' , SORT_DESC , $mode , $nohook );
2017-10-07 13:09:31 +02:00
return $tmparray [ 0 ];
2012-03-16 00:34:41 +01:00
}
2013-03-30 14:10:15 +01:00
2013-04-22 15:00:29 +02:00
/**
2013-04-25 10:06:54 +02:00
* Security check when accessing to a document ( used by document . php , viewimage . php and webservices )
*
2015-05-18 23:04:49 +02:00
* @ param string $modulepart Module of document ( 'module' , 'module_user_temp' , 'module_user' or 'module_temp' )
2016-12-13 00:15:21 +01:00
* @ param string $original_file Relative path with filename , relative to modulepart .
2017-05-20 11:31:03 +02:00
* @ param string $entity Restrict onto entity ( 0 = no restriction )
2013-06-25 23:22:00 +02:00
* @ param User $fuser User object ( forced )
2013-05-16 15:46:54 +02:00
* @ param string $refname Ref of object to check permission for external users ( autodetect if not provided )
2017-06-01 12:11:45 +02:00
* @ param string $mode Check permission for 'read' or 'write'
2016-12-13 00:15:21 +01:00
* @ return mixed Array with access information : 'accessallowed' & 'sqlprotectagainstexternals' & 'original_file' ( as a full path name )
2019-03-11 01:01:15 +01:00
* @ see restrictedArea ()
2013-04-22 15:00:29 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_check_secure_access_document ( $modulepart , $original_file , $entity , $fuser = '' , $refname = '' , $mode = 'read' )
2013-04-22 15:00:29 +02:00
{
2017-12-27 15:48:20 +01:00
global $conf , $db , $user ;
2017-08-26 15:22:13 +02:00
global $dolibarr_main_data_root , $dolibarr_main_document_root_alt ;
2017-06-01 12:11:45 +02:00
2013-06-25 15:09:51 +02:00
if ( ! is_object ( $fuser )) $fuser = $user ;
2013-04-25 10:06:54 +02:00
if ( empty ( $modulepart )) return 'ErrorBadParameter' ;
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ))
{
if ( empty ( $conf -> multicompany -> enabled )) $entity = 1 ;
else $entity = 0 ;
}
2018-12-17 15:35:20 +01:00
// Fix modulepart
if ( $modulepart == 'users' ) $modulepart = 'user' ;
2017-12-27 15:48:20 +01:00
dol_syslog ( 'modulepart=' . $modulepart . ' original_file=' . $original_file . ' entity=' . $entity );
2019-03-11 01:01:15 +01:00
2013-04-25 10:06:54 +02:00
// We define $accessallowed and $sqlprotectagainstexternals
2013-04-22 15:00:29 +02:00
$accessallowed = 0 ;
$sqlprotectagainstexternals = '' ;
$ret = array ();
2013-04-25 10:06:54 +02:00
2017-10-07 13:09:31 +02:00
// Find the subdirectory name as the reference. For exemple original_file='10/myfile.pdf' -> refname='10'
2013-05-16 15:46:54 +02:00
if ( empty ( $refname )) $refname = basename ( dirname ( $original_file ) . " / " );
2013-06-25 23:22:00 +02:00
2017-05-20 11:31:03 +02:00
// Define possible keys to use for permission check
$lire = 'lire' ; $read = 'read' ; $download = 'download' ;
if ( $mode == 'write' )
{
2017-10-07 13:09:31 +02:00
$lire = 'creer' ; $read = 'write' ; $download = 'upload' ;
2017-05-20 11:31:03 +02:00
}
2017-06-01 12:11:45 +02:00
2017-06-20 16:54:37 +02:00
// Wrapping for miscellaneous medias files
if ( $modulepart == 'medias' && ! empty ( $dolibarr_main_data_root ))
{
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ) || empty ( $conf -> medias -> multidir_output [ $entity ])) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2017-10-07 13:09:31 +02:00
$accessallowed = 1 ;
$original_file = $conf -> medias -> multidir_output [ $entity ] . '/' . $original_file ;
2017-06-20 16:54:37 +02:00
}
// Wrapping for *.log files, like when used with url http://.../document.php?modulepart=logs&file=dolibarr.log
elseif ( $modulepart == 'logs' && ! empty ( $dolibarr_main_data_root ))
{
2017-10-07 13:09:31 +02:00
$accessallowed = ( $user -> admin && basename ( $original_file ) == $original_file && preg_match ( '/^dolibarr.*\.log$/' , basename ( $original_file )));
$original_file = $dolibarr_main_data_root . '/' . $original_file ;
2017-06-20 16:54:37 +02:00
}
2019-08-12 22:19:24 +02:00
// Wrapping for *.log files, like when used with url http://.../document.php?modulepart=logs&file=dolibarr.log
elseif ( $modulepart == 'doctemplateswebsite' && ! empty ( $dolibarr_main_data_root ))
{
$accessallowed = ( $fuser -> rights -> website -> write && preg_match ( '/\.jpg$/i' , basename ( $original_file )));
$original_file = $dolibarr_main_data_root . '/doctemplates/websites/' . $original_file ;
}
2017-08-26 15:22:13 +02:00
// Wrapping for *.zip files, like when used with url http://.../document.php?modulepart=packages&file=module_myfile.zip
elseif ( $modulepart == 'packages' && ! empty ( $dolibarr_main_data_root ))
{
// Dir for custom dirs
$tmp = explode ( ',' , $dolibarr_main_document_root_alt );
$dirins = $tmp [ 0 ];
2017-10-07 13:09:31 +02:00
$accessallowed = ( $user -> admin && preg_match ( '/^module_.*\.zip$/' , basename ( $original_file )));
$original_file = $dirins . '/' . $original_file ;
2017-08-26 15:22:13 +02:00
}
2013-04-25 10:06:54 +02:00
// Wrapping for some images
2018-09-09 12:53:30 +02:00
elseif ( $modulepart == 'mycompany' && ! empty ( $conf -> mycompany -> dir_output ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
2018-09-09 12:53:30 +02:00
$original_file = $conf -> mycompany -> dir_output . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping for users photos
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'userphoto' && ! empty ( $conf -> user -> dir_output ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> user -> dir_output . '/' . $original_file ;
}
// Wrapping for members photos
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'memberphoto' && ! empty ( $conf -> adherent -> dir_output ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> adherent -> dir_output . '/' . $original_file ;
}
// Wrapping pour les apercu factures
2019-05-12 14:25:41 +02:00
elseif ( $modulepart == 'apercufacture' && ! empty ( $conf -> facture -> multidir_output [ $entity ]))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> facture -> { $lire }) $accessallowed = 1 ;
2019-05-12 14:25:41 +02:00
$original_file = $conf -> facture -> multidir_output [ $entity ] . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les apercu propal
2018-02-25 17:43:19 +01:00
elseif ( $modulepart == 'apercupropal' && ! empty ( $conf -> propal -> multidir_output [ $entity ]))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> propale -> { $lire }) $accessallowed = 1 ;
2018-02-25 17:43:19 +01:00
$original_file = $conf -> propal -> multidir_output [ $entity ] . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les apercu commande
2019-05-12 14:25:41 +02:00
elseif ( $modulepart == 'apercucommande' && ! empty ( $conf -> commande -> multidir_output [ $entity ]))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> commande -> { $lire }) $accessallowed = 1 ;
2019-05-12 14:25:41 +02:00
$original_file = $conf -> commande -> multidir_output [ $entity ] . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les apercu intervention
2017-03-28 12:47:48 +02:00
elseif (( $modulepart == 'apercufichinter' || $modulepart == 'apercuficheinter' ) && ! empty ( $conf -> ficheinter -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> ficheinter -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> ficheinter -> dir_output . '/' . $original_file ;
2017-05-04 19:11:19 +02:00
}
2017-05-18 12:40:20 +02:00
// Wrapping pour les apercu conat
elseif (( $modulepart == 'apercucontract' ) && ! empty ( $conf -> contrat -> dir_output ))
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> contrat -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> contrat -> dir_output . '/' . $original_file ;
2017-05-18 12:40:20 +02:00
}
2017-05-05 12:33:49 +02:00
// Wrapping pour les apercu supplier proposal
elseif (( $modulepart == 'apercusupplier_proposal' || $modulepart == 'apercusupplier_proposal' ) && ! empty ( $conf -> supplier_proposal -> dir_output ))
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> supplier_proposal -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> supplier_proposal -> dir_output . '/' . $original_file ;
2017-05-05 12:33:49 +02:00
}
// Wrapping pour les apercu supplier order
2017-05-04 19:11:19 +02:00
elseif (( $modulepart == 'apercusupplier_order' || $modulepart == 'apercusupplier_order' ) && ! empty ( $conf -> fournisseur -> commande -> dir_output ))
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> fournisseur -> commande -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> fournisseur -> commande -> dir_output . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
2017-05-05 12:33:49 +02:00
// Wrapping pour les apercu supplier invoice
elseif (( $modulepart == 'apercusupplier_invoice' || $modulepart == 'apercusupplier_invoice' ) && ! empty ( $conf -> fournisseur -> facture -> dir_output ))
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> fournisseur -> facture -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> fournisseur -> facture -> dir_output . '/' . $original_file ;
2017-05-05 12:33:49 +02:00
}
2017-06-13 15:34:18 +02:00
// Wrapping pour les apercu supplier invoice
elseif (( $modulepart == 'apercuexpensereport' ) && ! empty ( $conf -> expensereport -> dir_output ))
{
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> expensereport -> { $lire }) $accessallowed = 1 ;
$original_file = $conf -> expensereport -> dir_output . '/' . $original_file ;
2017-06-13 15:34:18 +02:00
}
2013-06-05 16:24:32 +02:00
// Wrapping pour les images des stats propales
2018-02-25 17:43:19 +01:00
elseif ( $modulepart == 'propalstats' && ! empty ( $conf -> propal -> multidir_temp [ $entity ]))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> propale -> { $lire }) $accessallowed = 1 ;
2018-02-25 17:43:19 +01:00
$original_file = $conf -> propal -> multidir_temp [ $entity ] . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les images des stats commandes
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'orderstats' && ! empty ( $conf -> commande -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> commande -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> commande -> dir_temp . '/' . $original_file ;
}
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'orderstatssupplier' && ! empty ( $conf -> fournisseur -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> fournisseur -> commande -> { $lire }) $accessallowed = 1 ;
2017-06-20 12:17:13 +02:00
$original_file = $conf -> fournisseur -> commande -> dir_temp . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les images des stats factures
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'billstats' && ! empty ( $conf -> facture -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> facture -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> facture -> dir_temp . '/' . $original_file ;
}
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'billstatssupplier' && ! empty ( $conf -> fournisseur -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> fournisseur -> facture -> { $lire }) $accessallowed = 1 ;
2017-10-06 14:05:13 +02:00
$original_file = $conf -> fournisseur -> facture -> dir_temp . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les images des stats expeditions
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'expeditionstats' && ! empty ( $conf -> expedition -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> expedition -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> expedition -> dir_temp . '/' . $original_file ;
}
// Wrapping pour les images des stats expeditions
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'tripsexpensesstats' && ! empty ( $conf -> deplacement -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> deplacement -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> deplacement -> dir_temp . '/' . $original_file ;
}
// Wrapping pour les images des stats expeditions
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'memberstats' && ! empty ( $conf -> adherent -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> adherent -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> adherent -> dir_temp . '/' . $original_file ;
}
// Wrapping pour les images des stats produits
2019-01-27 11:55:16 +01:00
elseif ( preg_match ( '/^productstats_/i' , $modulepart ) && ! empty ( $conf -> product -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> produit -> { $lire } || $fuser -> rights -> service -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = ( ! empty ( $conf -> product -> multidir_temp [ $entity ]) ? $conf -> product -> multidir_temp [ $entity ] : $conf -> service -> multidir_temp [ $entity ]) . '/' . $original_file ;
}
2017-04-12 19:30:01 +02:00
// Wrapping for taxes
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'tax' && ! empty ( $conf -> tax -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> tax -> charges -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> tax -> dir_output . '/' . $original_file ;
}
2017-04-12 19:30:01 +02:00
// Wrapping for events
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'actions' && ! empty ( $conf -> agenda -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> agenda -> myactions -> { $read }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> agenda -> dir_output . '/' . $original_file ;
}
// Wrapping for categories
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'category' && ! empty ( $conf -> categorie -> dir_output ))
2013-06-05 16:24:32 +02:00
{
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ) || empty ( $conf -> categorie -> multidir_output [ $entity ])) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> categorie -> { $lire }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> categorie -> multidir_output [ $entity ] . '/' . $original_file ;
}
// Wrapping pour les prelevements
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'prelevement' && ! empty ( $conf -> prelevement -> dir_output ))
2013-05-07 16:50:27 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> prelevement -> bons -> { $lire } || preg_match ( '/^specimen/i' , $original_file )) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> prelevement -> dir_output . '/' . $original_file ;
}
// Wrapping pour les graph energie
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'graph_stock' && ! empty ( $conf -> stock -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> stock -> dir_temp . '/' . $original_file ;
}
// Wrapping pour les graph fournisseurs
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'graph_fourn' && ! empty ( $conf -> fournisseur -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> fournisseur -> dir_temp . '/' . $original_file ;
}
// Wrapping pour les graph des produits
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'graph_product' && ! empty ( $conf -> product -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> product -> multidir_temp [ $entity ] . '/' . $original_file ;
}
// Wrapping pour les code barre
elseif ( $modulepart == 'barcode' )
{
$accessallowed = 1 ;
2017-03-10 13:39:11 +01:00
// If viewimage is called for barcode, we try to output an image on the fly, with no build of file on disk.
2013-06-05 16:24:32 +02:00
//$original_file=$conf->barcode->dir_temp.'/'.$original_file;
$original_file = '' ;
}
// Wrapping pour les icones de background des mailings
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'iconmailing' && ! empty ( $conf -> mailing -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> mailing -> dir_temp . '/' . $original_file ;
}
2017-03-10 13:39:11 +01:00
// Wrapping pour le scanner
elseif ( $modulepart == 'scanner_user_temp' && ! empty ( $conf -> scanner -> dir_temp ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
2013-06-25 15:09:51 +02:00
$original_file = $conf -> scanner -> dir_temp . '/' . $fuser -> id . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
// Wrapping pour les images fckeditor
2017-03-10 13:39:11 +01:00
elseif ( $modulepart == 'fckeditor' && ! empty ( $conf -> fckeditor -> dir_output ))
2013-06-05 16:24:32 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> fckeditor -> dir_output . '/' . $original_file ;
}
2013-04-25 10:06:54 +02:00
2017-04-27 00:53:13 +02:00
// Wrapping for users
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'user' && ! empty ( $conf -> user -> dir_output ))
2017-04-27 00:53:13 +02:00
{
2017-10-07 13:09:31 +02:00
$canreaduser = ( ! empty ( $fuser -> admin ) || $fuser -> rights -> user -> user -> { $lire });
if ( $fuser -> id == ( int ) $refname ) { $canreaduser = 1 ; } // A user can always read its own card
2019-01-27 11:55:16 +01:00
if ( $canreaduser || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> user -> dir_output . '/' . $original_file ;
2017-04-27 00:53:13 +02:00
}
2017-06-01 12:11:45 +02:00
2013-04-25 10:06:54 +02:00
// Wrapping for third parties
2019-08-25 16:41:59 +02:00
elseif (( $modulepart == 'company' || $modulepart == 'societe' || $modulepart == 'thirdparty' ) && ! empty ( $conf -> societe -> dir_output ))
2013-04-22 15:00:29 +02:00
{
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ) || empty ( $conf -> societe -> multidir_output [ $entity ])) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> societe -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> societe -> multidir_output [ $entity ] . '/' . $original_file ;
2017-05-30 18:50:54 +02:00
$sqlprotectagainstexternals = " SELECT rowid as fk_soc FROM " . MAIN_DB_PREFIX . " societe WHERE rowid=' " . $db -> escape ( $refname ) . " ' AND entity IN ( " . getEntity ( 'societe' ) . " ) " ;
2013-04-25 10:06:54 +02:00
}
2015-10-04 17:25:46 +02:00
// Wrapping for contact
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'contact' && ! empty ( $conf -> societe -> dir_output ))
2015-10-04 17:25:46 +02:00
{
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ) || empty ( $conf -> societe -> multidir_output [ $entity ])) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> societe -> { $lire })
2015-10-04 17:25:46 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> societe -> multidir_output [ $entity ] . '/contact/' . $original_file ;
}
2013-04-25 10:06:54 +02:00
// Wrapping for invoices
2019-05-12 14:25:41 +02:00
elseif (( $modulepart == 'facture' || $modulepart == 'invoice' ) && ! empty ( $conf -> facture -> multidir_output [ $entity ]))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2019-05-12 14:25:41 +02:00
$original_file = $conf -> facture -> multidir_output [ $entity ] . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " facture WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
2017-04-09 14:31:56 +02:00
// Wrapping for mass actions
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_proposals' && ! empty ( $conf -> propal -> multidir_output [ $entity ]))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> propal -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
2018-02-25 17:43:19 +01:00
$original_file = $conf -> propal -> multidir_output [ $entity ] . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2013-04-25 10:06:54 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_orders' )
2016-07-25 21:50:41 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> commande -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
2019-05-12 14:25:41 +02:00
$original_file = $conf -> commande -> multidir_output [ $entity ] . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2016-07-25 21:50:41 +02:00
}
2019-08-14 17:04:13 +02:00
elseif ( $modulepart == 'massfilesarea_sendings' )
{
if ( $fuser -> rights -> expedition -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
{
$accessallowed = 1 ;
}
$original_file = $conf -> expedition -> dir_output . '/sending/temp/massgeneration/' . $user -> id . '/' . $original_file ;
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_invoices' )
2016-08-05 13:08:23 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
2019-05-12 14:25:41 +02:00
$original_file = $conf -> facture -> multidir_output [ $entity ] . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2016-08-05 13:08:23 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_expensereport' )
2017-03-18 11:51:45 +01:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> expensereport -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2017-03-18 11:51:45 +01:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_interventions' )
2017-04-09 14:31:56 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> ficheinter -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> ficheinter -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2017-04-09 14:31:56 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_supplier_proposal' && ! empty ( $conf -> supplier_proposal -> dir_output ))
2017-04-09 13:12:25 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> supplier_proposal -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> supplier_proposal -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2017-04-09 13:12:25 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_supplier_order' )
2017-04-09 13:12:25 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> fournisseur -> commande -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> fournisseur -> commande -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2017-04-09 13:12:25 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_supplier_invoice' )
2017-04-09 13:12:25 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> fournisseur -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-10-07 13:09:31 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> fournisseur -> facture -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
2017-04-09 13:12:25 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'massfilesarea_contract' && ! empty ( $conf -> contrat -> dir_output ))
2017-09-16 15:39:52 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> contrat -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-09-16 15:39:52 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> contrat -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
}
2017-06-01 12:11:45 +02:00
2017-03-10 13:39:11 +01:00
// Wrapping for interventions
2019-01-27 10:49:34 +01:00
elseif (( $modulepart == 'fichinter' || $modulepart == 'ficheinter' ) && ! empty ( $conf -> ficheinter -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> ficheinter -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> ficheinter -> dir_output . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " fichinter WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les deplacements et notes de frais
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'deplacement' && ! empty ( $conf -> deplacement -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> deplacement -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> deplacement -> dir_output . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
//$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les propales
2019-01-27 10:49:34 +01:00
elseif (( $modulepart == 'propal' || $modulepart == 'propale' ) && ! empty ( $conf -> propal -> multidir_output [ $entity ]))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> propale -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2018-02-25 17:43:19 +01:00
$original_file = $conf -> propal -> multidir_output [ $entity ] . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " propal WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les commandes
2019-05-12 14:25:41 +02:00
elseif (( $modulepart == 'commande' || $modulepart == 'order' ) && ! empty ( $conf -> commande -> multidir_output [ $entity ]))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> commande -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2019-05-12 14:25:41 +02:00
$original_file = $conf -> commande -> multidir_output [ $entity ] . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " commande WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les projets
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'project' && ! empty ( $conf -> projet -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> projet -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> projet -> dir_output . '/' . $original_file ;
2017-05-30 18:50:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " projet WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity IN ( " . getEntity ( 'project' ) . " ) " ;
2013-04-25 10:06:54 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'project_task' && ! empty ( $conf -> projet -> dir_output ))
2014-02-08 02:02:01 +01:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> projet -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2014-02-08 02:02:01 +01:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> projet -> dir_output . '/' . $original_file ;
2017-05-30 18:50:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " projet WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity IN ( " . getEntity ( 'project' ) . " ) " ;
2014-02-08 02:02:01 +01:00
}
2013-04-25 10:06:54 +02:00
// Wrapping pour les commandes fournisseurs
2019-01-27 10:49:34 +01:00
elseif (( $modulepart == 'commande_fournisseur' || $modulepart == 'order_supplier' ) && ! empty ( $conf -> fournisseur -> commande -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> fournisseur -> commande -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> fournisseur -> commande -> dir_output . '/' . $original_file ;
2013-05-16 15:46:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " commande_fournisseur WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les factures fournisseurs
2019-01-27 10:49:34 +01:00
elseif (( $modulepart == 'facture_fournisseur' || $modulepart == 'invoice_supplier' ) && ! empty ( $conf -> fournisseur -> facture -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> fournisseur -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> fournisseur -> facture -> dir_output . '/' . $original_file ;
2019-07-04 16:02:04 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " facture_fourn WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
2013-04-25 10:06:54 +02:00
}
2017-02-14 12:00:56 +01:00
// Wrapping pour les rapport de paiements
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'supplier_payment' )
2017-02-14 12:00:56 +01:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> fournisseur -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2017-02-14 12:00:56 +01:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> fournisseur -> payment -> dir_output . '/' . $original_file ;
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " paiementfournisseur WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity= " . $conf -> entity ;
}
2013-04-25 10:06:54 +02:00
// Wrapping pour les rapport de paiements
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'facture_paiement' && ! empty ( $conf -> facture -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> facture -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-06-25 15:09:51 +02:00
if ( $fuser -> societe_id > 0 ) $original_file = $conf -> facture -> dir_output . '/payments/private/' . $fuser -> id . '/' . $original_file ;
2013-04-25 10:06:54 +02:00
else $original_file = $conf -> facture -> dir_output . '/payments/' . $original_file ;
}
2014-09-19 05:55:54 +02:00
// Wrapping for accounting exports
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'export_compta' && ! empty ( $conf -> accounting -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> accounting -> bind -> write || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2014-09-19 05:55:54 +02:00
$original_file = $conf -> accounting -> dir_output . '/' . $original_file ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les expedition
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'expedition' && ! empty ( $conf -> expedition -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> expedition -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> expedition -> dir_output . " /sending/ " . $original_file ;
}
// Wrapping pour les bons de livraison
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'livraison' && ! empty ( $conf -> expedition -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> expedition -> livraison -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> expedition -> dir_output . " /receipt/ " . $original_file ;
}
// Wrapping pour les actions
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'actions' && ! empty ( $conf -> agenda -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> agenda -> myactions -> { $read } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> agenda -> dir_output . '/' . $original_file ;
}
// Wrapping pour les actions
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'actionsreport' && ! empty ( $conf -> agenda -> dir_temp ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> agenda -> allactions -> { $read } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> agenda -> dir_temp . " / " . $original_file ;
}
// Wrapping pour les produits et services
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'product' || $modulepart == 'produit' || $modulepart == 'service' || $modulepart == 'produit|service' )
2013-04-25 10:06:54 +02:00
{
2017-12-27 15:48:20 +01:00
if ( empty ( $entity ) || ( empty ( $conf -> product -> multidir_output [ $entity ]) && empty ( $conf -> service -> multidir_output [ $entity ]))) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2019-01-27 11:55:16 +01:00
if (( $fuser -> rights -> produit -> { $lire } || $fuser -> rights -> service -> { $lire }) || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
$accessallowed = 1 ;
}
2013-04-25 10:06:54 +02:00
if ( ! empty ( $conf -> product -> enabled )) $original_file = $conf -> product -> multidir_output [ $entity ] . '/' . $original_file ;
elseif ( ! empty ( $conf -> service -> enabled )) $original_file = $conf -> service -> multidir_output [ $entity ] . '/' . $original_file ;
}
2018-04-12 15:10:37 +02:00
// Wrapping pour les lots produits
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'product_batch' || $modulepart == 'produitlot' )
2018-04-12 15:10:37 +02:00
{
if ( empty ( $entity ) || ( empty ( $conf -> productbatch -> multidir_output [ $entity ]))) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
2019-01-27 11:55:16 +01:00
if (( $fuser -> rights -> produit -> { $lire } ) || preg_match ( '/^specimen/i' , $original_file ))
2018-04-12 15:10:37 +02:00
{
$accessallowed = 1 ;
}
if ( ! empty ( $conf -> productbatch -> enabled )) $original_file = $conf -> productbatch -> multidir_output [ $entity ] . '/' . $original_file ;
}
2019-03-10 19:33:28 +01:00
2019-02-02 08:59:37 +01:00
// Wrapping for stock movements
elseif ( $modulepart == 'movement' || $modulepart == 'mouvement' )
2019-01-28 04:36:26 +01:00
{
2019-02-03 19:27:16 +01:00
if ( empty ( $entity ) || empty ( $conf -> stock -> multidir_output [ $entity ])) return array ( 'accessallowed' => 0 , 'error' => 'Value entity must be provided' );
if (( $fuser -> rights -> stock -> { $lire } || $fuser -> rights -> stock -> movement -> { $lire } || $fuser -> rights -> stock -> mouvement -> { $lire }) || preg_match ( '/^specimen/i' , $original_file ))
2019-01-28 04:36:26 +01:00
{
$accessallowed = 1 ;
}
if ( ! empty ( $conf -> stock -> enabled )) $original_file = $conf -> stock -> multidir_output [ $entity ] . '/movement/' . $original_file ;
}
2018-04-12 15:10:37 +02:00
2013-04-25 10:06:54 +02:00
// Wrapping pour les contrats
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'contract' && ! empty ( $conf -> contrat -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> contrat -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
$accessallowed = 1 ;
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> contrat -> dir_output . '/' . $original_file ;
2017-05-30 18:50:54 +02:00
$sqlprotectagainstexternals = " SELECT fk_soc as fk_soc FROM " . MAIN_DB_PREFIX . " contrat WHERE ref=' " . $db -> escape ( $refname ) . " ' AND entity IN ( " . getEntity ( 'contract' ) . " ) " ;
2013-04-25 10:06:54 +02:00
}
// Wrapping pour les dons
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'donation' && ! empty ( $conf -> don -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> don -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
$accessallowed = 1 ;
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> don -> dir_output . '/' . $original_file ;
}
2017-05-23 13:44:18 +02:00
// Wrapping pour les dons
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'dolresource' && ! empty ( $conf -> resource -> dir_output ))
2017-05-23 13:44:18 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> resource -> { $read } || preg_match ( '/^specimen/i' , $original_file ))
2017-05-23 13:44:18 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> resource -> dir_output . '/' . $original_file ;
}
2017-06-01 12:11:45 +02:00
2013-04-25 10:06:54 +02:00
// Wrapping pour les remises de cheques
2019-04-21 19:54:30 +02:00
elseif ( $modulepart == 'remisecheque' && ! empty ( $conf -> bank -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> banque -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$accessallowed = 1 ;
2013-04-22 15:00:29 +02:00
}
2013-04-25 10:06:54 +02:00
2016-10-05 22:24:14 +02:00
$original_file = $conf -> bank -> dir_output . '/checkdeposits/' . $original_file ; // original_file should contains relative path so include the get_exdir result
2013-04-25 10:06:54 +02:00
}
2015-10-02 16:29:54 +02:00
// Wrapping for bank
2019-04-21 19:54:30 +02:00
elseif (( $modulepart == 'banque' || $modulepart == 'bank' ) && ! empty ( $conf -> bank -> dir_output ))
2015-10-02 16:29:54 +02:00
{
2017-05-20 11:31:03 +02:00
if ( $fuser -> rights -> banque -> { $lire })
2015-10-02 16:29:54 +02:00
{
$accessallowed = 1 ;
}
$original_file = $conf -> bank -> dir_output . '/' . $original_file ;
}
2013-04-25 10:06:54 +02:00
// Wrapping for export module
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'export' && ! empty ( $conf -> export -> dir_temp ))
2013-04-25 10:06:54 +02:00
{
// Aucun test necessaire car on force le rep de download sur
// le rep export qui est propre a l'utilisateur
$accessallowed = 1 ;
2013-06-25 15:09:51 +02:00
$original_file = $conf -> export -> dir_temp . '/' . $fuser -> id . '/' . $original_file ;
2013-04-25 10:06:54 +02:00
}
// Wrapping for import module
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'import' && ! empty ( $conf -> import -> dir_temp ))
2013-04-25 10:06:54 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> import -> dir_temp . '/' . $original_file ;
}
// Wrapping pour l'editeur wysiwyg
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'editor' && ! empty ( $conf -> fckeditor -> dir_output ))
2013-04-25 10:06:54 +02:00
{
$accessallowed = 1 ;
$original_file = $conf -> fckeditor -> dir_output . '/' . $original_file ;
}
2017-06-01 12:11:45 +02:00
2016-05-01 16:34:50 +02:00
// Wrapping for backups
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'systemtools' && ! empty ( $conf -> admin -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2017-03-10 13:39:11 +01:00
if ( $fuser -> admin ) $accessallowed = 1 ;
2013-04-25 10:06:54 +02:00
$original_file = $conf -> admin -> dir_output . '/' . $original_file ;
}
// Wrapping for upload file test
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'admin_temp' && ! empty ( $conf -> admin -> dir_temp ))
2013-04-25 10:06:54 +02:00
{
2017-03-10 13:39:11 +01:00
if ( $fuser -> admin ) $accessallowed = 1 ;
2013-04-25 10:06:54 +02:00
$original_file = $conf -> admin -> dir_temp . '/' . $original_file ;
}
// Wrapping pour BitTorrent
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'bittorrent' && ! empty ( $conf -> bittorrent -> dir_output ))
2013-04-25 10:06:54 +02:00
{
$accessallowed = 1 ;
$dir = 'files' ;
2014-04-23 16:01:08 +02:00
if ( dol_mimetype ( $original_file ) == 'application/x-bittorrent' ) $dir = 'torrents' ;
2013-04-25 10:06:54 +02:00
$original_file = $conf -> bittorrent -> dir_output . '/' . $dir . '/' . $original_file ;
}
// Wrapping pour Foundation module
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'member' && ! empty ( $conf -> adherent -> dir_output ))
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( $fuser -> rights -> adherent -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
2013-04-22 15:00:29 +02:00
{
$accessallowed = 1 ;
}
2013-04-25 10:06:54 +02:00
$original_file = $conf -> adherent -> dir_output . '/' . $original_file ;
}
// Wrapping for Scanner
2019-01-27 10:49:34 +01:00
elseif ( $modulepart == 'scanner_user_temp' && ! empty ( $conf -> scanner -> dir_temp ))
2013-04-25 10:06:54 +02:00
{
$accessallowed = 1 ;
2013-06-25 15:09:51 +02:00
$original_file = $conf -> scanner -> dir_temp . '/' . $fuser -> id . '/' . $original_file ;
2013-04-25 10:06:54 +02:00
}
2017-10-07 13:09:31 +02:00
// GENERIC Wrapping
// If modulepart=module_user_temp Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart/temp/iduser
// If modulepart=module_temp Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart/temp
// If modulepart=module_user Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart/iduser
// If modulepart=module Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart
else
2013-04-25 10:06:54 +02:00
{
2019-01-27 11:55:16 +01:00
if ( preg_match ( '/^specimen/i' , $original_file )) $accessallowed = 1 ; // If link to a file called specimen. Test must be done before changing $original_file int full path.
2017-10-07 13:09:31 +02:00
if ( $fuser -> admin ) $accessallowed = 1 ; // If user is admin
2017-03-10 13:39:11 +01:00
2013-04-25 10:06:54 +02:00
// Define $accessallowed
2019-01-27 11:55:16 +01:00
if ( preg_match ( '/^([a-z]+)_user_temp$/i' , $modulepart , $reg ))
2013-06-05 16:24:32 +02:00
{
2017-03-10 12:19:50 +01:00
if ( empty ( $conf -> { $reg [ 1 ]} -> dir_temp )) // modulepart not supported
{
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , 'Error call dol_check_secure_access_document with not supported value for modulepart parameter (' . $modulepart . ')' );
2017-03-10 12:19:50 +01:00
exit ;
}
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> { $reg [ 1 ]} -> { $lire } || $fuser -> rights -> { $reg [ 1 ]} -> { $read } || ( $fuser -> rights -> { $reg [ 1 ]} -> { $download })) $accessallowed = 1 ;
2016-02-11 20:01:51 +01:00
$original_file = $conf -> { $reg [ 1 ]} -> dir_temp . '/' . $fuser -> id . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
2019-01-27 23:23:38 +01:00
elseif ( preg_match ( '/^([a-z]+)_temp$/i' , $modulepart , $reg ))
2013-06-05 16:24:32 +02:00
{
2017-03-10 12:19:50 +01:00
if ( empty ( $conf -> { $reg [ 1 ]} -> dir_temp )) // modulepart not supported
{
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , 'Error call dol_check_secure_access_document with not supported value for modulepart parameter (' . $modulepart . ')' );
2017-03-10 12:19:50 +01:00
exit ;
}
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> { $reg [ 1 ]} -> { $lire } || $fuser -> rights -> { $reg [ 1 ]} -> { $read } || ( $fuser -> rights -> { $reg [ 1 ]} -> { $download })) $accessallowed = 1 ;
2016-02-11 20:01:51 +01:00
$original_file = $conf -> { $reg [ 1 ]} -> dir_temp . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
2019-01-27 23:23:38 +01:00
elseif ( preg_match ( '/^([a-z]+)_user$/i' , $modulepart , $reg ))
2013-06-05 16:24:32 +02:00
{
2017-03-10 12:19:50 +01:00
if ( empty ( $conf -> { $reg [ 1 ]} -> dir_output )) // modulepart not supported
{
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , 'Error call dol_check_secure_access_document with not supported value for modulepart parameter (' . $modulepart . ')' );
2017-03-10 12:19:50 +01:00
exit ;
}
2017-10-07 13:09:31 +02:00
if ( $fuser -> rights -> { $reg [ 1 ]} -> { $lire } || $fuser -> rights -> { $reg [ 1 ]} -> { $read } || ( $fuser -> rights -> { $reg [ 1 ]} -> { $download })) $accessallowed = 1 ;
2016-02-11 20:01:51 +01:00
$original_file = $conf -> { $reg [ 1 ]} -> dir_output . '/' . $fuser -> id . '/' . $original_file ;
2013-06-05 16:24:32 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( preg_match ( '/^massfilesarea_([a-z]+)$/i' , $modulepart , $reg ))
2018-12-01 14:44:34 +01:00
{
if ( empty ( $conf -> { $reg [ 1 ]} -> dir_output )) // modulepart not supported
{
2019-01-27 11:55:16 +01:00
dol_print_error ( '' , 'Error call dol_check_secure_access_document with not supported value for modulepart parameter (' . $modulepart . ')' );
2018-12-01 14:44:34 +01:00
exit ;
}
if ( $fuser -> rights -> { $reg [ 1 ]} -> { $lire } || preg_match ( '/^specimen/i' , $original_file ))
{
$accessallowed = 1 ;
}
$original_file = $conf -> { $reg [ 1 ]} -> dir_output . '/temp/massgeneration/' . $user -> id . '/' . $original_file ;
}
2013-06-05 16:24:32 +02:00
else
{
2014-02-08 02:02:01 +01:00
if ( empty ( $conf -> $modulepart -> dir_output )) // modulepart not supported
{
2019-08-16 05:14:20 +02:00
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.' );
2014-02-08 02:02:01 +01:00
exit ;
}
2013-06-05 16:24:32 +02:00
$perm = GETPOST ( 'perm' );
$subperm = GETPOST ( 'subperm' );
if ( $perm || $subperm )
{
2013-06-25 15:09:51 +02:00
if (( $perm && ! $subperm && $fuser -> rights -> $modulepart -> $perm ) || ( $perm && $subperm && $fuser -> rights -> $modulepart -> $perm -> $subperm )) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> $modulepart -> dir_output . '/' . $original_file ;
}
else
{
2017-05-19 20:17:33 +02:00
if ( $fuser -> rights -> $modulepart -> { $lire } || $fuser -> rights -> $modulepart -> { $read }) $accessallowed = 1 ;
2013-06-05 16:24:32 +02:00
$original_file = $conf -> $modulepart -> dir_output . '/' . $original_file ;
}
}
2013-04-25 10:06:54 +02:00
// For modules who wants to manage different levels of permissions for documents
$subPermCategoryConstName = strtoupper ( $modulepart ) . '_SUBPERMCATEGORY_FOR_DOCUMENTS' ;
if ( ! empty ( $conf -> global -> $subPermCategoryConstName ))
2013-04-22 15:00:29 +02:00
{
2013-04-25 10:06:54 +02:00
$subPermCategory = $conf -> global -> $subPermCategoryConstName ;
2017-05-19 20:17:33 +02:00
if ( ! empty ( $subPermCategory ) && (( $fuser -> rights -> $modulepart -> $subPermCategory -> { $lire }) || ( $fuser -> rights -> $modulepart -> $subPermCategory -> { $read }) || ( $fuser -> rights -> $modulepart -> $subPermCategory -> { $download })))
2013-04-22 15:00:29 +02:00
{
$accessallowed = 1 ;
}
}
2013-04-25 10:06:54 +02:00
// Define $sqlprotectagainstexternals for modules who want to protect access using a SQL query.
$sqlProtectConstName = strtoupper ( $modulepart ) . '_SQLPROTECTAGAINSTEXTERNALS_FOR_DOCUMENTS' ;
if ( ! empty ( $conf -> global -> $sqlProtectConstName )) // If module want to define its own $sqlprotectagainstexternals
2013-04-22 15:00:29 +02:00
{
2013-05-16 15:46:54 +02:00
// Example: mymodule__SQLPROTECTAGAINSTEXTERNALS_FOR_DOCUMENTS = "SELECT fk_soc FROM ".MAIN_DB_PREFIX.$modulepart." WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity;
2013-04-25 10:06:54 +02:00
eval ( '$sqlprotectagainstexternals = "' . $conf -> global -> $sqlProtectConstName . '";' );
2013-04-22 15:00:29 +02:00
}
}
2013-06-25 15:09:51 +02:00
2013-04-25 10:06:54 +02:00
$ret = array (
'accessallowed' => $accessallowed ,
'sqlprotectagainstexternals' => $sqlprotectagainstexternals ,
'original_file' => $original_file
);
2013-04-22 15:00:29 +02:00
return $ret ;
}
2015-01-24 15:36:47 +01:00
/**
2017-03-10 13:42:55 +01:00
* Store object in file .
2015-01-24 15:36:47 +01:00
*
* @ param string $directory Directory of cache
* @ param string $filename Name of filecache
* @ param mixed $object Object to store in cachefile
* @ return void
*/
function dol_filecache ( $directory , $filename , $object )
{
2017-10-07 13:09:31 +02:00
if ( ! dol_is_dir ( $directory )) dol_mkdir ( $directory );
$cachefile = $directory . $filename ;
file_put_contents ( $cachefile , serialize ( $object ), LOCK_EX );
@ chmod ( $cachefile , 0644 );
2015-01-24 15:36:47 +01:00
}
/**
2017-03-10 13:42:55 +01:00
* Test if Refresh needed .
2015-01-24 15:36:47 +01:00
*
* @ param string $directory Directory of cache
* @ param string $filename Name of filecache
* @ param int $cachetime Cachetime delay
* @ return boolean 0 no refresh 1 if refresh needed
*/
function dol_cache_refresh ( $directory , $filename , $cachetime )
{
2017-10-07 13:09:31 +02:00
$now = dol_now ();
$cachefile = $directory . $filename ;
$refresh = ! file_exists ( $cachefile ) || ( $now - $cachetime ) > dol_filemtime ( $cachefile );
return $refresh ;
2015-01-24 15:36:47 +01:00
}
/**
2017-03-10 13:42:55 +01:00
* Read object from cachefile .
2015-01-24 15:36:47 +01:00
*
* @ param string $directory Directory of cache
* @ param string $filename Name of filecache
* @ return mixed Unserialise from file
*/
function dol_readcachefile ( $directory , $filename )
{
2017-10-07 13:09:31 +02:00
$cachefile = $directory . $filename ;
$object = unserialize ( file_get_contents ( $cachefile ));
return $object ;
2015-01-24 15:36:47 +01:00
}
2017-12-16 17:24:23 +01:00
/**
* Function to get list of updated or modified files .
* $file_list is used as global variable
*
* @ param array $file_list Array for response
* @ param SimpleXMLElement $dir SimpleXMLElement of files to test
* @ param string $path Path of files relative to $pathref . We start with '' . Used by recursive calls .
* @ param string $pathref Path ref ( DOL_DOCUMENT_ROOT )
* @ param array $checksumconcat Array of checksum
* @ return array Array of filenames
*/
function getFilesUpdated ( & $file_list , SimpleXMLElement $dir , $path = '' , $pathref = '' , & $checksumconcat = array ())
{
2018-02-16 22:00:34 +01:00
global $conffile ;
2017-12-16 17:24:23 +01:00
$exclude = 'install' ;
foreach ( $dir -> md5file as $file ) // $file is a simpleXMLElement
{
$filename = $path . $file [ 'name' ];
$file_list [ 'insignature' ][] = $filename ;
2019-11-04 13:23:48 +01:00
$expectedsize = ( empty ( $file [ 'size' ]) ? '' : $file [ 'size' ]);
2018-02-16 22:00:34 +01:00
$expectedmd5 = ( string ) $file ;
2017-12-16 17:24:23 +01:00
//if (preg_match('#'.$exclude.'#', $filename)) continue;
if ( ! file_exists ( $pathref . '/' . $filename ))
{
2019-11-04 13:23:48 +01:00
$file_list [ 'missing' ][] = array ( 'filename' => $filename , 'expectedmd5' => $expectedmd5 , 'expectedsize' => $expectedsize );
2017-12-16 17:24:23 +01:00
}
else
{
$md5_local = md5_file ( $pathref . '/' . $filename );
2018-02-16 22:00:34 +01:00
if ( $conffile == '/etc/dolibarr/conf.php' && $filename == '/filefunc.inc.php' ) // For install with deb or rpm, we ignore test on filefunc.inc.php that was modified by package
{
$checksumconcat [] = $expectedmd5 ;
}
else
{
2019-11-04 13:23:48 +01:00
if ( $md5_local != $expectedmd5 ) $file_list [ 'updated' ][] = array ( 'filename' => $filename , 'expectedmd5' => $expectedmd5 , 'expectedsize' => $expectedsize , 'md5' => ( string ) $md5_local );
2018-02-16 22:00:34 +01:00
$checksumconcat [] = $md5_local ;
}
2017-12-16 17:24:23 +01:00
}
}
2018-02-16 22:00:34 +01:00
foreach ( $dir -> dir as $subdir ) // $subdir['name'] is '' or '/accountancy/admin' for example
{
getFilesUpdated ( $file_list , $subdir , $path . $subdir [ 'name' ] . '/' , $pathref , $checksumconcat );
}
2017-12-16 17:24:23 +01:00
return $file_list ;
}