FilesLibTest.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. <?php
  2. use Sabre\VObject\Property\Boolean;
  3. /* Copyright (C) 2010-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18. * or see https://www.gnu.org/
  19. */
  20. /**
  21. * \file test/phpunit/FilesLibTest.php
  22. * \ingroup test
  23. * \brief PHPUnit test
  24. * \remarks To run this script as CLI: phpunit filename.php
  25. */
  26. global $conf,$user,$langs,$db;
  27. //define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
  28. //require_once 'PHPUnit/Autoload.php';
  29. require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
  30. require_once dirname(__FILE__).'/../../htdocs/core/lib/files.lib.php';
  31. if (empty($user->id))
  32. {
  33. print "Load permissions for admin user nb 1\n";
  34. $user->fetch(1);
  35. $user->getrights();
  36. }
  37. $conf->global->MAIN_DISABLE_ALL_MAILS=1;
  38. /**
  39. * Class for PHPUnit tests
  40. *
  41. * @backupGlobals disabled
  42. * @backupStaticAttributes enabled
  43. * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased.
  44. */
  45. class FilesLibTest extends PHPUnit\Framework\TestCase
  46. {
  47. protected $savconf;
  48. protected $savuser;
  49. protected $savlangs;
  50. protected $savdb;
  51. /**
  52. * Constructor
  53. * We save global variables into local variables
  54. *
  55. * @return FilesLibTest
  56. */
  57. public function __construct()
  58. {
  59. parent::__construct();
  60. //$this->sharedFixture
  61. global $conf,$user,$langs,$db;
  62. $this->savconf=$conf;
  63. $this->savuser=$user;
  64. $this->savlangs=$langs;
  65. $this->savdb=$db;
  66. print __METHOD__." db->type=".$db->type." user->id=".$user->id;
  67. //print " - db ".$db->db;
  68. print "\n";
  69. }
  70. /**
  71. * setUpBeforeClass
  72. *
  73. * @return void
  74. */
  75. public static function setUpBeforeClass()
  76. {
  77. global $conf,$user,$langs,$db;
  78. $db->begin(); // This is to have all actions inside a transaction even if test launched without suite.
  79. print __METHOD__."\n";
  80. }
  81. /**
  82. * tearDownAfterClass
  83. *
  84. * @return void
  85. */
  86. public static function tearDownAfterClass()
  87. {
  88. global $conf,$user,$langs,$db;
  89. $db->rollback();
  90. print __METHOD__."\n";
  91. }
  92. /**
  93. * Init phpunit tests
  94. *
  95. * @return void
  96. */
  97. protected function setUp()
  98. {
  99. global $conf,$user,$langs,$db;
  100. $conf=$this->savconf;
  101. $user=$this->savuser;
  102. $langs=$this->savlangs;
  103. $db=$this->savdb;
  104. print __METHOD__."\n";
  105. }
  106. /**
  107. * End phpunit tests
  108. *
  109. * @return void
  110. */
  111. protected function tearDown()
  112. {
  113. print __METHOD__."\n";
  114. }
  115. /**
  116. * testDolBasename
  117. *
  118. * @return void
  119. */
  120. public function testDolBasename()
  121. {
  122. global $conf,$user,$langs,$db;
  123. $conf=$this->savconf;
  124. $user=$this->savuser;
  125. $langs=$this->savlangs;
  126. $db=$this->savdb;
  127. $result=dol_basename('adir/afile');
  128. print __METHOD__." result=".$result."\n";
  129. $this->assertEquals('afile', $result);
  130. $result=dol_basename('adir/afile/');
  131. print __METHOD__." result=".$result."\n";
  132. $this->assertEquals('afile', $result);
  133. $result=dol_basename('adir/νεο'); // With cyrillic data. Here basename fails to return correct value
  134. print __METHOD__." result=".$result."\n";
  135. $this->assertEquals('νεο', $result);
  136. $result=dol_basename('adir/νεο/'); // With cyrillic data. Here basename fails to return correct value
  137. print __METHOD__." result=".$result."\n";
  138. $this->assertEquals('νεο', $result);
  139. }
  140. /**
  141. * testDolCountNbOfLine
  142. *
  143. * @return int
  144. */
  145. public function testDolCountNbOfLine()
  146. {
  147. global $conf,$user,$langs,$db;
  148. $conf=$this->savconf;
  149. $user=$this->savuser;
  150. $langs=$this->savlangs;
  151. $db=$this->savdb;
  152. $file=dirname(__FILE__).'/Example_import_company_1.csv';
  153. $result=dol_count_nb_of_line($file);
  154. print __METHOD__." result=".$result."\n";
  155. $this->assertEquals(3, $result);
  156. return $result;
  157. }
  158. /**
  159. * testDolIsFileDir
  160. *
  161. * @return int
  162. */
  163. public function testDolIsFileDir()
  164. {
  165. global $conf,$user,$langs,$db;
  166. $conf=$this->savconf;
  167. $user=$this->savuser;
  168. $langs=$this->savlangs;
  169. $db=$this->savdb;
  170. $file=dirname(__FILE__).'/Example_import_company_1.csv';
  171. $result=dol_is_file($file);
  172. print __METHOD__." result=".$result."\n";
  173. $this->assertTrue($result);
  174. $result=dol_is_dir($file);
  175. print __METHOD__." result=".$result."\n";
  176. $this->assertFalse($result);
  177. return $result;
  178. }
  179. /**
  180. * testDolOther
  181. *
  182. * @return boolean
  183. */
  184. public function testDolOther()
  185. {
  186. global $conf,$user,$langs,$db;
  187. $conf=$this->savconf;
  188. $user=$this->savuser;
  189. $langs=$this->savlangs;
  190. $db=$this->savdb;
  191. $url='http://www.dolibarr.org';
  192. $result=dol_is_url($url);
  193. print __METHOD__." result=".$result."\n";
  194. $this->assertTrue($result);
  195. $url='https://www.dolibarr.org';
  196. $result=dol_is_url($url);
  197. print __METHOD__." result=".$result."\n";
  198. $this->assertTrue($result);
  199. $url='file://www.dolibarr.org/download/file.zip';
  200. $result=dol_is_url($url);
  201. print __METHOD__." result=".$result."\n";
  202. $this->assertTrue($result);
  203. return $result;
  204. }
  205. /**
  206. * testDolMimeType
  207. *
  208. * @return void
  209. */
  210. public function testDolMimeType()
  211. {
  212. global $conf,$user,$langs,$db;
  213. $conf=$this->savconf;
  214. $user=$this->savuser;
  215. $langs=$this->savlangs;
  216. $db=$this->savdb;
  217. // file.png
  218. $result=dol_mimetype('file.png', '', 0);
  219. $this->assertEquals('image/png', $result);
  220. $result=dol_mimetype('file.png', '', 1);
  221. $this->assertEquals('png', $result);
  222. $result=dol_mimetype('file.png', '', 2);
  223. $this->assertEquals('image.png', $result);
  224. $result=dol_mimetype('file.png', '', 3);
  225. $this->assertEquals('', $result);
  226. // file.odt
  227. $result=dol_mimetype('file.odt', '', 0);
  228. $this->assertEquals('application/vnd.oasis.opendocument.text', $result);
  229. $result=dol_mimetype('file.odt', '', 1);
  230. $this->assertEquals('vnd.oasis.opendocument.text', $result);
  231. $result=dol_mimetype('file.odt', '', 2);
  232. $this->assertEquals('ooffice.png', $result);
  233. $result=dol_mimetype('file.odt', '', 3);
  234. $this->assertEquals('', $result);
  235. // file.php
  236. $result=dol_mimetype('file.php', '', 0);
  237. $this->assertEquals('text/plain', $result);
  238. $result=dol_mimetype('file.php', '', 1);
  239. $this->assertEquals('plain', $result);
  240. $result=dol_mimetype('file.php', '', 2);
  241. $this->assertEquals('php.png', $result);
  242. $result=dol_mimetype('file.php', '', 3);
  243. $this->assertEquals('php', $result);
  244. // file.php.noexe
  245. $result=dol_mimetype('file.php.noexe', '', 0);
  246. $this->assertEquals('text/plain', $result);
  247. }
  248. /**
  249. * testDolDeleteDir
  250. *
  251. * @return void
  252. */
  253. public function testDolDeleteDir()
  254. {
  255. global $conf,$user,$langs,$db;
  256. $conf=$this->savconf;
  257. $user=$this->savuser;
  258. $langs=$this->savlangs;
  259. $db=$this->savdb;
  260. $dirout=$conf->admin->dir_temp.'/test';
  261. $dirout2=$conf->admin->dir_temp.'/test2';
  262. $count=0;
  263. $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
  264. print __METHOD__." result=".$result."\n";
  265. $this->assertGreaterThanOrEqual(0, $result);
  266. $count=0;
  267. $countdeleted=0;
  268. $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
  269. print __METHOD__." result=".$result."\n";
  270. $this->assertGreaterThanOrEqual(0, $result);
  271. $this->assertGreaterThanOrEqual(0, $countdeleted);
  272. dol_mkdir($dirout2);
  273. $count=0;
  274. $countdeleted=0;
  275. $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
  276. print __METHOD__." result=".$result."\n";
  277. $this->assertGreaterThanOrEqual(1, $result);
  278. $this->assertGreaterThanOrEqual(1, $countdeleted);
  279. }
  280. /**
  281. * testDolCopyMoveDelete
  282. *
  283. * @return void
  284. */
  285. public function testDolCopyMoveDelete()
  286. {
  287. global $conf,$user,$langs,$db;
  288. $conf=$this->savconf;
  289. $user=$this->savuser;
  290. $langs=$this->savlangs;
  291. $db=$this->savdb;
  292. $file=dirname(__FILE__).'/Example_import_company_1.csv';
  293. $result=dol_copy($file, '/adir/that/does/not/exists/file.csv');
  294. print __METHOD__." result=".$result."\n";
  295. $this->assertLessThan(0, $result, 'copy dir that does not exists'); // We should have error
  296. $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv', 0, 1);
  297. print __METHOD__." result=".$result."\n";
  298. $this->assertGreaterThanOrEqual(1, $result, 'copy file ('.$file.') into a dir that exists ('.$conf->admin->dir_temp.'/file.csv)'); // Should be 1
  299. // Again to test with overwriting=0
  300. $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv', 0, 0);
  301. print __METHOD__." result=".$result."\n";
  302. $this->assertEquals(0, $result, 'copy destination already exists, no overwrite'); // Should be 0
  303. // Again to test with overwriting=1
  304. $result=dol_copy($file, $conf->admin->dir_temp.'/file.csv', 0, 1);
  305. print __METHOD__." result=".$result."\n";
  306. $this->assertGreaterThanOrEqual(1, $result, 'copy destination already exists, overwrite'); // Should be 1
  307. // To test a move that should work
  308. $result=dol_move($conf->admin->dir_temp.'/file.csv', $conf->admin->dir_temp.'/file2.csv', 0, 1);
  309. print __METHOD__." result=".$result."\n";
  310. $this->assertTrue($result, 'move with default mask');
  311. // To test a move that should work with forced mask
  312. $result=dol_move($conf->admin->dir_temp.'/file2.csv', $conf->admin->dir_temp.'/file3.csv', '0754', 1); // file should be rwxr-wr--
  313. print __METHOD__." result=".$result."\n";
  314. $this->assertTrue($result, 'move with forced mask');
  315. // To test a delete that should success
  316. $result=dol_delete_file($conf->admin->dir_temp.'/file3.csv');
  317. print __METHOD__." result=".$result."\n";
  318. $this->assertTrue($result, 'delete file');
  319. // Again to test there is error when deleting a non existing file with option disableglob
  320. $result=dol_delete_file($conf->admin->dir_temp.'/file3.csv', 1, 1);
  321. print __METHOD__." result=".$result."\n";
  322. $this->assertFalse($result, 'delete file that does not exists with disableglo must return ko');
  323. // Again to test there is no error when deleting a non existing file without option disableglob
  324. $result=dol_delete_file($conf->admin->dir_temp.'/file3csv', 0, 1);
  325. print __METHOD__." result=".$result."\n";
  326. $this->assertTrue($result, 'delete file that does not exists without disabling glob must return ok');
  327. // Test copy with special char / delete with blob
  328. $result=dol_copy($file, $conf->admin->dir_temp.'/file with [x] and é.csv', 0, 1);
  329. print __METHOD__." result=".$result."\n";
  330. $this->assertGreaterThanOrEqual(1, $result, 'copy file with special chars, overwrite'); // Should be 1
  331. // Try to delete using a glob criteria
  332. $result=dol_delete_file($conf->admin->dir_temp.'/file with [x]*é.csv');
  333. print __METHOD__." result=".$result."\n";
  334. $this->assertTrue($result, 'delete file using glob');
  335. }
  336. /**
  337. * testDolCompressUnCompress
  338. *
  339. * @return void
  340. */
  341. public function testDolCompressUnCompress()
  342. {
  343. global $conf,$user,$langs,$db;
  344. $conf=$this->savconf;
  345. $user=$this->savuser;
  346. $langs=$this->savlangs;
  347. $db=$this->savdb;
  348. $format='zip';
  349. $filein=dirname(__FILE__).'/Example_import_company_1.csv';
  350. $fileout=$conf->admin->dir_temp.'/test.'.$format;
  351. $dirout=$conf->admin->dir_temp.'/test';
  352. dol_delete_file($fileout);
  353. $count=0;
  354. dol_delete_dir_recursive($dirout, $count, 1);
  355. $errorstring = '';
  356. dol_mkdir($conf->admin->dir_temp);
  357. $conf->global->MAIN_ENABLE_LOG_TO_HTML=1; $conf->syslog->enabled=1; $_REQUEST['logtohtml']=1;
  358. $conf->logbuffer=array();
  359. $result=dol_compress_file($filein, $fileout, $format, $errorstring);
  360. print __METHOD__." result=".$result."\n";
  361. print join(', ', $conf->logbuffer);
  362. $this->assertGreaterThanOrEqual(1, $result, "Pb with dol_compress_file on ".$filein." into ".$fileout." : ".$errorstring);
  363. $result=dol_uncompress($fileout, $dirout);
  364. print __METHOD__." result=".join(',', $result)."\n";
  365. $this->assertEquals(0, count($result), "Pb with dol_uncompress_file of file ".$fileout);
  366. }
  367. /**
  368. * testDolDirList
  369. *
  370. * @return void
  371. *
  372. * @depends testDolCompressUnCompress
  373. * The depends says test is run only if previous is ok
  374. */
  375. public function testDolDirList()
  376. {
  377. global $conf,$user,$langs,$db;
  378. // 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).
  379. $founddirs=dol_dir_list(DOL_DOCUMENT_ROOT.'/includes/', 'files', 1, '^jquery\.js', array('ckeditor'));
  380. print __METHOD__." count(founddirs)=".count($founddirs)."\n";
  381. $this->assertEquals(1, count($founddirs));
  382. }
  383. /**
  384. * testDolCheckSecureAccessDocument
  385. *
  386. * @return void
  387. */
  388. public function testDolCheckSecureAccessDocument()
  389. {
  390. global $conf,$user,$langs,$db;
  391. $conf=$this->savconf;
  392. $user=$this->savuser;
  393. $langs=$this->savlangs;
  394. $db=$this->savdb;
  395. //$dummyuser=new User($db);
  396. //$result=restrictedArea($dummyuser,'societe');
  397. // We save user properties
  398. $savpermlire = $user->rights->facture->lire;
  399. $savpermcreer = $user->rights->facture->creer;
  400. // Check access to SPECIMEN
  401. $user->rights->facture->lire = 0;
  402. $user->rights->facture->creer = 0;
  403. $filename='SPECIMEN.pdf'; // Filename relative to module part
  404. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
  405. $this->assertEquals(1, $result['accessallowed']);
  406. // Check read permission
  407. $user->rights->facture->lire = 1;
  408. $user->rights->facture->creer = 1;
  409. $filename='FA010101/FA010101.pdf'; // Filename relative to module part
  410. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
  411. $this->assertEquals(1, $result['accessallowed']);
  412. $user->rights->facture->lire = 0;
  413. $user->rights->facture->creer = 0;
  414. $filename='FA010101/FA010101.pdf'; // Filename relative to module part
  415. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read');
  416. $this->assertEquals(0, $result['accessallowed']);
  417. // Check write permission
  418. $user->rights->facture->lire = 0;
  419. $user->rights->facture->creer = 0;
  420. $filename='FA010101/FA010101.pdf'; // Filename relative to module part
  421. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
  422. $this->assertEquals(0, $result['accessallowed']);
  423. $user->rights->facture->lire = 1;
  424. $user->rights->facture->creer = 1;
  425. $filename='FA010101/FA010101.pdf'; // Filename relative to module part
  426. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
  427. $this->assertEquals(1, $result['accessallowed']);
  428. $user->rights->facture->lire = 1;
  429. $user->rights->facture->creer = 0;
  430. $filename='FA010101/FA010101.pdf'; // Filename relative to module part
  431. $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write');
  432. $this->assertEquals(0, $result['accessallowed']);
  433. // We restore user properties
  434. $user->rights->facture->lire = $savpermlire;
  435. $user->rights->facture->creer = $savpermcreer;
  436. }
  437. }