From 815e1e4c4d1372ffaa8c0aa1c0c335d6594d2f9f Mon Sep 17 00:00:00 2001 From: Matthew Penner Date: Tue, 4 Oct 2022 19:57:24 -0600 Subject: [PATCH] Ensure server is not in a conflicting state before initiating a transfer (#4403) --- .../Admin/Servers/ServerTransferController.php | 2 ++ app/Models/Server.php | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/Http/Controllers/Admin/Servers/ServerTransferController.php b/app/Http/Controllers/Admin/Servers/ServerTransferController.php index b4afa2cab..9166ae3e9 100644 --- a/app/Http/Controllers/Admin/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Admin/Servers/ServerTransferController.php @@ -97,6 +97,8 @@ class ServerTransferController extends Controller // Check if the selected daemon is online. $this->daemonConfigurationRepository->setNode($node)->getSystemInformation(); + $server->validateTransferState(); + // Create a new ServerTransfer entry. $transfer = new ServerTransfer(); diff --git a/app/Models/Server.php b/app/Models/Server.php index fa690d353..b1560bb28 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -400,4 +400,21 @@ class Server extends Model throw new ServerStateConflictException($this); } } + + /** + * Checks if the server is currently in a transferable state. If not, an + * exception is raised. This should be called whenever something needs to make + * sure the server is able to be transferred and is not currently being transferred + * or installed. + */ + public function validateTransferState() + { + if ( + !$this->isInstalled() || + $this->status === self::STATUS_RESTORING_BACKUP || + !is_null($this->transfer) + ) { + throw new ServerStateConflictException($this); + } + } }