/* 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 "
+ ""
+ "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]) : "" + lang("add") + " ") + " " // Name
+ "" + esc(scanJson.aps[i][2]) + " " // Ch
// RSSI
+ ""
+ "" + 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
+ " "
+ "X " // 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]) : "" + lang("add") + " ") + " " // Name
+ "" + esc(scanJson.stations[i][4]) + " " // Pkts
+ "" + ap + " " // AP
+ "" + esc(scanJson.stations[i][6]) + " " // Last seen
// Select
+ " "
+ "X " // 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
+ "" + lang("save") + " " // Save
// Select
+ " "
+ "X " // 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();
}
}