From 99e45067b59a816146f173b4622683de034f95ac Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 15 May 2022 21:22:10 +0530 Subject: [PATCH 1/2] fix(script): adds explicit A record for URL redirection. Fixes #2365 --- .env | 1 + scripts/register-domains.js | 42 +++++++++++++++++++++++-------------- utils/constants.js | 4 +++- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/.env b/.env index 26270e769c..8022d3f4e4 100644 --- a/.env +++ b/.env @@ -3,3 +3,4 @@ DOMAIN_API_KEY=apikey DOMAIN_API_HOST=api-example.com DOMAIN_API_PORT=2087 DOMAIN_DOMAIN=example.com +DOMAIN_HOST_IP=69.69.69.69 diff --git a/scripts/register-domains.js b/scripts/register-domains.js index c7f5b56a42..f9e81796fa 100644 --- a/scripts/register-domains.js +++ b/scripts/register-domains.js @@ -1,29 +1,39 @@ const R = require('ramda'); -const { VALID_RECORD_TYPES, TTL, ENV } = require('../utils/constants'); +const { VALID_RECORD_TYPES, DOMAIN_HOST_IP, TTL, ENV } = require('../utils/constants'); const { domainService: dc } = require('../utils/domain-service'); const { getDomains: gd } = require('../utils/get-domain'); -// Allow TXT records while publishing (for pcl validation) const getRecords = R.compose(R.toPairs, R.pick(VALID_RECORD_TYPES)); -const address = (type, url) => { - if ('URL' === type) return `${url}`.replace(/\/$/g, ''); - if ('TXT' === type) return url; - return (type === 'CNAME' ? `${url}`.toLowerCase() : `${url}`).replace(/[/.]$/g, ''); +const address = (type, value) => { + if ('URL' === type) return `${value}`.replace(/\/$/g, ''); + if ('TXT' === type) return value; + return (type === 'CNAME' ? `${value}`.toLowerCase() : `${value}`).replace(/[/.]$/g, ''); }; const toHostList = R.chain(data => { - const rs = getRecords(data.record); + // URL redirection must contain explicit A record + // Wildcard A record breaks when used with MX + // Ref: https://github.com/is-a-dev/register/issues/2365 + if (data.record.URL) { + data.record.A = [ DOMAIN_HOST_IP ] + } - return R.chain(([recordType, urls]) => - (Array.isArray(urls) ? urls : [urls]).map((url, index) => ({ - name: data.name, - type: recordType, - address: address(recordType, url), - ttl: TTL, - ...(recordType === 'MX' ? { priority: index + 20 } : {}) - })) - , rs); + return R.pipe( + data.record, + getRecords, + R.chain(([recordType, values]) => { + const valueList = Array.isArray(values) ? values : [values]; + + return valueList.map((value, index) => ({ + name: data.name, + type: recordType, + address: address(recordType, value), + ttl: TTL, + ...(recordType === 'MX' ? { priority: index + 20 } : {}) + })) + }), + ); }); const registerDomains = async ({ domainService, getDomains, log = () => { } }) => { diff --git a/utils/constants.js b/utils/constants.js index 8977f80132..022bd6646a 100644 --- a/utils/constants.js +++ b/utils/constants.js @@ -12,11 +12,12 @@ const { DOMAIN_DOMAIN, DOMAIN_API_HOST, DOMAIN_API_PORT, + DOMAIN_HOST_IP, } = process.env; const IS_TEST = ENV === 'test'; -const DOMAINS_PATH = require('path').resolve('domains'); +const DOMAINS_PATH = path.resolve('domains'); module.exports = { ENV, @@ -27,6 +28,7 @@ module.exports = { DOMAIN_API_KEY: IS_TEST ? 'testkey' : DOMAIN_API_KEY, DOMAIN_API_HOST: IS_TEST ? 'example.com' : DOMAIN_API_HOST, DOMAIN_API_PORT: IS_TEST ? 6969 : DOMAIN_API_PORT, + DOMAIN_HOST_IP, DOMAINS_PATH, TTL: 5 * 60 * 60, }; From e153b5f75e72eea6117a1e6f4b6a965243f0cd5a Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 15 May 2022 21:42:29 +0530 Subject: [PATCH 2/2] fix(script): narrows case to just URL+MX to reduce the number of new dns records --- scripts/register-domains.js | 28 +++++++++++++--------------- utils/domain-service.js | 4 ++-- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/scripts/register-domains.js b/scripts/register-domains.js index f9e81796fa..370949af63 100644 --- a/scripts/register-domains.js +++ b/scripts/register-domains.js @@ -15,25 +15,23 @@ const toHostList = R.chain(data => { // URL redirection must contain explicit A record // Wildcard A record breaks when used with MX // Ref: https://github.com/is-a-dev/register/issues/2365 - if (data.record.URL) { + if (data.record.URL && data.record.MX) { data.record.A = [ DOMAIN_HOST_IP ] } - return R.pipe( - data.record, - getRecords, - R.chain(([recordType, values]) => { - const valueList = Array.isArray(values) ? values : [values]; + const records = getRecords(data.record); - return valueList.map((value, index) => ({ - name: data.name, - type: recordType, - address: address(recordType, value), - ttl: TTL, - ...(recordType === 'MX' ? { priority: index + 20 } : {}) - })) - }), - ); + return R.chain(([recordType, values]) => { + const valueList = Array.isArray(values) ? values : [values]; + + return valueList.map((value, index) => ({ + name: data.name, + type: recordType, + address: address(recordType, value), + ttl: TTL, + ...(recordType === 'MX' ? { priority: index + 20 } : {}) + })) + }, records) }); const registerDomains = async ({ domainService, getDomains, log = () => { } }) => { diff --git a/utils/domain-service.js b/utils/domain-service.js index 3732712de2..7829e74315 100644 --- a/utils/domain-service.js +++ b/utils/domain-service.js @@ -95,7 +95,7 @@ const getDomainService = ({ cpanel }) => { cpanel.zone.add ), recordToZone, - print(({ name }) => `Adding zone for ${name}...`), + print(r => `Adding zone for ${r.name}: (${r.type} ${r.address})...`), )); const removeZoneRecord = lazyTask(R.compose( R.ifElse(R.propEq('type', 'MX'), @@ -103,7 +103,7 @@ const getDomainService = ({ cpanel }) => { R.compose(cpanel.zone.remove, R.pick(['line'])) ), recordToZone, - print(({ name }) => `Deleting zone for ${name}...`), + print(r => `Deleting zone for ${r.name}: (${r.type} ${r.address})...`), )); const addRedirection = lazyTask(R.compose( cpanel.redirection.add,