diff --git a/lib/index.js b/lib/index.js index 9bebbc3..817e132 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,77 +1,121 @@ '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) { -<<<<<<< HEAD // 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; + 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; }); }); -======= - //console.info('List Zones', data); - throw Error('listing zones not implemented'); ->>>>>>> parent of 16db087... integration tests passed }, set: function(data) { // 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); -<<<<<<< HEAD - - 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(txtRecord) return { dnsAuthorization: record.content }; - else return null; - - }); + 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]; - 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'); - } - }); -======= - throw Error('listing TXTs not implemented'); ->>>>>>> parent of 16db087... integration tests passed + 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/test.js b/test.js index a459da9..b0accf2 100755 --- a/test.js +++ b/test.js @@ -5,11 +5,11 @@ var tester = require('acme-challenge-test'); require('dotenv').config(); -// Usage: node ./test.js example.com username xxxxxxxxx +// Usage: node ./test.js example.com token account var zone = process.argv[2] || process.env.ZONE; var challenger = require('./index.js').create({ - username: process.argv[3] || process.env.USERNAME, - password: process.argv[4] || process.env.PASSWORD + token: process.argv[3] || process.env.TOKEN, + account: process.argv[4] || process.env.ACCOUNT }); // The dry-run tests can pass on, literally, 'example.com'