licenseFilePath = storage_path('app/license'); } public function shouldRecheck() { if ($this->valid()) { return Carbon::parse($this->getLicenseFromFile()->next_check)->isPast(); } } public function valid() { return $this->getLicenseFromFile()?->valid; } public function shouldCreateLicense(): bool { return match (true) { $this->inFrontend(), $this->runningInLocal(), $this->valid() => false, default => true, }; } /** * @throws InvalidLicenseException|GuzzleException */ public function recheck(): void { $this->activate( $this->getLicenseFromFile()->purchase_code ); } /** * @throws InvalidLicenseException|GuzzleException */ public function activate($purchaseCode): void { $license = new stdClass(); $client = new Client(['base_uri' => $this->endpoint]); try { $client->post('/api/v1/licenses', [ 'form_params' => [ 'item_id' => FleetCart::ITEM_ID, 'domain' => request()->root(), 'purchase_code' => $purchaseCode, ], ]); $license->valid = true; } catch (ClientException $e) { $license->valid = false; $response = json_decode($e->getResponse()->getBody()); if ($response->status === 'success' && !$response->valid) { throw new InvalidLicenseException('The purchase code is invalid.'); } if ($response->status === 'error') { throw new InvalidLicenseException($response->message); } } catch (ConnectException|ServerException|RequestException $e) { $license->valid = true; } finally { $license->purchase_code = $purchaseCode; $license->next_check = now()->addDays(1); $this->deleteLicenseFile(); $this->storeLicenseToFile(json_encode($license)); } } /** * The following function implements Singleton pattern * to retrieve license from file. */ private function getLicenseFromFile() { if (!is_null($this->license)) { return $this->license; } if (!file_exists($this->licenseFilePath)) { return null; } $this->license = json_decode( decrypt( file_get_contents( $this->licenseFilePath ) ) ); return $this->license; } private function inFrontend(): bool { if (request()->is('license')) { return false; } return !request()->is('*admin*'); } private function runningInLocal(): bool { return app()->isLocal() || in_array(request()->ip(), ['127.0.0.1', '::1']); } private function deleteLicenseFile(): void { File::delete($this->licenseFilePath); } private function storeLicenseToFile($license): void { file_put_contents($this->licenseFilePath, encrypt($license)); } }