FilesLibTest.php 15 KB

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