AJ ONeal
5 years ago
6 changed files with 160 additions and 25 deletions
@ -1,2 +1,4 @@ |
|||
ZONE=example.co.uk |
|||
TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
|||
# Used for HTTP Basic Auth |
|||
USERNAME=johndoe |
|||
TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
|||
|
@ -1,29 +1,137 @@ |
|||
'use strict'; |
|||
|
|||
var request; |
|||
var defaults = {}; |
|||
var defaults = { |
|||
baseUrl: 'https://api.name.com/v4/' |
|||
}; |
|||
|
|||
module.exports.create = function(config) { |
|||
return { |
|||
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) { |
|||
//console.info('List Zones', data);
|
|||
throw Error('listing zones not implemented'); |
|||
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.info('Add TXT', data);
|
|||
throw Error('setting TXT not implemented'); |
|||
}, |
|||
remove: function(data) { |
|||
// console.info('Remove TXT', data);
|
|||
throw Error('removing TXT not implemented'); |
|||
// 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.info('List TXT', data);
|
|||
throw Error('listing TXTs not implemented'); |
|||
// 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; |
|||
}; |
|||
|
@ -0,0 +1,9 @@ |
|||
#!/bin/bash |
|||
set -e |
|||
|
|||
# Before assuming there's something wrong with this plugin, |
|||
# you should test that you can use your token with curl first. |
|||
|
|||
echo "USERNAME: '$USERNAME'" |
|||
echo "TOKEN: '$TOKEN'" |
|||
curl -f -u "$USERNAME:$TOKEN" https://api.name.com/v4/domains |
Loading…
Reference in new issue