diff --git a/src/dns/cloudflare.js b/src/dns/cloudflare.js index b1b95bc87..d5225fe41 100644 --- a/src/dns/cloudflare.js +++ b/src/dns/cloudflare.js @@ -77,9 +77,16 @@ async function getZoneByName(domainConfig, zoneName) { const [error, response] = await safe(createRequest('GET', `${CLOUDFLARE_ENDPOINT}/zones?name=${zoneName}&status=active`, domainConfig)); if (error) throw new BoxError(BoxError.NETWORK_ERROR, error.message); if (response.statusCode !== 200 || response.body.success !== true) throw translateRequestError(response); - if (!response.body.result.length) throw new BoxError(BoxError.NOT_FOUND, util.format('%s %j', response.statusCode, response.body)); + if (!response.body.result || !response.body.result.length) throw new BoxError(BoxError.NOT_FOUND, `${response.statusCode} ${JSON.stringify(response.body)}`); - return response.body.result[0]; + // check 'id' and 'name_servers' exist in the response + const zone = response.body.result[0]; + const zoneId = safe.query(zone, 'id'); + if (typeof zoneId !== 'string') throw new BoxError(BoxError.EXTERNAL_ERROR, `No zone id in response: ${response.statusCode} ${JSON.stringify(response.body)}`); + const name_servers = safe.query(zone, 'name_servers'); + if (!Array.isArray(name_servers)) throw new BoxError(BoxError.EXTERNAL_ERROR, `name_servers is not an array: ${response.statusCode} ${JSON.stringify(response.body)}`); + + return zone; } // gets records filtered by zone, type and fqdn @@ -110,8 +117,8 @@ async function upsert(domainObject, location, type, values) { debug('upsert: %s for zone %s of type %s with values %j', fqdn, zoneName, type, values); - const result = await getZoneByName(domainConfig, zoneName); - const zoneId = result.id; + const zone = await getZoneByName(domainConfig, zoneName); + const zoneId = zone.id; const records = await getDnsRecords(domainConfig, zoneId, fqdn, type); @@ -223,8 +230,8 @@ async function wait(domainObject, subdomain, type, value, options) { debug('wait: %s for zone %s of type %s', fqdn, zoneName, type); - const result = await getZoneByName(domainConfig, zoneName); - const zoneId = result.id; + const zone = await getZoneByName(domainConfig, zoneName); + const zoneId = zone.id; const dnsRecords = await getDnsRecords(domainConfig, zoneId, fqdn, type); if (dnsRecords.length === 0) throw new BoxError(BoxError.NOT_FOUND, 'Domain not found');