*stop() function dnswatch_search() { // get domain var domain = document.getElementById('dnswatch-search').value.toLowerCase(); // test if domain is invalid if (!is_valid_domain(domain)) { document.getElementById('results').innerHTML = '
'; feather.replace(); document.getElementById('invaliddomain').style.visibility = 'visible'; document.getElementById('invaliddomain').style.display = 'block'; return; } document.getElementById('invaliddomain').style.visibility = 'hidden'; document.getElementById('invaliddomain').style.display = 'none'; // activate spinner document.getElementById('loadani').style.visibility = 'visible'; document.getElementById('loadani').style.display = 'block'; // send api request var request = new XMLHttpRequest(); request.open('POST', 'https://dns-watch.org/search', true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); request.onload = function() { if (request.status >= 200 && request.status < 400) { var response = JSON.parse(this.response); // TODO: CLEAN UP THIS MESS OF TABLE GENERATION CODE if (response['type'] == 'success') { // success var table = '\n'; //// reference dns let first_ref = true; response['data']['reference'].forEach(i => { table += gen_tablerow({ status_color: 'ref', status_icon: get_status_icon(i['status']), dns_icon: i['icon'], dns_name: i['name'], dns_address: i['address'], desc_color: 'ref', desc_text: 'reference', show_help: first_ref }) first_ref = false; }); table += '
'; // randomized response message if (response['data']['randomized_response']) { table += 'This domain uses randomized responses. \n'; } if (response['data']['found']) { // only if reference confirms table += '\n'; // spacer //// search rows let causes = []; response['data']['search'].forEach(i => { table += gen_tablerow({ status_color: get_status_color(i['status']), status_icon: get_status_icon(i['status']), dns_icon: i['icon'], dns_name: i['name'], dns_address: i['address'], desc_color: i['cause'] !== null ? 'blocked': '', desc_text: get_blocked_text(i['cause']), show_help: i['cause'] !== null && !causes.includes(i['cause']) }) if (i['cause'] !== null) causes.push(i['cause']) }); } table += '
'; } else { // no success if (response['error'] == 'malformed_domain') { // invalid domain - should not happen, but just in case i guess var table = '
'; document.getElementById('results').innerHTML = '
'; feather.replace(); document.getElementById('invaliddomain').style.visibility = 'visible'; document.getElementById('invaliddomain').style.display = 'block'; } else { var table = '\n'; table += '\n'; // status table += '\n'; // provider icon table += '\n'; // name and address table += `\n`; table += '\n'; table += '\n'; table += '\n'; table += '
\n'; table += '\n'; table += '\n'; table += '\n'; table += 'ERROR: ${ response["error"] }
'; } } document.getElementById('results').innerHTML = table; feather.replace(); } // deactivate spinner document.getElementById('loadani').style.visibility = 'hidden'; document.getElementById('loadani').style.display = 'none'; } request.send(`domain=${ window.btoa(domain) }`); } function is_valid_domain(str) { let regex = /^([a-z0-9\-]{1,64}\.){1,16}[a-z0-9]{2,}$/; return regex.test(str); } function gen_tablerow(options) { return ` ${ options.dns_name }${ options.dns_address } ${ options.desc_text } ${ options.show_help ? '' : '' } ` } function get_status_color(status) { if (status === true) return 'check' if (status === false) return 'cross' return 'offline' } function get_status_icon(status) { if (status === true) return 'check' if (status === false) return 'x' return 'wifi-off' } function get_blocked_text(cause) { if (cause == 'cuii') return 'blocked by cuii' if (cause !== null) return `bocked: ${cause}` return '' } // add event triggers document.addEventListener('DOMContentLoaded', () => { document.getElementById('dnswatch-search-submit').addEventListener('click', (event) => { dnswatch_search(); }); document.getElementById('dnswatch-search').addEventListener('keyup', (event) => { if (event.keyCode === 13) { event.preventDefault(); dnswatch_search(); } }); });