Visual improvements for web interface

This commit is contained in:
Spacehuhn
2021-01-11 18:04:59 +01:00
parent 077eee674b
commit d95d7c7aa7
14 changed files with 844 additions and 775 deletions

View File

@@ -1,23 +1,25 @@
var attackJSON = [[false,0,0],[false,0,0],[false,0,0]];
function draw(){
/* 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]];
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("deauthTargets").innerHTML = esc(attackJSON[0][1]+"");
getE("beaconTargets").innerHTML = esc(attackJSON[1][1]+"");
getE("probeTargets").innerHTML = esc(attackJSON[2][1]+"");
getE("deauthTargets").innerHTML = esc(attackJSON[0][1] + "");
getE("beaconTargets").innerHTML = esc(attackJSON[1][1] + "");
getE("probeTargets").innerHTML = esc(attackJSON[2][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("allpkts").innerHTML = esc(attackJSON[3]+"");
getE("allpkts").innerHTML = esc(attackJSON[3] + "");
}
function start(mode){
switch(mode){
function start(mode) {
switch (mode) {
case 0:
attackJSON[0][0] = !attackJSON[0][0];
break;
@@ -28,13 +30,13 @@ function start(mode){
attackJSON[2][0] = !attackJSON[2][0];
break;
}
getFile("run?cmd=attack"+(attackJSON[0][0] ? " -d":"")+(attackJSON[1][0] ? " -b":"")+(attackJSON[2][0] ? " -p":""),function(){
getFile("run?cmd=attack" + (attackJSON[0][0] ? " -d" : "") + (attackJSON[1][0] ? " -b" : "") + (attackJSON[2][0] ? " -p" : ""), function () {
draw();
});
}
function load(){
getFile("attack.json",function(response){
function load() {
getFile("attack.json", function (response) {
attackJSON = JSON.parse(response);
draw();
});

View File

@@ -1,13 +1,15 @@
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
var nameJson = [];
var scanJson = {aps:[],stations:[]};
function drawScan(){
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>"
@@ -23,34 +25,34 @@ function drawScan(){
+ "<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];
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";
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
+ "<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] == "-" ? "":"&#x1f512;")+"</td>" // Lock Emoji
+ "<td class='mac'>"+esc(scanJson.aps[i][5])+"</td>" // MAC
+ "<td class='vendor'>"+esc(scanJson.aps[i][6])+"</td>" // Vendor
+ "<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] == "-" ? "" : "&#x1f512;") + "</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
+ "<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>"
@@ -65,35 +67,35 @@ function drawScan(){
+ "<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];
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)
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
+ "<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
+ "<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(){
function drawNames() {
var html;
var selected;
// Names
getE("nNum").innerHTML = nameJson.length;
html = "<tr>"
@@ -107,32 +109,32 @@ function drawNames(){
+ "<th class='selectColumn'></th>"
+ "<th class='remove'></th>"
+ "</tr>";
for(var i=0;i<nameJson.length;i++){
selected = nameJson[i][nameJson[i].length-1];
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
+ "<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
+ "<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){
function scan(type) {
getE('RButton').disabled = true;
switch(type){
switch (type) {
case 0:
getE('scanOne').disabled = true;
getE('scanZero').style.visibility = 'hidden';
@@ -141,17 +143,17 @@ function scan(type){
case 1:
getE('scanZero').disabled = true;
getE('scanOne').style.visibility = 'hidden';
elxtime = parseInt(getE("scanTime").value+"000") + 1500;
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);
+ (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(){
function buttonFunc() {
switch (duts) {
case 0:
getE('scanZero').style.visibility = 'visible';
@@ -164,128 +166,128 @@ function buttonFunc(){
getE('RButton').disabled = false;
}
function load(){
function load() {
// APs and Stations
getFile("run?cmd=save scan", function(){
getFile("scan.json",function(res){
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){
getFile("run?cmd=save names", function () {
getFile("names.json", function (res) {
nameJson = JSON.parse(res);
drawNames();
});
});
}
function selectRow(type,id,selected){
switch(type){
function selectRow(type, id, selected) {
switch (type) {
case 0:
scanJson.aps[id][7] = selected;
drawScan();
getFile("run?cmd="+(selected ? "":"de")+"select ap "+id);
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);
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);
getFile("run?cmd=" + (selected ? "" : "de") + "select name " + id);
}
}
function remove(type,id){
switch(type){
function remove(type, id) {
switch (type) {
case 0:
scanJson.aps.splice(id, 1);
drawScan();
getFile("run?cmd=remove ap "+id);
getFile("run?cmd=remove ap " + id);
break;
case 1:
scanJson.stations.splice(id, 1);
drawScan();
getFile("run?cmd=remove station "+id);
getFile("run?cmd=remove station " + id);
break;
case 2:
nameJson.splice(id, 1);
drawNames();
getFile("run?cmd=remove name "+id);
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>","");
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){
if (changed) {
nameJson[id][0] = mac;
nameJson[id][2] = name;
nameJson[id][3] = apbssid;
nameJson[id][4] = ch;
if(nameJson[id][0].length != 17){
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" : ""));
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){
function add(type, id) {
if (nameJson.length >= 25) {
showMessage("Device Name List is full!");
return;
}
switch(type){
}
switch (type) {
case 0:
getFile("run?cmd=add name \""+scanJson.aps[id][0]+"\" -ap "+id);
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]);
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]);
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]);
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){
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;
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;
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;
getFile("run?cmd=" + (select ? "" : "de") + "select names");
for (var i = 0; i < nameJson.length; i++) nameJson[i][5] = select;
drawNames();
}
}

View File

@@ -1,36 +1,38 @@
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
var settingsJson = {};
function load(){
getFile("settings.json",function(res){
function load() {
getFile("settings.json", function (res) {
settingsJson = JSON.parse(res);
draw();
});
}
function 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>"
+ "<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)'>";
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>"
+ "<p>" + lang("setting_" + key) + "</p>"
+ "<hr>"
+ "</div>"
+ "</div>";
@@ -39,12 +41,12 @@ function draw(){
getE("settingsList").innerHTML = html;
}
function save(key, value){
if(key){
function save(key, value) {
if (key) {
settingsJson[key] = value;
getFile("run?cmd=set "+key+" \""+value+"\"");
}else{
getFile("run?cmd=save settings",function(res){
getFile("run?cmd=set " + key + " \"" + value + "\"");
} else {
getFile("run?cmd=save settings", function (res) {
load();
});
}

View File

@@ -1,11 +1,13 @@
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
var langJson = {};
function getE(name){
function getE(name) {
return document.getElementById(name);
}
function esc(str) {
if(str){
if (str) {
return str.toString()
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
@@ -17,102 +19,94 @@ function esc(str) {
return "";
}
function convertLineBreaks(str){
if(str){
function convertLineBreaks(str) {
if (str) {
str = str.toString();
str = str.replace(/(?:\r\n|\r|\n)/g,'<br>');
str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');
return str;
}
return "";
}
function showMessage(msg, closeAfter){
var elmt = getE("error");
elmt.innerHTML = esc(msg)+"<a onclick='closeMessage()' id='closeError'>x</a>";
elmt.classList.remove('hide');
elmt.classList.add('show');
if(closeAfter !== undefined){
setTimeout(closeMessage(),closeAfter);
}
function showMessage(msg, closeAfter) {
getE("status").style.backgroundColor = "#d33";
console.error("disconnected (" + msg + ")");
getE("status").innerHTML = "disconnected";
}
function closeMessage(){
var elmt = getE("error");
elmt.innerHTML = "";
elmt.classList.remove('show');
elmt.classList.add('hide');
}
function getFile(adr, callback, timeout, method, onTimeout, onError){
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 (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);
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.onerror = onError;
request.overrideMimeType("application/json");
request.onreadystatechange = function() {
if(this.readyState == 4){
if(this.status == 200){
request.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
callback(this.responseText);
}
}
};
/* send request */
request.send();
console.log(adr);
}
function lang(key){
function lang(key) {
return convertLineBreaks(esc(langJson[key]));
}
function parseLang(fileStr){
function parseLang(fileStr) {
langJson = JSON.parse(fileStr);
if(langJson["lang"] != "en"){// no need to update the HTML
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();
document.querySelector('html').setAttribute("lang", langJson["lang"]);
if (typeof load !== 'undefined') load();
}
function loadLang(){
function loadLang() {
var language = "default"; //navigator.language.slice(0, 2);
getFile("lang/" + language + ".lang",
parseLang,
getFile("lang/" + language + ".lang",
parseLang,
2000,
"GET",
function(){
getFile("lang/en.lang", parseLang);
}, function(){
getFile("lang/en.lang", parseLang);
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";
});

View File

@@ -1,17 +1,19 @@
var ssidJson = {"random":false,"ssids":[]};
function load(){
getFile("run?cmd=save ssids", function(){
getFile("ssids.json",function(res){
/* 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);
draw();
});
});
}
function draw(){
function draw() {
var html;
html = "<tr>"
+ "<th class='id'></th>"
+ "<th class='ssid'></th>"
@@ -19,87 +21,87 @@ function draw(){
+ "<th class='save'></th>"
+ "<th class='remove'></th>"
+ "</tr>";
for(var i=0;i<ssidJson.ssids.length;i++){
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] ? "&#x1f512;" : "-")+"</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
+ "<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] ? "&#x1f512;" : "-") + "</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){
function remove(id) {
ssidJson.ssids.splice(id, 1);
getFile("run?cmd=remove ssid "+id);
getFile("run?cmd=remove ssid " + id);
draw();
}
function add(){
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]);
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(){
function enableRandom() {
if (ssidJson.random) {
getFile("run?cmd=disable random", function () {
load();
});
}else{
getFile("run?cmd=enable random "+getE("interval").value,function(){
} else {
getFile("run?cmd=enable random " + getE("interval").value, function () {
load();
});
}
}
function disableRandom(){
function disableRandom() {
}
function addSelected(){
getFile("run?cmd=add ssid -s"+(getE("overwrite").checked ? " -f":""));
function addSelected() {
getFile("run?cmd=add ssid -s" + (getE("overwrite").checked ? " -f" : ""));
}
function changeEnc(id){
function changeEnc(id) {
ssidJson.ssids[id][1] = !ssidJson.ssids[id][1];
draw();
save(id);
}
function removeAll(){
function removeAll() {
ssidJson.ssids = [];
getFile("run?cmd=remove ssids");
draw();
}
function save(id){
var name = getE("ssid_"+id).innerHTML.replace("<br>","").substring(0,32);
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" : ""));
ssidJson.ssids[id] = [name, wpa2];
getFile("run?cmd=replace ssid " + id + " -n \"" + name + "\" " + (wpa2 ? "-wpa2" : ""));
}