From d9c2e7646adafe394d16b8a6b771c1f793bd0f73 Mon Sep 17 00:00:00 2001 From: RMartinOscar <40749467+RMartinOscar@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:14:31 +0000 Subject: [PATCH] Add file name Validation --- .../Server/Resources/FileResource/Pages/ListFiles.php | 9 +++++++-- app/Models/File.php | 10 +++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php b/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php index 419112f6e..7be088d3d 100644 --- a/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php +++ b/app/Filament/Server/Resources/FileResource/Pages/ListFiles.php @@ -136,6 +136,7 @@ class ListFiles extends ListRecords ->form([ TextInput::make('name') ->label(trans('server/file.actions.rename.name')) + ->rules(File::getRulesForField('name')) ->default(fn (File $file) => $file->name) ->required(), ]) @@ -189,6 +190,7 @@ class ListFiles extends ListRecords ->form([ TextInput::make('location') ->label(trans('server/file.actions.move.new_location')) + ->rules(File::getRulesForField('name')) ->hint(trans('server/file.actions.move.new_location_hint')) ->required() ->live(), @@ -349,6 +351,7 @@ class ListFiles extends ListRecords ->form([ TextInput::make('location') ->label(trans('server/file.actions.move.directory')) + ->rules(File::getRulesForField('name')) ->hint(trans('server/file.actions.move.directory_hint')) ->required() ->live(), @@ -451,6 +454,7 @@ class ListFiles extends ListRecords ->form([ TextInput::make('name') ->label(trans('server/file.actions.new_file.file_name')) + ->rules(File::getRulesForField('name')) ->required(), Select::make('lang') ->label(trans('server/file.actions.new_file.syntax')) @@ -492,6 +496,7 @@ class ListFiles extends ListRecords ->form([ TextInput::make('name') ->label(trans('server/file.actions.new_folder.folder_name')) + ->rules(File::getRulesForField('name')) ->required(), ]), HeaderAction::make('upload') @@ -556,9 +561,9 @@ class ListFiles extends ListRecords ->form([ TextInput::make('searchTerm') ->label(trans('server/file.actions.global_search.search_term')) - ->placeholder(trans('server/file.actions.global_search.search_term_placeholder')) + ->rules(array_merge(File::getRulesForField('name'), ['regex:/^[^*]*\*?[^*]*$/'])) ->required() - ->regex('/^[^*]*\*?[^*]*$/') + ->placeholder(trans('server/file.actions.global_search.search_term_placeholder')) ->minValue(3), ]) ->action(fn ($data) => redirect(SearchFiles::getUrl([ diff --git a/app/Models/File.php b/app/Models/File.php index 759f5e15b..2ec734b1e 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -2,8 +2,10 @@ namespace App\Models; +use App\Contracts\Validatable; use App\Livewire\AlertBanner; use App\Repositories\Daemon\DaemonFileRepository; +use App\Traits\HasValidation; use Carbon\Carbon; use Exception; use Illuminate\Database\Eloquent\Builder; @@ -26,10 +28,16 @@ use Sushi\Sushi; * @property bool $is_symlink * @property string $mime_type */ -class File extends Model +class File extends Model implements Validatable { + use HasValidation; use Sushi; + /** @var array */ + public static array $validationRules = [ + 'name' => ['required', 'string', 'not_regex:/[{}#]/'], + ]; + protected int $sushiInsertChunkSize = 100; public const ARCHIVE_MIMES = [