Fix the delete dir functions does not return real nb of deleted files.

This commit is contained in:
Laurent Destailleur
2017-07-13 00:18:58 +02:00
parent 4b4dcf2e01
commit 23fbef3dae
5 changed files with 65 additions and 32 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;
}
}
}