activation issue solving

This commit is contained in:
Flatlogic Bot 2026-05-10 03:10:50 +00:00
parent 969ead5890
commit 14ab1bb84c

View File

@ -164,12 +164,10 @@ class LicenseService {
return self::$remote_api_url; return self::$remote_api_url;
} }
if (file_exists(__DIR__ . '/../central_license_manager/index.php')) { // Do not auto-switch to a bundled local license manager just because the module exists.
$detectedLocalUrl = self::detectLocalApiUrl(); // Customer activation keys for this project are issued centrally from omanapp.cloud, so
self::$remote_api_url = $detectedLocalUrl !== '' ? $detectedLocalUrl : 'http://127.0.0.1/central_license_manager'; // local/offline copies should keep using the central service unless an explicit project
return self::$remote_api_url; // config or environment variable points somewhere else.
}
self::$remote_api_url = 'https://omanapp.cloud/central_license_manager'; self::$remote_api_url = 'https://omanapp.cloud/central_license_manager';
return self::$remote_api_url; return self::$remote_api_url;
} }
@ -183,6 +181,27 @@ class LicenseService {
return self::$api_secret; return self::$api_secret;
} }
private static function buildActivationDebugContext() {
$identity = self::getClientIdentity();
$apiUrl = self::getApiUrl();
$slug = (string)($identity['app_slug'] ?? '');
$slugSource = (string)($identity['app_slug_source'] ?? 'unknown');
$name = (string)($identity['app_name'] ?? '');
$parts = [];
if ($apiUrl !== '') {
$parts[] = 'Activation server: ' . $apiUrl . '.';
}
if ($slug !== '') {
$parts[] = 'App slug sent: ' . $slug . ' (' . $slugSource . ').';
}
if ($name !== '') {
$parts[] = 'App name sent: ' . $name . '.';
}
return implode(' ', $parts);
}
public static function sanitizeAppSlug($value, $allowEmpty = false) { public static function sanitizeAppSlug($value, $allowEmpty = false) {
$value = strtolower(trim((string)$value)); $value = strtolower(trim((string)$value));
$value = preg_replace('/[^a-z0-9]+/', '-', $value); $value = preg_replace('/[^a-z0-9]+/', '-', $value);
@ -528,7 +547,19 @@ class LicenseService {
]); ]);
if (empty($response['success'])) { if (empty($response['success'])) {
return ['success' => false, 'error' => $response['error'] ?? 'Remote activation failed.']; $error = trim((string)($response['error'] ?? 'Remote activation failed.'));
$needsContext = $error === ''
|| stripos($error, 'Remote request failed') !== false
|| stripos($error, 'Invalid response from remote server') !== false
|| stripos($error, 'License does not belong to this app') !== false
|| stripos($error, 'Invalid license key') !== false;
if ($needsContext) {
$error = rtrim($error !== '' ? $error : 'Remote activation failed.', '.');
$error .= '. ' . self::buildActivationDebugContext();
}
return ['success' => false, 'error' => $error !== '' ? $error : 'Remote activation failed.'];
} }
require_once __DIR__ . '/../db/config.php'; require_once __DIR__ . '/../db/config.php';
@ -623,20 +654,66 @@ class LicenseService {
$url = rtrim($baseUrl, '/') . '/index.php?action=' . urlencode($action); $url = rtrim($baseUrl, '/') . '/index.php?action=' . urlencode($action);
} }
$ch = curl_init($url); $payload = json_encode($params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if ($payload === false) {
curl_setopt($ch, CURLOPT_POST, true); return ['success' => false, 'error' => 'Failed to encode remote activation payload.'];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); }
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); $resp = false;
$resp = curl_exec($ch); $http_code = 0;
$http_code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); $content_type = '';
$content_type = (string)curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $curl_error = '';
$curl_error = curl_error($ch);
curl_close($ch); if (function_exists('curl_init')) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$resp = curl_exec($ch);
$http_code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
$content_type = (string)curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$curl_error = curl_error($ch);
curl_close($ch);
} else {
$headers = [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
];
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => implode("\r\n", $headers) . "\r\n",
'content' => $payload,
'timeout' => 10,
'ignore_errors' => true,
],
]);
$resp = @file_get_contents($url, false, $context);
$streamHeaders = isset($http_response_header) && is_array($http_response_header) ? $http_response_header : [];
foreach ($streamHeaders as $headerLine) {
if (preg_match('#^HTTP/\S+\s+(\d{3})#i', (string)$headerLine, $matches)) {
$http_code = (int)$matches[1];
}
if (stripos((string)$headerLine, 'Content-Type:') === 0) {
$content_type = trim((string)substr((string)$headerLine, strlen('Content-Type:')));
}
}
if ($resp === false) {
$lastError = error_get_last();
$curl_error = trim((string)($lastError['message'] ?? 'HTTP stream transport failed.'));
}
}
if ($resp === false) { if ($resp === false) {
return ['success' => false, 'error' => 'Remote request failed: ' . $curl_error]; $networkError = $curl_error !== '' ? $curl_error : 'Unknown network error.';
return ['success' => false, 'error' => 'Remote request failed: ' . $networkError . ' URL: ' . $url];
} }
$data = json_decode($resp, true); $data = json_decode($resp, true);