Skip to content

Commit 06707fd

Browse files
committed
Better throttling of backup generation
1 parent 63d8cd4 commit 06707fd

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

.php_cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ return PhpCsFixer\Config::create()
4646
'psr0' => ['dir' => 'app'],
4747
'psr4' => true,
4848
'random_api_migration' => true,
49+
'single_line_throw' => false,
4950
'standardize_not_equals' => true,
5051
'ternary_to_null_coalescing' => true,
5152
'yoda_style' => [

app/Http/Controllers/Api/Client/Servers/BackupController.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
44

5+
use Carbon\Carbon;
56
use Pterodactyl\Models\Backup;
67
use Pterodactyl\Models\Server;
78
use Illuminate\Http\JsonResponse;
89
use Pterodactyl\Services\Backups\DeleteBackupService;
10+
use Pterodactyl\Repositories\Eloquent\BackupRepository;
911
use Pterodactyl\Services\Backups\InitiateBackupService;
1012
use Pterodactyl\Transformers\Api\Client\BackupTransformer;
1113
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
14+
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
1215
use Pterodactyl\Http\Requests\Api\Client\Servers\Backups\GetBackupsRequest;
1316
use Pterodactyl\Http\Requests\Api\Client\Servers\Backups\StoreBackupRequest;
1417
use Pterodactyl\Http\Requests\Api\Client\Servers\Backups\DeleteBackupRequest;
@@ -25,18 +28,28 @@ class BackupController extends ClientApiController
2528
*/
2629
private $deleteBackupService;
2730

31+
/**
32+
* @var \Pterodactyl\Repositories\Eloquent\BackupRepository
33+
*/
34+
private $repository;
35+
2836
/**
2937
* BackupController constructor.
3038
*
39+
* @param \Pterodactyl\Repositories\Eloquent\BackupRepository $repository
3140
* @param \Pterodactyl\Services\Backups\DeleteBackupService $deleteBackupService
3241
* @param \Pterodactyl\Services\Backups\InitiateBackupService $initiateBackupService
3342
*/
34-
public function __construct(DeleteBackupService $deleteBackupService, InitiateBackupService $initiateBackupService)
35-
{
43+
public function __construct(
44+
BackupRepository $repository,
45+
DeleteBackupService $deleteBackupService,
46+
InitiateBackupService $initiateBackupService
47+
) {
3648
parent::__construct();
3749

3850
$this->initiateBackupService = $initiateBackupService;
3951
$this->deleteBackupService = $deleteBackupService;
52+
$this->repository = $repository;
4053
}
4154

4255
/**
@@ -65,6 +78,14 @@ public function index(GetBackupsRequest $request, Server $server)
6578
*/
6679
public function store(StoreBackupRequest $request, Server $server)
6780
{
81+
$previous = $this->repository->getBackupsGeneratedDuringTimespan($server->id, 10);
82+
if ($previous->count() >= 2) {
83+
throw new TooManyRequestsHttpException(
84+
Carbon::now()->diffInSeconds($previous->last()->created_at->addMinutes(10)),
85+
'Only two backups may be generated within a 10 minute span of time.'
86+
);
87+
}
88+
6889
$backup = $this->initiateBackupService
6990
->setIgnoredFiles($request->input('ignored'))
7091
->handle($server, $request->input('name'));

app/Repositories/Eloquent/BackupRepository.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Pterodactyl\Repositories\Eloquent;
44

5+
use Carbon\Carbon;
56
use Pterodactyl\Models\Backup;
67

78
class BackupRepository extends EloquentRepository
@@ -13,4 +14,21 @@ public function model()
1314
{
1415
return Backup::class;
1516
}
17+
18+
/**
19+
* Determines if too many backups have been generated by the server.
20+
*
21+
* @param int $server
22+
* @param int $minutes
23+
* @return \Pterodactyl\Models\Backup[]|\Illuminate\Support\Collection
24+
*/
25+
public function getBackupsGeneratedDuringTimespan(int $server, int $minutes = 10)
26+
{
27+
return $this->getBuilder()
28+
->withTrashed()
29+
->where('server_id', $server)
30+
->where('created_at', '>=', Carbon::now()->subMinutes($minutes)->toDateTimeString())
31+
->get()
32+
->toBase();
33+
}
1634
}

routes/api-client.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989

9090
Route::group(['prefix' => '/backups'], function () {
9191
Route::get('/', 'Servers\BackupController@index');
92-
Route::post('/', 'Servers\BackupController@store')->middleware('throttle:2,10');
92+
Route::post('/', 'Servers\BackupController@store');
9393
Route::get('/{backup}', 'Servers\BackupController@view');
9494
Route::get('/{backup}/download', 'Servers\DownloadBackupController');
9595
Route::delete('/{backup}', 'Servers\BackupController@delete');

0 commit comments

Comments
 (0)