Source of file AssetAdapterTest.php
Size: 5,322 Bytes - Last Modified: 2021-12-23T10:27:40+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Flysystem/AssetAdapterTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | <?php namespace SilverStripe\Assets\Tests\Flysystem; use SilverStripe\Assets\File; use SilverStripe\Assets\Filesystem; use SilverStripe\Assets\Flysystem\AssetAdapter; use SilverStripe\Assets\Flysystem\ProtectedAssetAdapter; use SilverStripe\Assets\Flysystem\PublicAssetAdapter; use SilverStripe\Control\Director; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; class AssetAdapterTest extends SapphireTest { protected $rootDir = null; protected $originalServer = null; protected function setUp(): void { parent::setUp(); AssetAdapter::config()->set('file_permissions', [ 'file' => [ 'public' => 0644, 'private' => 0600, ], 'dir' => [ 'public' => 0755, 'private' => 0700, ] ]); $this->rootDir = ASSETS_PATH . '/AssetAdapterTest'; Filesystem::makeFolder($this->rootDir); Config::modify()->set(Director::class, 'alternate_base_url', '/'); $this->originalServer = $_SERVER; } protected function tearDown(): void { if ($this->rootDir) { Filesystem::removeFolder($this->rootDir); $this->rootDir = null; } if ($this->originalServer) { $_SERVER = $this->originalServer; $this->originalServer = null; } parent::tearDown(); } public function testPublicAdapter() { $_SERVER['SERVER_SOFTWARE'] = 'Apache/2.2.22 (Win64) PHP/5.3.13'; $adapter = new PublicAssetAdapter($this->rootDir); $this->assertFileExists($this->rootDir . '/.htaccess'); $this->assertFileDoesNotExist($this->rootDir . '/web.config'); $htaccess = $adapter->read('.htaccess'); $content = $htaccess['contents']; // Allowed extensions set $this->assertStringContainsString('RewriteCond %{REQUEST_URI} !^[^.]*[^\/]*\.(?i:', $content); foreach (File::getAllowedExtensions() as $extension) { $this->assertMatchesRegularExpression('/\b'.preg_quote($extension).'\b/', $content); } // Rewrite rules $this->assertStringContainsString('RewriteRule .* ../index.php [QSA]', $content); $this->assertStringContainsString('RewriteRule error[^\\\\/]*\\.html$ - [L]', $content); // Test flush restores invalid content file_put_contents($this->rootDir . '/.htaccess', '# broken content'); $adapter->flush(); $htaccess2 = $adapter->read('.htaccess'); $this->assertEquals($content, $htaccess2['contents']); // Test URL $this->assertEquals('/assets/AssetAdapterTest/file.jpg', $adapter->getPublicUrl('file.jpg')); } public function testProtectedAdapter() { $_SERVER['SERVER_SOFTWARE'] = 'Apache/2.2.22 (Win64) PHP/5.3.13'; $adapter = new ProtectedAssetAdapter($this->rootDir . '/.protected'); $this->assertFileExists($this->rootDir . '/.protected/.htaccess'); $this->assertFileDoesNotExist($this->rootDir . '/.protected/web.config'); // Test url $this->assertEquals('/assets/file.jpg', $adapter->getProtectedUrl('file.jpg')); } public function testPermissions() { if (stripos(PHP_OS, 'win') === 0) { $this->markTestSkipped("This test doesn't work on windows"); } $_SERVER['SERVER_SOFTWARE'] = 'Apache/2.2.22 (Win64) PHP/5.3.13'; // Public asset adapter writes .htaccess with public perms $adapter = new PublicAssetAdapter($this->rootDir); $adapter->flush(); $this->assertFileExists($this->rootDir . '/.htaccess'); $publicPerm = fileperms($this->rootDir . '/.htaccess'); // Public read $this->assertEquals( 0044, $publicPerm & 0044, $this->readablePerm($publicPerm) . ' has public read' ); // Same as protected adapter $adapter = new ProtectedAssetAdapter($this->rootDir . '/.protected'); $adapter->flush(); $this->assertFileExists($this->rootDir . '/.protected/.htaccess'); $protectedPerm = fileperms($this->rootDir . '/.protected/.htaccess'); // Public read $this->assertEquals( 0044, $protectedPerm & 0044, $this->readablePerm($protectedPerm) . ' has public read' ); } public function testNormalisePermissions() { $this->assertEquals( [ 'file' => [ 'private' => 0644, 'public' => 0666, ], 'dir' => [ 'public' => 0755, 'private' => 0700, ] ], AssetAdapter::normalisePermissions([ 'file' => [ 'private' => '0644', 'public' => '666', ], 'dir' => [ 'public' => 0755, 'private' => 0700, ] ]) ); } /** * Human readable perm mask * * @param int $mask * @return string */ protected function readablePerm($mask) { return substr(sprintf('%o', $mask), -4); } } |