@@ -12,45 +12,51 @@ const retry = require('../../retry')(config['acme-dns-retry-delay-ms'], config['
1212const getTokenDigest = ( dnsChallenge , acctKeyPair ) =>
1313 crypto . createHash ( 'sha256' ) . update ( `${ dnsChallenge . token } .${ RSA . thumbprint ( acctKeyPair ) } ` ) . digest ( )
1414
15- const dnsPreCheck = ( domain , expect ) => ( tryCount ) => {
16- console . log ( `Attempt ${ tryCount + 1 } to resolve TXT record for ${ domain } ` )
17- return resolveTxt ( `_acme-challenge.${ domain } ` )
18- . then ( ( data ) => {
15+ const arrayContainsArray = ( superset , subset ) =>
16+ subset . every ( value => superset . indexOf ( value ) >= 0 )
17+
18+ const flatten = input => Array . prototype . concat . apply ( [ ] , input )
19+
20+
21+ const dnsPreCheck = ( domain , expect ) => ( tryCount ) => {
22+ console . log ( `Attempt ${ tryCount + 1 } to resolve TXT record for ${ domain } ` )
23+ return resolveTxt ( `_acme-challenge.${ domain } ` )
24+ . then ( data => {
25+ ++ tryCount
26+ return {
27+ tryCount,
28+ result : arrayContainsArray ( flatten ( data ) , expect )
29+ }
30+ } )
31+ . catch ( e => {
32+ if ( e . code === 'ENODATA' || e . code === 'ENOTFOUND' ) {
1933 ++ tryCount
20- return {
21- tryCount,
22- result : ( data [ 0 ] [ 0 ] === expect )
23- }
24- } )
25- . catch ( ( e ) => {
26- if ( e . code === 'ENODATA' || e . code === 'ENOTFOUND' ) {
27- ++ tryCount
28- return { tryCount, result : false }
29- } else { throw e }
30- } )
31- }
32-
33- const validateDNSChallenge = ( domain , dnsChallengeText ) => {
34- return retry ( 0 , dnsPreCheck ( domain , dnsChallengeText ) )
35- . then ( ( data ) => {
36- if ( data . result ) {
37- return data . result
38- } else {
39- throw new Error ( `Could not pre-validate DNS TXT record. Didn't find ${ dnsChallengeText } in _acme-challenge.${ domain } ` )
40- }
41- } )
42- }
43-
44- const updateDNSChallenge = ( domain , dnsChallenge , acctKeyPair ) => {
34+ return { tryCount, result : false }
35+ } else { throw e }
36+ } )
37+ }
38+
39+ const validateDNSChallenge = ( domain , dnsChallengeTexts ) => {
40+ return retry ( 0 , dnsPreCheck ( domain , dnsChallengeTexts ) )
41+ . then ( ( data ) => {
42+ if ( data . result ) {
43+ return data . result
44+ } else {
45+ throw new Error ( `Could not pre-validate DNS TXT record. Didn't find ${ dnsChallengeTexts } in _acme-challenge.${ domain } ` )
46+ }
47+ } )
48+ }
49+
50+ const updateDNSChallenge = ( domain , dnsChallenges , acctKeyPair ) => {
4551 const domainName = ( typeof domain === 'string' ) ? domain : domain . name
46- const dnsChallengeText = urlB64 ( getTokenDigest ( dnsChallenge , acctKeyPair ) )
52+ const dnsChallengeTexts = dnsChallenges . map ( dnsChallenge => urlB64 ( getTokenDigest ( dnsChallenge , acctKeyPair ) ) )
4753 return getHostedZoneId ( domain )
48- . then ( ( id ) => {
49- console . log ( `Updating DNS TXT Record for ${ domainName } to contain ${ dnsChallengeText } in Route53 hosted zone ${ id } ` )
50- return updateTXTRecord ( id , domainName , dnsChallengeText )
54+ . then ( id => {
55+ console . log ( `Updating DNS TXT Record for ${ domainName } to contain ${ dnsChallengeTexts } in Route53 hosted zone ${ id } ` )
56+ return updateTXTRecord ( id , domainName , dnsChallengeTexts )
5157 } )
52- . then ( ( updated ) => validateDNSChallenge ( domainName , dnsChallengeText ) )
53- . catch ( ( e ) => {
58+ . then ( updated => validateDNSChallenge ( domainName , dnsChallengeTexts ) )
59+ . catch ( e => {
5460 console . error ( `Couldn't write token digest to DNS record.` , e )
5561 throw e
5662 } )
0 commit comments