mirror of
https://git.coolaj86.com/coolaj86/acme-dns-01-namedotcom.js.git
synced 2025-04-20 06:10:49 +00:00
143 lines
3.7 KiB
JavaScript
143 lines
3.7 KiB
JavaScript
"use strict";
|
|
|
|
var request;
|
|
var defaults = {
|
|
baseUrl: "https://api.name.com/v4/",
|
|
wait: 15 * 1000
|
|
};
|
|
|
|
module.exports.create = function(config) {
|
|
var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, "");
|
|
var token = config.token;
|
|
var username = config.username;
|
|
var wait = config.wait || defaults.wait;
|
|
|
|
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);
|
|
}
|
|
// The api returns success long before the record is actually set.
|
|
// Therefore we wait a bit to make sure the server propagate the response.
|
|
return new Promise(function(resolve) {
|
|
setTimeout(resolve, wait, 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;
|
|
};
|