mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-05 09:08:09 +01:00
Fix the delete dir functions does not return real nb of deleted files.
This commit is contained in:
@@ -31,7 +31,7 @@ if (! $user->admin)
|
||||
|
||||
$action=GETPOST('action','alpha');
|
||||
$confirm=GETPOST('confirm','alpha');
|
||||
$choice=GETPOST('choice');
|
||||
$choice=GETPOST('choice','aZ09');
|
||||
|
||||
|
||||
// Define filelog to discard it from purge
|
||||
|
||||
@@ -112,21 +112,33 @@ class Utils
|
||||
}
|
||||
|
||||
$count=0;
|
||||
$countdeleted=0;
|
||||
$counterror=0;
|
||||
if (count($filesarray))
|
||||
{
|
||||
foreach($filesarray as $key => $value)
|
||||
{
|
||||
//print "x ".$filesarray[$key]['fullname']."<br>\n";
|
||||
//print "x ".$filesarray[$key]['fullname']."-".$filesarray[$key]['type']."<br>\n";
|
||||
if ($filesarray[$key]['type'] == 'dir')
|
||||
{
|
||||
$count+=dol_delete_dir_recursive($filesarray[$key]['fullname']);
|
||||
$startcount=0;
|
||||
$tmpcountdeleted=0;
|
||||
$result=dol_delete_dir_recursive($filesarray[$key]['fullname'], $startcount, 1, 0, $tmpcountdeleted);
|
||||
$count+=$result;
|
||||
$countdeleted+=$tmpcountdeleted;
|
||||
}
|
||||
elseif ($filesarray[$key]['type'] == 'file')
|
||||
{
|
||||
// If (file that is not logfile) or (if logfile with option logfile)
|
||||
if ($filesarray[$key]['fullname'] != $filelog || $choice=='logfile')
|
||||
{
|
||||
$count+=(dol_delete_file($filesarray[$key]['fullname'])?1:0);
|
||||
$result=dol_delete_file($filesarray[$key]['fullname'], 1, 1);
|
||||
if ($result)
|
||||
{
|
||||
$count++;
|
||||
$countdeleted++;
|
||||
}
|
||||
else $counterror++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -140,8 +152,12 @@ class Utils
|
||||
}
|
||||
}
|
||||
|
||||
if ($count > 0) $this->output=$langs->trans("PurgeNDirectoriesDeleted", $count);
|
||||
else $this->output=$langs->trans("PurgeNothingToDelete");
|
||||
if ($count > 0)
|
||||
{
|
||||
$this->output=$langs->trans("PurgeNDirectoriesDeleted", $countdeleted);
|
||||
if ($count > $countdeleted) $this->output.='<br>'.$langs->trans("PurgeNDirectoriesFailed", ($count - $countdeleted));
|
||||
}
|
||||
else $this->output=$langs->trans("PurgeNothingToDelete").($choice == 'tempfilesold' ? ' (older than 24h)':'');
|
||||
|
||||
//return $count;
|
||||
return 0; // This function can be called by cron so must return 0 if OK
|
||||
|
||||
@@ -1113,12 +1113,13 @@ function dol_delete_dir($dir,$nophperrors=0)
|
||||
* Remove a directory $dir and its subdirectories (or only files and subdirectories)
|
||||
*
|
||||
* @param string $dir Dir to delete
|
||||
* @param int $count Counter to count nb of deleted elements
|
||||
* @param int $count Counter to count nb of elements found to delete
|
||||
* @param int $nophperrors Disable all PHP output errors
|
||||
* @param int $onlysub Delete only files and subdir, not main directory
|
||||
* @return int Number of files and directory removed
|
||||
* @param int $countdeleted Counter to count nb of elements found really deleted
|
||||
* @return int Number of files and directory we try to remove. NB really removed is returned into $countdeleted.
|
||||
*/
|
||||
function dol_delete_dir_recursive($dir,$count=0,$nophperrors=0,$onlysub=0)
|
||||
function dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0)
|
||||
{
|
||||
dol_syslog("functions.lib:dol_delete_dir_recursive ".$dir,LOG_DEBUG);
|
||||
if (dol_is_dir($dir))
|
||||
@@ -1134,13 +1135,13 @@ function dol_delete_dir_recursive($dir,$count=0,$nophperrors=0,$onlysub=0)
|
||||
{
|
||||
if (is_dir(dol_osencode("$dir/$item")))
|
||||
{
|
||||
$count=dol_delete_dir_recursive("$dir/$item",$count,$nophperrors);
|
||||
$count=dol_delete_dir_recursive("$dir/$item", $count, $nophperrors, 0, $countdeleted);
|
||||
}
|
||||
else
|
||||
{
|
||||
dol_delete_file("$dir/$item",1,$nophperrors);
|
||||
$result=dol_delete_file("$dir/$item", 1, $nophperrors);
|
||||
$count++;
|
||||
//echo " removing $dir/$item<br>\n";
|
||||
if ($result) $countdeleted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1148,14 +1149,13 @@ function dol_delete_dir_recursive($dir,$count=0,$nophperrors=0,$onlysub=0)
|
||||
|
||||
if (empty($onlysub))
|
||||
{
|
||||
dol_delete_dir($dir,$nophperrors);
|
||||
$count++;
|
||||
//echo "removing $dir<br>\n";
|
||||
$result=dol_delete_dir($dir, $nophperrors);
|
||||
$count++;
|
||||
if ($result) $countdeleted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//echo "return=".$count;
|
||||
return $count;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,6 +147,7 @@ PurgeDeleteAllFilesInDocumentsDir=Delete all files in directory <b>%s</b>. Tempo
|
||||
PurgeRunNow=Purge now
|
||||
PurgeNothingToDelete=No directory or files to delete.
|
||||
PurgeNDirectoriesDeleted=<b>%s</b> files or directories deleted.
|
||||
PurgeNDirectoriesFailed=Failed to delete <b>%s</b> files or directories.
|
||||
PurgeAuditEvents=Purge all security events
|
||||
ConfirmPurgeAuditEvents=Are you sure you want to purge all security events? All security logs will be deleted, no other data will be removed.
|
||||
GenerateBackup=Generate backup
|
||||
|
||||
@@ -286,11 +286,27 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
|
||||
$db=$this->savdb;
|
||||
|
||||
$dirout=$conf->admin->dir_temp.'/test';
|
||||
$dirout2=$conf->admin->dir_temp.'/test2';
|
||||
|
||||
$count=0;
|
||||
$result=dol_delete_dir_recursive($dirout,$count,1); // If it has no permission to delete, it will fails as if dir does not exists, so we can't test it
|
||||
$result=dol_delete_dir_recursive($dirout,$count); // If it has no permission to delete, it will fails as if dir does not exists, so we can't test it
|
||||
print __METHOD__." result=".$result."\n";
|
||||
$this->assertGreaterThanOrEqual(0,$result);
|
||||
|
||||
$count=0;
|
||||
$countdeleted=0;
|
||||
$result=dol_delete_dir_recursive($dirout,$count,1,0,$countdeleted); // If it has no permission to delete, it will fails as if dir does not exists, so we can't test it
|
||||
print __METHOD__." result=".$result."\n";
|
||||
$this->assertGreaterThanOrEqual(0,$result);
|
||||
$this->assertGreaterThanOrEqual(0,$countdeleted);
|
||||
|
||||
dol_mkdir($dirout2);
|
||||
$count=0;
|
||||
$countdeleted=0;
|
||||
$result=dol_delete_dir_recursive($dirout2,$count,1,0,$countdeleted); // If it has no permission to delete, it will fails as if dir does not exists, so we can't test it
|
||||
print __METHOD__." result=".$result."\n";
|
||||
$this->assertGreaterThanOrEqual(1,$result);
|
||||
$this->assertGreaterThanOrEqual(1,$countdeleted);
|
||||
}
|
||||
|
||||
|
||||
@@ -399,7 +415,7 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
|
||||
print __METHOD__." result=".join(',',$result)."\n";
|
||||
$this->assertEquals(0,count($result));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* testDolDirList
|
||||
*
|
||||
@@ -411,7 +427,7 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
|
||||
public function testDolDirList()
|
||||
{
|
||||
global $conf,$user,$langs,$db;
|
||||
|
||||
|
||||
// Scan dir to guaruante we on't have library jquery twice (we accept exception of duplicte into ckeditor because all dir is removed for debian package, so there is no duplicate).
|
||||
$founddirs=dol_dir_list(DOL_DOCUMENT_ROOT.'/includes/', 'files', 1, '^jquery\.js', array('ckeditor'));
|
||||
print __METHOD__." count(founddirs)=".count($founddirs)."\n";
|
||||
@@ -431,60 +447,60 @@ class FilesLibTest extends PHPUnit_Framework_TestCase
|
||||
$user=$this->savuser;
|
||||
$langs=$this->savlangs;
|
||||
$db=$this->savdb;
|
||||
|
||||
|
||||
|
||||
|
||||
//$dummyuser=new User($db);
|
||||
//$result=restrictedArea($dummyuser,'societe');
|
||||
|
||||
// We save user properties
|
||||
$savpermlire = $user->rights->facture->lire;
|
||||
$savpermcreer = $user->rights->facture->creer;
|
||||
|
||||
|
||||
|
||||
|
||||
// Check access to SPECIMEN
|
||||
$user->rights->facture->lire = 0;
|
||||
$user->rights->facture->creer = 0;
|
||||
$filename='SPECIMEN.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
|
||||
$this->assertEquals(1,$result['accessallowed']);
|
||||
|
||||
|
||||
|
||||
|
||||
// Check read permission
|
||||
$user->rights->facture->lire = 1;
|
||||
$user->rights->facture->creer = 1;
|
||||
$filename='FA010101/FA010101.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
|
||||
$this->assertEquals(1,$result['accessallowed']);
|
||||
|
||||
|
||||
$user->rights->facture->lire = 0;
|
||||
$user->rights->facture->creer = 0;
|
||||
$filename='FA010101/FA010101.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
|
||||
$this->assertEquals(0,$result['accessallowed']);
|
||||
|
||||
|
||||
// Check write permission
|
||||
$user->rights->facture->lire = 0;
|
||||
$user->rights->facture->creer = 0;
|
||||
$filename='FA010101/FA010101.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
|
||||
$this->assertEquals(0,$result['accessallowed']);
|
||||
|
||||
|
||||
$user->rights->facture->lire = 1;
|
||||
$user->rights->facture->creer = 1;
|
||||
$filename='FA010101/FA010101.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
|
||||
$this->assertEquals(1,$result['accessallowed']);
|
||||
|
||||
|
||||
$user->rights->facture->lire = 1;
|
||||
$user->rights->facture->creer = 0;
|
||||
$filename='FA010101/FA010101.pdf'; // Filename relative to module part
|
||||
$result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
|
||||
$this->assertEquals(0,$result['accessallowed']);
|
||||
|
||||
|
||||
|
||||
|
||||
// We restore user properties
|
||||
$user->rights->facture->lire = $savpermlire;
|
||||
$user->rights->facture->creer = $savpermcreer;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user