first commit
This commit is contained in:
63
web_interface/js/attack.js
Normal file
63
web_interface/js/attack.js
Normal file
@@ -0,0 +1,63 @@
|
||||
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
|
||||
|
||||
var attackJSON = [[false, 0, 0], [false, 0, 0], [false, 0, 0], [false, 0, 0], [false, "[Nothing]"]];
|
||||
|
||||
function draw() {
|
||||
getE("deauth").innerHTML = attackJSON[0][0] ? lang("stop") : lang("start");
|
||||
getE("beacon").innerHTML = attackJSON[1][0] ? lang("stop") : lang("start");
|
||||
getE("probe").innerHTML = attackJSON[2][0] ? lang("stop") : lang("start");
|
||||
getE("deauthAll").innerHTML = attackJSON[3][0] ? lang("stop") : lang("start");
|
||||
getE("evilTwin").innerHTML = attackJSON[4][0] ? lang("stop") : lang("start");
|
||||
|
||||
getE("deauthTargets").innerHTML = esc(attackJSON[0][1] + "");
|
||||
getE("beaconTargets").innerHTML = esc(attackJSON[1][1] + "");
|
||||
getE("probeTargets").innerHTML = esc(attackJSON[2][1] + "");
|
||||
getE("deauthAllTargets").innerHTML = esc(attackJSON[3][1] + "");
|
||||
getE("evilTwinTargets").innerHTML = esc(attackJSON[4][1] + "");
|
||||
|
||||
getE("deauthPkts").innerHTML = esc(attackJSON[0][2] + "/" + attackJSON[0][3]);
|
||||
getE("beaconPkts").innerHTML = esc(attackJSON[1][2] + "/" + attackJSON[1][3]);
|
||||
getE("probePkts").innerHTML = esc(attackJSON[2][2] + "/" + attackJSON[2][3]);
|
||||
getE("deauthAllPkts").innerHTML = esc(attackJSON[3][2] + "/" + attackJSON[3][3]);
|
||||
|
||||
getE("allpkts").innerHTML = esc(attackJSON[5] + "");
|
||||
}
|
||||
|
||||
function stopAll() {
|
||||
getFile("run?cmd=stop attack", function () {
|
||||
load();
|
||||
});
|
||||
}
|
||||
|
||||
function start(mode) {
|
||||
switch (mode) {
|
||||
case 0:
|
||||
attackJSON[0][0] = !attackJSON[0][0];
|
||||
break;
|
||||
case 1:
|
||||
attackJSON[1][0] = !attackJSON[1][0];
|
||||
break;
|
||||
case 2:
|
||||
attackJSON[2][0] = !attackJSON[2][0];
|
||||
break;
|
||||
case 3:
|
||||
attackJSON[3][0] = !attackJSON[3][0];
|
||||
break;
|
||||
case 4:
|
||||
attackJSON[4][0] = !attackJSON[4][0];
|
||||
break;
|
||||
}
|
||||
getFile("run?cmd=attack" + (attackJSON[0][0] ? " -d" : "") + (attackJSON[1][0] ? " -b" : "") + (attackJSON[2][0] ? " -p" : "") + (attackJSON[3][0] ? " -da" : "") + (attackJSON[4][0] ? " -et" : ""), function () {
|
||||
setTimeout(load, 2000);
|
||||
draw();
|
||||
});
|
||||
}
|
||||
|
||||
function load() {
|
||||
getFile("attack.json", function (response) {
|
||||
attackJSON = JSON.parse(response);
|
||||
console.log(response);
|
||||
showMessage("connected");
|
||||
draw();
|
||||
});
|
||||
}
|
||||
46
web_interface/js/fs.js
Normal file
46
web_interface/js/fs.js
Normal file
@@ -0,0 +1,46 @@
|
||||
function load() {
|
||||
filelist();
|
||||
getFile("eviltwin.txt", function (res) {
|
||||
document.getElementById("eviltwinpath").value = res;
|
||||
});
|
||||
getFile("log.json", function (res) {
|
||||
var array = JSON.parse(res)
|
||||
var logDiv = document.getElementById("log");
|
||||
logDiv.innerHTML = "<th>SSID</th> <th>Password</th>";
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
logDiv.innerHTML += "<tr><td>" + array[index].ssid + "</td><td>" + array[index].pass + "</td></tr>";
|
||||
}
|
||||
});
|
||||
getFile("fsinfo", function (res) {
|
||||
document.getElementById("fsinfo").innerHTML = res;
|
||||
});
|
||||
}
|
||||
|
||||
function format() {
|
||||
getFile("format", function (res) {
|
||||
var out;
|
||||
if (res == "OK") out = "Format Success. Restarting...";
|
||||
else out = "Format failed!!!"
|
||||
alert(out);
|
||||
});
|
||||
}
|
||||
|
||||
function filelist() {
|
||||
getFile("filecli?cmd=listfile", function (res) {
|
||||
var array = JSON.parse(res)
|
||||
var listView = document.getElementById("fileList");
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
listView.innerHTML += "<tr><td>" + array[index].name + "</td><td>" + array[index].size + "</td><td><button onclick='deleteFile(\""+ array[index].name +"\");' class='red'>DELETE</button></td></tr>";
|
||||
}
|
||||
});
|
||||
}
|
||||
function deleteFile(filePath) {
|
||||
getFile("filecli?cmd=" + filePath, function (res) {
|
||||
if (res == "OK"){
|
||||
alert("Success delete file : " + filePath);
|
||||
window.location.reload();
|
||||
}else{
|
||||
alert("Failed delete file");
|
||||
}
|
||||
});
|
||||
}
|
||||
296
web_interface/js/scan.js
Normal file
296
web_interface/js/scan.js
Normal file
@@ -0,0 +1,296 @@
|
||||
/* 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 = "<tr>"
|
||||
+ "<th class='id'></th>"
|
||||
+ "<th class='ssid'>SSID</th>"
|
||||
+ "<th class='name'>Name</th>"
|
||||
+ "<th class='ch'>Ch</th>"
|
||||
+ "<th class='rssi'>RSSI</th>"
|
||||
+ "<th class='enc'>Enc</th>"
|
||||
+ "<th class='lock'></th>"
|
||||
+ "<th class='mac'>MAC</th>"
|
||||
+ "<th class='vendor'>Vendor</th>"
|
||||
+ "<th class='selectColumn'></th>"
|
||||
+ "<th class='remove'></th>"
|
||||
+ "</tr>";
|
||||
|
||||
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 ? "<tr class='selected'>" : "<tr>")
|
||||
+ "<td class='id'>" + i + "</td>" // ID
|
||||
+ "<td class='ssid'>" + esc(scanJson.aps[i][0]) + "</td>" // SSID
|
||||
+ "<td class='name'>" + (scanJson.aps[i][1].length > 0 ? esc(scanJson.aps[i][1]) : "<button onclick='add(0," + i + ")'>" + lang("add") + "</button>") + "</td>" // Name
|
||||
+ "<td class='ch'>" + esc(scanJson.aps[i][2]) + "</td>" // Ch
|
||||
// RSSI
|
||||
+ "<td class='rssi'><div class='meter_background'> <div class='meter_forground " + color + "' style='width: " + width + "%;'><div class='meter_value'>" + scanJson.aps[i][3] + "</div></div> </div></td>"
|
||||
+ "<td class='enc'>" + esc(scanJson.aps[i][4]) + "</td>" // ENC
|
||||
+ "<td class='lock'>" + (scanJson.aps[i][4] == "-" ? "" : "🔒") + "</td>" // Lock Emoji
|
||||
+ "<td class='mac'>" + esc(scanJson.aps[i][5]) + "</td>" // MAC
|
||||
+ "<td class='vendor'>" + esc(scanJson.aps[i][6]) + "</td>" // Vendor
|
||||
// Select
|
||||
+ "<td class='selectColumn'><label class='checkBoxContainer'><input type='checkbox' " + (selected ? "checked" : "") + " onclick='selectRow(0," + i + "," + (selected ? "false" : "true") + ")'><span class='checkmark'></span></label></td>"
|
||||
+ "<td class='remove'><button class='red' onclick='remove(0," + i + ")'>X</button></td>" // Remove
|
||||
+ "</tr>";
|
||||
}
|
||||
|
||||
getE("apTable").innerHTML = html;
|
||||
|
||||
// Stations
|
||||
getE("stNum").innerHTML = scanJson.stations.length;
|
||||
html = "<tr>"
|
||||
+ "<th class='id'></th>"
|
||||
+ "<th class='vendor'>Vendor</th>"
|
||||
+ "<th class='mac'>MAC</th>"
|
||||
+ "<th class='ch'>Ch</th>"
|
||||
+ "<th class='name'>Name</th>"
|
||||
+ "<th class='pkts'>Pkts</th>"
|
||||
+ "<th class='ap'>AP</th>"
|
||||
+ "<th class='lastseen'>Last seen</th>"
|
||||
+ "<th class='selectColumn'></th>"
|
||||
+ "<th class='remove'></th>"
|
||||
+ "</tr>";
|
||||
|
||||
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 ? "<tr class='selected'>" : "<tr>")
|
||||
+ "<td class='id'>" + i + "</td>" // ID
|
||||
+ "<td class='vendor'>" + esc(scanJson.stations[i][3]) + "</td>" // Vendor
|
||||
+ "<td class='mac'>" + esc(scanJson.stations[i][0]) + "</td>" // MAC
|
||||
+ "<td class='ch'>" + esc(scanJson.stations[i][1]) + "</td>" // Ch
|
||||
+ "<td class='name'>" + (scanJson.stations[i][2].length > 0 ? esc(scanJson.stations[i][2]) : "<button onclick='add(1," + i + ")'>" + lang("add") + "</button>") + "</td>" // Name
|
||||
+ "<td class='pkts'>" + esc(scanJson.stations[i][4]) + "</td>" // Pkts
|
||||
+ "<td class='ap'>" + ap + "</td>" // AP
|
||||
+ "<td class='lastseen'>" + esc(scanJson.stations[i][6]) + "</td>" // Last seen
|
||||
// Select
|
||||
+ "<td class='selectColumn'><label class='checkBoxContainer'><input type='checkbox' " + (selected ? "checked" : "") + " onclick='selectRow(1," + i + "," + (selected ? "false" : "true") + ")'><span class='checkmark'></span></label></td>"
|
||||
+ "<td class='remove'><button class='red' onclick='remove(1," + i + ")'>X</button></td>" // Remove
|
||||
+ "</tr>";
|
||||
}
|
||||
|
||||
getE("stTable").innerHTML = html;
|
||||
}
|
||||
|
||||
function drawNames() {
|
||||
var html;
|
||||
var selected;
|
||||
|
||||
// Names
|
||||
getE("nNum").innerHTML = nameJson.length;
|
||||
html = "<tr>"
|
||||
+ "<th class='id'></th>"
|
||||
+ "<th class='mac'>MAC</th>"
|
||||
+ "<th class='vendor'>Vendor</th>"
|
||||
+ "<th class='name'>Name</th>"
|
||||
+ "<th class='ap'>AP-BSSID</th>"
|
||||
+ "<th class='ch'>Ch</th>"
|
||||
+ "<th class='save'></th>"
|
||||
+ "<th class='selectColumn'></th>"
|
||||
+ "<th class='remove'></th>"
|
||||
+ "</tr>";
|
||||
|
||||
for (var i = 0; i < nameJson.length; i++) {
|
||||
selected = nameJson[i][nameJson[i].length - 1];
|
||||
|
||||
html += (selected ? "<tr class='selected'>" : "<tr>")
|
||||
+ "<td class='id'>" + i + "</td>" // ID
|
||||
+ "<td class='mac' contentEditable='true' id='name_" + i + "_mac'>" + esc(nameJson[i][0]) + "</td>" // MAC
|
||||
+ "<td class='vendor'>" + esc(nameJson[i][1]) + "</td>" // Vendor
|
||||
+ "<td class='name' contentEditable='true' id='name_" + i + "_name'>" + esc(nameJson[i][2].substring(0, 16)) + "</td>" // Name
|
||||
+ "<td class='ap' contentEditable='true' id='name_" + i + "_apbssid'>" + esc(nameJson[i][3]) + "</td>" // AP-BSSID
|
||||
+ "<td class='ch' contentEditable='true' id='name_" + i + "_ch'>" + esc(nameJson[i][4]) + "</td>" // Ch
|
||||
+ "<td class='save'><button class='green' onclick='save(" + i + ")'>" + lang("save") + "</button></td>" // Save
|
||||
// Select
|
||||
+ "<td class='selectColumn'><label class='checkBoxContainer'><input type='checkbox' " + (selected ? "checked" : "") + " onclick='selectRow(2," + i + "," + (selected ? "false" : "true") + ")'><span class='checkmark'></span></label></td>"
|
||||
+ "<td class='remove'><button class='red' onclick='remove(2," + i + ")'>X</button></td>" // Remove
|
||||
+ "</tr>";
|
||||
}
|
||||
|
||||
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);
|
||||
setTimeout(load, 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);
|
||||
showMessage("connected");
|
||||
drawScan();
|
||||
});
|
||||
});
|
||||
// Names
|
||||
getFile("run?cmd=save names", function () {
|
||||
getFile("names.json", function (res) {
|
||||
nameJson = JSON.parse(res);
|
||||
showMessage("connected");
|
||||
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("<br>", "");
|
||||
var name = getE("name_" + id + "_name").innerHTML.replace("<br>", "");
|
||||
var apbssid = getE("name_" + id + "_apbssid").innerHTML.replace("<br>", "");
|
||||
var ch = getE("name_" + id + "_ch").innerHTML.replace("<br>", "");
|
||||
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();
|
||||
}
|
||||
}
|
||||
53
web_interface/js/settings.js
Normal file
53
web_interface/js/settings.js
Normal file
@@ -0,0 +1,53 @@
|
||||
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
|
||||
|
||||
var settingsJson = {};
|
||||
|
||||
function load() {
|
||||
getFile("settings.json", function (res) {
|
||||
settingsJson = JSON.parse(res);
|
||||
showMessage("connected");
|
||||
draw();
|
||||
});
|
||||
}
|
||||
function draw() {
|
||||
var html = "";
|
||||
for (var key in settingsJson) {
|
||||
key = esc(key);
|
||||
if (settingsJson.hasOwnProperty(key)) {
|
||||
html += "<div class='row'>"
|
||||
+ "<div class='col-6'>"
|
||||
+ "<label class='settingName " + (typeof settingsJson[key] == "boolean" ? "labelFix" : "") + "' for='" + key + "'>" + key + ":</label>"
|
||||
+ "</div>"
|
||||
+ "<div class='col-6'>";
|
||||
|
||||
if (typeof settingsJson[key] == "boolean") {
|
||||
html += "<label class='checkBoxContainer'><input type='checkbox' name='" + key + "' " + (settingsJson[key] ? "checked" : "") + " onchange='save(\"" + key + "\",!settingsJson[\"" + key + "\"])'><span class='checkmark'></span></label>";
|
||||
} else if (typeof settingsJson[key] == "number") {
|
||||
html += "<input type='number' name='" + key + "' value=" + settingsJson[key] + " onchange='save(\"" + key + "\",parseInt(this.value))'>";
|
||||
} else if (typeof settingsJson[key] == "string") {
|
||||
html += "<input type='text' name='" + key + "' value='" + settingsJson[key].toString() + "' " + (key == "version" ? "readonly" : "") + " onchange='save(\"" + key + "\",this.value)'>";
|
||||
}
|
||||
|
||||
html += "</div>"
|
||||
+ "</div>"
|
||||
+ "<div class='row'>"
|
||||
+ "<div class='col-12'>"
|
||||
+ "<p>" + lang("setting_" + key) + "</p>"
|
||||
+ "<hr>"
|
||||
+ "</div>"
|
||||
+ "</div>";
|
||||
}
|
||||
}
|
||||
getE("settingsList").innerHTML = html;
|
||||
}
|
||||
|
||||
function save(key, value) {
|
||||
if (key) {
|
||||
settingsJson[key] = value;
|
||||
getFile("run?cmd=set " + key + " \"" + value + "\"");
|
||||
} else {
|
||||
getFile("run?cmd=save settings", function (res) {
|
||||
load();
|
||||
});
|
||||
}
|
||||
}
|
||||
126
web_interface/js/site.js
Normal file
126
web_interface/js/site.js
Normal file
@@ -0,0 +1,126 @@
|
||||
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
|
||||
|
||||
var langJson = {};
|
||||
|
||||
function getE(name) {
|
||||
return document.getElementById(name);
|
||||
}
|
||||
|
||||
function esc(str) {
|
||||
if (str) {
|
||||
return str.toString()
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/\"/g, '"')
|
||||
.replace(/\'/g, ''')
|
||||
.replace(/\//g, '/');
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
function convertLineBreaks(str) {
|
||||
if (str) {
|
||||
str = str.toString();
|
||||
str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');
|
||||
return str;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
function showMessage(msg) {
|
||||
if (msg.startsWith("ERROR")) {
|
||||
getE("status").style.backgroundColor = "#d33";
|
||||
getE("status").innerHTML = "disconnected";
|
||||
|
||||
console.error("disconnected (" + msg + ")");
|
||||
} else if (msg.startsWith("LOADING")) {
|
||||
getE("status").style.backgroundColor = "#fc0";
|
||||
getE("status").innerHTML = "loading...";
|
||||
} else {
|
||||
getE("status").style.backgroundColor = "#3c5";
|
||||
getE("status").innerHTML = "connected";
|
||||
|
||||
console.log("" + msg + "");
|
||||
}
|
||||
}
|
||||
|
||||
function getFile(adr, callback, timeout, method, onTimeout, onError) {
|
||||
/* fallback stuff */
|
||||
if (adr === undefined) return;
|
||||
if (callback === undefined) callback = function () { };
|
||||
if (timeout === undefined) timeout = 8000;
|
||||
if (method === undefined) method = "GET";
|
||||
if (onTimeout === undefined) {
|
||||
onTimeout = function () {
|
||||
showMessage("ERROR: timeout loading file " + adr);
|
||||
};
|
||||
}
|
||||
if (onError === undefined) {
|
||||
onError = function () {
|
||||
showMessage("ERROR: loading file: " + adr);
|
||||
};
|
||||
}
|
||||
|
||||
/* create request */
|
||||
var request = new XMLHttpRequest();
|
||||
|
||||
/* set parameter for request */
|
||||
request.open(method, encodeURI(adr), true);
|
||||
request.timeout = timeout;
|
||||
request.ontimeout = onTimeout;
|
||||
request.onerror = onError;
|
||||
request.overrideMimeType("application/json");
|
||||
|
||||
request.onreadystatechange = function () {
|
||||
if (this.readyState == 4) {
|
||||
if (this.status == 200) {
|
||||
showMessage("CONNECTED");
|
||||
callback(this.responseText);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
showMessage("LOADING");
|
||||
|
||||
/* send request */
|
||||
request.send();
|
||||
|
||||
console.log(adr);
|
||||
}
|
||||
|
||||
function lang(key) {
|
||||
return convertLineBreaks(esc(langJson[key]));
|
||||
}
|
||||
|
||||
function parseLang(fileStr) {
|
||||
langJson = JSON.parse(fileStr);
|
||||
if (langJson["lang"] != "en") {// no need to update the HTML
|
||||
var elements = document.querySelectorAll("[data-translate]");
|
||||
for (i = 0; i < elements.length; i++) {
|
||||
var element = elements[i];
|
||||
element.innerHTML = lang(element.getAttribute("data-translate"));
|
||||
}
|
||||
}
|
||||
document.querySelector('html').setAttribute("lang", langJson["lang"]);
|
||||
if (typeof load !== 'undefined') load();
|
||||
}
|
||||
|
||||
function loadLang() {
|
||||
var language = "default"; //navigator.language.slice(0, 2);
|
||||
getFile("lang/" + language + ".lang",
|
||||
parseLang,
|
||||
2000,
|
||||
"GET",
|
||||
function () {
|
||||
getFile("lang/en.lang", parseLang);
|
||||
}, function () {
|
||||
getFile("lang/en.lang", parseLang);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
window.addEventListener('load', function () {
|
||||
getE("status").style.backgroundColor = "#3c5";
|
||||
getE("status").innerHTML = "connected";
|
||||
});
|
||||
107
web_interface/js/ssids.js
Normal file
107
web_interface/js/ssids.js
Normal file
@@ -0,0 +1,107 @@
|
||||
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
|
||||
|
||||
var ssidJson = { "random": false, "ssids": [] };
|
||||
|
||||
function load() {
|
||||
getFile("run?cmd=save ssids", function () {
|
||||
getFile("ssids.json", function (res) {
|
||||
ssidJson = JSON.parse(res);
|
||||
showMessage("connected");
|
||||
draw();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function draw() {
|
||||
var html;
|
||||
|
||||
html = "<tr>"
|
||||
+ "<th class='id'></th>"
|
||||
+ "<th class='ssid'></th>"
|
||||
+ "<th class='lock'></th>"
|
||||
+ "<th class='save'></th>"
|
||||
+ "<th class='remove'></th>"
|
||||
+ "</tr>";
|
||||
|
||||
for (var i = 0; i < ssidJson.ssids.length; i++) {
|
||||
html += "<tr>"
|
||||
+ "<td class='id'>" + i + "</td>" // ID
|
||||
+ "<td class='ssid' contenteditable='true' id='ssid_" + i + "'>" + esc(ssidJson.ssids[i][0].substring(0, ssidJson.ssids[i][2])) + "</td>" // SSID
|
||||
+ "<td class='lock clickable' onclick='changeEnc(" + i + ")' id='enc_" + i + "'>" + (ssidJson.ssids[i][1] ? "🔒" : "-") + "</td>" // Enc
|
||||
+ "<td class='save'><button class='green' onclick='save(" + i + ")'>" + lang("save") + "</button></td>" // Save
|
||||
+ "<td class='remove'><button class='red' onclick='remove(" + i + ")'>X</button></td>" // Remove
|
||||
+ "</tr>";
|
||||
}
|
||||
|
||||
getE("randomBtn").innerHTML = ssidJson.random ? lang("disable_random") : lang("enable_random");
|
||||
|
||||
getE("ssidTable").innerHTML = html;
|
||||
}
|
||||
|
||||
function remove(id) {
|
||||
ssidJson.ssids.splice(id, 1);
|
||||
getFile("run?cmd=remove ssid " + id);
|
||||
draw();
|
||||
}
|
||||
|
||||
function add() {
|
||||
var ssidStr = getE("ssid").value;
|
||||
var wpa2 = getE("enc").checked;
|
||||
var clones = getE("ssidNum").value;
|
||||
var force = getE("overwrite").checked;
|
||||
if (ssidStr.length > 0) {
|
||||
var cmdStr = "add ssid \"" + ssidStr + "\"" + (force ? " -f" : " ") + " -cl " + clones;
|
||||
if (wpa2) cmdStr += " -wpa2";
|
||||
|
||||
getFile("run?cmd=" + cmdStr);
|
||||
|
||||
for (var i = 0; i < clones; i++) {
|
||||
if (ssidJson.ssids.length >= 60) ssidJson.ssids.splice(0, 1);
|
||||
ssidJson.ssids.push([ssidStr, wpa2]);
|
||||
}
|
||||
|
||||
draw();
|
||||
}
|
||||
}
|
||||
|
||||
function enableRandom() {
|
||||
if (ssidJson.random) {
|
||||
getFile("run?cmd=disable random", function () {
|
||||
load();
|
||||
});
|
||||
} else {
|
||||
getFile("run?cmd=enable random " + getE("interval").value, function () {
|
||||
load();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function disableRandom() {
|
||||
|
||||
}
|
||||
|
||||
function addSelected() {
|
||||
getFile("run?cmd=add ssid -s" + (getE("overwrite").checked ? " -f" : ""));
|
||||
}
|
||||
|
||||
function changeEnc(id) {
|
||||
ssidJson.ssids[id][1] = !ssidJson.ssids[id][1];
|
||||
draw();
|
||||
save(id);
|
||||
}
|
||||
|
||||
function removeAll() {
|
||||
ssidJson.ssids = [];
|
||||
getFile("run?cmd=remove ssids");
|
||||
draw();
|
||||
}
|
||||
|
||||
function save(id) {
|
||||
var name = getE("ssid_" + id).innerHTML.replace("<br>", "").substring(0, 32);
|
||||
var wpa2 = ssidJson.ssids[id][1];
|
||||
ssidJson.ssids[id] = [name, wpa2];
|
||||
|
||||
getFile("run?cmd=replace ssid " + id + " -n \"" + name + "\" " + (wpa2 ? "-wpa2" : ""));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user