first commit

This commit is contained in:
2026-05-20 14:01:28 +02:00
commit 0beb9cbab0
2550 changed files with 558392 additions and 0 deletions
@@ -0,0 +1,231 @@
<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../class/db-functions.php';
$db = DBHandlerSelect::getInstance()->getConnection();
function jsonResponse(bool $success, string $message, array $extra = []): void
{
echo json_encode(array_merge([
'success' => $success,
'message' => $message
], $extra));
exit;
}
function getCyberpanelEncryptionKey(): string
{
return hash('sha256', 'CHANGE_THIS_SECRET_KEY_FOR_CYBERPANEL_DASHBOARD');
}
function decryptCyberpanelPassword(string $encryptedPassword): string
{
if ($encryptedPassword === '') {
return '';
}
$key = getCyberpanelEncryptionKey();
$decoded = base64_decode($encryptedPassword);
if (!$decoded || strpos($decoded, '::') === false) {
return '';
}
[$ivBase64, $encrypted] = explode('::', $decoded, 2);
$iv = base64_decode($ivBase64);
if (!$iv) {
return '';
}
$decrypted = openssl_decrypt(
$encrypted,
'AES-256-CBC',
$key,
0,
$iv
);
return $decrypted ?: '';
}
try {
$serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0;
if ($serverId <= 0) {
jsonResponse(false, 'Missing server ID.');
}
$stmt = $db->prepare("
SELECT
id,
name,
panel_url,
username,
password_encrypted,
api_enabled
FROM cyberpanel_servers
WHERE id = :id
LIMIT 1
");
$stmt->execute([
':id' => $serverId
]);
$server = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$server) {
jsonResponse(false, 'Server not found.');
}
if ((int)$server['api_enabled'] !== 1) {
jsonResponse(false, 'API is disabled for this server.');
}
$panelUrl = rtrim($server['panel_url'], '/');
$username = $server['username'];
$password = decryptCyberpanelPassword($server['password_encrypted']);
if ($password === '') {
jsonResponse(false, 'Saved password is empty or cannot be decrypted.');
}
$possibleApiUrls = [
$panelUrl . '/api/verifyConn',
$panelUrl . '/cloudAPI/'
];
$apiUrl = $possibleApiUrls[0];
$payload = [
'adminUser' => $username,
'adminPass' => $password
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $curlError !== '') {
$update = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'offline',
last_check = NOW()
WHERE id = :id
");
$update->execute([
':id' => $serverId
]);
jsonResponse(false, 'cURL error: ' . $curlError, [
'http_code' => $httpCode,
'url' => $apiUrl
]);
}
$decoded = json_decode($response, true);
if (!is_array($decoded)) {
$update = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'offline',
last_check = NOW()
WHERE id = :id
");
$update->execute([
':id' => $serverId
]);
$cleanResponse = strip_tags($response);
$cleanResponse = preg_replace('/\s+/', ' ', $cleanResponse);
$cleanResponse = trim($cleanResponse);
jsonResponse(false, 'CyberPanel did not return JSON. HTTP ' . $httpCode . ' - ' . substr($cleanResponse, 0, 500), [
'http_code' => $httpCode,
'url' => $apiUrl,
'raw_response_preview' => substr($response, 0, 1000)
]);
}
$isSuccess = false;
if (isset($decoded['verifyConn']) && (int)$decoded['verifyConn'] === 1) {
$isSuccess = true;
}
if (isset($decoded['status']) && (int)$decoded['status'] === 1) {
$isSuccess = true;
}
if (isset($decoded['success']) && (int)$decoded['success'] === 1) {
$isSuccess = true;
}
if ($isSuccess) {
$update = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'online',
last_check = NOW()
WHERE id = :id
");
$update->execute([
':id' => $serverId
]);
jsonResponse(true, 'CyberPanel API connection successful.', [
'http_code' => $httpCode,
'url' => $apiUrl,
'response' => $decoded
]);
}
$update = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'offline',
last_check = NOW()
WHERE id = :id
");
$update->execute([
':id' => $serverId
]);
jsonResponse(false, 'CyberPanel API connection failed.', [
'http_code' => $httpCode,
'url' => $apiUrl,
'response' => $decoded
]);
} catch (Throwable $e) {
jsonResponse(false, 'API check error: ' . $e->getMessage());
}
@@ -0,0 +1,224 @@
<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../class/db-functions.php';
$db = DBHandlerSelect::getInstance()->getConnection();
function jsonResponse(bool $success, string $message, array $extra = []): void
{
echo json_encode(array_merge([
'success' => $success,
'message' => $message
], $extra));
exit;
}
function getCyberpanelEncryptionKey(): string
{
return hash('sha256', 'CHANGE_THIS_SECRET_KEY_FOR_CYBERPANEL_DASHBOARD');
}
function decryptCyberpanelPassword(string $encryptedPassword): string
{
if ($encryptedPassword === '') {
return '';
}
$key = getCyberpanelEncryptionKey();
$decoded = base64_decode($encryptedPassword);
if (!$decoded || strpos($decoded, '::') === false) {
return '';
}
[$ivBase64, $encrypted] = explode('::', $decoded, 2);
$iv = base64_decode($ivBase64);
if (!$iv) {
return '';
}
$decrypted = openssl_decrypt(
$encrypted,
'AES-256-CBC',
$key,
0,
$iv
);
return $decrypted ?: '';
}
function callCyberPanelApi(string $panelUrl, string $endpoint, string $username, string $password): array
{
$apiUrl = rtrim($panelUrl, '/') . '/api/' . ltrim($endpoint, '/');
$payload = [
'adminUser' => $username,
'adminPass' => $password
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $curlError !== '') {
return [
'success' => false,
'endpoint' => $endpoint,
'url' => $apiUrl,
'http_code' => $httpCode,
'error' => $curlError,
'data' => null
];
}
$decoded = json_decode($response, true);
if (!is_array($decoded)) {
return [
'success' => false,
'endpoint' => $endpoint,
'url' => $apiUrl,
'http_code' => $httpCode,
'error' => 'Invalid JSON response',
'raw' => substr(strip_tags($response), 0, 500),
'data' => null
];
}
return [
'success' => true,
'endpoint' => $endpoint,
'url' => $apiUrl,
'http_code' => $httpCode,
'error' => null,
'data' => $decoded
];
}
try {
$serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0;
if ($serverId <= 0) {
jsonResponse(false, 'Missing server ID.');
}
$stmt = $db->prepare("
SELECT
id,
name,
panel_url,
username,
password_encrypted,
api_enabled
FROM cyberpanel_servers
WHERE id = :id
LIMIT 1
");
$stmt->execute([
':id' => $serverId
]);
$server = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$server) {
jsonResponse(false, 'Server not found.');
}
if ((int)$server['api_enabled'] !== 1) {
jsonResponse(false, 'API is disabled for this server.');
}
$password = decryptCyberpanelPassword($server['password_encrypted']);
if ($password === '') {
jsonResponse(false, 'Saved password is empty or cannot be decrypted.');
}
$panelUrl = $server['panel_url'];
$username = $server['username'];
$versionResult = callCyberPanelApi($panelUrl, 'cyberPanelVersion', $username, $password);
$packagesResult = callCyberPanelApi($panelUrl, 'listPackage', $username, $password);
$version = '-';
$packagesCount = 0;
if ($versionResult['success']) {
$versionData = $versionResult['data'];
if (isset($versionData['version'])) {
$version = (string)$versionData['version'];
} elseif (isset($versionData['currentVersion'])) {
$version = (string)$versionData['currentVersion'];
} elseif (isset($versionData['cyberPanelVersion'])) {
$version = (string)$versionData['cyberPanelVersion'];
} else {
$version = json_encode($versionData);
}
}
if ($packagesResult['success']) {
$packageData = $packagesResult['data'];
if (isset($packageData['data']) && is_array($packageData['data'])) {
$packagesCount = count($packageData['data']);
} elseif (isset($packageData['packages']) && is_array($packageData['packages'])) {
$packagesCount = count($packageData['packages']);
} elseif (isset($packageData['listPackages']) && is_array($packageData['listPackages'])) {
$packagesCount = count($packageData['listPackages']);
} else {
$packagesCount = 0;
}
}
$update = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'online',
last_check = NOW(),
cyberpanel_version = :cyberpanel_version,
packages_count = :packages_count
WHERE id = :id
");
$update->execute([
':cyberpanel_version' => $version,
':packages_count' => $packagesCount,
':id' => $serverId
]);
jsonResponse(true, 'CyberPanel data loaded successfully.', [
'version' => $version,
'packages_count' => $packagesCount,
'version_response' => $versionResult,
'packages_response' => $packagesResult
]);
} catch (Throwable $e) {
jsonResponse(false, 'CyberPanel summary error: ' . $e->getMessage());
}
@@ -0,0 +1,198 @@
<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../class/db-functions.php';
$db = DBHandlerSelect::getInstance()->getConnection();
function jsonResponse(bool $success, string $message, array $extra = []): void
{
echo json_encode(array_merge([
'success' => $success,
'message' => $message
], $extra));
exit;
}
function getCyberpanelEncryptionKey(): string
{
return hash('sha256', 'CHANGE_THIS_SECRET_KEY_FOR_CYBERPANEL_DASHBOARD');
}
function encryptCyberpanelPassword(string $plainPassword): string
{
if ($plainPassword === '') {
return '';
}
$key = getCyberpanelEncryptionKey();
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt(
$plainPassword,
'AES-256-CBC',
$key,
0,
$iv
);
return base64_encode(base64_encode($iv) . '::' . $encrypted);
}
try {
$serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0;
$name = trim($_POST['server_name'] ?? '');
$provider = trim($_POST['provider'] ?? '');
$panelUrl = trim($_POST['panel_url'] ?? '');
$ipAddress = trim($_POST['ip_address'] ?? '');
$username = trim($_POST['api_username'] ?? '');
$password = trim($_POST['api_password'] ?? '');
$apiEnabled = isset($_POST['api_enabled']) ? (int)$_POST['api_enabled'] : 1;
$environment = trim($_POST['environment'] ?? 'production');
$notes = trim($_POST['notes'] ?? '');
if ($name === '') {
jsonResponse(false, 'Server name is required.');
}
if ($panelUrl === '') {
jsonResponse(false, 'CyberPanel URL is required.');
}
if (!preg_match('/^https?:\/\//i', $panelUrl)) {
jsonResponse(false, 'CyberPanel URL must start with http:// or https://');
}
if ($username === '') {
jsonResponse(false, 'API username is required.');
}
if ($serverId <= 0 && $password === '') {
jsonResponse(false, 'Password is required for a new server.');
}
$apiEnabled = $apiEnabled === 1 ? 1 : 0;
if ($environment === '') {
$environment = 'production';
}
if ($serverId <= 0) {
$encryptedPassword = encryptCyberpanelPassword($password);
$stmt = $db->prepare("
INSERT INTO cyberpanel_servers
(
name,
provider,
ip_address,
panel_url,
username,
password_encrypted,
api_enabled,
environment,
notes
)
VALUES
(
:name,
:provider,
:ip_address,
:panel_url,
:username,
:password_encrypted,
:api_enabled,
:environment,
:notes
)
");
$stmt->execute([
':name' => $name,
':provider' => $provider,
':ip_address' => $ipAddress,
':panel_url' => $panelUrl,
':username' => $username,
':password_encrypted' => $encryptedPassword,
':api_enabled' => $apiEnabled,
':environment' => $environment,
':notes' => $notes
]);
jsonResponse(true, 'Server created successfully.', [
'id' => (int)$db->lastInsertId()
]);
}
if ($password !== '') {
$encryptedPassword = encryptCyberpanelPassword($password);
$stmt = $db->prepare("
UPDATE cyberpanel_servers
SET
name = :name,
provider = :provider,
ip_address = :ip_address,
panel_url = :panel_url,
username = :username,
password_encrypted = :password_encrypted,
api_enabled = :api_enabled,
environment = :environment,
notes = :notes
WHERE id = :id
");
$stmt->execute([
':name' => $name,
':provider' => $provider,
':ip_address' => $ipAddress,
':panel_url' => $panelUrl,
':username' => $username,
':password_encrypted' => $encryptedPassword,
':api_enabled' => $apiEnabled,
':environment' => $environment,
':notes' => $notes,
':id' => $serverId
]);
jsonResponse(true, 'Server updated successfully.', [
'id' => $serverId
]);
}
$stmt = $db->prepare("
UPDATE cyberpanel_servers
SET
name = :name,
provider = :provider,
ip_address = :ip_address,
panel_url = :panel_url,
username = :username,
api_enabled = :api_enabled,
environment = :environment,
notes = :notes
WHERE id = :id
");
$stmt->execute([
':name' => $name,
':provider' => $provider,
':ip_address' => $ipAddress,
':panel_url' => $panelUrl,
':username' => $username,
':api_enabled' => $apiEnabled,
':environment' => $environment,
':notes' => $notes,
':id' => $serverId
]);
jsonResponse(true, 'Server updated successfully.', [
'id' => $serverId
]);
} catch (Throwable $e) {
jsonResponse(false, 'Server save error: ' . $e->getMessage());
}
@@ -0,0 +1,330 @@
<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../class/db-functions.php';
$db = DBHandlerSelect::getInstance()->getConnection();
function jsonResponse(bool $success, string $message, array $extra = []): void
{
echo json_encode(array_merge([
'success' => $success,
'message' => $message
], $extra));
exit;
}
function getCyberpanelEncryptionKey(): string
{
return hash('sha256', 'CHANGE_THIS_SECRET_KEY_FOR_CYBERPANEL_DASHBOARD');
}
function decryptCyberpanelPassword(string $encryptedPassword): string
{
if ($encryptedPassword === '') {
return '';
}
$key = getCyberpanelEncryptionKey();
$decoded = base64_decode($encryptedPassword);
if (!$decoded || strpos($decoded, '::') === false) {
return '';
}
[$ivBase64, $encrypted] = explode('::', $decoded, 2);
$iv = base64_decode($ivBase64);
if (!$iv) {
return '';
}
$decrypted = openssl_decrypt(
$encrypted,
'AES-256-CBC',
$key,
0,
$iv
);
return $decrypted ?: '';
}
function callCyberPanelApi(string $panelUrl, string $endpoint, string $username, string $password, array $extraPayload = []): array
{
$apiUrl = rtrim($panelUrl, '/') . '/api/' . ltrim($endpoint, '/');
$payload = array_merge([
'adminUser' => $username,
'adminPass' => $password
], $extraPayload);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $curlError !== '') {
return [
'success' => false,
'endpoint' => $endpoint,
'http_code' => $httpCode,
'error' => $curlError,
'raw' => null,
'data' => null
];
}
$decoded = json_decode($response, true);
if (!is_array($decoded)) {
return [
'success' => false,
'endpoint' => $endpoint,
'http_code' => $httpCode,
'error' => 'Invalid JSON response',
'raw' => substr($response, 0, 1000),
'data' => null
];
}
return [
'success' => true,
'endpoint' => $endpoint,
'http_code' => $httpCode,
'error' => null,
'raw' => $response,
'data' => $decoded
];
}
function extractPackages(array $data): array
{
/*
* CyberPanel responses may vary between versions.
* We support multiple possible structures.
*/
if (isset($data['data']) && is_array($data['data'])) {
return $data['data'];
}
if (isset($data['packages']) && is_array($data['packages'])) {
return $data['packages'];
}
if (isset($data['listPackages']) && is_array($data['listPackages'])) {
return $data['listPackages'];
}
if (isset($data['packageList']) && is_array($data['packageList'])) {
return $data['packageList'];
}
/*
* Some CyberPanel versions may return associative keys directly.
*/
foreach ($data as $key => $value) {
if (is_array($value)) {
return $value;
}
}
return [];
}
function getValue(array $item, array $keys, string $default = ''): string
{
foreach ($keys as $key) {
if (isset($item[$key]) && $item[$key] !== '') {
return (string)$item[$key];
}
}
return $default;
}
try {
$serverId = isset($_POST['server_id']) ? (int)$_POST['server_id'] : 0;
if ($serverId <= 0) {
jsonResponse(false, 'Missing server ID.');
}
$stmt = $db->prepare("
SELECT
id,
name,
panel_url,
username,
password_encrypted,
api_enabled
FROM cyberpanel_servers
WHERE id = :id
LIMIT 1
");
$stmt->execute([
':id' => $serverId
]);
$server = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$server) {
jsonResponse(false, 'Server not found.');
}
if ((int)$server['api_enabled'] !== 1) {
jsonResponse(false, 'API is disabled for this server.');
}
$password = decryptCyberpanelPassword($server['password_encrypted']);
if ($password === '') {
jsonResponse(false, 'Saved password is empty or cannot be decrypted.');
}
$versionResult = callCyberPanelApi(
$server['panel_url'],
'cyberPanelVersion',
$server['username'],
$password
);
$packagesResult = callCyberPanelApi(
$server['panel_url'],
'listPackage',
$server['username'],
$password
);
if (!$packagesResult['success']) {
jsonResponse(false, 'Unable to load packages from CyberPanel API.', [
'packages_result' => $packagesResult,
'version_result' => $versionResult
]);
}
$packages = extractPackages($packagesResult['data']);
$db->prepare("DELETE FROM cyberpanel_packages WHERE server_id = :server_id")
->execute([':server_id' => $serverId]);
$insert = $db->prepare("
INSERT INTO cyberpanel_packages
(
server_id,
package_name,
disk_space,
bandwidth,
email_accounts,
ftp_accounts,
databases_count,
domains_count,
raw_json,
last_sync
)
VALUES
(
:server_id,
:package_name,
:disk_space,
:bandwidth,
:email_accounts,
:ftp_accounts,
:databases_count,
:domains_count,
:raw_json,
NOW()
)
");
$inserted = 0;
foreach ($packages as $package) {
if (!is_array($package)) {
continue;
}
$packageName = getValue($package, [
'packageName',
'package_name',
'name',
'package'
], 'Unknown package');
$insert->execute([
':server_id' => $serverId,
':package_name' => $packageName,
':disk_space' => getValue($package, ['diskSpace', 'disk_space', 'disk', 'space']),
':bandwidth' => getValue($package, ['bandwidth', 'bw']),
':email_accounts' => getValue($package, ['emailAccounts', 'email_accounts', 'emails']),
':ftp_accounts' => getValue($package, ['ftpAccounts', 'ftp_accounts', 'ftp']),
':databases_count' => getValue($package, ['dataBases', 'databases', 'databases_count', 'db']),
':domains_count' => getValue($package, ['domains', 'domains_count']),
':raw_json' => json_encode($package)
]);
$inserted++;
}
$version = null;
if ($versionResult['success']) {
$versionData = $versionResult['data'];
if (isset($versionData['version'])) {
$version = (string)$versionData['version'];
} elseif (isset($versionData['currentVersion'])) {
$version = (string)$versionData['currentVersion'];
} elseif (isset($versionData['cyberPanelVersion'])) {
$version = (string)$versionData['cyberPanelVersion'];
}
}
$updateServer = $db->prepare("
UPDATE cyberpanel_servers
SET
last_status = 'online',
last_check = NOW(),
cyberpanel_version = :cyberpanel_version,
packages_count = :packages_count
WHERE id = :server_id
");
$updateServer->execute([
':cyberpanel_version' => $version,
':packages_count' => $inserted,
':server_id' => $serverId
]);
jsonResponse(true, 'Native CyberPanel API data synced successfully.', [
'server_id' => $serverId,
'cyberpanel_version' => $version,
'packages_count' => $inserted,
'packages_raw_response' => $packagesResult['data']
]);
} catch (Throwable $e) {
jsonResponse(false, 'Native API sync error: ' . $e->getMessage());
}
@@ -0,0 +1,123 @@
<?php
require_once __DIR__ . '/../include/headscript.php';
header('Content-Type: application/json; charset=utf-8');
function jsonResponse(bool $success, string $message, array $extra = []): void
{
echo json_encode(array_merge([
'success' => $success,
'message' => $message
], $extra));
exit;
}
$panelUrl = trim($_POST['panel_url'] ?? '');
$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');
if ($panelUrl === '') {
jsonResponse(false, 'CyberPanel URL is required.');
}
if ($username === '') {
jsonResponse(false, 'Username is required.');
}
if ($password === '') {
jsonResponse(false, 'Password is required for connection test.');
}
$panelUrl = rtrim($panelUrl, '/');
if (!preg_match('/^https?:\/\//i', $panelUrl)) {
jsonResponse(false, 'CyberPanel URL must start with http:// or https://');
}
/*
* CyberPanel classic API endpoint.
*/
$apiUrl = $panelUrl . '/api/verifyConn';
$payload = [
'adminUser' => $username,
'adminPass' => $password
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $apiUrl,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 25,
CURLOPT_CONNECTTIMEOUT => 15,
/*
* CyberPanel often uses self-signed SSL on port 8090.
* For the first test we disable strict SSL verification.
* Later we can make this configurable per server.
*/
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
]);
$response = curl_exec($ch);
$curlError = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $curlError !== '') {
jsonResponse(false, 'cURL error: ' . $curlError, [
'url' => $apiUrl,
'http_code' => $httpCode
]);
}
$decoded = json_decode($response, true);
if (!is_array($decoded)) {
jsonResponse(false, 'Invalid JSON response from CyberPanel.', [
'url' => $apiUrl,
'http_code' => $httpCode,
'raw_response' => $response
]);
}
/*
* CyberPanel responses can vary slightly between versions.
* So we check multiple possible success indicators.
*/
$isSuccess = false;
if (isset($decoded['verifyConn']) && (int)$decoded['verifyConn'] === 1) {
$isSuccess = true;
}
if (isset($decoded['status']) && (int)$decoded['status'] === 1) {
$isSuccess = true;
}
if (isset($decoded['success']) && (int)$decoded['success'] === 1) {
$isSuccess = true;
}
if ($isSuccess) {
jsonResponse(true, 'Connection successful.', [
'url' => $apiUrl,
'http_code' => $httpCode,
'response' => $decoded
]);
}
jsonResponse(false, 'Connection failed. Check CyberPanel API Access, username or password.', [
'url' => $apiUrl,
'http_code' => $httpCode,
'response' => $decoded
]);