diff --git a/AUTHORS b/AUTHORS index f2496e6..6966d87 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1 +1,2 @@ AJ ONeal (https://coolaj86.com/) +Hitesh Walia \ No newline at end of file diff --git a/README.md b/README.md index 4dbd414..cac0a4e 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ node ./test.js example.com johndoe xxxxxx # Authors - AJ ONeal +- Hitesh Walia See AUTHORS for contact info. diff --git a/lib/index.js b/lib/index.js index 3f0917c..2afbb44 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,17 +1,57 @@ 'use strict'; var request; -var defaults = {}; +var defaults = { + baseUrl: 'https://api.dnsimple.com/v2/' +}; module.exports.create = function(config) { + var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, ''); + var token = config.token; + var account = config.account; + + function api(method, path, form) { + var req = { + method: method, + url: baseUrl + path, + headers: { + Authorization: 'Bearer ' + token, + 'Content-Type': 'application/json' + }, + json: true, + form: form + }; + return request(req).then(function(resp) { + if (2 !== Math.floor(resp.statusCode / 100)) { + console.error(resp.statusCode, req.url); + console.error(); + console.error('Request:'); + console.error(req); + console.error(); + console.error('Response:'); + console.error(resp.body); + console.error(); + throw new Error( + 'Error response. Check token, baseUrl, domains, etc.' + ); + } + return resp; + }); + } + return { init: function(opts) { request = opts.request; return null; }, zones: function(data) { - //console.info('List Zones', data); - throw Error('listing zones not implemented'); + // console.info('List Zones', data); + return api('GET', '/' + account + '/zones').then(function(resp) { + return resp['body']['data'].map(function(elem) { + //console.log('DEBUG >>> elem.name: ' + elem.name); + return elem.name; + }); + }); }, set: function(data) { var ch = data.challenge; @@ -19,15 +59,67 @@ module.exports.create = function(config) { throw new Error('No matching zone for ' + ch.dnsHost); } // console.info('Add TXT', data); - throw Error('setting TXT not implemented'); - }, - remove: function(data) { - // console.info('Remove TXT', data); - throw Error('removing TXT not implemented'); + var ch = data.challenge; + var txt = ch.dnsAuthorization; + + return api( + 'POST', + '/' + account + '/zones/' + ch.dnsZone + '/records', + { + name: '', + type: 'TXT', + content: txt + } + ).then(function(resp) { + if (resp.statusCode === 201) { + return true; + } + throw new Error( + 'record did not set. check subdomain, api key, etc' + ); + }); }, get: function(data) { // console.info('List TXT', data); - throw Error('listing TXTs not implemented'); + + return api( + 'GET', + '/' + account + '/zones/' + data.challenge.dnsZone + '/records' + ).then(function(resp) { + var record = resp.body.data.filter(function(record) { + return data.challenge.dnsAuthorization === record.content; + })[0]; + + if (record) return { dnsAuthorization: record.content }; + else return null; + }); + }, + remove: function(data) { + return api( + 'GET', + '/' + account + '/zones/' + data.challenge.dnsZone + '/records' + ).then(function(resp) { + var record = resp.body.data.filter(function(record) { + return data.challenge.dnsAuthorization === record.content; + })[0]; + + if (record) { + return api( + 'DELETE', + '/' + + account + + '/zones/' + + data.challenge.dnsZone + + '/records/' + + record.id + ).then(function(resp) { + // console.info('DEBUG >>> resp: ', JSON.stringify(resp, null, 2)); + return true; + }); + } else { + throw new Error('Txt Record not found for removal'); + } + }); } }; }; diff --git a/package.json b/package.json index 4b3e067..b55ba41 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "acme", "greenlock" ], - "author": "AJ ONeal (https://coolaj86.com/)", + "author": "AJ ONeal (https://coolaj86.com/), Hitesh Walia