/////////////////////////////////////////////// // GLOBAL VARIABLES /////////////////////////////////////////////// // ARRAY OF NAMES OF ALGORITHMS var algorithms = []; // ARRAY OF SERVERS THAT SUPPORT EACH ALGORITHM var algorithm_servers = []; // ARRAY OF NAMES OF SERVERS var server_names = []; // OBJECT OF ALGORITHM HASH LENGTHS (HEX STRING SIZE) var algorithm_length = {}; /////////////////////////////////////////////// // MISC. UTILITIES /////////////////////////////////////////////// function isHex(hex) { var strPattern = /^[A-Fa-f0-9]*$/; return strPattern.test(hex.toLowerCase()); } function isValidHash(hash,alg) { if (!isHex(hash)) { return false; } if (hash.length != algorithm_length[alg]) { return false; } return true; } // HURRAY FOR LAZINESS! function $(which) { return document.getElementById(which); } // REMOVE SPACES FROM A STRING function remSpaces(withSpaces) { return withSpaces.replace(/\s/g,''); } // CONVERT AN ARRAY TO AN OBJECT function arrToObj(arr) { var obj = {}; for (var i = 0; i < arr.length; i++) { obj[arr[i]] = ''; } return obj; } function createNamedElement(nodeName, nameAttributeValue) { var namedElem = null; try { // MICROSOFT, YOU DONE FUCKED UP namedElem = document.createElement('<'+nodeName+' name="'+nameAttributeValue+'">'); } catch (unFucked) { /* This actually means things are working right... good job IE */ } if (!namedElem || namedElem.nodeName != "INPUT") { namedElem = document.createElement(nodeName); namedElem.name = nameAttributeValue; } return namedElem; } /////////////////////////////////////////////// // AJAX STUFF /////////////////////////////////////////////// function getHTTPObject() { if (window.XMLHttpRequest) { return new XMLHttpRequest(); } else if (window.ActiveXObject){ return new ActiveXObject("Microsoft.XMLHTTP"); } else { return false; } } // new and improved version of the above getHTTPObject() function function getRequestObject() { var http = null; var xml = [ "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ]; if (window.ActiveXObject) { for (var i=0; i 0)) { // NO SERVERS SELECTED var errorMsg = document.createElement('span'); errorMsg.setAttribute('class','error'); errorMsg.style.fontWeight = 'bold'; errorMsg.appendChild(document.createTextNode('No servers were selected. Please select at least one server to search.')); resultDiv.appendChild(errorMsg); return; } // ENSURE HASH IS VALID if (!isValidHash(hash,alg)) { // INVALID HASH var errorMsg = document.createElement('span'); errorMsg.setAttribute('class','error'); errorMsg.style.fontWeight = 'bold'; errorMsg.appendChild(document.createTextNode('The hash you entered is not a valid '+alg+' hash.')); resultDiv.appendChild(errorMsg); return; } // SEARCH EACH SERVER FOR THE HASH for (var i = 0; i < servers.length; i++) { // THIS SERVER'S DETAILS var srv = servers[i]; var srvNam = server_names[srv]; // BUILD RESULT BOX FOR THIS SERVER var resDiv = document.createElement('div'); resDiv.setAttribute('id','result_div_'+srv); var resHead = document.createElement('span'); resHead.appendChild(document.createTextNode('Searching '+srvNam+'...')); resDiv.appendChild(resHead); // ADD RESULT BOX TO LARGER RESULT DIV resultDiv.appendChild(resDiv); // EXECUTE SEARCH executeSearch(alg, hash, srv); } } function changeAlgorithm(algorithm) { // REMOVE INPUT ELEMENTS IF THEY EXIST clearElement('hash_div'); clearElement('result_div'); // DIV FOR HASH INPUT hashInDiv = document.createElement('div'); hashInDiv.setAttribute('id', 'hash_div'); hashInDiv.style.width = "350px"; //hashInDiv.style.padding = "10px"; hashInDiv.style.marginRight = "10px"; hashInDiv.style.cssFloat = "left"; // LABEL FOR TEXT INPUT FOR HASH var hashInLbl = document.createElement('label'); hashInLbl.setAttribute('for','hash'); hashInLbl.setAttribute('accesskey','H'); hashInLbl.appendChild(document.createTextNode('Hash:')); hashInDiv.appendChild(hashInLbl); hashInDiv.appendChild(document.createElement('br')); // CREATE TEXT INPUT FOR HASH var hashIn = document.createElement('input'); hashIn.name = 'hash'; hashIn.setAttribute('id','hash'); hashIn.setAttribute('size','50'); hashIn.setAttribute('type','text'); hashInDiv.appendChild(hashIn); hashInDiv.appendChild(document.createElement('br')); hashInDiv.appendChild(document.createElement('br')); // LOAD SERVERS FOR THIS ALGORITHM var alg_srvs = algorithm_servers[parseInt(algorithm)]; if (typeof alg_srvs !== 'undefined' && alg_srvs) { alg_srvs = alg_srvs.split(","); } // LABEL FOR CHECKBOXES TO SELECT SERVERS var srvLbl = document.createElement('label'); srvLbl.setAttribute('for','servers[]'); srvLbl.setAttribute('accesskey','S'); srvLbl.appendChild(document.createTextNode('Servers to search:')); srvLbl.appendChild(document.createElement('br')); hashInDiv.appendChild(srvLbl); // CREATE CHECKBOXES TO SELECT SERVERS if (typeof alg_srvs !== 'undefined' && alg_srvs) { for (var i = 0; i < alg_srvs.length; i++) { // DETAILS FOR THIS SERVER var thisSrv = alg_srvs[i]; var thisSrvNam = server_names[thisSrv]; var srvChk = createNamedElement('input','servers[]'); srvChk.setAttribute('type','checkbox'); srvChk.setAttribute('value',thisSrv); srvChk.setAttribute('checked','checked'); hashInDiv.appendChild(srvChk); hashInDiv.appendChild(document.createTextNode(" "+thisSrvNam)); hashInDiv.appendChild(document.createElement('br')); } } hashInDiv.appendChild(document.createElement('br')); // SUBMIT BUTTON var subBtn = document.createElement('button'); subBtn.name = 'sub_btn'; subBtn.setAttribute('type','button'); subBtn.appendChild(document.createTextNode('Search')); subBtn.onclick = function() { searchRun(); } hashInDiv.appendChild(subBtn); // PUT IT ALL ON THE PAGE //$('rehash_search').appendChild(hashInDiv); // we want it to pop in before the
$('rehash_search').insertBefore(hashInDiv, $('saveme')); } function setAlgorithmSelected(algVal) { var algOpts = $('algorithm').options; for (var i = 0; i < algOpts.length; i++) { if (algOpts[i].value == algVal) { algOpts[i].selected = true; break; } } changeAlgorithm(algVal); } function buildAlgorithmsMenu() { // INSERT OPTIONS FOR ALGORITHMS SELECT MENU for (var i = 0; i < algorithms.length; i++) { var algOpt = document.createElement('option'); algOpt.setAttribute('value',i); algOpt.appendChild(document.createTextNode(algorithms[i])); $('algorithm').appendChild(algOpt); } // INIT SELECTION WITH MD5 ("3") setAlgorithmSelected("3"); } function handleAlgorithmData() { if (ajax_http.readyState == 4 && ajax_http.status == 200) { try { var resp = ajax_http.responseXML; // PROCESS ALGORITHM DATA var algElems = resp.getElementsByTagName('algorithm'); for (var i = 0; i < algElems.length; i++) { algorithms[i] = algElems.item(i).firstChild.firstChild.data; algorithm_servers[i] = algElems.item(i).childNodes.item(1).firstChild.data; algorithm_length[algorithms[i]] = algElems.item(i).childNodes.item(2).firstChild.data; } // PROCESS SERVER DATA var srvElems = resp.getElementsByTagName('server'); for (var i = 0; i < srvElems.length; i++) { var srvId = srvElems.item(i).firstChild.firstChild.data; server_names[srvId] = srvElems.item(i).childNodes.item(1).firstChild.data; } } catch (poot) { alert(poot); } // REFRESH AJAX STATUS AS WE'RE DONE WITH IT ajax_working = false; buildAlgorithmsMenu(); } else if (ajax_http.readyState == 4) { ajax_working = false; } } function initAlgorithms() { // REQUEST ALGORITHM DATA if (!ajax_working && ajax_http) { ajax_working = true; ajax_http.onreadystatechange = handleAlgorithmData; ajax_http.open('GET','service_data.php',true); ajax_http.send(null); } else { setTimeout("initAlgorithms();",500); } }