acme-dns-01-namedotcom.js/lib/index.js

138 lines
3.0 KiB
JavaScript

'use strict';
var request;
var defaults = {
baseUrl: 'https://api.name.com/v4/'
};
module.exports.create = function(config) {
var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, '');
var token = config.token;
var username = config.username;
var plugin = {
init: function(opts) {
request = opts.request;
return null;
},
// We must list all zones (domains) in the account
zones: function(data) {
return api({
url: baseUrl + '/domains'
}).then(function(resp) {
return resp.body.domains.map(function(d) {
//#console.log("Domain Name:", d.domainName);
return d.domainName;
});
});
},
// We must set each record as required
set: function(data) {
// console.log('Add TXT', data);
var ch = data.challenge;
if (!ch.dnsZone) {
throw new Error(
'[Name.com Plugin] Unknown domain: ',
data.domain || data.dnsHost
);
}
return api({
method: 'POST',
url: baseUrl + '/domains/' + ch.dnsZone + '/records',
json: {
host: ch.dnsPrefix,
type: 'TXT',
answer: ch.dnsAuthorization,
ttl: 300 // minimum allowed value
}
}).then(function(resp) {
if (!resp.body.id) {
throw Error('[Name.com API] [set] ' + resp.body);
}
return null;
});
},
// We must be able to confirm that the appropriate records were set
get: function(data) {
// console.log('List TXT', data);
var ch = data.challenge;
if (!ch.dnsZone) {
throw new Error(
'[Name.com Plugin] Unknown domain: ',
data.domain || data.dnsHost
);
}
return api({
url: baseUrl + '/domains/' + ch.dnsZone + '/records'
}).then(function(resp) {
var value = resp.body.records.filter(function(r) {
return (
r.host === ch.dnsPrefix &&
'TXT' === r.type &&
ch.dnsAuthorization === r.answer
);
})[0];
if (!value) {
return null;
}
// adding id to make re-usable for remove
return { id: value.id, dnsAuthorization: value.answer };
});
},
// We must delete junk records once we're done
remove: function(data) {
// console.log('Remove TXT', data);
var ch = data.challenge;
return plugin.get(data).then(function(r) {
if (!r.id) {
throw new Error(
'[Name.com Plugin] [del] Did not find TXT record for ' +
ch.dnsHost
);
}
return api({
method: 'DELETE',
url: baseUrl + '/domains/' + ch.dnsZone + '/records/' + r.id
}).then(function(resp) {
return null;
});
});
}
};
// Authentication and Error handling here
function api(opts) {
opts.auth = {
user: username,
pass: token,
sendImmediately: true
};
if (!opts.json) {
opts.json = true;
}
return request(opts).then(function(resp) {
if (!resp.body.message) {
return resp;
}
console.error(opts.method + ' ' + opts.url);
console.error(resp.headers);
console.error(resp.body);
throw new Error(
'[Name.com API] ' +
(opts.method || 'GET') +
' ' +
opts.url +
' : ' +
resp.body.message
);
});
}
return plugin;
};