2012-01-20 10:08:16 +01:00
< ? php
2012-01-21 18:46:36 +01:00
/* Copyright ( C ) 2010 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2012 Regis Houssin < regis . houssin @ inodbox . com >
2012-01-20 10:08:16 +01: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
2012-01-20 10:08:16 +01: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
* along with this program . If not , see < http :// www . gnu . org / licenses />.
* or see http :// www . gnu . org /
*/
/**
* \file test / phpunit / FilesLibTest . php
* \ingroup test
* \brief PHPUnit test
* \remarks To run this script as CLI : phpunit filename . php
*/
global $conf , $user , $langs , $db ;
//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
2014-05-01 19:57:53 +02:00
//require_once 'PHPUnit/Autoload.php';
2012-01-20 10:08:16 +01:00
require_once dirname ( __FILE__ ) . '/../../htdocs/master.inc.php' ;
require_once dirname ( __FILE__ ) . '/../../htdocs/core/lib/files.lib.php' ;
if ( empty ( $user -> id ))
{
print " Load permissions for admin user nb 1 \n " ;
$user -> fetch ( 1 );
$user -> getrights ();
}
$conf -> global -> MAIN_DISABLE_ALL_MAILS = 1 ;
/**
* Class for PHPUnit tests
*
* @ backupGlobals disabled
* @ backupStaticAttributes enabled
* @ remarks backupGlobals must be disabled to have db , conf , user and lang not erased .
*/
class FilesLibTest extends PHPUnit_Framework_TestCase
{
protected $savconf ;
protected $savuser ;
protected $savlangs ;
protected $savdb ;
/**
* Constructor
* We save global variables into local variables
*
* @ return FilesLibTest
*/
2012-07-30 17:17:33 +02:00
function __construct ()
2012-01-20 10:08:16 +01:00
{
2018-09-02 14:10:06 +02:00
parent :: __construct ();
2012-01-20 10:08:16 +01:00
//$this->sharedFixture
global $conf , $user , $langs , $db ;
$this -> savconf = $conf ;
$this -> savuser = $user ;
$this -> savlangs = $langs ;
$this -> savdb = $db ;
print __METHOD__ . " db->type= " . $db -> type . " user->id= " . $user -> id ;
//print " - db ".$db->db;
print " \n " ;
}
// Static methods
public static function setUpBeforeClass ()
{
global $conf , $user , $langs , $db ;
$db -> begin (); // This is to have all actions inside a transaction even if test launched without suite.
print __METHOD__ . " \n " ;
}
2015-01-06 17:54:36 +01:00
// tear down after class
2012-01-20 10:08:16 +01:00
public static function tearDownAfterClass ()
{
global $conf , $user , $langs , $db ;
$db -> rollback ();
print __METHOD__ . " \n " ;
}
/**
2012-02-05 19:37:52 +01:00
* Init phpunit tests
*
* @ return void
2012-01-20 10:08:16 +01:00
*/
protected function setUp ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
print __METHOD__ . " \n " ;
}
/**
2012-02-05 19:37:52 +01:00
* End phpunit tests
*
* @ return void
2012-01-20 10:08:16 +01:00
*/
protected function tearDown ()
{
print __METHOD__ . " \n " ;
}
2012-06-24 19:32:19 +02:00
/**
* testDolBasename
*
* @ return int
*/
public function testDolBasename ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$result = dol_basename ( 'adir/afile' );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 'afile' , $result );
2012-06-24 19:32:19 +02:00
$result = dol_basename ( 'adir/afile/' );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 'afile' , $result );
2012-06-24 19:32:19 +02:00
$result = dol_basename ( 'adir/νεο' ); // With cyrillic data. Here basename fails to return correct value
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 'νεο' , $result );
2012-06-24 19:32:19 +02:00
$result = dol_basename ( 'adir/νεο/' ); // With cyrillic data. Here basename fails to return correct value
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 'νεο' , $result );
2012-06-24 19:32:19 +02:00
}
2012-01-20 10:08:16 +01:00
/**
2012-02-05 19:37:52 +01:00
* testDolCountNbOfLine
*
* @ return int
*/
2012-01-20 10:08:16 +01:00
public function testDolCountNbOfLine ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$file = dirname ( __FILE__ ) . '/Example_import_company_1.csv' ;
$result = dol_count_nb_of_line ( $file );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 3 , $result );
2012-01-20 10:08:16 +01:00
return $result ;
}
2012-01-20 19:39:58 +01:00
/**
2012-02-05 19:37:52 +01:00
* testDolIsFileDir
*
* @ return int
*/
2012-01-20 19:39:58 +01:00
public function testDolIsFileDir ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$file = dirname ( __FILE__ ) . '/Example_import_company_1.csv' ;
$result = dol_is_file ( $file );
print __METHOD__ . " result= " . $result . " \n " ;
$this -> assertTrue ( $result );
$result = dol_is_dir ( $file );
print __METHOD__ . " result= " . $result . " \n " ;
$this -> assertFalse ( $result );
return $result ;
}
/**
2012-02-05 19:37:52 +01:00
* testDolOther
*
* @ return boolean
2012-01-20 19:39:58 +01:00
*/
public function testDolOther ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$url = 'http://www.dolibarr.org' ;
$result = dol_is_url ( $url );
print __METHOD__ . " result= " . $result . " \n " ;
$this -> assertTrue ( $result );
$url = 'https://www.dolibarr.org' ;
$result = dol_is_url ( $url );
print __METHOD__ . " result= " . $result . " \n " ;
$this -> assertTrue ( $result );
$url = 'file://www.dolibarr.org/download/file.zip' ;
2012-01-21 18:46:36 +01:00
$result = dol_is_url ( $url );
2012-01-20 19:39:58 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
$this -> assertTrue ( $result );
return $result ;
}
2012-02-05 19:37:52 +01:00
2013-01-16 15:54:07 +01:00
/**
* testDolMimeType
*
* @ return string
*/
public function testDolMimeType ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
// file.png
2019-01-27 13:07:22 +01:00
$result = dol_mimetype ( 'file.png' , '' , 0 );
$this -> assertEquals ( 'image/png' , $result );
$result = dol_mimetype ( 'file.png' , '' , 1 );
$this -> assertEquals ( 'png' , $result );
$result = dol_mimetype ( 'file.png' , '' , 2 );
$this -> assertEquals ( 'image.png' , $result );
$result = dol_mimetype ( 'file.png' , '' , 3 );
$this -> assertEquals ( '' , $result );
2013-01-16 15:54:07 +01:00
// file.odt
2019-01-27 13:07:22 +01:00
$result = dol_mimetype ( 'file.odt' , '' , 0 );
$this -> assertEquals ( 'application/vnd.oasis.opendocument.text' , $result );
$result = dol_mimetype ( 'file.odt' , '' , 1 );
$this -> assertEquals ( 'vnd.oasis.opendocument.text' , $result );
$result = dol_mimetype ( 'file.odt' , '' , 2 );
$this -> assertEquals ( 'ooffice.png' , $result );
$result = dol_mimetype ( 'file.odt' , '' , 3 );
$this -> assertEquals ( '' , $result );
2013-01-16 15:54:07 +01:00
// file.php
2019-01-27 13:07:22 +01:00
$result = dol_mimetype ( 'file.php' , '' , 0 );
$this -> assertEquals ( 'text/plain' , $result );
$result = dol_mimetype ( 'file.php' , '' , 1 );
$this -> assertEquals ( 'plain' , $result );
$result = dol_mimetype ( 'file.php' , '' , 2 );
$this -> assertEquals ( 'php.png' , $result );
$result = dol_mimetype ( 'file.php' , '' , 3 );
$this -> assertEquals ( 'php' , $result );
2013-01-16 15:54:07 +01:00
// file.php.noexe
2019-01-27 13:07:22 +01:00
$result = dol_mimetype ( 'file.php.noexe' , '' , 0 );
$this -> assertEquals ( 'text/plain' , $result );
2013-01-16 15:54:07 +01:00
}
/**
* testDolDeleteDir
*
* @ return int
*/
public function testDolDeleteDir ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
2012-12-29 12:21:13 +01:00
$db = $this -> savdb ;
2013-01-16 15:54:07 +01:00
$dirout = $conf -> admin -> dir_temp . '/test' ;
2017-07-13 00:18:58 +02:00
$dirout2 = $conf -> admin -> dir_temp . '/test2' ;
2013-01-16 15:54:07 +01:00
$count = 0 ;
2019-01-27 13:07:22 +01:00
$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
2013-01-16 15:54:07 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 0 , $result );
2017-07-13 00:18:58 +02:00
$count = 0 ;
$countdeleted = 0 ;
2019-01-27 13:07:22 +01:00
$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
2017-07-13 00:18:58 +02:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 0 , $result );
$this -> assertGreaterThanOrEqual ( 0 , $countdeleted );
2017-07-13 00:18:58 +02:00
dol_mkdir ( $dirout2 );
$count = 0 ;
$countdeleted = 0 ;
2019-01-27 13:07:22 +01:00
$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
2017-07-13 00:18:58 +02:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 1 , $result );
$this -> assertGreaterThanOrEqual ( 1 , $countdeleted );
2012-12-29 12:21:13 +01:00
}
2012-02-05 19:37:52 +01:00
/**
2012-09-07 10:30:02 +02:00
* testDolCopyMoveDelete
2012-02-05 19:37:52 +01:00
*
* @ return int
2012-12-29 12:21:13 +01:00
*
* @ depends testDolDeleteDir
* The depends says test is run only if previous is ok
2012-02-05 19:37:52 +01:00
*/
2012-09-07 10:30:02 +02:00
public function testDolCopyMoveDelete ()
2012-02-05 19:37:52 +01:00
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$file = dirname ( __FILE__ ) . '/Example_import_company_1.csv' ;
$result = dol_copy ( $file , '/adir/that/does/not/exists/file.csv' );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertLessThan ( 0 , $result , 'copy dir that does not exists' ); // We should have error
2012-02-05 19:37:52 +01:00
2019-01-27 13:07:22 +01:00
$result = dol_copy ( $file , $conf -> admin -> dir_temp . '/file.csv' , 0 , 1 );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 1 , $result , 'copy file (' . $file . ') into a dir that exists (' . $conf -> admin -> dir_temp . '/file.csv' . ')' ); // Should be 1
2012-02-05 19:37:52 +01:00
// Again to test with overwriting=0
2019-01-27 13:07:22 +01:00
$result = dol_copy ( $file , $conf -> admin -> dir_temp . '/file.csv' , 0 , 0 );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 0 , $result , 'copy destination already exists, no overwrite' ); // Should be 0
2012-02-05 19:37:52 +01:00
// Again to test with overwriting=1
2019-01-27 13:07:22 +01:00
$result = dol_copy ( $file , $conf -> admin -> dir_temp . '/file.csv' , 0 , 1 );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 1 , $result , 'copy destination already exists, overwrite' ); // Should be 1
2012-02-05 19:37:52 +01:00
2015-10-14 22:36:32 +02:00
// To test a move that should work
2019-01-27 13:07:22 +01:00
$result = dol_move ( $conf -> admin -> dir_temp . '/file.csv' , $conf -> admin -> dir_temp . '/file2.csv' , 0 , 1 );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertTrue ( $result , 'move with default mask' );
2015-10-14 22:36:32 +02:00
// To test a move that should work with forced mask
2019-01-27 13:07:22 +01:00
$result = dol_move ( $conf -> admin -> dir_temp . '/file2.csv' , $conf -> admin -> dir_temp . '/file3.csv' , '0754' , 1 ); // file shoutld be rwxr-wr--
2015-10-14 22:36:32 +02:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertTrue ( $result , 'move with forced mask' );
2012-02-05 19:37:52 +01:00
2015-10-14 22:36:32 +02:00
// To test a delete that should success
$result = dol_delete_file ( $conf -> admin -> dir_temp . '/file3.csv' );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertTrue ( $result , 'delete file' );
2012-02-05 19:37:52 +01:00
2015-05-29 17:11:42 +02:00
// Again to test there is error when deleting a non existing file with option disableglob
2019-01-27 13:07:22 +01:00
$result = dol_delete_file ( $conf -> admin -> dir_temp . '/file3.csv' , 1 , 1 );
2015-05-29 17:11:42 +02:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertFalse ( $result , 'delete file that does not exists with disableglo must return ko' );
2015-05-29 17:11:42 +02:00
// Again to test there is no error when deleting a non existing file without option disableglob
2019-01-27 13:07:22 +01:00
$result = dol_delete_file ( $conf -> admin -> dir_temp . '/file3csv' , 0 , 1 );
2012-02-05 19:37:52 +01:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertTrue ( $result , 'delete file that does not exists without disabling glob must return ok' );
2013-04-30 17:24:11 +02:00
// Test copy with special char / delete with blob
2019-01-27 13:07:22 +01:00
$result = dol_copy ( $file , $conf -> admin -> dir_temp . '/file with [x] and é.csv' , 0 , 1 );
2013-04-30 17:24:11 +02:00
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 1 , $result , 'copy file with special chars, overwrite' ); // Should be 1
2013-05-03 00:15:02 +02:00
2013-04-30 17:24:11 +02:00
// Try to delete using a glob criteria
$result = dol_delete_file ( $conf -> admin -> dir_temp . '/file with [x]*é.csv' );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertTrue ( $result , 'delete file using glob' );
2012-02-05 19:37:52 +01:00
}
2012-04-28 18:21:51 +02:00
/**
* testDolCompressUnCompress
*
* @ return string
2012-12-29 12:21:13 +01:00
*
* @ depends testDolCopyMoveDelete
* The depends says test is run only if previous is ok
2012-04-28 18:21:51 +02:00
*/
public function testDolCompressUnCompress ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
$format = 'zip' ;
$filein = dirname ( __FILE__ ) . '/Example_import_company_1.csv' ;
$fileout = $conf -> admin -> dir_temp . '/test.' . $format ;
$dirout = $conf -> admin -> dir_temp . '/test' ;
dol_delete_file ( $fileout );
$count = 0 ;
2019-01-27 13:07:22 +01:00
dol_delete_dir_recursive ( $dirout , $count , 1 );
2012-04-28 18:21:51 +02:00
$result = dol_compress_file ( $filein , $fileout , $format );
print __METHOD__ . " result= " . $result . " \n " ;
2019-01-27 13:07:22 +01:00
$this -> assertGreaterThanOrEqual ( 1 , $result );
2012-04-28 18:21:51 +02:00
$result = dol_uncompress ( $fileout , $dirout );
2019-01-27 13:07:22 +01:00
print __METHOD__ . " result= " . join ( ',' , $result ) . " \n " ;
$this -> assertEquals ( 0 , count ( $result ));
2012-04-28 18:21:51 +02:00
}
2017-07-13 00:18:58 +02:00
2016-07-16 19:38:18 +02:00
/**
* testDolDirList
*
* @ return string
*
* @ depends testDolCompressUnCompress
* The depends says test is run only if previous is ok
*/
public function testDolDirList ()
{
global $conf , $user , $langs , $db ;
2017-07-13 00:18:58 +02:00
2016-07-16 19:38:18 +02:00
// 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 " ;
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 1 , count ( $founddirs ));
2016-07-16 19:38:18 +02:00
}
2017-05-19 20:17:33 +02:00
/**
* testDolCheckSecureAccessDocument
*
* @ return void
*/
public function testDolCheckSecureAccessDocument ()
{
global $conf , $user , $langs , $db ;
$conf = $this -> savconf ;
$user = $this -> savuser ;
$langs = $this -> savlangs ;
$db = $this -> savdb ;
2017-07-13 00:18:58 +02:00
2017-05-19 20:17:33 +02:00
//$dummyuser=new User($db);
//$result=restrictedArea($dummyuser,'societe');
2017-05-20 11:31:03 +02:00
2017-05-22 01:19:16 +02:00
// We save user properties
$savpermlire = $user -> rights -> facture -> lire ;
$savpermcreer = $user -> rights -> facture -> creer ;
2017-07-13 00:18:58 +02:00
2017-05-22 01:19:16 +02:00
// Check access to SPECIMEN
2017-05-20 11:31:03 +02:00
$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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 1 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-20 11:31:03 +02:00
// 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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 1 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-20 11:31:03 +02:00
$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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 0 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-20 11:31:03 +02:00
// 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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 0 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-20 11:31:03 +02:00
$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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 1 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-20 11:31:03 +02:00
$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' );
2019-01-27 13:07:22 +01:00
$this -> assertEquals ( 0 , $result [ 'accessallowed' ]);
2017-07-13 00:18:58 +02:00
2017-05-22 01:19:16 +02:00
// We restore user properties
$user -> rights -> facture -> lire = $savpermlire ;
$user -> rights -> facture -> creer = $savpermcreer ;
2017-07-13 00:18:58 +02:00
}
2012-01-20 10:08:16 +01:00
}