diff --git a/app/Filament/Admin/Pages/Settings.php b/app/Filament/Admin/Pages/Settings.php index 424b4a7957..cd112334bb 100644 --- a/app/Filament/Admin/Pages/Settings.php +++ b/app/Filament/Admin/Pages/Settings.php @@ -31,11 +31,13 @@ use Filament\Pages\Page; use Filament\Schemas\Components\Actions; use Filament\Schemas\Components\Component; +use Filament\Schemas\Components\Fieldset; use Filament\Schemas\Components\Group; use Filament\Schemas\Components\Section; use Filament\Schemas\Components\StateCasts\BooleanStateCast; use Filament\Schemas\Components\Tabs; use Filament\Schemas\Components\Tabs\Tab; +use Filament\Schemas\Components\Text; use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Contracts\HasSchemas; @@ -794,24 +796,172 @@ private function miscSettings(): array ]), Section::make(trans('admin/setting.misc.api.title')) ->description(trans('admin/setting.misc.api.helper')) - ->columns() + ->columns(1) ->collapsible() ->collapsed() ->schema([ - TextInput::make('APP_API_CLIENT_RATELIMIT') - ->label(trans('admin/setting.misc.api.client_rate')) - ->required() - ->numeric() - ->minValue(1) - ->suffix(trans('admin/setting.misc.api.rpm')) - ->default(env('APP_API_CLIENT_RATELIMIT', config('http.rate_limit.client'))), - TextInput::make('APP_API_APPLICATION_RATELIMIT') - ->label(trans('admin/setting.misc.api.app_rate')) - ->required() - ->numeric() - ->minValue(1) - ->suffix(trans('admin/setting.misc.api.rpm')) - ->default(env('APP_API_APPLICATION_RATELIMIT', config('http.rate_limit.application'))), + Fieldset::make() + ->label(trans('admin/setting.misc.api.client_title')) + ->schema([ + TextInput::make('APP_API_CLIENT_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_CLIENT_RATELIMIT', config('http.rate_limit.client'))), + + TextInput::make('APP_API_CLIENT_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_CLIENT_RATELIMIT_PERIOD', config('http.rate_limit.client_period'))), + Text::make(trans('admin/setting.misc.api.client_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.application_title')) + ->schema([ + TextInput::make('APP_API_APPLICATION_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_APPLICATION_RATELIMIT', config('http.rate_limit.application'))), + + TextInput::make('APP_API_APPLICATION_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_APPLICATION_RATELIMIT_PERIOD', config('http.rate_limit.application_period'))), + Text::make(trans('admin/setting.misc.api.application_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.password_reset_title')) + ->schema([ + TextInput::make('APP_API_PASSWORD_RESET_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_PASSWORD_RESET_RATELIMIT', config('http.rate_limit.password_reset'))), + + TextInput::make('APP_API_PASSWORD_RESET_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_PASSWORD_RESET_RATELIMIT_PERIOD', config('http.rate_limit.password_reset_period'))), + Text::make(trans('admin/setting.misc.api.password_reset_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.websocket_title')) + ->schema([ + TextInput::make('APP_API_WEBSOCKET_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_WEBSOCKET_RATELIMIT', config('http.rate_limit.websocket'))), + + TextInput::make('APP_API_WEBSOCKET_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_WEBSOCKET_RATELIMIT_PERIOD', config('http.rate_limit.websocket_period'))), + Text::make(trans('admin/setting.misc.api.websocket_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.backup_restore_title')) + ->schema([ + TextInput::make('APP_API_BACKUP_RESTORE_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_BACKUP_RESTORE_RATELIMIT', config('http.rate_limit.backup_restore'))), + + TextInput::make('APP_API_BACKUP_RESTORE_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_BACKUP_RESTORE_RATELIMIT_PERIOD', config('http.rate_limit.backup_restore_period'))), + Text::make(trans('admin/setting.misc.api.backup_restore_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.database_create_title')) + ->schema([ + TextInput::make('APP_API_DATABASE_CREATE_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_DATABASE_CREATE_RATELIMIT', config('http.rate_limit.database_create'))), + + TextInput::make('APP_API_DATABASE_CREATE_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_DATABASE_CREATE_RATELIMIT_PERIOD', config('http.rate_limit.database_create_period'))), + Text::make(trans('admin/setting.misc.api.database_create_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.subuser_create_title')) + ->schema([ + TextInput::make('APP_API_SUBUSER_CREATE_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_SUBUSER_CREATE_RATELIMIT', config('http.rate_limit.subuser_create'))), + + TextInput::make('APP_API_SUBUSER_CREATE_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_SUBUSER_CREATE_RATELIMIT_PERIOD', config('http.rate_limit.subuser_create_period'))), + Text::make(trans('admin/setting.misc.api.subuser_create_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.file_pull_title')) + ->schema([ + TextInput::make('APP_API_FILE_PULL_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_FILE_PULL_RATELIMIT', config('http.rate_limit.file_pull'))), + + TextInput::make('APP_API_FILE_PULL_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_FILE_PULL_RATELIMIT_PERIOD', config('http.rate_limit.file_pull_period'))), + Text::make(trans('admin/setting.misc.api.file_pull_helper')), + ]), + Fieldset::make() + ->label(trans('admin/setting.misc.api.default_title')) + ->schema([ + TextInput::make('APP_API_DEFAULT_RATELIMIT') + ->label(trans('admin/setting.misc.api.requests_per_period')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.requests'))->default(env('APP_API_DEFAULT_RATELIMIT', config('http.rate_limit.default'))), + + TextInput::make('APP_API_DEFAULT_RATELIMIT_PERIOD') + ->label(trans('admin/setting.misc.api.period_length')) + ->required() + ->numeric() + ->minValue(1) + ->suffix(trans('admin/setting.misc.api.minutes'))->default(env('APP_API_DEFAULT_RATELIMIT_PERIOD', config('http.rate_limit.default_period'))), + Text::make(trans('admin/setting.misc.api.default_helper')), + ]), ]), Section::make(trans('admin/setting.misc.server.title')) ->description(trans('admin/setting.misc.server.helper')) @@ -913,6 +1063,5 @@ protected function getDefaultHeaderActions(): array ->authorize(fn () => user()?->can('update settings')) ->keyBindings(['mod+s']), ]; - } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 9246795276..2d59b6552c 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -72,8 +72,6 @@ protected function configureRateLimiting(): void if ($request->route()->named('auth.post.forgot-password')) { return Limit::perMinutes(config('http.rate_limit.password_reset_period'), config('http.rate_limit.password_reset'))->by($request->ip()); } - - return Limit::perMinutes(config('http.rate_limit.auth_period'), config('http.rate_limit.auth')); }); // Configure the throttles for both the application and client APIs below. diff --git a/config/http.php b/config/http.php index 10171fc3fc..47a481a822 100644 --- a/config/http.php +++ b/config/http.php @@ -17,9 +17,6 @@ 'application_period' => env('APP_API_APPLICATION_RATELIMIT_PERIOD', 1), 'application' => env('APP_API_APPLICATION_RATELIMIT', 256), - 'auth_period' => env('APP_API_AUTH_RATELIMIT_PERIOD', 1), - 'auth' => env('APP_API_AUTH_RATELIMIT', 10), - 'password_reset_period' => env('APP_API_PASSWORD_RESET_RATELIMIT_PERIOD', 1), 'password_reset' => env('APP_API_PASSWORD_RESET_RATELIMIT', 2), diff --git a/lang/en/admin/setting.php b/lang/en/admin/setting.php index b7a278dfa4..65585e7c8a 100644 --- a/lang/en/admin/setting.php +++ b/lang/en/admin/setting.php @@ -139,10 +139,29 @@ ], 'api' => [ 'title' => 'API', - 'helper' => 'Defines the rate limit for the number of requests per minute that can be executed.', - 'client_rate' => 'Client API Rate Limit', - 'app_rate' => 'Application API Rate Limit', - 'rpm' => 'Requests per Minute', + 'helper' => 'Defines the rate limit for the number of requests that can be executed per configured period.', + 'requests_per_period' => 'Requests Per Period', + 'requests' => 'Requests', + 'minutes' => 'Minutes', + 'period_length' => 'Period Length', + 'client_title' => 'Client API Ratelimit', + 'client_helper' => 'Ratelimit is per user, or IP if there is no user', + 'application_title' => 'Application API Ratelimit', + 'application_helper' => 'Ratelimit is per user, or IP if there is no user', + 'password_reset_title' => 'Password Reset Ratelimit', + 'password_reset_helper' => 'Ratelimit is per IP', + 'websocket_title' => 'Websocket Ratelimit', + 'websocket_helper' => 'Ratelimit is per server', + 'backup_restore_title' => 'Backup and Restore Ratelimit', + 'backup_restore_helper' => 'Ratelimit is per server', + 'database_create_title' => 'Database Create Ratelimit', + 'database_create_helper' => 'Ratelimit is per server', + 'subuser_create_title' => 'Subuser Create Ratelimit', + 'subuser_create_helper' => 'Ratelimit is per server', + 'file_pull_title' => 'File Pull Ratelimit', + 'file_pull_helper' => 'Ratelimit is per server', + 'default_title' => 'Default Ratelimit', + 'default_helper' => 'Ratelimit is per server', ], 'server' => [ 'title' => 'Servers',