diff --git a/src/dns/cloudflare.js b/src/dns/cloudflare.js index 4f62af907..225c775b6 100644 --- a/src/dns/cloudflare.js +++ b/src/dns/cloudflare.js @@ -233,12 +233,10 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { if (!dnsConfig.token || typeof dnsConfig.token !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'token must be a non-empty string')); if (!dnsConfig.email || typeof dnsConfig.email !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'email must be a non-empty string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { token: dnsConfig.token, - email: dnsConfig.email, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + email: dnsConfig.email }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/digitalocean.js b/src/dns/digitalocean.js index 0a6f969c9..0949a5d50 100644 --- a/src/dns/digitalocean.js +++ b/src/dns/digitalocean.js @@ -201,11 +201,9 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { assert.strictEqual(typeof callback, 'function'); if (!dnsConfig.token || typeof dnsConfig.token !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'token must be a non-empty string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { - token: dnsConfig.token, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + token: dnsConfig.token }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/gandi.js b/src/dns/gandi.js index d6710cc22..420f2ee65 100644 --- a/src/dns/gandi.js +++ b/src/dns/gandi.js @@ -113,11 +113,9 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { assert.strictEqual(typeof callback, 'function'); if (!dnsConfig.token || typeof dnsConfig.token !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'token must be a non-empty string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { - token: dnsConfig.token, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + token: dnsConfig.token }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/gcdns.js b/src/dns/gcdns.js index ee425d2a9..28b039396 100644 --- a/src/dns/gcdns.js +++ b/src/dns/gcdns.js @@ -24,8 +24,7 @@ function getDnsCredentials(dnsConfig) { credentials: { client_email: dnsConfig.credentials.client_email, private_key: dnsConfig.credentials.private_key - }, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + } }; } @@ -168,7 +167,6 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { if (!dnsConfig.credentials || typeof dnsConfig.credentials !== 'object') return callback(new DomainsError(DomainsError.BAD_FIELD, 'credentials must be an object')); if (typeof dnsConfig.credentials.client_email !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'credentials.client_email must be a string')); if (typeof dnsConfig.credentials.private_key !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'credentials.private_key must be a string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = getDnsCredentials(dnsConfig); if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/godaddy.js b/src/dns/godaddy.js index 53be07487..16e0a5866 100644 --- a/src/dns/godaddy.js +++ b/src/dns/godaddy.js @@ -148,12 +148,10 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { if (!dnsConfig.apiKey || typeof dnsConfig.apiKey !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'apiKey must be a non-empty string')); if (!dnsConfig.apiSecret || typeof dnsConfig.apiSecret !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'apiSecret must be a non-empty string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { apiKey: dnsConfig.apiKey, - apiSecret: dnsConfig.apiSecret, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + apiSecret: dnsConfig.apiSecret }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/manual.js b/src/dns/manual.js index fe0d03d29..332724fac 100644 --- a/src/dns/manual.js +++ b/src/dns/manual.js @@ -55,17 +55,11 @@ function verifyDnsConfig(dnsConfig, domain, zoneName, ip, callback) { assert.strictEqual(typeof ip, 'string'); assert.strictEqual(typeof callback, 'function'); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); - - var config = { - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains - }; - // Very basic check if the nameservers can be fetched dns.resolve(zoneName, 'NS', { timeout: 5000 }, function (error, nameservers) { if (error && error.code === 'ENOTFOUND') return callback(new DomainsError(DomainsError.BAD_FIELD, 'Unable to resolve nameservers for this domain')); if (error || !nameservers) return callback(new DomainsError(DomainsError.BAD_FIELD, error ? error.message : 'Unable to get nameservers')); - callback(null, config); + callback(null, {}); }); } diff --git a/src/dns/namecom.js b/src/dns/namecom.js index 7ae8c17bb..a4140a631 100644 --- a/src/dns/namecom.js +++ b/src/dns/namecom.js @@ -210,12 +210,10 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { if (typeof dnsConfig.username !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'username must be a string')); if (typeof dnsConfig.token !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'token must be a string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { username: dnsConfig.username, - token: dnsConfig.token, - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains + token: dnsConfig.token }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/route53.js b/src/dns/route53.js index 502fa16a3..6b1f29df1 100644 --- a/src/dns/route53.js +++ b/src/dns/route53.js @@ -235,7 +235,6 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { if (!dnsConfig.accessKeyId || typeof dnsConfig.accessKeyId !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'accessKeyId must be a non-empty string')); if (!dnsConfig.secretAccessKey || typeof dnsConfig.secretAccessKey !== 'string') return callback(new DomainsError(DomainsError.BAD_FIELD, 'secretAccessKey must be a non-empty string')); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); var credentials = { accessKeyId: dnsConfig.accessKeyId, @@ -243,7 +242,6 @@ function verifyDnsConfig(dnsConfig, fqdn, zoneName, ip, callback) { region: dnsConfig.region || 'us-east-1', endpoint: dnsConfig.endpoint || null, listHostedZonesByName: true, // new/updated creds require this perm - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains }; if (process.env.BOX_ENV === 'test') return callback(null, credentials); // this shouldn't be here diff --git a/src/dns/wildcard.js b/src/dns/wildcard.js index b20b01765..0bc1f74e8 100644 --- a/src/dns/wildcard.js +++ b/src/dns/wildcard.js @@ -56,18 +56,12 @@ function verifyDnsConfig(dnsConfig, domain, zoneName, ip, callback) { assert.strictEqual(typeof ip, 'string'); assert.strictEqual(typeof callback, 'function'); - if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); - - var config = { - hyphenatedSubdomains: !!dnsConfig.hyphenatedSubdomains - }; - // Very basic check if the nameservers can be fetched dns.resolve(zoneName, 'NS', { timeout: 5000 }, function (error, nameservers) { if (error && error.code === 'ENOTFOUND') return callback(new DomainsError(DomainsError.BAD_FIELD, 'Unable to resolve nameservers for this domain')); if (error || !nameservers) return callback(new DomainsError(DomainsError.BAD_FIELD, error ? error.message : 'Unable to get nameservers')); - const separator = config.hyphenatedSubdomains ? '-' : '.'; + const separator = dnsConfig.hyphenatedSubdomains ? '-' : '.'; const fqdn = `cloudrontest${separator}${domain}`; dns.resolve(fqdn, 'A', { server: '127.0.0.1', timeout: 5000 }, function (error, result) { if (error && error.code === 'ENOTFOUND') return callback(new DomainsError(DomainsError.BAD_FIELD, `Unable to resolve ${fqdn}`)); @@ -78,7 +72,7 @@ function verifyDnsConfig(dnsConfig, domain, zoneName, ip, callback) { if (result.length !== 1 || ip !== result[0]) return callback(new DomainsError(DomainsError.EXTERNAL_ERROR, `Domain resolves to ${JSON.stringify(result)} instead of ${ip}`)); - callback(null, config); + callback(null, {}); }); }); }); diff --git a/src/domains.js b/src/domains.js index e3f801d38..330cbeef3 100644 --- a/src/domains.js +++ b/src/domains.js @@ -95,8 +95,8 @@ function api(provider) { } } -function verifyDnsConfig(config, domain, zoneName, provider, ip, callback) { - assert(config && typeof config === 'object'); // the dns config to test with +function verifyDnsConfig(dnsConfig, domain, zoneName, provider, ip, callback) { + assert(dnsConfig && typeof dnsConfig === 'object'); // the dns config to test with assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof zoneName, 'string'); assert.strictEqual(typeof provider, 'string'); @@ -104,9 +104,22 @@ function verifyDnsConfig(config, domain, zoneName, provider, ip, callback) { assert.strictEqual(typeof callback, 'function'); var backend = api(provider); - if (!backend) return callback(new DomainsError(DomainsError.INVALID_PROVIDER)); + if (!backend) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Invalid provider')); - api(provider).verifyDnsConfig(config, domain, zoneName, ip, callback); + if ('hyphenatedSubdomains' in dnsConfig && typeof dnsConfig.hyphenatedSubdomains !== 'boolean') return callback(new DomainsError(DomainsError.BAD_FIELD, 'hyphenatedSubdomains must be a boolean')); + + api(provider).verifyDnsConfig(dnsConfig, domain, zoneName, ip, function (error, result) { + if (error && error.reason === DomainsError.ACCESS_DENIED) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Incorrect configuration. Access denied')); + if (error && error.reason === DomainsError.NOT_FOUND) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Zone not found')); + if (error && error.reason === DomainsError.EXTERNAL_ERROR) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Configuration error: ' + error.message)); + if (error && error.reason === DomainsError.BAD_FIELD) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); + if (error && error.reason === DomainsError.INVALID_PROVIDER) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); + if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, error)); + + result.hyphenatedSubdomains = !!dnsConfig.hyphenatedSubdomains; + + callback(null, result); + }); } function fqdn(location, domainObject) { @@ -186,12 +199,7 @@ function add(domain, zoneName, provider, dnsConfig, fallbackCertificate, tlsConf if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, 'Error getting IP:' + error.message)); verifyDnsConfig(dnsConfig, domain, zoneName, provider, ip, function (error, result) { - if (error && error.reason === DomainsError.ACCESS_DENIED) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Incorrect configuration. Access denied')); - if (error && error.reason === DomainsError.NOT_FOUND) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Zone not found')); - if (error && error.reason === DomainsError.EXTERNAL_ERROR) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Configuration error: ' + error.message)); - if (error && error.reason === DomainsError.BAD_FIELD) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); - if (error && error.reason === DomainsError.INVALID_PROVIDER) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); - if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, error)); + if (error) return callback(error); domaindb.add(domain, { zoneName: zoneName, provider: provider, config: result, tlsConfig: tlsConfig }, function (error) { if (error && error.reason === DatabaseError.ALREADY_EXISTS) return callback(new DomainsError(DomainsError.ALREADY_EXISTS)); @@ -283,12 +291,7 @@ function update(domain, zoneName, provider, dnsConfig, fallbackCertificate, tlsC if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, 'Error getting IP:' + error.message)); verifyDnsConfig(dnsConfig, domain, zoneName, provider, ip, function (error, result) { - if (error && error.reason === DomainsError.ACCESS_DENIED) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Error adding A record. Access denied')); - if (error && error.reason === DomainsError.NOT_FOUND) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Zone not found')); - if (error && error.reason === DomainsError.EXTERNAL_ERROR) return callback(new DomainsError(DomainsError.BAD_FIELD, 'Error adding A record:' + error.message)); - if (error && error.reason === DomainsError.BAD_FIELD) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); - if (error && error.reason === DomainsError.INVALID_PROVIDER) return callback(new DomainsError(DomainsError.BAD_FIELD, error.message)); - if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, error)); + if (error) return callback(error); domaindb.update(domain, { zoneName: zoneName, provider: provider, config: result, tlsConfig: tlsConfig }, function (error) { if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new DomainsError(DomainsError.NOT_FOUND));