diff --git a/modules/registrars/openprovider/Controllers/Hooks/ClientAreaPrimarySidebarController.php b/modules/registrars/openprovider/Controllers/Hooks/ClientAreaPrimarySidebarController.php index 93dcc4dfb..1b2f48a29 100644 --- a/modules/registrars/openprovider/Controllers/Hooks/ClientAreaPrimarySidebarController.php +++ b/modules/registrars/openprovider/Controllers/Hooks/ClientAreaPrimarySidebarController.php @@ -23,10 +23,17 @@ class ClientAreaPrimarySidebarController * @var ApiHelper */ private $apiHelper; - - public function __construct(ApiHelper $apiHelper) + /** + * @var DNS + */ + private $dnsHelper; + /** + * ConfigController constructor. + */ + public function __construct(ApiHelper $apiHelper, DNS $dnsHelper) { $this->apiHelper = $apiHelper; + $this->dnsHelper = $dnsHelper; } public function show($primarySidebar) @@ -52,7 +59,7 @@ private function replaceDnsMenuItem($primarySidebar) return; } - if ($url = DNS::getDnsUrlOrFail($domainId)) { + if ($url = $this->dnsHelper->getDnsUrlOrFail($domainId)) { // Update the URL. $dnsManagement->setUri($url); diff --git a/modules/registrars/openprovider/Controllers/Hooks/DnsAuthController.php b/modules/registrars/openprovider/Controllers/Hooks/DnsAuthController.php index dd59d4b6b..c2f92d469 100644 --- a/modules/registrars/openprovider/Controllers/Hooks/DnsAuthController.php +++ b/modules/registrars/openprovider/Controllers/Hooks/DnsAuthController.php @@ -13,9 +13,21 @@ */ class DnsAuthController { + /** + * @var DNS + */ + private $dnsHelper; + /** + * ConfigController constructor. + */ + public function __construct(DNS $dnsHelper) + { + $this->dnsHelper = $dnsHelper; + } + public function redirectDnsManagementPage($params) { - if ($url = DNS::getDnsUrlOrFail($params['domainid'])) { + if($url = $this->dnsHelper->getDnsUrlOrFail($params['domainid'])) { // Fallback if referer is not set or is not same-origin $defaultPreviousUrl = 'clientarea.php?action=domains'; diff --git a/modules/registrars/openprovider/Controllers/System/DnsController.php b/modules/registrars/openprovider/Controllers/System/DnsController.php index f4a7a89de..4b0a60f8f 100644 --- a/modules/registrars/openprovider/Controllers/System/DnsController.php +++ b/modules/registrars/openprovider/Controllers/System/DnsController.php @@ -13,6 +13,7 @@ use OpenProvider\API\Domain; use WeDevelopCoffee\wPower\Controllers\BaseController; use WeDevelopCoffee\wPower\Core\Core; +use OpenProvider\WhmcsRegistrar\helpers\DNS; class DnsController extends BaseController { @@ -26,16 +27,20 @@ class DnsController extends BaseController * @var ApiHelper */ private $apiHelper; - + /** + * @var DNS + */ + private $dnsHelper; /** * ConfigController constructor. */ - public function __construct(Core $core, Domain $domain, ApiHelper $apiHelper) + public function __construct(Core $core, Domain $domain, ApiHelper $apiHelper, DNS $dnsHelper) { parent::__construct($core); $this->domain = $domain; $this->apiHelper = $apiHelper; + $this->dnsHelper = $dnsHelper; } /** @@ -115,6 +120,62 @@ public function save($params) } } + public function redirectDnsManagementPage ($params) + { + $url = $this->dnsHelper->getDnsUrlOrFail($params['domainid'], true); + + if (!$url) { + return [ + 'error' => 'Unable to generate DNS Management URL.', + ]; + } + + $previousUrl = isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] !== '' + ? $_SERVER['REQUEST_URI'] + : '/'; + + if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '') { + $referer = $_SERVER['HTTP_REFERER']; + $refererParts = parse_url($referer); + + if ( + is_array($refererParts) && + isset($refererParts['host'], $_SERVER['HTTP_HOST']) && + strtolower($refererParts['host']) === strtolower($_SERVER['HTTP_HOST']) + ) { + $previousUrl = $referer; + } + } + + $encodedUrl = json_encode($url, JSON_UNESCAPED_SLASHES); + $encodedPreviousUrl = json_encode($previousUrl, JSON_UNESCAPED_SLASHES); + + echo ''; + + exit; + } + private function isZoneNotFound(\Throwable $e): bool { if ((int) $e->getCode() === 872) { diff --git a/modules/registrars/openprovider/OpenProvider/API/ApiHelper.php b/modules/registrars/openprovider/OpenProvider/API/ApiHelper.php index ea11526a2..f5be92785 100644 --- a/modules/registrars/openprovider/OpenProvider/API/ApiHelper.php +++ b/modules/registrars/openprovider/OpenProvider/API/ApiHelper.php @@ -522,6 +522,22 @@ public function deleteDnsRecords(Domain $domain): array return []; } + /** + * @param string $domain + * @param string $zone_provider + * @return array + * @throws \Exception + */ + public function getDnsDomainToken(string $domain, string $zone_provider): array + { + $args = [ + 'domain' => $domain, + 'zone_provider' => $zone_provider, + ]; + + return $this->buildResponse($this->apiClient->call('createDomainTokenRequest', $args)); + } + /** * @param string $handle * @param bool $formattedForWhmcs diff --git a/modules/registrars/openprovider/OpenProvider/API/CommandMapping.php b/modules/registrars/openprovider/OpenProvider/API/CommandMapping.php index 49c84f733..baa069e2f 100644 --- a/modules/registrars/openprovider/OpenProvider/API/CommandMapping.php +++ b/modules/registrars/openprovider/OpenProvider/API/CommandMapping.php @@ -15,6 +15,7 @@ use Openprovider\Api\Rest\Client\Person\Api\ResellerServiceApi; use Openprovider\Api\Rest\Client\Tld\Api\TldServiceApi; use Openprovider\Api\Rest\Client\Domain\Api\AuthCodeApi; +use Openprovider\Api\Rest\Client\Dns\Api\DomainTokenApi; class CommandMapping { @@ -134,6 +135,10 @@ class CommandMapping self::COMMAND_MAP_METHOD => 'createZone', self::COMMAND_MAP_CLASS => ZoneServiceApi::class, ], + 'createDomainTokenRequest' => [ + self::COMMAND_MAP_METHOD => 'createToken', + self::COMMAND_MAP_CLASS => DomainTokenApi::class + ], // Nameservers 'searchNsRequest' => [ diff --git a/modules/registrars/openprovider/helpers/DNS.php b/modules/registrars/openprovider/helpers/DNS.php index b78364b05..27ff5a66d 100644 --- a/modules/registrars/openprovider/helpers/DNS.php +++ b/modules/registrars/openprovider/helpers/DNS.php @@ -2,41 +2,69 @@ namespace OpenProvider\WhmcsRegistrar\helpers; +use OpenProvider\API\ApiHelper; use OpenProvider\WhmcsRegistrar\src\Configuration; -use OpenProvider\WhmcsRegistrar\src\OpenProvider; +use OpenProvider\WhmcsRegistrar\helpers\DomainFullNameToDomainObject; use WHMCS\Database\Capsule; class DNS { + /** + * @var ApiHelper + */ + private $apiHelper; + + /** + * ConfigController constructor. + */ + public function __construct(ApiHelper $apiHelper) + { + $this->apiHelper = $apiHelper; + } + /** * Get the DNS URL * - * @return bool|void + * @param int $domain_id + * @param bool $skipConfigCheck Whether to ignore useNewDnsManagerFeature flag + * @return string|bool */ - public static function getDnsUrlOrFail($domain_id) + public function getDnsUrlOrFail($domain_id, bool $skipConfigCheck = false) { // Get the domain details $domain = Capsule::table('tbldomains') ->where('id', $domain_id) ->first(); + + if (!$domain) { + return false; + } // Check if OpenProvider is the provider if($domain->registrar != 'openprovider' || $domain->status != 'Active') return false; - // Check if we are allowed to make a redirect. - $newDnsStatus = Configuration::getOrDefault('useNewDnsManagerFeature', false); + // Client-side feature toggle (unless skipped) + if (!$skipConfigCheck) { + // Check if we are allowed to make a redirect + $newDnsStatus = Configuration::getOrDefault('useNewDnsManagerFeature', false); - if($newDnsStatus != true) - return false; + if ($newDnsStatus !== true) { + return false; + } + } + + $op_domain_obj = DomainFullNameToDomainObject::convert($domain->domain); // Let's get the URL. try { - $OpenProvider = new OpenProvider(); - return $OpenProvider->api->getDnsSingleDomainTokenUrl($domain->domain)['url']; + $domainOp = $this->apiHelper->getDomain($op_domain_obj); + $zoneProvider = !empty($domainOp['isSectigoDnsEnabled']) ? 'sectigo' : 'openprovider'; + $response = $this->apiHelper->getDnsDomainToken($domain->domain, $zoneProvider); + return $response['url'] ?? false; } catch (\Exception $e) { - \logModuleCall('OpenProvider', 'Fetching generateSingleDomainTokenRequest', $domain->domain, @$response, $e->getMessage(), [htmlentities($params['Password']), $params['Password']]); + logModuleCall('OpenProvider','getDnsDomainToken',$domain->domain,$e->getMessage(),'', ''); return false; } } diff --git a/modules/registrars/openprovider/openprovider.php b/modules/registrars/openprovider/openprovider.php index d08263817..62d63a15a 100644 --- a/modules/registrars/openprovider/openprovider.php +++ b/modules/registrars/openprovider/openprovider.php @@ -64,6 +64,7 @@ function openprovider_AdminCustomButtonArray() $buttonarray = array( "Auto-renew Sync" => "AutoRenewSync", "Sync" => "Sync", + "Manage DNS Zone" => "AdminManageDnsZone", ); return $buttonarray; @@ -342,6 +343,17 @@ function openprovider_ResendIRTPVerificationEmail(array $params) return openprovider_registrar_launch_decorator('resendIRTPVerificationEmail', $params); } +/** + * Admin Manage Dns Zone + * + * @param array $params + * @return mixed + */ +function openprovider_AdminManageDnsZone($params) +{ + return openprovider_registrar_launch_decorator('adminManageDnsZone', $params); +} + function openprovider_config_validate($params) { diff --git a/modules/registrars/openprovider/routes/system.php b/modules/registrars/openprovider/routes/system.php index c0e9b7a8f..418af82e0 100644 --- a/modules/registrars/openprovider/routes/system.php +++ b/modules/registrars/openprovider/routes/system.php @@ -32,6 +32,7 @@ // DNS 'getDns' => 'DnsController@get', 'saveDns' => 'DnsController@save', + 'adminManageDnsZone' => 'DnsController@redirectDnsManagementPage', // Contact 'getContactDetails' => 'ContactController@getDetails',