/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */ var nameJson = []; var scanJson = { aps: [], stations: [] }; function drawScan() { var html; var selected; var width; var color; var macVendor; // Access Points getE("apNum").innerHTML = scanJson.aps.length; html = "" + "" + "SSID" + "Name" + "Ch" + "RSSI" + "Enc" + "" + "MAC" + "Vendor" + "" + "" + ""; for (var i = 0; i < scanJson.aps.length; i++) { selected = scanJson.aps[i][scanJson.aps[i].length - 1]; width = parseInt(scanJson.aps[i][3]) + 130; if (width < 50) color = "meter_red"; else if (width < 70) color = "meter_orange"; else color = "meter_green"; html += (selected ? "" : "") + "" + i + "" // ID + "" + esc(scanJson.aps[i][0]) + "" // SSID + "" + (scanJson.aps[i][1].length > 0 ? esc(scanJson.aps[i][1]) : "") + "" // Name + "" + esc(scanJson.aps[i][2]) + "" // Ch // RSSI + "
" + scanJson.aps[i][3] + "
" + "" + esc(scanJson.aps[i][4]) + "" // ENC + "" + (scanJson.aps[i][4] == "-" ? "" : "🔒") + "" // Lock Emoji + "" + esc(scanJson.aps[i][5]) + "" // MAC + "" + esc(scanJson.aps[i][6]) + "" // Vendor // Select + "" + "" // Remove + ""; } getE("apTable").innerHTML = html; // Stations getE("stNum").innerHTML = scanJson.stations.length; html = "" + "" + "Vendor" + "MAC" + "Ch" + "Name" + "Pkts" + "AP" + "Last seen" + "" + "" + ""; for (var i = 0; i < scanJson.stations.length; i++) { selected = scanJson.stations[i][scanJson.stations[i].length - 1]; ap = ""; if (scanJson.stations[i][5] >= 0) ap = esc(scanJson.aps[scanJson.stations[i][5]][0]); html += (selected ? "" : "") + "" + i + "" // ID + "" + esc(scanJson.stations[i][3]) + "" // Vendor + "" + esc(scanJson.stations[i][0]) + "" // MAC + "" + esc(scanJson.stations[i][1]) + "" // Ch + "" + (scanJson.stations[i][2].length > 0 ? esc(scanJson.stations[i][2]) : "") + "" // Name + "" + esc(scanJson.stations[i][4]) + "" // Pkts + "" + ap + "" // AP + "" + esc(scanJson.stations[i][6]) + "" // Last seen // Select + "" + "" // Remove + ""; } getE("stTable").innerHTML = html; } function drawNames() { var html; var selected; // Names getE("nNum").innerHTML = nameJson.length; html = "" + "" + "MAC" + "Vendor" + "Name" + "AP-BSSID" + "Ch" + "" + "" + "" + ""; for (var i = 0; i < nameJson.length; i++) { selected = nameJson[i][nameJson[i].length - 1]; html += (selected ? "" : "") + "" + i + "" // ID + "" + esc(nameJson[i][0]) + "" // MAC + "" + esc(nameJson[i][1]) + "" // Vendor + "" + esc(nameJson[i][2].substring(0, 16)) + "" // Name + "" + esc(nameJson[i][3]) + "" // AP-BSSID + "" + esc(nameJson[i][4]) + "" // Ch + "" // Save // Select + "" + "" // Remove + ""; } getE("nTable").innerHTML = html; } var duts; var elxtime; function scan(type) { getE('RButton').disabled = true; switch (type) { case 0: getE('scanOne').disabled = true; getE('scanZero').style.visibility = 'hidden'; elxtime = 2450; break; case 1: getE('scanZero').disabled = true; getE('scanOne').style.visibility = 'hidden'; elxtime = parseInt(getE("scanTime").value + "000") + 1500; } var cmdStr = "scan " + (type == 0 ? "aps " : "stations -t " + getE("scanTime").value + "s") + " -ch " + getE("ch").options[getE("ch").selectedIndex].value; getFile("run?cmd=" + cmdStr); duts = parseInt(type); setTimeout(buttonFunc, elxtime) } function buttonFunc() { switch (duts) { case 0: getE('scanZero').style.visibility = 'visible'; getE('scanOne').disabled = false; break; case 1: getE('scanOne').style.visibility = 'visible'; getE('scanZero').disabled = false; } getE('RButton').disabled = false; } function load() { // APs and Stations getFile("run?cmd=save scan", function () { getFile("scan.json", function (res) { scanJson = JSON.parse(res); drawScan(); }); }); // Names getFile("run?cmd=save names", function () { getFile("names.json", function (res) { nameJson = JSON.parse(res); drawNames(); }); }); } function selectRow(type, id, selected) { switch (type) { case 0: scanJson.aps[id][7] = selected; drawScan(); getFile("run?cmd=" + (selected ? "" : "de") + "select ap " + id); break; case 1: scanJson.stations[id][7] = selected; drawScan(); getFile("run?cmd=" + (selected ? "" : "de") + "select station " + id); break; case 2: save(id); nameJson[id][5] = selected; drawNames(); getFile("run?cmd=" + (selected ? "" : "de") + "select name " + id); } } function remove(type, id) { switch (type) { case 0: scanJson.aps.splice(id, 1); drawScan(); getFile("run?cmd=remove ap " + id); break; case 1: scanJson.stations.splice(id, 1); drawScan(); getFile("run?cmd=remove station " + id); break; case 2: nameJson.splice(id, 1); drawNames(); getFile("run?cmd=remove name " + id); } } function save(id) { var mac = getE("name_" + id + "_mac").innerHTML.replace("
", ""); var name = getE("name_" + id + "_name").innerHTML.replace("
", ""); var apbssid = getE("name_" + id + "_apbssid").innerHTML.replace("
", ""); var ch = getE("name_" + id + "_ch").innerHTML.replace("
", ""); var changed = mac != nameJson[id][0] || name != nameJson[id][2] || apbssid != nameJson[id][3] || ch != nameJson[id][4]; if (changed) { nameJson[id][0] = mac; nameJson[id][2] = name; nameJson[id][3] = apbssid; nameJson[id][4] = ch; if (nameJson[id][0].length != 17) { showMessage("ERROR: MAC invalid"); return; } getFile("run?cmd=replace name " + id + " -n \"" + nameJson[id][2] + "\" -m \"" + nameJson[id][0] + "\" -ch " + nameJson[id][4] + " -b \"" + nameJson[id][3] + "\" " + (nameJson[id][5] ? "-s" : "")); drawNames(); } } function add(type, id) { if (nameJson.length >= 25) { showMessage("Device Name List is full!"); return; } switch (type) { case 0: getFile("run?cmd=add name \"" + scanJson.aps[id][0] + "\" -ap " + id); scanJson.aps[id][1] = scanJson.aps[id][0]; // name = SSID nameJson.push([scanJson.aps[id][5], scanJson.aps[id][6], scanJson.aps[id][0], "", scanJson.aps[id][2], false]); drawScan(); break; case 1: getFile("run?cmd=add name \"" + scanJson.stations[id][0] + "\" station " + id); scanJson.stations[id][2] = "device_" + nameJson.length; // name = device_ nameJson.push([scanJson.stations[id][0], scanJson.stations[id][3], "device_" + nameJson.length, scanJson.aps[scanJson.stations[id][5]][5], scanJson.stations[id][1], false]); drawScan(); break; case 2: getFile("run?cmd=add name device_" + nameJson.length + " -m 00:00:00:00:00:00 -ch 1"); nameJson.push(["00:00:00:00:00:00", "", "device_" + nameJson.length, "", 1, false]); drawNames(); } drawNames(); } function selectAll(type, select) { switch (type) { case 0: getFile("run?cmd=" + (select ? "" : "de") + "select aps"); for (var i = 0; i < scanJson.aps.length; i++) scanJson.aps[i][7] = select; drawScan(); break; case 1: getFile("run?cmd=" + (select ? "" : "de") + "select stations"); for (var i = 0; i < scanJson.stations.length; i++) scanJson.stations[i][7] = select; drawScan(); break; case 2: getFile("run?cmd=" + (select ? "" : "de") + "select names"); for (var i = 0; i < nameJson.length; i++) nameJson[i][5] = select; drawNames(); } }