[TASK] Move access right parameters from BE to SYS configuration
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Tests / Unit / Locking / SimpleLockStrategyTest.php
1 <?php
2 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
3
4 /*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17 use TYPO3\CMS\Core\Locking\SimpleLockStrategy;
18 use TYPO3\CMS\Core\Tests\UnitTestCase;
19 use TYPO3\CMS\Core\Utility\GeneralUtility;
20
21 /**
22 * Testcase for \TYPO3\CMS\Core\Locking\SimpleLockStrategy
23 */
24 class SimpleLockStrategyTest extends UnitTestCase
25 {
26 /**
27 * @test
28 */
29 public function constructorCreatesLockDirectoryIfNotExisting()
30 {
31 GeneralUtility::rmdir(PATH_site . SimpleLockStrategy::FILE_LOCK_FOLDER, true);
32 new SimpleLockStrategy('999999999');
33 $this->assertTrue(is_dir(PATH_site . SimpleLockStrategy::FILE_LOCK_FOLDER));
34 }
35
36 /**
37 * @test
38 */
39 public function constructorSetsResourceToPathWithIdIfUsingSimpleLocking()
40 {
41 $lock = $this->getAccessibleMock(SimpleLockStrategy::class, ['dummy'], ['999999999']);
42 $this->assertSame(PATH_site . SimpleLockStrategy::FILE_LOCK_FOLDER . 'simple_' . md5('999999999'), $lock->_get('filePath'));
43 }
44
45 /**
46 * @test
47 */
48 public function acquireFixesPermissionsOnLockFile()
49 {
50 if (TYPO3_OS === 'WIN') {
51 $this->markTestSkipped('Test not available on Windows.');
52 }
53 // Use a very high id to be unique
54 /** @var SimpleLockStrategy|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface $lock */
55 $lock = $this->getAccessibleMock(SimpleLockStrategy::class, ['dummy'], ['999999999']);
56
57 $pathOfLockFile = $lock->_get('filePath');
58
59 $GLOBALS['TYPO3_CONF_VARS']['SYS']['fileCreateMask'] = '0777';
60
61 // Acquire lock, get actual file permissions and clean up
62 $lock->acquire();
63 clearstatcache();
64 $resultFilePermissions = substr(decoct(fileperms($pathOfLockFile)), 2);
65 $lock->release();
66 $this->assertEquals($resultFilePermissions, '0777');
67 }
68
69 /**
70 * @test
71 */
72 public function releaseRemovesLockfileInTypo3TempLocks()
73 {
74 /** @var SimpleLockStrategy|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface $lock */
75 $lock = $this->getAccessibleMock(SimpleLockStrategy::class, ['dummy'], ['999999999']);
76
77 $pathOfLockFile = $lock->_get('filePath');
78
79 $lock->acquire();
80 $lock->release();
81
82 $this->assertFalse(is_file($pathOfLockFile));
83 }
84
85 /**
86 * Dataprovider for releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectory
87 */
88 public function invalidFileReferences()
89 {
90 return array(
91 'not withing PATH_site' => array('/tmp/TYPO3-Lock-Test'),
92 'directory traversal' => array(PATH_site . 'typo3temp/../typo3temp/locks/foo'),
93 'directory traversal 2' => array(PATH_site . 'typo3temp/locks/../locks/foo'),
94 'within uploads' => array(PATH_site . 'uploads/TYPO3-Lock-Test')
95 );
96 }
97
98 /**
99 * @test
100 * @dataProvider invalidFileReferences
101 * @param string $file
102 * @throws \PHPUnit_Framework_SkippedTestError
103 */
104 public function releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectory($file)
105 {
106 if (TYPO3_OS === 'WIN') {
107 $this->markTestSkipped('releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectory() test not available on Windows.');
108 }
109 // Create test file
110 touch($file);
111 if (!is_file($file)) {
112 $this->markTestIncomplete('releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectory() skipped: Test file could not be created');
113 }
114 // Create instance, set lock file to invalid path
115 /** @var SimpleLockStrategy|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface $lock */
116 $lock = $this->getAccessibleMock(SimpleLockStrategy::class, ['dummy'], ['999999999']);
117 $lock->_set('filePath', $file);
118 $lock->_set('isAcquired', true);
119
120 // Call release method
121 $lock->release();
122 // Check if file is still there and clean up
123 $fileExists = is_file($file);
124 if (is_file($file)) {
125 unlink($file);
126 }
127 $this->assertTrue($fileExists);
128 }
129 }