'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; };