From 3e4eaeab350cf94108c786bc8b893f6d2c01cfd5 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Fri, 8 Feb 2019 20:21:16 -0800 Subject: [PATCH] namecheap: do not use global object if we have multiple namecheap, it doesn't work. --- src/dns/namecheap.js | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/dns/namecheap.js b/src/dns/namecheap.js index c44a2f504..2e3771179 100644 --- a/src/dns/namecheap.js +++ b/src/dns/namecheap.js @@ -18,8 +18,6 @@ var assert = require('assert'), util = require('util'), waitForDns = require('./waitfordns.js'); -var namecheap; - function formatError(response) { return util.format('NameCheap DNS error [%s] %j', response.code, response.message); } @@ -43,20 +41,18 @@ function mapHosts(hosts) { }); } -function init(dnsConfig, callback) { +function getApi(dnsConfig, callback) { assert.strictEqual(typeof dnsConfig, 'object'); assert.strictEqual(typeof callback, 'function'); - if (namecheap) return callback(); - sysinfo.getPublicIp(function (error, ip) { if (error) return callback(new DomainsError(DomainsError.INTERNAL_ERROR, error)); // Note that for all NameCheap calls to go through properly, the public IP returned by the getPublicIp method below must be whitelisted on NameCheap's API dashboard - namecheap = new Namecheap(dnsConfig.username, dnsConfig.apiKey, ip); + let namecheap = new Namecheap(dnsConfig.username, dnsConfig.apiKey, ip); namecheap.setUsername(dnsConfig.username); - callback(); + callback(null, namecheap); }); } @@ -67,7 +63,7 @@ function getInternal(dnsConfig, zoneName, subdomain, type, callback) { assert.strictEqual(typeof type, 'string'); assert.strictEqual(typeof callback, 'function'); - init(dnsConfig, function (error) { + getApi(dnsConfig, function (error, namecheap) { if (error) return callback(error); namecheap.domains.dns.getHosts(zoneName, function (error, result) { @@ -80,12 +76,22 @@ function getInternal(dnsConfig, zoneName, subdomain, type, callback) { }); } -function setInternal(zoneName, hosts, callback) { - let mappedHosts = mapHosts(hosts); - namecheap.domains.dns.setHosts(zoneName, mappedHosts, function (error, result) { - if (error) return callback(new DomainsError(DomainsError.EXTERNAL_ERROR, formatError(error))); +function setInternal(dnsConfig, zoneName, hosts, callback) { + assert.strictEqual(typeof dnsConfig, 'object'); + assert.strictEqual(typeof zoneName, 'string'); + assert(Array.isArray(hosts)); + assert.strictEqual(typeof callback, 'function'); - return callback(null, result); + let mappedHosts = mapHosts(hosts); + + getApi(dnsConfig, function (error, namecheap) { + if (error) return callback(error); + + namecheap.domains.dns.setHosts(zoneName, mappedHosts, function (error, result) { + if (error) return callback(new DomainsError(DomainsError.EXTERNAL_ERROR, formatError(error))); + + return callback(null, result); + }); }); } @@ -149,7 +155,7 @@ function upsert(domainObject, subdomain, type, values, callback) { let toUpsert = result.concat(toInsert); - setInternal(zoneName, toUpsert, callback); + setInternal(dnsConfig, zoneName, toUpsert, callback); }); } @@ -215,7 +221,7 @@ function del(domainObject, subdomain, type, values, callback) { } // Only set hosts if we actually removed a host - if (removed) return setInternal(zoneName, result, callback); + if (removed) return setInternal(dnsConfig, zoneName, result, callback); callback(); });