From 595370df926b722769b453003b54602e1cbb5f22 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 14 Mar 2025 14:55:38 +0100 Subject: [PATCH] feat(LocalFileVolume): add binary file detection and update UI logic Implemented a new attribute to detect binary files in the LocalFileVolume model, enhancing the file handling capabilities. The isBinary method checks for binary content based on specific criteria, allowing for better management of file types. Additionally, updated the file storage UI to conditionally display conversion options based on the binary status of the file, improving user experience and preventing unintended actions on binary files. These changes contribute to a more robust and user-friendly file management system. --- app/Models/LocalFileVolume.php | 16 ++++++++++++++++ .../project/service/file-storage.blade.php | 19 +++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/app/Models/LocalFileVolume.php b/app/Models/LocalFileVolume.php index 2c223be77..d96f7125e 100644 --- a/app/Models/LocalFileVolume.php +++ b/app/Models/LocalFileVolume.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Events\FileStorageChanged; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; class LocalFileVolume extends BaseModel @@ -11,6 +12,8 @@ class LocalFileVolume extends BaseModel protected $guarded = []; + public $appends = ['is_binary']; + protected static function booted() { static::created(function (LocalFileVolume $fileVolume) { @@ -19,6 +22,15 @@ class LocalFileVolume extends BaseModel }); } + protected function isBinary(): Attribute + { + return Attribute::make( + get: function () { + return $this->content === '[binary file]'; + } + ); + } + public function service() { return $this->morphTo('resource'); @@ -44,6 +56,10 @@ class LocalFileVolume extends BaseModel $isFile = instant_remote_process(["test -f $path && echo OK || echo NOK"], $server); if ($isFile === 'OK') { $content = instant_remote_process(["cat $path"], $server, false); + // Check if content contains binary data by looking for null bytes or non-printable characters + if (str_contains($content, "\0") || preg_match('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', $content)) { + $content = '[binary file]'; + } $this->content = $content; $this->is_directory = false; $this->save(); diff --git a/resources/views/livewire/project/service/file-storage.blade.php b/resources/views/livewire/project/service/file-storage.blade.php index 550b43c20..e17835429 100644 --- a/resources/views/livewire/project/service/file-storage.blade.php +++ b/resources/views/livewire/project/service/file-storage.blade.php @@ -28,12 +28,15 @@ confirmationLabel="Please confirm the execution of the actions by entering the Filepath below" shortConfirmationLabel="Filepath" step3ButtonText="Permanently Delete" /> @else - + @if (!$fileStorage->is_binary) + + @endif - @if (!$fileStorage->is_based_on_git) + readonly="{{ $fileStorage->is_based_on_git || $fileStorage->is_binary }}"> + @if (!$fileStorage->is_based_on_git && !$fileStorage->is_binary) Save @endif @endif