'OpenPanel', 'version' => '1.0.0', 'author' => 'Paymenter', 'website' => 'https://paymenter.org', ]; } public function getConfig() { return [ [ 'name' => 'host', 'friendlyName' => 'Url to OpenPanel server (with port)', 'type' => 'text', 'required' => true, ], [ 'name' => 'username', 'friendlyName' => 'Username', 'type' => 'text', 'required' => true, ], [ 'name' => 'password', 'friendlyName' => 'Password', 'type' => 'text', 'required' => true, ] ]; } public function getProductConfig($options) { return [ [ 'name' => 'packageName', 'friendlyName' => 'Package Name', 'type' => 'text', 'required' => true, 'description' => 'Package Name for the OpenPanel server', ], ]; } public function getUserConfig() { return [ [ 'name' => 'domain', 'friendlyName' => 'Domain', 'type' => 'text', 'required' => true, 'description' => 'Domain for the webhost', ], [ 'name' => 'username', 'friendlyName' => 'Username', 'type' => 'text', 'required' => true, 'description' => 'Username to login to the website', ], [ 'name' => 'password', 'friendlyName' => 'Password', 'type' => 'text', 'required' => true, 'description' => 'Password to login to the website', ] ]; } public function createServer($user, $params, $order, $product, $configurableOptions) { list($jwtToken, $error) = $this->getAuthToken(); if (!$jwtToken) { ExtensionHelper::error('OpenPanel', 'Failed to get authentication token: ' . $error); return; } $createUserEndpoint = $this->getApiProtocol($params["host"]) . $params["host"] . ':2087/api/users'; $response = Http::withToken($jwtToken) ->post($createUserEndpoint, [ 'username' => $params['config']['username'], 'password' => $params['config']['password'], 'email' => $user->email, 'plan_name' => $params['packageName'], ]); if (!$response->successful()) { ExtensionHelper::error('OpenPanel', 'Failed to create server: ' . $response->body()); } } public function suspendServer($user, $params, $order, $product, $configurableOptions) { list($jwtToken, $error) = $this->getAuthToken(); if (!$jwtToken) { ExtensionHelper::error('OpenPanel', 'Failed to get authentication token: ' . $error); return; } $suspendUserEndpoint = $this->getApiProtocol($params["host"]) . $params["host"] . ':2087/api/users/' . $params["config"]["username"] . '/suspend'; $response = Http::withToken($jwtToken)->patch($suspendUserEndpoint); if (!$response->successful()) { ExtensionHelper::error('OpenPanel', 'Failed to suspend server: ' . $response->body()); } } public function unsuspendServer($user, $params, $order, $product, $configurableOptions) { list($jwtToken, $error) = $this->getAuthToken(); if (!$jwtToken) { ExtensionHelper::error('OpenPanel', 'Failed to get authentication token: ' . $error); return; } $unsuspendUserEndpoint = $this->getApiProtocol($params["host"]) . $params["host"] . ':2087/api/users/' . $params["config"]["username"] . '/unsuspend'; $response = Http::withToken($jwtToken)->patch($unsuspendUserEndpoint); if (!$response->successful()) { ExtensionHelper::error('OpenPanel', 'Failed to unsuspend server: ' . $response->body()); } } public function terminateServer($user, $params, $order, $product, $configurableOptions) { list($jwtToken, $error) = $this->getAuthToken(); if (!$jwtToken) { ExtensionHelper::error('OpenPanel', 'Failed to get authentication token: ' . $error); return; } $deleteUserEndpoint = $this->getApiProtocol($params["host"]) . $params["host"] . ':2087/api/users/' . $params["config"]["username"]; $response = Http::withToken($jwtToken)->delete($deleteUserEndpoint); if (!$response->successful()) { ExtensionHelper::error('OpenPanel', 'Failed to terminate server: ' . $response->body()); } } private function getApiProtocol($hostname) { return filter_var($hostname, FILTER_VALIDATE_IP) === false ? 'https://' : 'http://'; } private function getAuthToken() { $authEndpoint = $this->getApiProtocol(ExtensionHelper::getConfig('OpenPanel', 'host')) . ExtensionHelper::getConfig('OpenPanel', 'host') . ':2087/api/auth'; $response = Http::post($authEndpoint, [ 'username' => ExtensionHelper::getConfig('OpenPanel', 'username'), 'password' => ExtensionHelper::getConfig('OpenPanel', 'password'), ]); if (!$response->successful()) { return [false, 'Failed to authenticate: ' . $response->body()]; } $responseData = $response->json(); return [$responseData['access_token'] ?? false, 'Token not found in response']; } }