91334a46b5
Co-authored-by: Cursor <cursoragent@cursor.com>
136 lines
5.4 KiB
PHP
136 lines
5.4 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
|
|
/**
|
|
* Map registration API / local error codes → product status and UX behaviour.
|
|
*
|
|
* @package mod_meetletacbfree
|
|
* @copyright 2026 MeetLet
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
namespace mod_meetletacbfree\registration;
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
/**
|
|
* Branch on stable error.code only (never on message text).
|
|
*/
|
|
class error_mapper {
|
|
public const STATUS_ACTIVE = 'active';
|
|
public const STATUS_GRACE = 'grace';
|
|
public const STATUS_OFFLINE_GRACE_EXPIRED = 'offline_grace_expired';
|
|
public const STATUS_INVALID_KEY = 'invalid_key';
|
|
public const STATUS_EXPIRED = 'expired';
|
|
public const STATUS_SUSPENDED = 'suspended';
|
|
public const STATUS_REVOKED = 'revoked';
|
|
public const STATUS_DOMAIN_MISMATCH = 'domain_mismatch';
|
|
public const STATUS_ACTIVATION_LIMIT = 'activation_limit';
|
|
public const STATUS_NETWORK_ERROR = 'network_error';
|
|
public const STATUS_MISCONFIGURED = 'misconfigured';
|
|
public const STATUS_UNKNOWN = 'unknown';
|
|
public const STATUS_INACTIVE = 'inactive';
|
|
|
|
public const LOCAL_NETWORK_ERROR = 'NETWORK_ERROR';
|
|
public const LOCAL_INVALID_AUTHORIZATION_SIGNATURE = 'INVALID_AUTHORIZATION_SIGNATURE';
|
|
|
|
/**
|
|
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array}
|
|
*/
|
|
public static function map(string $code, ?array $details = null, bool $hasgraceauth = false): array {
|
|
$code = strtoupper(trim($code));
|
|
if ($code === '') {
|
|
$code = 'UNKNOWN';
|
|
}
|
|
|
|
switch ($code) {
|
|
case 'INVALID_LICENSE':
|
|
case 'INSTALLATION_NOT_FOUND':
|
|
return self::result($code, self::STATUS_INVALID_KEY, true, 'registration_err_invalid_key', $details);
|
|
|
|
case 'LICENSE_EXPIRED':
|
|
return self::result($code, self::STATUS_EXPIRED, true, 'registration_err_expired', $details);
|
|
|
|
case 'LICENSE_REVOKED':
|
|
case 'INSTALLATION_REVOKED':
|
|
return self::result($code, self::STATUS_REVOKED, true, 'registration_err_revoked', $details);
|
|
|
|
case 'LICENSE_SUSPENDED':
|
|
case 'CUSTOMER_SUSPENDED':
|
|
case 'PRODUCT_SUSPENDED':
|
|
return self::result($code, self::STATUS_SUSPENDED, true, 'registration_err_suspended', $details);
|
|
|
|
case 'PRODUCT_NOT_FOUND':
|
|
case 'PRODUCT_NOT_ENTITLED':
|
|
case 'PRODUCT_MISMATCH':
|
|
return self::result($code, self::STATUS_MISCONFIGURED, true, 'registration_err_product_mismatch', $details);
|
|
|
|
case 'DOMAIN_NOT_ALLOWED':
|
|
return self::result($code, self::STATUS_DOMAIN_MISMATCH, true, 'registration_err_domain', $details);
|
|
|
|
case 'ACTIVATION_LIMIT_REACHED':
|
|
case 'ACTIVATION_LIMIT':
|
|
return self::result($code, self::STATUS_ACTIVATION_LIMIT, true, 'registration_err_activation_limit', $details);
|
|
|
|
case 'INVALID_REQUEST_SIGNATURE':
|
|
case 'INVALID_SIGNATURE':
|
|
case 'TIMESTAMP_INVALID':
|
|
case 'VALIDATION_ERROR':
|
|
case 'INVALID_REQUEST':
|
|
return self::result($code, self::STATUS_MISCONFIGURED, false, 'registration_err_misconfigured', $details);
|
|
|
|
case self::LOCAL_INVALID_AUTHORIZATION_SIGNATURE:
|
|
return self::result($code, self::STATUS_MISCONFIGURED, true, 'registration_err_bad_signature', $details);
|
|
|
|
case 'REPLAY_DETECTED':
|
|
case 'RATE_LIMITED':
|
|
case 'TEMPORARY_LICENSE_SERVICE_UNAVAILABLE':
|
|
case self::LOCAL_NETWORK_ERROR:
|
|
if ($hasgraceauth) {
|
|
return self::result($code, self::STATUS_ACTIVE, false, '', $details);
|
|
}
|
|
return self::result($code, self::STATUS_NETWORK_ERROR, false, 'registration_err_network', $details);
|
|
|
|
default:
|
|
return self::result($code, self::STATUS_UNKNOWN, false, 'registration_err_unknown', $details);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array,request_id:?string,message:string}
|
|
*/
|
|
public static function from_exception(registration_exception $e, bool $hasgraceauth = false): array {
|
|
$mapped = self::map($e->get_error_code(), $e->get_details(), $hasgraceauth);
|
|
$mapped['request_id'] = $e->get_request_id();
|
|
$mapped['message'] = self::user_message($mapped['message_key'], $e->get_api_message());
|
|
return $mapped;
|
|
}
|
|
|
|
public static function user_message(string $messagekey, string $fallback = ''): string {
|
|
if ($messagekey !== '' && get_string_manager()->string_exists($messagekey, 'meetletacbfree')) {
|
|
return get_string($messagekey, 'meetletacbfree');
|
|
}
|
|
return $fallback !== '' ? $fallback : $messagekey;
|
|
}
|
|
|
|
/**
|
|
* @param array|null $details
|
|
* @return array{code:string,status:string,clear_auth:bool,message_key:string,details:?array}
|
|
*/
|
|
protected static function result(
|
|
string $code,
|
|
string $status,
|
|
bool $clearauth,
|
|
string $messagekey,
|
|
?array $details
|
|
): array {
|
|
return [
|
|
'code' => $code,
|
|
'status' => $status,
|
|
'clear_auth' => $clearauth,
|
|
'message_key' => $messagekey,
|
|
'details' => $details,
|
|
];
|
|
}
|
|
}
|