kopia lustrzana https://gitlab.com/rysiekpl/libresilient
doh.js: bugfix (window is not a thing in service workers), improved errorreporting (ref. #36)
rodzic
15a52cade7
commit
c1b84cac86
40
lib/doh.js
40
lib/doh.js
|
@ -17,7 +17,7 @@
|
||||||
* @param config (object) config object with fields: dohProvider, dohMethod, dohMediaType
|
* @param config (object) config object with fields: dohProvider, dohMethod, dohMediaType
|
||||||
* @param log (function) logging function to use (optional)
|
* @param log (function) logging function to use (optional)
|
||||||
*/
|
*/
|
||||||
window.resolveEndpointsBinary = async (domain, config, log=()=>{} ) => {
|
self.resolveEndpointsBinary = async (domain, config, log=()=>{} ) => {
|
||||||
|
|
||||||
// encoder and decoder
|
// encoder and decoder
|
||||||
let enc = new TextEncoder();
|
let enc = new TextEncoder();
|
||||||
|
@ -344,6 +344,36 @@ window.resolveEndpointsBinary = async (domain, config, log=()=>{} ) => {
|
||||||
return answers;
|
return answers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* names of known DNS return codes
|
||||||
|
* to simplify debugging
|
||||||
|
*
|
||||||
|
* https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||||
|
*/
|
||||||
|
let dnsReturnCodes = []
|
||||||
|
dnsReturnCodes[0] = 'NOERROR' // no error
|
||||||
|
dnsReturnCodes[1] = 'FORMERR' // format error
|
||||||
|
dnsReturnCodes[2] = 'SERVFAIL' // server failed to complete the request
|
||||||
|
dnsReturnCodes[3] = 'NXDOMAIN' // domain name does not exist
|
||||||
|
dnsReturnCodes[4] = 'NOTIMP' // not implemented
|
||||||
|
dnsReturnCodes[5] = 'REFUSED' // server refused to answer
|
||||||
|
dnsReturnCodes[6] = 'YXDOMAIN' // name that should not exist, exists
|
||||||
|
dnsReturnCodes[7] = 'YXRRSET' // RRset that should not exist, exists
|
||||||
|
dnsReturnCodes[8] = 'NXRRSET' // RRset that should exist, doesn't
|
||||||
|
dnsReturnCodes[9] = 'NOTAUTH' // server not authoritative for the zone, or request not authorized
|
||||||
|
dnsReturnCodes[10] = 'NOTZONE' // name not in the zone
|
||||||
|
dnsReturnCodes[11] = 'DSOTYPENI' // DSO-TYPE not implemented
|
||||||
|
// dnsReturnCodes[12] to dnsReturnCodes[15] unassigned
|
||||||
|
dnsReturnCodes[16] = 'BADSIG' // TSIG signature failure
|
||||||
|
dnsReturnCodes[17] = 'BADKEY' // bad key
|
||||||
|
dnsReturnCodes[18] = 'BADTIME' // signature out of time window
|
||||||
|
dnsReturnCodes[19] = 'BADMODE' // bad TKEY mode
|
||||||
|
dnsReturnCodes[20] = 'BADNAME' // duplicate key name
|
||||||
|
dnsReturnCodes[21] = 'BADALG' // algorithm not supported
|
||||||
|
dnsReturnCodes[22] = 'BADTRUNC' // bad truncation
|
||||||
|
dnsReturnCodes[23] = 'BADCOOKIE' // bad/missing server cookie
|
||||||
|
// the rest is unassigned / reserved for private use etc
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* retrieving the alternative endpoints list from DNS TXT records
|
* retrieving the alternative endpoints list from DNS TXT records
|
||||||
* using a DNS-over-HTTPS JSON endpoint
|
* using a DNS-over-HTTPS JSON endpoint
|
||||||
|
@ -353,7 +383,7 @@ window.resolveEndpointsBinary = async (domain, config, log=()=>{} ) => {
|
||||||
* @param domain (string) domain name to resolve TXT records for
|
* @param domain (string) domain name to resolve TXT records for
|
||||||
* @param config (object) config object with fields: dohProvider, dohMethod, dohMediaType
|
* @param config (object) config object with fields: dohProvider, dohMethod, dohMediaType
|
||||||
*/
|
*/
|
||||||
window.resolveEndpointsJSON = async (domain, config) => {
|
self.resolveEndpointsJSON = async (domain, config) => {
|
||||||
// pretty self-explanatory:
|
// pretty self-explanatory:
|
||||||
// DoH provider, domain, TXT type, pretty please
|
// DoH provider, domain, TXT type, pretty please
|
||||||
var query = `${config.dohProvider}?name=${domain}&type=TXT`
|
var query = `${config.dohProvider}?name=${domain}&type=TXT`
|
||||||
|
@ -379,7 +409,11 @@ window.resolveEndpointsJSON = async (domain, config) => {
|
||||||
// only Status == 0 is acceptable
|
// only Status == 0 is acceptable
|
||||||
// https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
// https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||||
if (!('Status' in response) || response.Status != 0) {
|
if (!('Status' in response) || response.Status != 0) {
|
||||||
throw new Error(`DNS request failure, status code: ${response.Status}`)
|
let status_msg = dnsReturnCodes[response.Status]
|
||||||
|
if (status_msg === undefined) {
|
||||||
|
status_msg = "unknown error"
|
||||||
|
}
|
||||||
|
throw new Error(`DNS request failure, status code: ${response.Status} (${status_msg})`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// we also do need the Answer section please
|
// we also do need the Answer section please
|
||||||
|
|
Ładowanie…
Reference in New Issue