From: Alexander Ebert Date: Tue, 26 Sep 2023 14:54:58 +0000 (+0200) Subject: Make use of the `LicenseApi` to validate the license X-Git-Tag: 6.0.0_RC_2~3^2~16 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=5a7d5783d1591761cc07c3c938cbbbd83fcd9026;p=GitHub%2FWoltLab%2FWCF.git Make use of the `LicenseApi` to validate the license --- diff --git a/wcfsetup/install/files/lib/acp/form/LicenseEditForm.class.php b/wcfsetup/install/files/lib/acp/form/LicenseEditForm.class.php index ae465e4a96..4a1d1a831b 100644 --- a/wcfsetup/install/files/lib/acp/form/LicenseEditForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/LicenseEditForm.class.php @@ -2,11 +2,7 @@ namespace wcf\acp\form; -use CuyZ\Valinor\Mapper\MappingError; -use CuyZ\Valinor\Mapper\Source\Source; -use CuyZ\Valinor\MapperBuilder; use GuzzleHttp\Exception\ConnectException; -use GuzzleHttp\Psr7\Request; use Laminas\Diactoros\Response\RedirectResponse; use Psr\Http\Client\ClientExceptionInterface; use wcf\data\option\Option; @@ -23,9 +19,9 @@ use wcf\system\form\builder\field\dependency\EmptyFormFieldDependency; use wcf\system\form\builder\field\TextFormField; use wcf\system\form\builder\field\validation\FormFieldValidationError; use wcf\system\form\builder\field\validation\FormFieldValidator; -use wcf\system\io\HttpFactory; +use wcf\system\package\license\exception\ParsingFailed; +use wcf\system\package\license\LicenseApi; use wcf\system\request\LinkHandler; -use wcf\system\WCF; /** * Set up or edit the license data. @@ -52,7 +48,7 @@ final class LicenseEditForm extends AbstractFormBuilderForm */ public $templateName = 'licenseEdit'; - private array $apiResponse; + private LicenseApi $licenseApi; private string $url; @@ -109,13 +105,16 @@ final class LicenseEditForm extends AbstractFormBuilderForm \assert($licenseNo instanceof TextFormField); try { - $this->apiResponse = $this->getLicenseData($licenseNo->getValue(), $serialNo->getValue()); + $this->licenseApi = LicenseApi::fetchFromRemote([ + 'username' => $licenseNo->getValue(), + 'password' => $serialNo->getValue(), + ]); } catch (ConnectException) { $serialNo->addValidationError(new FormFieldValidationError( 'failedConnect', 'wcf.acp.firstTimeSetup.license.credentials.error.failedConnect' )); - } catch (ClientExceptionInterface | MappingError) { + } catch (ClientExceptionInterface | ParsingFailed) { $serialNo->addValidationError(new FormFieldValidationError( 'failedValidation', 'wcf.acp.firstTimeSetup.license.credentials.error.failedValidation' @@ -161,43 +160,6 @@ final class LicenseEditForm extends AbstractFormBuilderForm ); } - private function getLicenseData(string $licenseNo, string $serialNo): array - { - $request = new Request( - 'POST', - 'https://api.woltlab.com/2.0/customer/license/list.json', - [ - 'content-type' => 'application/x-www-form-urlencoded', - ], - \http_build_query([ - 'licenseNo' => $licenseNo, - 'serialNo' => $serialNo, - 'instanceId' => \hash_hmac('sha256', 'api.woltlab.com', \WCF_UUID), - ], '', '&', \PHP_QUERY_RFC1738) - ); - - $response = HttpFactory::makeClientWithTimeout(5)->send($request); - - return (new MapperBuilder()) - ->allowSuperfluousKeys() - ->mapper() - ->map( - <<<'EOT' - array { - status: 200, - license: array { - authCode?: string, - type: string, - expiryDates?: array, - }, - pluginstore: array, - woltlab: array, - } - EOT, - Source::json($response->getBody()) - ); - } - /** * @inheritDoc */ @@ -238,21 +200,20 @@ final class LicenseEditForm extends AbstractFormBuilderForm $objectAction->executeAction(); } - if (isset($this->apiResponse) && isset($this->apiResponse['license']['authCode'])) { - $optionData = [ - Option::getOptionByName('package_server_auth_code')->optionID => $this->apiResponse['license']['authCode'], - ]; + $authCode = ''; + if (isset($this->licenseApi)) { + $authCode = $this->licenseApi->getData()['license']['authCode'] ?? ''; } else { - $optionData = [ - Option::getOptionByName('package_server_auth_code')->optionID => '', - ]; + LicenseApi::removeLicenseFile(); } $objectAction = new OptionAction( [], 'updateAll', [ - 'data' => $optionData, + 'data' => [ + Option::getOptionByName('package_server_auth_code')->optionID => $authCode + ], ] ); $objectAction->executeAction(); diff --git a/wcfsetup/install/files/lib/system/package/license/LicenseApi.class.php b/wcfsetup/install/files/lib/system/package/license/LicenseApi.class.php index 0b592ce7a8..80f059e592 100644 --- a/wcfsetup/install/files/lib/system/package/license/LicenseApi.class.php +++ b/wcfsetup/install/files/lib/system/package/license/LicenseApi.class.php @@ -30,8 +30,6 @@ final class LicenseApi { $this->json = $json; $this->data = $this->parseLicenseData($this->json); - - $this->updateLicenseFile(); } public function getData(): array @@ -39,7 +37,7 @@ final class LicenseApi return $this->data; } - private function updateLicenseFile(): void + public function updateLicenseFile(): void { @\file_put_contents( self::LICENSE_FILE, @@ -83,13 +81,15 @@ final class LicenseApi return $result; } - public static function fetchFromRemote(): LicenseApi + public static function fetchFromRemote(array $authData = []): LicenseApi { - if (!self::hasLicenseCredentials()) { - throw new MissingCredentials(); - } + if ($authData === []) { + if (!self::hasLicenseCredentials()) { + throw new MissingCredentials(); + } - $authData = PackageUpdateServer::getWoltLabUpdateServer()->getAuthData(); + $authData = PackageUpdateServer::getWoltLabUpdateServer()->getAuthData(); + } $request = new Request( 'POST', @@ -106,7 +106,10 @@ final class LicenseApi $response = HttpFactory::makeClientWithTimeout(5)->send($request); - return new LicenseApi($response->getBody()); + $licenseApi = new LicenseApi($response->getBody()); + $licenseApi->updateLicenseFile(); + + return $licenseApi; } public static function readFromFile(): ?LicenseApi @@ -124,6 +127,15 @@ final class LicenseApi } } + public static function removeLicenseFile(): void + { + if (!\file_exists(self::LICENSE_FILE)) { + return; + } + + \unlink(self::LICENSE_FILE); + } + public static function hasLicenseCredentials(): bool { $authData = PackageUpdateServer::getWoltLabUpdateServer()->getAuthData();