mirror of https://github.com/certd/certd
120 lines
3.7 KiB
JavaScript
120 lines
3.7 KiB
JavaScript
/**
|
|
* Pebble Challenge Test Server integration
|
|
*/
|
|
|
|
const { assert } = require('chai');
|
|
const axios = require('./../src/axios');
|
|
|
|
const apiBaseUrl = process.env.ACME_CHALLTESTSRV_URL || null;
|
|
const httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;
|
|
|
|
/**
|
|
* Send request
|
|
*/
|
|
|
|
async function request(apiPath, data = {}) {
|
|
if (!apiBaseUrl) {
|
|
throw new Error('No Pebble Challenge Test Server URL found');
|
|
}
|
|
|
|
await axios.request({
|
|
url: `${apiBaseUrl}/${apiPath}`,
|
|
method: 'post',
|
|
data,
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* State
|
|
*/
|
|
|
|
exports.isEnabled = () => !!apiBaseUrl;
|
|
|
|
/**
|
|
* DNS
|
|
*/
|
|
|
|
exports.addDnsARecord = async (host, addresses) => request('add-a', { host, addresses });
|
|
exports.setDnsCnameRecord = async (host, target) => request('set-cname', { host, target });
|
|
|
|
/**
|
|
* Challenge response
|
|
*/
|
|
|
|
async function addHttp01ChallengeResponse(token, content) {
|
|
return request('add-http01', { token, content });
|
|
}
|
|
|
|
async function addHttps01ChallengeResponse(token, content, targetHostname) {
|
|
await addHttp01ChallengeResponse(token, content);
|
|
return request('add-redirect', {
|
|
path: `/.well-known/acme-challenge/${token}`,
|
|
targetURL: `https://${targetHostname}:${httpsPort}/.well-known/acme-challenge/${token}`,
|
|
});
|
|
}
|
|
|
|
async function addDns01ChallengeResponse(host, value) {
|
|
return request('set-txt', { host, value });
|
|
}
|
|
|
|
async function addTlsAlpn01ChallengeResponse(host, content) {
|
|
return request('add-tlsalpn01', { host, content });
|
|
}
|
|
|
|
exports.addHttp01ChallengeResponse = addHttp01ChallengeResponse;
|
|
exports.addHttps01ChallengeResponse = addHttps01ChallengeResponse;
|
|
exports.addDns01ChallengeResponse = addDns01ChallengeResponse;
|
|
exports.addTlsAlpn01ChallengeResponse = addTlsAlpn01ChallengeResponse;
|
|
|
|
/**
|
|
* Challenge response mock functions
|
|
*/
|
|
|
|
async function assertHttpChallengeCreateFn(authz, challenge, keyAuthorization) {
|
|
assert.strictEqual(challenge.type, 'http-01');
|
|
return addHttp01ChallengeResponse(challenge.token, keyAuthorization);
|
|
}
|
|
|
|
async function assertHttpsChallengeCreateFn(authz, challenge, keyAuthorization) {
|
|
assert.strictEqual(challenge.type, 'http-01');
|
|
return addHttps01ChallengeResponse(challenge.token, keyAuthorization, authz.identifier.value);
|
|
}
|
|
|
|
async function assertDnsChallengeCreateFn(authz, challenge, keyAuthorization) {
|
|
assert.strictEqual(challenge.type, 'dns-01');
|
|
return addDns01ChallengeResponse(`_acme-challenge.${authz.identifier.value}.`, keyAuthorization);
|
|
}
|
|
|
|
async function assertTlsAlpnChallengeCreateFn(authz, challenge, keyAuthorization) {
|
|
assert.strictEqual(challenge.type, 'tls-alpn-01');
|
|
return addTlsAlpn01ChallengeResponse(authz.identifier.value, keyAuthorization);
|
|
}
|
|
|
|
async function challengeCreateFn(authz, challenge, keyAuthorization) {
|
|
if (challenge.type === 'http-01') {
|
|
return assertHttpChallengeCreateFn(authz, challenge, keyAuthorization);
|
|
}
|
|
|
|
if (challenge.type === 'dns-01') {
|
|
return assertDnsChallengeCreateFn(authz, challenge, keyAuthorization);
|
|
}
|
|
|
|
if (challenge.type === 'tls-alpn-01') {
|
|
return assertTlsAlpnChallengeCreateFn(authz, challenge, keyAuthorization);
|
|
}
|
|
|
|
throw new Error(`Unsupported challenge type ${challenge.type}`);
|
|
}
|
|
|
|
exports.challengeRemoveFn = async () => true;
|
|
exports.challengeNoopFn = async () => true;
|
|
exports.challengeThrowFn = async () => { throw new Error('oops'); };
|
|
|
|
exports.assertHttpChallengeCreateFn = assertHttpChallengeCreateFn;
|
|
exports.assertHttpsChallengeCreateFn = assertHttpsChallengeCreateFn;
|
|
exports.assertDnsChallengeCreateFn = assertDnsChallengeCreateFn;
|
|
exports.assertTlsAlpnChallengeCreateFn = assertTlsAlpnChallengeCreateFn;
|
|
exports.challengeCreateFn = challengeCreateFn;
|