====== ThemeLicenseService ====== **Layer:** ''Service'' · **Source:** ''lib/service/ThemeLicenseService.php:21'' (lines 21–321) ---- class ThemeLicenseService ThemeLicenseService HTTP client that validates premium theme licenses against the MyBlog license API (https://myblog.local/api/v2/licenses/*). Requests are HMAC-signed using the per-product license_secret embedded in the theme's theme.ini file. ======= Docblock Metadata ======= ^ Tag ^ Value ^ | ''@category'' | Class ThemeLicenseService | | ''@author'' | MyBlog | | ''@license'' | MIT | | ''@version'' | 1.0.0 | | ''@since'' | Since Release 1.0.0 | ======= Inheritance ======= //No parent, interface or trait. This is a root type.// ======= Constants (0) ======= //None.// ======= Properties (2) ======= ^ Visibility ^ Type ^ Name ^ Default ^ Line ^ | ''protected'' | ''(untyped)'' | ''$apiBaseUrl'' | | 28 | | ''private'' | ''(untyped)'' | ''$timeout'' | | 35 | ======= Methods (10) ======= ^ Visibility ^ Method ^ Summary ^ Line ^ | public | ''__construct()'' | Constructor | 43 | | public | ''readThemeConfig()'' | Read the theme.ini configuration for a given theme directory. | 55 | | public | ''isPremiumTheme()'' | Determine whether a theme is a premium theme. | 74 | | public | ''activate()'' | Activate a license key against the MyBlog license API. | 97 | | public | ''validate()'' | Validate an already-activated license. | 120 | | public | ''deactivate()'' | Deactivate a theme license, releasing one activation slot. | 143 | | protected | ''post()'' | Send an HMAC-signed POST request to the license API. | 167 | | private | ''postCurl()'' | Send the request using cURL. | 198 | | private | ''postStream()'' | Send the request using stream context (fallback when cURL is absent). | 234 | | protected | ''parseResponse()'' | Parse the JSON response from the license API. | 278 | ======== __construct() ======== public function __construct($apiBaseUrl = null, $timeout = 10) //lines 43–47 (5)// Constructor ^ Parameter ^ Type ^ Default ^ Description ^ | ''$apiBaseUrl'' | ''(untyped)'' | ''null'' | Override the license API base URL. | | ''$timeout'' | ''(untyped)'' | ''10'' | Request timeout in seconds. | ======== readThemeConfig() ======== public function readThemeConfig($themeDirectory) //lines 55–66 (12)// Read the theme.ini configuration for a given theme directory. ^ Parameter ^ Type ^ Default ^ Description ^ | ''$themeDirectory'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — array ======== isPremiumTheme() ======== public function isPremiumTheme($themeDirectory) //lines 74–83 (10)// Determine whether a theme is a premium theme. ^ Parameter ^ Type ^ Default ^ Description ^ | ''$themeDirectory'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — bool ======== activate() ======== public function activate($licenseKey, $domain, $productSecret, $productId) //lines 97–107 (11)// Activate a license key against the MyBlog license API. POST /api/v2/licenses/activate/{product_id} Body: {"license_key": "...", "domain": "..."} ^ Parameter ^ Type ^ Default ^ Description ^ | ''$licenseKey'' | ''(untyped)'' | //required// | The license key entered by the admin. | | ''$domain'' | ''(untyped)'' | //required// | The domain where the theme is installed. | | ''$productSecret'' | ''(untyped)'' | //required// | Per-product license_secret embedded in the theme. | | ''$productId'' | ''(untyped)'' | //required// | MyBlog store product ID for this theme. | **Returns:** ''(none declared)'' — array{success: bool, message: string, data?: array} ======== validate() ======== public function validate($licenseKey, $productId, $productSecret) //lines 120–130 (11)// Validate an already-activated license. POST /api/v2/licenses/validate Body: {"license_key": "...", "product_id": N} ^ Parameter ^ Type ^ Default ^ Description ^ | ''$licenseKey'' | ''(untyped)'' | //required// | //none// | | ''$productId'' | ''(untyped)'' | //required// | //none// | | ''$productSecret'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — array{success: bool, message: string, data?: array} ======== deactivate() ======== public function deactivate($licenseKey, $productId, $productSecret) //lines 143–153 (11)// Deactivate a theme license, releasing one activation slot. POST /api/v2/licenses/deactivate Body: {"license_key": "...", "product_id": N} ^ Parameter ^ Type ^ Default ^ Description ^ | ''$licenseKey'' | ''(untyped)'' | //required// | //none// | | ''$productId'' | ''(untyped)'' | //required// | //none// | | ''$productSecret'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — array{success: bool, message: string, data?: array} ======== post() ======== protected function post($url, $body, $secret) //lines 167–188 (22)// Send an HMAC-signed POST request to the license API. Signature scheme (mirrors MyBlog ApiAuthService::verifyHmacSignature): payload = "{timestamp}.{nonce}.{body}" signature = hash_hmac('sha256', payload, secret) ^ Parameter ^ Type ^ Default ^ Description ^ | ''$url'' | ''(untyped)'' | //required// | //none// | | ''$body'' | ''(untyped)'' | //required// | //none// | | ''$secret'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — array{success: bool, message: string, data?: array} ======== postCurl() ======== private function postCurl($url, $body, array $headers) //lines 198–224 (27)// Send the request using cURL. ^ Parameter ^ Type ^ Default ^ Description ^ | ''$url'' | ''(untyped)'' | //required// | //none// | | ''$body'' | ''(untyped)'' | //required// | //none// | | ''$headers'' | ''array'' | //required// | //none// | **Returns:** ''(none declared)'' — array ======== postStream() ======== private function postStream($url, $body, array $headers) //lines 234–269 (36)// Send the request using stream context (fallback when cURL is absent). ^ Parameter ^ Type ^ Default ^ Description ^ | ''$url'' | ''(untyped)'' | //required// | //none// | | ''$body'' | ''(untyped)'' | //required// | //none// | | ''$headers'' | ''array'' | //required// | //none// | **Returns:** ''(none declared)'' — array ======== parseResponse() ======== protected function parseResponse($response, $httpCode) //lines 278–320 (43)// Parse the JSON response from the license API. ^ Parameter ^ Type ^ Default ^ Description ^ | ''$response'' | ''(untyped)'' | //required// | //none// | | ''$httpCode'' | ''(untyped)'' | //required// | //none// | **Returns:** ''(none declared)'' — array ---- //This page is generated from source by 'tools/gendoc'. Edits will be overwritten.//