diff --git a/extensions/chromium/minimalistic-pac-setter/extension/1-sync-pac-script-with-pac-provider.js b/extensions/chromium/minimalistic-pac-setter/extension/1-sync-pac-script-with-pac-provider.js index 6a80f59..9ccf7d9 100755 --- a/extensions/chromium/minimalistic-pac-setter/extension/1-sync-pac-script-with-pac-provider.js +++ b/extensions/chromium/minimalistic-pac-setter/extension/1-sync-pac-script-with-pac-provider.js @@ -123,6 +123,7 @@ }, + /* pullFromStorage(cb) { chrome.storage.local.get(null, (storage) => { @@ -140,6 +141,7 @@ }); }, + */ syncWithPacProvider(key, cb) { @@ -476,114 +478,67 @@ ); } - function getOneDnsRecord(args, cb) { + function getIpsFor(host, cb) { - // args: { host:..., type: 'AAAA', filter: ['AAAA'] } - if (!(args.host && args.type && cb)) { - throw new Error('Wrong args:' + args.host + ',' + args.type); - } + const types = [1, 28]; + const promises = types.map( + (type) => new Promise((resolve) => + httpGet( + 'https://dns.google.com/resolve?type=' + type + '&name=' + host, + (err, res) => { - const type2str = { - // https://en.wikipedia.org/wiki/List_of_DNS_record_types - // A, AAAA may be localized (github, e.g.), but you may use ANY - 1: 'A', // IPv4 - 28: 'AAAA', // IPv6 - 2: 'NS', - 5: 'CNAME', // Synonyms, returned by server together with A/AAAA. - 255: 'ANY', // Deprecated on some servers, not recommended - }; - - httpGet( - 'https://dns.google.com/resolve?type=' + args.type + '&name=' + args.host, - (err, res) => { - if (res) { - try { - res = JSON.parse(res); - console.log('Json parsed.'); - if (err || res.Status) { - const msg = ['Answer', 'Comment', 'Status'] - .filter( (prop) => res[prop] ) - .map( (prop) => prop + ': ' + JSON.stringify( res[prop] ) ) - .join(', \n'); - err.clarification.message += ' Сервер (json): ' + msg; - err.data = err.data || res; - } else { - res = res.Answer || []; - for (const record of res) { - record.type = type2str[record.type]; - } - if ( args.filter ) { - res = res.filter( - (record) => args.filter.indexOf( record.type ) > -1 - ); + if (res) { + try { + res = JSON.parse(res); + console.log('Json parsed.'); + if (err || res.Status) { + const msg = ['Answer', 'Comment', 'Status'] + .filter( (prop) => res[prop] ) + .map( (prop) => prop + ': ' + JSON.stringify( res[prop] ) ) + .join(', \n'); + err.clarification.message += ' Сервер (json): ' + msg; + err.data = err.data || res; + } else { + res = res.Answer || []; + res = res.filter( + (record) => types.includes(record.type) + ); + } + } catch(e) { + err = e || err || {clarification: {message: ''}}; + err.clarification = err.clarification || {message: ''}; + err.clarification.message = ( + error.clarification.message + + ' Сервер (текст): '+ res + ).trim(); + err.data = err.data || res; } } - } catch(e) { - err = e || err || {clarification: {message: ''}}; - err.clarification = err.clarification || {message: ''}; - err.clarification.message += ' Сервер (текст): '+ res; - err.clarification.message.trim(); - err.data = err.data || res; + resolve([err, res]); + } - } - cb( err, res ); - } - ); - } - - function getDnsRecords(args, cb) { - - /* - Example of input: - { - // Required - host: 'proxy.navalny.cia.gov', - // Optional - types: { - string: ['A', 'AAAA'], - // ^ Default. Makes one request per each type. - filter: ['A', 'AAAA'], - // ^ Default. E.g., you want to get rid of CNAME type from - // response. - } - } - Exmple of answer from google: - "Answer": - [ - { - "name": "apple.com.", // Always matches name in the Question - // section. - "type": 1, // A - Standard DNS RR type. - "TTL": 3599, // Record's time-to-live in seconds. - "data": "17.178.96.59" // Data for A - IP address as text. - }, - ... - Exmple of output: - The same as google, but types _may be_ canonical strings ('AAAA', 'A') - **/ - - if ( !args.host.length ) { - throw new Error('args.host is required: ' + args.host); - } - args.types = Object.assign({ - string: ['A', 'AAAA'], - filter: ['A', 'AAAA'], - }, args.types); - - const promises = args.types.string.map( - (type) => new Promise( (resolve, reject) => - getOneDnsRecord( - {host: args.host, type: type, filter: args.types.filter}, - (err, res) => err ? reject(err) : resolve(res) ) + ) ) ); Promise.all(promises).then( - (answers) => cb( null, [].concat(...answers) ), - cb - ); - } + ([[v4err, v4res], [v6err, v6res]]) => { - const getIpDnsRecords = (host, cb) => getDnsRecords({host: host}, cb); + if(v4err) { + return cb(v4err, v4res); + } + const ips = v4res; + if (!v6err) { + ips.push(...v6res); + } else { + v6err.clarification.ifNotCritical = true; + console.warn(v6err); + } + cb(v6err, ips); + + } + ); + + } function updatePacProxyIps(provider, cb) { @@ -600,15 +555,15 @@ errors: {}, }; let i = 0; - provider.proxyHosts.map( - (proxyHost) => getIpDnsRecords( + provider.proxyHosts.forEach( + (proxyHost) => getIpsFor( proxyHost, - (err, records) => { + (err, ips) => { - if (!err) { + if (!err || err.clarification.ifNotCritical) { provider.proxyIps = provider.proxyIps || {}; - records.forEach( - (ans) => provider.proxyIps[ans.data] = proxyHost + ips.forEach( + (ip) => provider.proxyIps[ip] = proxyHost ); } else { failure.errors[proxyHost] = err; diff --git a/extensions/chromium/minimalistic-pac-setter/extension/pages/choose-pac-provider/index.js b/extensions/chromium/minimalistic-pac-setter/extension/pages/choose-pac-provider/index.js index b860b8e..fe044ec 100755 --- a/extensions/chromium/minimalistic-pac-setter/extension/pages/choose-pac-provider/index.js +++ b/extensions/chromium/minimalistic-pac-setter/extension/pages/choose-pac-provider/index.js @@ -139,7 +139,8 @@ chrome://extensions › const li = document.createElement('li'); li.innerHTML = ` - [обновить]`; + [обновить]`; li.querySelector('.link-button').onclick = () => { conduct(