diff --git a/.github/workflows/phpcs.yml b/.github/workflows/phpcs.yml index 71c5f48..02cfc8b 100644 --- a/.github/workflows/phpcs.yml +++ b/.github/workflows/phpcs.yml @@ -3,20 +3,27 @@ name: CI on: [ push ] jobs: - build-and-test: + phpcs: runs-on: ubuntu-latest + defaults: + run: + working-directory: "modules/registrars/realtimeregister" steps: - uses: actions/checkout@v3 - name: Composer install --dev uses: php-actions/composer@v6 - working_dir: modules/registrars/realtimeregister + env: + COMPOSER: "composer.json" + with: + working_dir: "modules/registrars/realtimeregister" - name: PHP Code Sniffer uses: php-actions/phpcs@v1 with: php_version: 8.1 path: modules/registrars/realtimeregister - ignore: modules/registrars/realtimregister/vendor + ignore: modules/registrars/realtimeregister/vendor + extensions: php standard: PSR12 \ No newline at end of file diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml new file mode 100644 index 0000000..acb6ee6 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,26 @@ +name: Test application + +on: [ push ] + +jobs: + phpunit: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Composer install --dev + uses: php-actions/composer@v6 + with: + working_dir: "modules/registrars/realtimeregister" + + - name: PHPUnit + uses: php-actions/phpunit@master + env: + TEST_NAME: WHMCS + with: + version: 9.6 + php_version: 8.1 + bootstrap: modules/registrars/realtimeregister/vendor/autoload.php + configuration: modules/registrars/realtimeregister/phpunit.xml.dist + args: --coverage-text \ No newline at end of file diff --git a/modules/registrars/realtimeregister/additionalfields.php b/modules/registrars/realtimeregister/additionalfields.php index 705bcf5..dd6e444 100644 --- a/modules/registrars/realtimeregister/additionalfields.php +++ b/modules/registrars/realtimeregister/additionalfields.php @@ -26,8 +26,9 @@ if (isset($_SESSION['cart']['domains'])) { $tlds = array_map( function ($domain) { - return MetadataService::getTld($domain['domain']); - }, $_SESSION['cart']['domains'] + return MetadataService::getTld($domain['domain']); + }, + $_SESSION['cart']['domains'] ); } @@ -49,7 +50,9 @@ function ($domain) { try { $additional = (new MetadataService($tld))->getTldAdditionalFields(); } catch (\Exception $e) { - logActivity("Error while getting additional fields for '" . $tld . "' for Realtime Register:" . $e->getMessage()); + logActivity( + "Error while getting additional fields for '" . $tld . "' for Realtime Register:" . $e->getMessage() + ); $additional = []; } @@ -61,7 +64,8 @@ function ($domain) { if ($tld !== 'aero') { $fields = array_filter( - $fields, function ($field) { + $fields, + function ($field) { return !in_array($field['Name'], ['AeroId', 'AeroKey']); } ); @@ -96,4 +100,4 @@ function ($domain) { } } -MetadataService::removeDefaultFields($additionaldomainfields); \ No newline at end of file +MetadataService::removeDefaultFields($additionaldomainfields); diff --git a/modules/registrars/realtimeregister/composer.json b/modules/registrars/realtimeregister/composer.json index 237bca7..8a52d84 100644 --- a/modules/registrars/realtimeregister/composer.json +++ b/modules/registrars/realtimeregister/composer.json @@ -1,6 +1,7 @@ { "name": "registrars/realtimeregister", "type": "library", + "version": "2.0.0", "repositories": [ { "type": "vcs", @@ -15,6 +16,11 @@ "src/helpers.php" ] }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, "authors": [ { "name": "Realtime Register", diff --git a/modules/registrars/realtimeregister/composer.lock b/modules/registrars/realtimeregister/composer.lock index d17a83c..e57a825 100644 --- a/modules/registrars/realtimeregister/composer.lock +++ b/modules/registrars/realtimeregister/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9b3b8134609ea2aedb7695bddaca5cb0", + "content-hash": "8195acc04fd353a9ef218f486c39dd09", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -1421,12 +1421,12 @@ "source": { "type": "git", "url": "https://github.com/realtimeregister/realtimeregister-php.git", - "reference": "6726db0eaa6809784707e6b18debc70150aa9eed" + "reference": "5621a8de294448a4c2cb14633724e76882a1afe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/realtimeregister/realtimeregister-php/zipball/6726db0eaa6809784707e6b18debc70150aa9eed", - "reference": "6726db0eaa6809784707e6b18debc70150aa9eed", + "url": "https://api.github.com/repos/realtimeregister/realtimeregister-php/zipball/5621a8de294448a4c2cb14633724e76882a1afe8", + "reference": "5621a8de294448a4c2cb14633724e76882a1afe8", "shasum": "" }, "require": { @@ -1492,7 +1492,7 @@ "support": { "source": "https://github.com/realtimeregister/realtimeregister-php/tree/whmcs" }, - "time": "2024-08-23T07:18:53+00:00" + "time": "2024-08-27T07:26:51+00:00" }, { "name": "symfony/deprecation-contracts", diff --git a/modules/registrars/realtimeregister/hooks.php b/modules/registrars/realtimeregister/hooks.php index 84026c7..19b4c2b 100644 --- a/modules/registrars/realtimeregister/hooks.php +++ b/modules/registrars/realtimeregister/hooks.php @@ -10,13 +10,18 @@ App::hook(Hooks\PreRegistrarGetContactDetails::class); App::hook(Hooks\AdminAreaPage::class, 10); -App::hook("AdminAreaHeadOutput", Hooks\CheckCredentials::class, 1); - +App::hook('AdminAreaHeadOutput', Hooks\CheckCredentials::class, 1); +App::hook('ClientAreaHeadOutput', Hooks\Adac::class, 10); +App::hook('ClientAreaHeadOutput', Hooks\ClientAreaHeadOutput::class, 20); +App::hook('ClientAreaHeadOutput', Hooks\CheckCredentials::class, 10); App::hook(Hooks\AdminAreaHeadOutput::class, null, 100); App::hook(Hooks\AdminAreaFooterOutput::class, null, 100); App::hook(Hooks\ClientAreaPage::class); App::hook(Hooks\ContactEdit::class); App::hook("AdminAreaHeadOutput", Hooks\ImportDomains::class); +App::hook('ShoppingCartValidateCheckout', Hooks\ShoppingCartValidate::class); +App::hook('ShoppingCartValidateDomainsConfig', Hooks\ShoppingCartValidate::class); +App::hook(Hooks\UserLogin::class); App::hook('AdminHomeWidgets', Hooks\Widgets\BalanceWidget::class); App::hook('AdminHomeWidgets', Hooks\Widgets\DomainOverviewWidget::class); diff --git a/modules/registrars/realtimeregister/lang/english.additional.php b/modules/registrars/realtimeregister/lang/english.additional.php index 8d0306f..f98cdd0 100644 --- a/modules/registrars/realtimeregister/lang/english.additional.php +++ b/modules/registrars/realtimeregister/lang/english.additional.php @@ -1,4 +1,5 @@ - + - ./tests/ + ./tests/ + + + \ No newline at end of file diff --git a/modules/registrars/realtimeregister/realtimeregister.php b/modules/registrars/realtimeregister/realtimeregister.php index 100ba69..50ac9f3 100644 --- a/modules/registrars/realtimeregister/realtimeregister.php +++ b/modules/registrars/realtimeregister/realtimeregister.php @@ -117,3 +117,7 @@ function realtimeregister_ResendValidationMails(array $params) throw new Exception(__FUNCTION__ . ' is not implemented yet'); } +function realtimeregister_GetEPPCode($params) +{ + return App::dispatch(\RealtimeRegister\Actions\Domains\GetAuthCode::class, $params); +} diff --git a/modules/registrars/realtimeregister/src/Actions/Domains/CheckAvailability.php b/modules/registrars/realtimeregister/src/Actions/Domains/CheckAvailability.php index b742787..55ccb49 100644 --- a/modules/registrars/realtimeregister/src/Actions/Domains/CheckAvailability.php +++ b/modules/registrars/realtimeregister/src/Actions/Domains/CheckAvailability.php @@ -14,7 +14,10 @@ class CheckAvailability extends Action public function __invoke(Request $request) { $isProxy = App::isProxy(); - $isProxy->enable('premium'); + + if ($request->params['premiumEnabled']) { + $isProxy->enable('premium'); + } $isProxyDomains = $isProxy->checkMany( $request->get('searchTerm'), @@ -30,9 +33,9 @@ public function __invoke(Request $request) $searchResult->setStatus( match ($result->getStatus()) { - IsProxyDomain::STATUS_AVAILABLE => SearchResult::STATUS_NOT_REGISTERED, - IsProxyDomain::STATUS_NOT_AVAILABLE => SearchResult::STATUS_REGISTERED, - default => SearchResult::STATUS_UNKNOWN + IsProxyDomain::STATUS_AVAILABLE => SearchResult::STATUS_NOT_REGISTERED, + IsProxyDomain::STATUS_NOT_AVAILABLE => SearchResult::STATUS_REGISTERED, + default => SearchResult::STATUS_UNKNOWN } ); diff --git a/modules/registrars/realtimeregister/src/Actions/Domains/GetAuthCode.php b/modules/registrars/realtimeregister/src/Actions/Domains/GetAuthCode.php new file mode 100644 index 0000000..9ab6321 --- /dev/null +++ b/modules/registrars/realtimeregister/src/Actions/Domains/GetAuthCode.php @@ -0,0 +1,15 @@ +domainInfo($request); + return $domain->authcode; + } +} diff --git a/modules/registrars/realtimeregister/src/App.php b/modules/registrars/realtimeregister/src/App.php index c99bfac..7c59911 100644 --- a/modules/registrars/realtimeregister/src/App.php +++ b/modules/registrars/realtimeregister/src/App.php @@ -49,7 +49,9 @@ public static function boot(): App $app = static::instance(); if (!static::$booted) { - Cache::boot(); + if (!defined('PHPUNIT_REALTIMEREGISTER_TESTSUITE')) { + Cache::boot(); + } static::$booted = true; } diff --git a/modules/registrars/realtimeregister/src/Assets/Css/adac.css b/modules/registrars/realtimeregister/src/Assets/Css/adac.css new file mode 100644 index 0000000..7b5a934 --- /dev/null +++ b/modules/registrars/realtimeregister/src/Assets/Css/adac.css @@ -0,0 +1,139 @@ +.adac-js .suggestion, +.adac-js .domain-option { + clear: both; + line-height: 3rem; + overflow: hidden; + padding: 5px 15px; + + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.adac-js .domain-option { + border: 1px solid #eee; +} + +.adac-js .domain-option:nth-child(even) { + background: #eee; +} + +.adac-js .suggestion:nth-child(even) { + background: #dddedf; +} + +#adac-js-suggestions, +#adac-js-domain-results { + margin: 30px 0; +} + +.adac-js .label { + border-radius: 3px; +} + +#adac-js-categories input { + display: none; +} + +#adac-js-categories label { + color: #fff !important; + display: inline-block; + margin-bottom: 4px; + padding: 5px 6px; + font-size: 90%; + font-weight: 400; + border-radius: 2px; + background-color: #777; + margin-right: 5px; + cursor: pointer; +} + +#adac-js-categories label:hover { + background-color: #5e5e5e; +} + +#adac-js-categories input:checked + label { + background-color: #5cb85c; +} + +#adac-js-categories input:checked + label:hover { + background-color: #449d44; +} + +.adac-js .domain_status_0, +.adac-js .domain_status_2, +.adac-js .domain_status_3, +.adac-js .domain_status_4 { + color: #a2a2a2; +} + +.adac-js .transfer, +.adac-js .checkout { + border-color: #ccc; + background-color: white; + color: #777; +} + +.adac-js .transfer:hover, +.adac-js .checkout:hover { + color: #505050; + border-color: #909090; +} + +.adac-js .adac-register-domain, +.adac-js .adac-transfer-domain { + width: 100%; + max-width: 300px; +} + +@media only screen and (max-width: 767px) and (min-width: 460px) { + .adac-js #adac-js-domain-results { + display: flex; + flex-wrap: wrap; + } + + .adac-js #adac-js-domain-results .domain-option { + background: #fff; + width: 50%; + display: inline-block; + flex: 0 50%; + } + + .adac-js #adac-js-domain-results .domain-option:nth-child(4n+2), + .adac-js #adac-js-domain-results .domain-option:nth-child(4n+3) { + background-color: #eee; + } + + .adac-js #adac-js-suggestions .suggestion { + width: 50%; + display: inline-block; + background-color: #edeeef; + flex: 0 50%; + } + + .adac-js #adac-js-suggestions .suggestion:nth-child(4n+3), + .adac-js #adac-js-suggestions .suggestion:nth-child(4n+4) { + background-color: #dddedf; + } +} + +@media (max-width: 767px) { + .adac-js .suggestion, + .adac-js .domain-option { + padding-top: 10px; + padding-bottom: 15px; + } +} + +@media (max-width: 767px) { + .text-xs-center { + text-align: center; + } +} + +@media only screen and (max-width: 992px) and (min-width: 767px) { + .text-sm-center { + text-align: center; + } +} diff --git a/modules/registrars/realtimeregister/src/Assets/Css/style.css b/modules/registrars/realtimeregister/src/Assets/Css/style.css new file mode 100644 index 0000000..62a680a --- /dev/null +++ b/modules/registrars/realtimeregister/src/Assets/Css/style.css @@ -0,0 +1,108 @@ +#realtimeregisterconfig table .fieldlabel { + width: 200px; +} +#realtimeregisterconfig table td { + padding: 2px 5px; + text-align: left; + vertical-align: top; +} +#realtimeregisterconfig table td li { + list-style: circle; +} +#realtimeregisterconfig table td a { + text-decoration: underline; +} +form .view-ips { + padding-top: 4px; + vertical-align: top; + max-width: initial; +} +.manage-ips, .delete-host { + vertical-align: top; +} +.add-ip { + font-weight: bold; + padding: 0 5px; +} +.remove-ip { + padding: 5px; +} + +.remove-ip i { + margin-top: 4px; +} + +.extra-ips { + padding: 0 5px; + white-space: nowrap; +} +.extra-ips:hover, .add-ip:hover { + text-decoration: none; +} +.ip-version { + min-width: 175px; +} + +@keyframes spinner-border { + to { transform: rotate(360deg); } +} + +.spinner { + display: none; + background-color: rgba(255, 255, 255, 0.6); + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + text-align: center; +} +.spinner.active { + display: block; +} + +.spinner-border { + position: absolute; + top: calc(50% - 1rem); + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: .25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; +} + +.child-host { +} + +.child-host__table { + width: 100%; +} + +.child-host__table td input, +.child-host__table td select { + height: 30px; + padding: 5px; +} + +.child-host__table td label, +.child-host__table td input, +.child-host__table td select { + width: 100%; +} + +.child-host__table td { + padding-bottom: 5px; + padding-top: 5px; +} + +.child-host__table td.version { + padding-left: 10px; +} + +.child-host__table td.remove { + width: 20px; +} diff --git a/modules/registrars/realtimeregister/src/Assets/Js/adac.js b/modules/registrars/realtimeregister/src/Assets/Js/adac.js new file mode 100644 index 0000000..4c73d9e --- /dev/null +++ b/modules/registrars/realtimeregister/src/Assets/Js/adac.js @@ -0,0 +1,622 @@ +var statusMapping = {}; + +if(adacLang.status != undefined) { + statusMapping = adacLang.status; +} else { + statusMapping[0] = 'Checking...'; + statusMapping[1] = 'available'; + statusMapping[2] = 'taken'; + statusMapping[3] = 'invalid'; + statusMapping[4] = 'No response'; + statusMapping[5] = 'unknown'; +} + +var registerLang = 'Register'; +if (adacLang.register != undefined) { + registerLang = adacLang.register; +} + +var transferLang = 'Transfer'; +if (adacLang.transfer != undefined) { + transferLang = adacLang.transfer; +} + +var premiumLang = 'Premium'; +if (adacLang.premium != undefined) { + premiumLang = adacLang.premium; +} + +var checkoutLang = 'Checkout'; +if (adacLang.checkout != undefined) { + checkoutLang = adacLang.checkout; +} + +var suggestionLang = 'Need suggestions? You might also like:'; +if (adacLang.suggestions != undefined) { + suggestionLang = adacLang.suggestions; +} + +var premiumNotSupportedLang = 'Premium domains are not supported'; +if (adacLang.premium_not_supported != undefined) { + premiumNotSupportedLang = adacLang.premium_not_supported; +} + +var statusClass = {}; +statusClass[0] = 'label-default'; +statusClass[1] = 'label-success'; +statusClass[2] = 'label-warning'; +statusClass[3] = 'label-danger'; +statusClass[4] = 'label-default'; +statusClass[5] = 'label-default'; + +function ready(fn) { + if (document.readyState != 'loading') { + fn(); + } + else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', fn); + } + else { + document.attachEvent('onreadystatechange', function () { + if (document.readyState != 'loading') { + fn(); + } + }); + } +} + +function getCheckedBoxes(checkboxName) { + var checkboxes = document.getElementsByName(checkboxName); + var checkboxesChecked = []; + + for (var i = 0; i < checkboxes.length; i++) { + if (checkboxes[i].checked) { + checkboxesChecked.push(checkboxes[i]); + } + } + + return checkboxesChecked.length > 0 ? checkboxesChecked : null; +} + +var init = function () { + adac.ensureUUID(); + + var setupFallbackConnection = function () { + var xhr = new XMLHttpRequest(); + + xhr.onreadystatechange = function () { + if (xhr.readyState == XMLHttpRequest.DONE) { + if (xhr.responseText) { + if (adac.debug) { + console.log('non-empty xhr response!'); + } + var dataArray = JSON.parse(xhr.responseText); + + dataArray.forEach(function (data) { + adac['action_' + data.action](data.data); + }); + } + + if (xhr.status == 200) { + adac.pollServer(); + } + else { + setTimeout(function () { + adac.pollServer(); + }, adac.RECONNECT_TIME); + } + } + }; + + adac.inputElement.onpaste = function (event) { + setTimeout(function () { adac.processInput.call(adac.inputElement, event, adac.inputElement.value); }, 0); + }; + + adac.pollServer = function (xhr_type, command) { + xhr_type = xhr_type || 'GET'; + command = command || null; + + xhr.open(xhr_type, adac.XHR_URL + '?session_id=' + localStorage.getItem('sessionId'), true); + + if (xhr_type === 'POST') { + xhr.setRequestHeader("Content-Type", "application/json"); + } + + xhr.send(command); + }; + + adac.sendCommand = function (command) { + adac.pollServer('POST', JSON.stringify(command)); + }; + + adac.initInputListener(); + }; + + if (!window.WebSocket) { + if (adac.debug) { + console.log('No websocket support, using fallback'); + } + setupFallbackConnection(); + } else { + var setupWebsocketConnection = function () { + adac.sendCommand = function (command) { + if (adac.connection.readyState === 1) { + adac.connection.send(JSON.stringify(command)); + } + else { + setTimeout(function () { + adac.sendCommand(command); + }, 100); + } + }; + + adac.connection = new WebSocket(adac.WEBSOCKET_URL + '?session_id=' + localStorage.getItem('sessionId')); + + adac.connection.onopen = function () { + adac.initInputListener(); + }; + + adac.connection.onmessage = function (message) { + var data = JSON.parse(message.data); + adac['action_' + data.action](data.data); + }; + + adac.connection.onclose = function (event) { + if (adac.debug) { + console.log('ws connection closed!'); + } + if (event.code == 1006 && !event.wasClean) { + if (adac.debug) { + console.log('ws failed, using fallback'); + } + setupFallbackConnection(); + } else { + setTimeout(function () { + if (adac.debug) { + console.log('ws connection retrying...'); + } + setupWebsocketConnection(); + }, adac.RECONNECT_TIME); + } + }; + }; + + setupWebsocketConnection(); + } +}; + +var adac = { + WEBSOCKET_URL: 'wss://adac.api.yoursrs.com/ws', + XHR_URL: 'https://adac.api.yoursrs.com/ajax', + RECONNECT_TIME: 3000, + DEBOUNCE_TIME: 500, + + DOMAIN_STATUS_WAITING: 0, + DOMAIN_STATUS_AVAILABLE: 1, + DOMAIN_STATUS_TAKEN: 2, + DOMAIN_STATUS_INVALID: 3, + DOMAIN_STATUS_ERROR: 4, + DOMAIN_STATUS_UNKNOWN: 5, + + debounce: function (fn, delay) { + var timer = null; + return function () { + var context = this, args = arguments; + clearTimeout(timer); + timer = setTimeout(function () { + fn.apply(context, args); + }, delay); + }; + }, + + initialize: function (API_KEY, user_config) { + var config = { + PRIORITY_LIST_TOKEN: null, + inputElement: document.getElementById('adac-js-domain-input'), + resultsElement: document.getElementById('adac-js-domain-results'), + suggestionElement: document.getElementById('adac-js-suggestions'), + categoriesElement: document.getElementById('adac-js-categories'), + debug: false + }; + + if (ote != undefined && ote == 'on') { + adac.WEBSOCKET_URL = 'wss://adac.api.yoursrs-ote.com/ws'; + adac.XHR_URL = 'wss://adac.api.yoursrs-ote.com/ws'; + } + + for (var attr in user_config) { + config[attr] = user_config[attr]; + } + + adac.CUSTOMER_API_KEY = API_KEY; + adac.PRIORITY_LIST_TOKEN = config.PRIORITY_LIST_TOKEN; + adac.inputElement = config.inputElement; + adac.resultsElement = config.resultsElement; + adac.suggestionElement = config.suggestionElement; + adac.categoriesElement = config.categoriesElement; + adac.debug = config.debug; + + ready(function() { + init(); + adac.fetch_categories(); + + $(document).ready(function () { + if (adac.inputElement.value) { + adac.processInput.call(adac.inputElement, null, adac.inputElement.value); + } + }); + }); + }, + + fetch_categories: function () { + var command = {api_key: adac.CUSTOMER_API_KEY, action: 'categories', data: ''}; + adac.sendCommand(command); + }, + + initInputListener: function () { + adac.inputElement.onkeyup = adac.debounce(function (event) { + var ignoreKeys = [9, 16, 17, 18, 20, 37, 38, 39, 40, 91, 92, 93]; + if (ignoreKeys.indexOf(event.which) > -1) { + return false; + } + + adac.preInput(this.value); + adac.processInput.call(this, event, this.value); + }, adac.DEBOUNCE_TIME); + + if (adac.categoriesElement) { + adac.categoriesElement.onchange = function (event) { + adac.preInput(adac.inputElement.value); + adac.processInput.call(adac.inputElement, event, adac.inputElement.value); + } + } + }, + + preInput: function (value) { + }, + + processInput: function (event, value) { + if (adac.resultsElement) { + while (adac.resultsElement.firstChild) { + adac.resultsElement.removeChild(adac.resultsElement.firstChild); + } + } + + if (adac.suggestionElement) { + while (adac.suggestionElement.firstChild) { + adac.suggestionElement.removeChild(adac.suggestionElement.firstChild); + } + } + + if (value !== '') { + if (adac.debug) { + console.log('Input given: ' + value); + } + + var categories = adac.getSelectedCategories(); + + var command = { + api_key: adac.CUSTOMER_API_KEY, + action: 'input', + data: {priority_list_token: adac.PRIORITY_LIST_TOKEN, input: value, categories: categories} + }; + + adac.sendCommand(command); + + } + + return false; + }, + + action_domain_status: function (domainResult) { + if (adac.debug) { + console.log("action_domain_status() progress: ", domainResult); + } + + adac.addDomainResult(domainResult); + }, + + action_suggestion: function (domainResult) { + if (adac.debug) { + console.log("action_suggestion() progress: ", domainResult); + } + var target = adac.suggestionElement; + var h3 = $(target).find('h3'); + + if (!h3.length) { + target.style.backgroundColor = '#EDEEEF'; + + var h3 = $('

') + .css('padding', '30px 15px 15px 15px') + .text(suggestionLang) + .appendTo(target); + } + + + adac.addSuggestion(domainResult); + }, + + action_categories: function (categories) { + if (adac.debug) { + console.log("action_categories(): ", categories); + } + adac.addCategories(categories); + }, + + action_error: function (error) { + if (adac.debug) { + console.error("action_error(): ", error); + } + adac.showError(error); + }, + + addDomainResult: function (domainResult) { + var div = document.getElementById('domain-result-' + domainResult.domain_name); + + if (!div) { + div = document.createElement('div'); + + var domainName = document.createElement('div'); + domainName.id = 'domain-name-' + domainResult.domain_name; + div.appendChild(domainHtml(domainName, domainResult)); + + div.id = 'domain-result-' + domainResult.domain_name; + div.className = 'domain-option domain_status_' + domainResult.status; + adac.resultsElement.appendChild(div); + } + else { + div.className = 'domain-option domain_status_' + domainResult.status; + + // Premium label + if(domainResult.price != undefined){ + document.getElementById('domain-name-' + domainResult.domain_name).innerHTML += ' ' + premiumLang + ''; + } + } + + var status = document.getElementById('status-' + domainResult.domain_name); + if (!status) { + // Status + div.appendChild(statusHtml(document.createElement('div'), domainResult)); + } else { + status.innerHTML = '' + statusMapping[domainResult.status] + ''; + } + + + var price = document.getElementById('price-' + domainResult.domain_name); + + if (!price) { + var price = document.createElement('div'); + price.id = "price-" + domainResult.domain_name; + div.appendChild(price); + } else { + price = priceHtml(price, domainResult, status); + } + + var orderBtn = document.getElementById('order-' + domainResult.domain_name); + var suffixWithoutDot = domainResult.suffix.split('.').join(""); + + if (!orderBtn) { + var orderBtn = document.createElement('div'); + orderBtn.id = "order-" + domainResult.domain_name; + orderBtn.className = 'text-center col-xs-12 col-sm-4 col-md-3 col-lg-2'; + div.appendChild(orderBtn); + } else { + if(tldPrices['' + suffixWithoutDot + ''] && tldPrices['' + suffixWithoutDot + ''].domainregister != undefined) { + if(domainResult.status == 1) { + var registerBtnClass = 'adac-register-domain btn btn-success'; + if (domainResult.price != undefined) { + registerBtnClass += ' disabled'; + } + + if (cartDomains != undefined && cartDomains.indexOf(domainResult.domain_name) > -1) { + orderBtn.innerHTML = ' ' + checkoutLang + ''; + } else { + var years = 1; + if (tldPrices['' + suffixWithoutDot + ''].interval && tldPrices['' + suffixWithoutDot + ''].interval > 12) { + years = tldPrices['' + suffixWithoutDot + ''].interval / 12; + } + orderBtn.innerHTML = ' ' + registerLang + ''; + } + } else if(domainResult.status == 2) { + orderBtn.innerHTML = ' ' + transferLang + ''; + } + } + } + + }, + + addSuggestion: function (domainResult) { + if (! adac.suggestionElement) { + if (adac.debug) { + console.error('Suggestion container not found. Please check the `adac.suggestionElement` setting.'); + } + } else { + var suffixWithoutDot = domainResult.suffix.split('.').join(""); + + if(tldPrices['' + suffixWithoutDot + ''] != undefined) { + var div = document.createElement('div'); + div.className = 'suggestion suggestion_' + domainResult.status; + + domainName = document.createElement('div'); + div.appendChild(domainHtml(domainName, domainResult)); + + adac.suggestionElement.appendChild(div); + + // Status + div.appendChild(statusHtml(document.createElement('div'), domainResult)); + + // Price + var price = document.createElement('div'); + price.id = "price-" + domainResult.domain_name; + price = priceHtml(price, domainResult, status); + div.appendChild(price); + + if(domainResult.status == 1 && tldPrices['' + suffixWithoutDot + ''] && tldPrices['' + suffixWithoutDot + ''].domainregister != undefined) { + var orderBtn = document.createElement('div'); + orderBtn.id = "order-" + domainResult.domain_name; + + if (cartDomains != undefined && cartDomains.indexOf(domainResult.domain_name) > -1) { + orderBtn.innerHTML = ' ' + checkoutLang + ''; + } else { + orderBtn.innerHTML = ' ' + registerLang + ''; + } + orderBtn.className = 'text-center col-xs-12 col-sm-4 col-md-3 col-lg-2'; + div.appendChild(orderBtn); + } + } + } + }, + + addCategories: function (categories) { + if (! adac.categoriesElement) { + if (adac.debug) { + console.error('Categories container not found. Please check the `adac.categoriesElement` setting.'); + } + } else { + categories.forEach(function (category, _index, _array) { + var id = category[0], + name = category[1], + checkbox = document.createElement('input'); + + checkbox.type = 'checkbox'; + checkbox.name = 'adac-js-categories'; + checkbox.value = id; + checkbox.id = id; + + var label = document.createElement('label'); + label.htmlFor = id; + label.appendChild(document.createTextNode(name)); + + adac.categoriesElement.appendChild(checkbox); + adac.categoriesElement.appendChild(label); + }); + } + }, + + showError: function(error) { + var p = document.createElement('p'); + p.appendChild(document.createTextNode('Error: ' + error)); + adac.resultsElement.appendChild(p); + }, + + getSelectedCategories: function () { + var checkedBoxes = getCheckedBoxes('adac-js-categories'); + + if (checkedBoxes) { + return checkedBoxes.map(function (element) { + return parseInt(element.value); + }); + } + + return null; + }, + + ensureUUID: function() { + if (localStorage.getItem('sessionId') === null) { + localStorage.setItem('sessionId', 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;return v.toString(16);})); + } + } +}; + +function statusHtml(status, domainResult) +{ + status.id = "status-" + domainResult.domain_name; + status.className = 'col-sm-3 col-md-2 col-xs-12 hidden-sm hidden-xs'; + status.innerHTML = '' + statusMapping[domainResult.status] + ''; + + return status; +} + +function domainHtml(domainName, domainResult) +{ + var suffixWithoutDot = domainResult.suffix.split('.').join(""); + var domainWithoutExtension = domainResult.domain_name.split('.'); + + domainName.className = 'domain col-xs-12 col-sm-5 text-xs-center'; + domainName.innerHTML = '' + domainWithoutExtension[0] + '.' + domainResult.suffix + ''; + + if (tldPrices['' + suffixWithoutDot + ''] != undefined && + tldPrices['' + suffixWithoutDot + ''].group != undefined && + tldPrices['' + suffixWithoutDot + ''].group != 'none' && + tldPrices['' + suffixWithoutDot + ''].group != '' + ) { + var group = tldPrices['' + suffixWithoutDot + ''].group; + var labelClass = 'label-warning'; + if (group == 'new') { + labelClass = 'label-success'; + } else if (group == 'hot') { + labelClass = 'label-danger'; + } + + domainName.innerHTML += ' ' + tldPrices['' + suffixWithoutDot + ''].group_title + '!'; + } + + // Premium label + if (domainResult.price != undefined) { + domainName.innerHTML = '' + domainWithoutExtension[0] + '.' + domainResult.suffix + ' ' + premiumLang + ''; + } + + return domainName; +} + +function priceHtml(price, domainResult, status) +{ + if(domainResult.status == 1 || domainResult.status == 2) { + + var suffixWithoutDot = domainResult.suffix.split('.').join(""); + + if(domainResult.price != undefined) { + if (!premiumDomains) { + status.innerHTML = 'Taken'; + price.innerHTML = premiumNotSupportedLang; + } else { + // Do ajax call to get premium price + $.post(document.location.href, { + adacpremium: domainResult.domain_name, + adacpremiumprice: domainResult.price, + adacpremiumcurrency: domainResult.currency + }) + .done(function (data) { + var json = $.parseJSON(data); + + if (json.error != undefined) { + price.innerHTML = ''; + status.innerHTML = 'error'; + $('.adac-register-domain[domain="' + domainResult.domain_name + '"]').replaceWith( + json.error); + } else { + // Set register to enable + price.innerHTML = json.price + ' ' + json.currency['suffix']; + $('.adac-register-domain[domain="' + domainResult.domain_name + '"]').removeClass( + 'disabled'); + } + }, "json"); + price.innerHTML = ''; + } + } else if(tldPrices['' + suffixWithoutDot + ''] && tldPrices['' + suffixWithoutDot + ''].domainregister != undefined) { + price.innerHTML = tldPrices['' + suffixWithoutDot + ''].domainregister; + } else { + price.innerHTML = 'N/A'; + } + } + price.className = 'price col-xs-12 col-sm-3 col-md-2 col-lg-3 text-xs-center'; + + return price; +} + +function clickRegister(event, domain) +{ + var button = $('.adac-register-domain[domain="' + domain + '"]'); + + if (!button.hasClass('checkout')) { + event.preventDefault(); + button.html(""); + + $.post(window.location.pathname, {a: "addToCart", domain: domain, token: csrfToken, whois: 0}) + .done(function (data) { + button.attr("href", "cart.php?a=confdomains"); + button.html(' ' + checkoutLang); + button.addClass('checkout'); + }); + } +} diff --git a/modules/registrars/realtimeregister/src/Assets/Js/checkCredentials.js b/modules/registrars/realtimeregister/src/Assets/Js/checkCredentials.js index 66bb5a9..8e6f63d 100644 --- a/modules/registrars/realtimeregister/src/Assets/Js/checkCredentials.js +++ b/modules/registrars/realtimeregister/src/Assets/Js/checkCredentials.js @@ -11,7 +11,9 @@ $(document).ready( const ignoreSslField = config_container.find('[type="checkbox"][name="ignore_ssl"]'); config_container.on( - 'click', '.check-connection', function (e) { + 'click', + '.check-connection', + function (e) { e.preventDefault(); const btn = $(this); diff --git a/modules/registrars/realtimeregister/src/Assets/Js/rtr.js b/modules/registrars/realtimeregister/src/Assets/Js/rtr.js new file mode 100644 index 0000000..bdd81e6 --- /dev/null +++ b/modules/registrars/realtimeregister/src/Assets/Js/rtr.js @@ -0,0 +1,19 @@ +; +(function ($) { + let rtr = $.extend({ + controller: [], + params: null, + routes: {}, + error: null + }, rtr); + + $(document).ready(function () { + // Initialize router controller. + $.each(rtr.controller, function (i, controller) { + if ($.isFunction(rtr.routes[controller])) { + rtr.routes[controller](); + } + }); + + }); +})(jQuery); diff --git a/modules/registrars/realtimeregister/src/Assets/Js/rtrClient.js b/modules/registrars/realtimeregister/src/Assets/Js/rtrClient.js new file mode 100644 index 0000000..19fc411 --- /dev/null +++ b/modules/registrars/realtimeregister/src/Assets/Js/rtrClient.js @@ -0,0 +1,165 @@ +(function ($) { + // Controllers format: rtr.routes.. + + rtr.routes.noLockSupport = function () { + $('[name="reglock"]').hide(); + }; + rtr.routes.removeRenewButton = function () { + $('[href="cart.php?gid=renewals"]').hide(); + }; + + $(document).ready(function () { + // Remove language code selection when not needed + $('#frmConfigureDomains').find('> .row > div:contains("Select Language Code")').parent().each(function() { + let self = $(this); + let domain = self.prevAll('.sub-heading').first().find('span').text(); + if (domain.match(/^([0-9a-z\-]+\.)+([a-z\-]+|xn--[a-z0-9\-]+)$/) && !domain.startsWith('xn--')) { + self.remove(); + } + }); + + let key = $('input[name="totalIPS"]').val(); + + $(document).on('click', '.delete-ns', function (e) { + e.preventDefault(); + + let self = this, host = $(self).attr('data-ns'); + + if (confirm("Do you want to delete host: " + host)) { + $(self).closest('li').find('.spinner').addClass('active'); + $.post(document.location.href, { + hostAction: "delete", + hostName: host + }, function (response) { + $(self).closest('li').remove(); + }); + } + }); + + $( ".remove-key-data" ).click(function(e) { + e.preventDefault(); + $(this).closest('tr').remove(); + }); + + $( ".add-keydata" ).click(function(e) { + e.preventDefault(); + let total = $(this).closest('form').find('input[name="totalDNSsec"]').val(); + + $(this).closest('form').find('input[name="totalDNSsec"]').val(parseInt(total) + 1); + + // Flags + let flags = $('').attr({ + name: 'algorithm[' + total + ']', + class: 'form-control' + }), algorithmsOptions = [ + {key: '1', text: '1 (RSA/MD5)'}, + {key: '3', text: '3 (DSA/SHA1)'}, + {key: '5', text: '5 (RSA/SHA-1)'}, + {key: '6', text: '6 (DSA-NSEC3-SHA1)'}, + {key: '7', text: '7 (RSASHA1-NSEC3-SHA1)'}, + {key: '8', text: '8 (RSA/SHA-256)'}, + {key: '10', text: '10 (RSA/SHA-512)'}, + {key: '12', text: '12 (GOST R 34.10-2001)'}, + {key: '13', text: '13 (ECDSA Curve P-256 with SHA-256)'}, + {key: '14', text: '14 (ECDSA Curve P-384 with SHA-384)'}, + {key: '15', text: '15 (Ed25519)'}, + {key: '16', text: '16 (Ed448)'}, + ]; + + for (let i = 0; i < algorithmsOptions.length; i++) { + algorithms.append($('