diff --git a/app/Config/filesystems.php b/app/Config/filesystems.php index ab507a2f8..ab73fec29 100644 --- a/app/Config/filesystems.php +++ b/app/Config/filesystems.php @@ -34,6 +34,7 @@ return [ 'root' => public_path(), 'serve' => false, 'throw' => true, + 'directory_visibility' => 'public', ], 'local_secure_attachments' => [ diff --git a/app/Uploads/ImageStorageDisk.php b/app/Uploads/ImageStorageDisk.php index 8e364831f..f2667d993 100644 --- a/app/Uploads/ImageStorageDisk.php +++ b/app/Uploads/ImageStorageDisk.php @@ -7,6 +7,7 @@ use Illuminate\Contracts\Filesystem\Filesystem; use Illuminate\Filesystem\FilesystemAdapter; use Illuminate\Support\Facades\Log; use League\Flysystem\UnableToSetVisibility; +use League\Flysystem\Visibility; use Symfony\Component\HttpFoundation\StreamedResponse; class ImageStorageDisk @@ -85,7 +86,7 @@ class ImageStorageDisk // require different ACLs for S3, and this provides us more logical control. if ($makePublic && !$this->isS3Like()) { try { - $this->filesystem->setVisibility($path, 'public'); + $this->filesystem->setVisibility($path, Visibility::PUBLIC); } catch (UnableToSetVisibility $e) { Log::warning("Unable to set visibility for image upload with relative path: {$path}"); } diff --git a/tests/Uploads/ImageStorageTest.php b/tests/Uploads/ImageStorageTest.php new file mode 100644 index 000000000..117da7f52 --- /dev/null +++ b/tests/Uploads/ImageStorageTest.php @@ -0,0 +1,30 @@ +markTestSkipped('Test only works on Linux'); + } + + config()->set('filesystems.default', 'local'); + $storage = $this->app->make(ImageStorage::class); + $dirToCheck = 'test-dir-perms-' . substr(md5(random_bytes(16)), 0, 6); + + $disk = $storage->getDisk('gallery'); + $disk->put("{$dirToCheck}/image.png", 'abc', true); + + $expectedPath = public_path("uploads/images/{$dirToCheck}"); + $permissionsApplied = substr(sprintf('%o', fileperms($expectedPath)), -4); + $this->assertEquals('0755', $permissionsApplied); + + @unlink("{$expectedPath}/image.png"); + @rmdir($expectedPath); + } +}