feat(web_interface): js refactor

This commit is contained in:
Jan Rochalski
2019-11-12 13:59:23 +01:00
parent fda01a6486
commit 942f62bc53
5 changed files with 247 additions and 234 deletions

View File

@@ -1,40 +1,38 @@
var attackJSON = [[false,0,0],[false,0,0],[false,0,0]]; const attackJSON = [
[false, 0, 0],
function draw(){ [false, 0, 0],
[false, 0, 0]
];
const draw = () => {
getE("deauth").innerHTML = attackJSON[0][0] ? lang("stop") : lang("start"); getE("deauth").innerHTML = attackJSON[0][0] ? lang("stop") : lang("start");
getE("beacon").innerHTML = attackJSON[1][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("probe").innerHTML = attackJSON[2][0] ? lang("stop") : lang("start");
getE("deauthTargets").innerHTML = esc(attackJSON[0][1]+""); getE("deauthTargets").innerHTML = esc(`${attackJSON[0][1]}`);
getE("beaconTargets").innerHTML = esc(attackJSON[1][1]+""); getE("beaconTargets").innerHTML = esc(`${attackJSON[1][1]}`);
getE("probeTargets").innerHTML = esc(attackJSON[2][1]+""); getE("probeTargets").innerHTML = esc(`${attackJSON[2][1]}`);
getE("deauthPkts").innerHTML = esc(attackJSON[0][2] + "/" + attackJSON[0][3]); getE("deauthPkts").innerHTML = esc(`${attackJSON[0][2]}/${attackJSON[0][3]}`);
getE("beaconPkts").innerHTML = esc(attackJSON[1][2] + "/" + attackJSON[1][3]); getE("beaconPkts").innerHTML = esc(`${attackJSON[1][2]}/${attackJSON[1][3]}`);
getE("probePkts").innerHTML = esc(attackJSON[2][2] + "/" + attackJSON[2][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){ const start = (mode) => {
switch(mode){ attackJSON[mode][0] = !attackJSON[mode][0];
case 0:
attackJSON[0][0] = !attackJSON[0][0]; getFile(
break; `run?cmd=attack${attackJSON[0][0] ? " -d":""}${attackJSON[1][0] ? " -b":""}${attackJSON[2][0] ? " -p":""}`,
case 1: () => {
attackJSON[1][0] = !attackJSON[1][0]; draw();
break; }
case 2: );
attackJSON[2][0] = !attackJSON[2][0];
break;
}
getFile("run?cmd=attack"+(attackJSON[0][0] ? " -d":"")+(attackJSON[1][0] ? " -b":"")+(attackJSON[2][0] ? " -p":""),function(){
draw();
});
} }
function load(){ const load = () => {
getFile("attack.json",function(response){ getFile("attack.json", (response) => {
attackJSON = JSON.parse(response); attackJSON = JSON.parse(response);
draw(); draw();
}); });

View File

@@ -1,13 +1,16 @@
var nameJson = []; let nameJson = [];
var scanJson = {aps:[],stations:[]}; let scanJson = {
aps: [],
function drawScan(){ stations: []
var html; };
var selected;
var width; const drawScan = () => {
var color; let html;
var macVendor; let selected;
let width;
let color;
let macVendor;
// Access Points // Access Points
getE("apNum").innerHTML = scanJson.aps.length; getE("apNum").innerHTML = scanJson.aps.length;
html = "<tr>" html = "<tr>"
@@ -23,7 +26,7 @@ function drawScan(){
+ "<th class='selectColumn'></th>" + "<th class='selectColumn'></th>"
+ "<th class='remove'></th>" + "<th class='remove'></th>"
+ "</tr>"; + "</tr>";
for(var i=0;i<scanJson.aps.length;i++){ for(var i=0;i<scanJson.aps.length;i++){
selected = scanJson.aps[i][scanJson.aps[i].length-1]; selected = scanJson.aps[i][scanJson.aps[i].length-1];
width = parseInt(scanJson.aps[i][3]) + 130; width = parseInt(scanJson.aps[i][3]) + 130;
@@ -31,7 +34,7 @@ function drawScan(){
if(width < 50) color = "meter_red"; if(width < 50) color = "meter_red";
else if(width < 70) color = "meter_orange"; else if(width < 70) color = "meter_orange";
else color = "meter_green"; else color = "meter_green";
html += (selected ? "<tr class='selected'>" : "<tr>") html += (selected ? "<tr class='selected'>" : "<tr>")
+ "<td class='id'>"+i+"</td>" // ID + "<td class='id'>"+i+"</td>" // ID
+ "<td class='ssid'>"+esc(scanJson.aps[i][0])+"</td>" // SSID + "<td class='ssid'>"+esc(scanJson.aps[i][0])+"</td>" // SSID
@@ -48,9 +51,9 @@ function drawScan(){
+ "<td class='remove'><button class='red' onclick='remove(0,"+i+")'>X</button></td>" // Remove + "<td class='remove'><button class='red' onclick='remove(0,"+i+")'>X</button></td>" // Remove
+ "</tr>"; + "</tr>";
} }
getE("apTable").innerHTML = html; getE("apTable").innerHTML = html;
// Stations // Stations
getE("stNum").innerHTML = scanJson.stations.length; getE("stNum").innerHTML = scanJson.stations.length;
html = "<tr>" html = "<tr>"
@@ -65,13 +68,13 @@ function drawScan(){
+ "<th class='selectColumn'></th>" + "<th class='selectColumn'></th>"
+ "<th class='remove'></th>" + "<th class='remove'></th>"
+ "</tr>"; + "</tr>";
for(var i=0;i<scanJson.stations.length;i++){ for(var i=0;i<scanJson.stations.length;i++){
selected = scanJson.stations[i][scanJson.stations[i].length-1]; selected = scanJson.stations[i][scanJson.stations[i].length-1];
ap = ""; ap = "";
if(scanJson.stations[i][5] >= 0) if(scanJson.stations[i][5] >= 0)
ap = esc(scanJson.aps[scanJson.stations[i][5]][0]); ap = esc(scanJson.aps[scanJson.stations[i][5]][0]);
html += (selected ? "<tr class='selected'>" : "<tr>") html += (selected ? "<tr class='selected'>" : "<tr>")
+ "<td class='id'>"+i+"</td>" // ID + "<td class='id'>"+i+"</td>" // ID
+ "<td class='vendor'>"+esc(scanJson.stations[i][3])+"</td>" // Vendor + "<td class='vendor'>"+esc(scanJson.stations[i][3])+"</td>" // Vendor
@@ -86,14 +89,14 @@ function drawScan(){
+ "<td class='remove'><button class='red' onclick='remove(1,"+i+")'>X</button></td>" // Remove + "<td class='remove'><button class='red' onclick='remove(1,"+i+")'>X</button></td>" // Remove
+ "</tr>"; + "</tr>";
} }
getE("stTable").innerHTML = html; getE("stTable").innerHTML = html;
} }
function drawNames(){ function drawNames(){
var html; var html;
var selected; var selected;
// Names // Names
getE("nNum").innerHTML = nameJson.length; getE("nNum").innerHTML = nameJson.length;
html = "<tr>" html = "<tr>"
@@ -107,10 +110,10 @@ function drawNames(){
+ "<th class='selectColumn'></th>" + "<th class='selectColumn'></th>"
+ "<th class='remove'></th>" + "<th class='remove'></th>"
+ "</tr>"; + "</tr>";
for(var i=0;i<nameJson.length;i++){ for(var i=0;i<nameJson.length;i++){
selected = nameJson[i][nameJson[i].length-1]; selected = nameJson[i][nameJson[i].length-1];
html += (selected ? "<tr class='selected'>" : "<tr>") html += (selected ? "<tr class='selected'>" : "<tr>")
+ "<td class='id'>"+i+"</td>" // ID + "<td class='id'>"+i+"</td>" // ID
+ "<td class='mac' contentEditable='true' id='name_"+i+"_mac'>"+esc(nameJson[i][0])+"</td>" // MAC + "<td class='mac' contentEditable='true' id='name_"+i+"_mac'>"+esc(nameJson[i][0])+"</td>" // MAC
@@ -124,10 +127,10 @@ function drawNames(){
+ "<td class='remove'><button class='red' onclick='remove(2,"+i+")'>X</button></td>" // Remove + "<td class='remove'><button class='red' onclick='remove(2,"+i+")'>X</button></td>" // Remove
+ "</tr>"; + "</tr>";
} }
getE("nTable").innerHTML = html; getE("nTable").innerHTML = html;
} }
function scan(type){ function scan(type){
var cmdStr = "scan " var cmdStr = "scan "
+ (type == 0 ? "aps " : "stations -t "+getE("scanTime").value+"s") + (type == 0 ? "aps " : "stations -t "+getE("scanTime").value+"s")
@@ -202,14 +205,14 @@ function save(id){
nameJson[id][2] = name; nameJson[id][2] = name;
nameJson[id][3] = apbssid; nameJson[id][3] = apbssid;
nameJson[id][4] = ch; nameJson[id][4] = ch;
if(nameJson[id][0].length != 17){ if(nameJson[id][0].length != 17){
showMessage("ERROR: MAC invalid"); showMessage("ERROR: MAC invalid");
return; 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(); drawNames();
} }
} }
@@ -218,8 +221,8 @@ function add(type,id){
if(nameJson.length >= 25){ if(nameJson.length >= 25){
showMessage("Device Name List is full!"); showMessage("Device Name List is full!");
return; return;
} }
switch(type){ switch(type){
case 0: case 0:
getFile("run?cmd=add name \""+scanJson.aps[id][0]+"\" -ap "+id); getFile("run?cmd=add name \""+scanJson.aps[id][0]+"\" -ap "+id);
@@ -238,7 +241,7 @@ function add(type,id){
nameJson.push(["00:00:00:00:00:00","","device_"+nameJson.length,"",1,false]); nameJson.push(["00:00:00:00:00:00","","device_"+nameJson.length,"",1,false]);
drawNames(); drawNames();
} }
drawNames(); drawNames();
} }

View File

@@ -1,51 +1,61 @@
var settingsJson = {}; let settingsJson = {};
function load(){ const load = () => {
getFile("settings.json",function(res){ getFile("settings.json", res => {
settingsJson = JSON.parse(res); settingsJson = JSON.parse(res);
draw(); draw();
}); });
} }
function draw(){ const draw = () => {
var html = ""; let html = "";
for (var key in settingsJson) { for (var key in settingsJson) {
key = esc(key); key = esc(key);
if (settingsJson.hasOwnProperty(key)) { if (settingsJson.hasOwnProperty(key)) {
html += "<div class='row'>" html += `
+ "<div class='col-6'>" <div class="row">
+ "<label class='settingName "+(typeof settingsJson[key] == "boolean" ? "labelFix":"")+"' for='"+key+"'>"+key+":</label>" <div class="col-6">
+ "</div>" <label class="settingName ${(typeof settingsJson[key] == "boolean" ? "labelFix" : "")}" for="${key}">
+ "<div class='col-6'>"; ${key}:
</label>
if(typeof settingsJson[key] == "boolean"){ </div>
html += "<label class='checkBoxContainer'><input type='checkbox' name='"+key+"' "+(settingsJson[key] ? "checked" : "")+" onchange='save(\""+key+"\",!settingsJson[\""+key+"\"])'><span class='checkmark'></span></label>"; <div class='col-6'>
}else if(typeof settingsJson[key] == "number"){ ${() => {
html += "<input type='number' name='"+key+"' value="+settingsJson[key]+" onchange='save(\""+key+"\",parseInt(this.value))'>"; switch(typeof settingsJson[key]) {
}else if(typeof settingsJson[key] == "string"){ case "boolean":
html += "<input type='text' name='"+key+"' value="+settingsJson[key]+" "+(key=="version"?"readonly":"")+" onchange='save(\""+key+"\",this.value)'>"; return `
} <label class="checkBoxContainer">
<input type="checkbox" name="${key}" ${(settingsJson[key] ? "checked" : "")} onchange="save(${key}, ${!settingsJson[key]})" />;
html += "</div>" <span class="checkmark"></span>
+ "</div>" </label>
+ "<div class='row'>" `;
+ "<div class='col-12'>" case "number":
+ "<p>"+lang("setting_"+key)+"</p>" return `<input type="number" name="${key}" value="${settingsJson[key]}" onchange="save(${key}, ${parseInt(this.value)})">`;
+ "<hr>" case "string":
+ "</div>" return `<input type="text" name="${key}" value="${settingsJson[key]}" ${key === "version" ? "readonly" : ""} onchange="save(${key}, ${this.value})">`
+ "</div>"; }
}}
</div>
</div>
<div class='row'>
<div class='col-12'>
<p>${lang("setting_"+key)}</p>
<hr>
</div>
</div>
`;
} }
} }
getE("settingsList").innerHTML = html; getE("settingsList").innerHTML = html;
} }
function save(key, value){ const save = (key, value) => {
if(key){ if (key) {
settingsJson[key] = value; settingsJson[key] = value;
getFile("run?cmd=set "+key+" \""+value+"\""); getFile(`run?cmd=set ${key} "${value}"`);
}else{ } else {
getFile("run?cmd=save settings",function(res){ getFile("run?cmd=save settings", load);
load();
});
} }
} }

View File

@@ -1,118 +1,113 @@
var langJson = {}; let langJson = {};
function getE(name){ const getE = (name) => document.getElementById(name);
return document.getElementById(name);
}
function esc(str) { const esc = str => {
if(str){ if (str) {
return str.toString() return str.toString()
.replace(/&/g, '&amp;') .replace(/&/g, "&amp;")
.replace(/</g, '&lt;') .replace(/</g, "&lt;")
.replace(/>/g, '&gt;') .replace(/>/g, "&gt;")
.replace(/\"/g, '&quot;') .replace(/\"/g, "&quot;")
.replace(/\'/g, '&#39;') .replace(/\'/g, "&#39;")
.replace(/\//g, '&#x2F;'); .replace(/\//g, "&#x2F;");
} }
return ""; return "";
} }
function convertLineBreaks(str){ const convertLineBreaks = str => {
if(str){ if (str) {
str = str.toString(); str = str.toString();
str = str.replace(/(?:\r\n|\r|\n)/g,'<br>'); str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');
return str; return str;
} }
return ""; return "";
} }
function showMessage(msg, closeAfter){ const showMessage = (msg, closeAfter) => {
var elmt = getE("error"); const elmt = getE("error");
elmt.innerHTML = esc(msg)+"<a onclick='closeMessage()' id='closeError'>x</a>"; elmt.innerHTML = `${esc(msg)}<a onclick='closeMessage()' id='closeError'>x</a>`;
elmt.classList.remove('hide'); elmt.classList.remove("hide");
elmt.classList.add('show'); elmt.classList.add("show");
if(closeAfter !== undefined){ if(closeAfter !== undefined){
setTimeout(closeMessage(),closeAfter); setTimeout(closeMessage, closeAfter);
} }
} }
function closeMessage(){ const closeMessage = () => {
var elmt = getE("error"); const elmt = getE("error");
elmt.innerHTML = ""; elmt.innerHTML = "";
elmt.classList.remove('show'); elmt.classList.remove("show");
elmt.classList.add('hide'); elmt.classList.add("hide");
} }
function getFile(adr, callback, timeout, method, onTimeout, onError){ const getFile = (
adr,
callback = () => undefined,
timeout = 8000,
method = "GET",
onTimeout = showMessage(`ERROR: timeout loading file ${adr}`),
onError = showMessage(`ERROR: loading file: ${adr}`)
) => {
/* fallback stuff */ /* fallback stuff */
if(adr === undefined) return; 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 */ /* create request */
var request = new XMLHttpRequest(); const request = new XMLHttpRequest();
/* set parameter for request */ /* set parameter for request */
request.open(method, encodeURI(adr), true); request.open(method, encodeURI(adr), true);
request.timeout = timeout; request.timeout = timeout;
request.ontimeout = onTimeout; request.ontimeout = onTimeout;
request.onerror = onError; request.onerror = onError;
request.overrideMimeType("application/json"); request.overrideMimeType("application/json");
request.onreadystatechange = function() { request.onreadystatechange = () => {
if(this.readyState == 4){ if (this.readyState == 4 && this.status == 200) {
if(this.status == 200){ callback(this.responseText);
callback(this.responseText);
}
} }
}; };
/* send request */ /* send request */
request.send(); request.send();
console.log(adr); console.log(adr);
} }
function lang(key){ const lang = key => convertLineBreaks(esc(langJson[key]));
return convertLineBreaks(esc(langJson[key]));
}
function parseLang(fileStr){ const parseLang = fileStr => {
langJson = JSON.parse(fileStr); langJson = JSON.parse(fileStr);
if(langJson["lang"] != "en"){// no need to update the HTML
var elements = document.querySelectorAll("[data-translate]"); if (langJson["lang"] !== "en") {
for (i = 0; i < elements.length; i++) { // no need to update the HTML
var element = elements[i]; const elements = document.querySelectorAll("[data-translate]");
element.innerHTML = lang(element.getAttribute("data-translate"));
} [...elements].forEach(item => {
item.innerHTML = lang(element.getAttribute("data-translate"));
})
} }
document.querySelector('html').setAttribute("lang", langJson["lang"] );
document.querySelector('html').setAttribute("lang", langJson["lang"]);
if(typeof load !== 'undefined') load(); if(typeof load !== 'undefined') load();
} }
function loadLang(){ const loadLang = () => {
var language = "default"; //navigator.language.slice(0, 2); const language = "default"; //navigator.language.slice(0, 2);
getFile("lang/" + language + ".lang", const langFunc = () => getFile("lang/en.lang", parseLang);
parseLang,
getFile(
`lang/${language}.lang`,
parseLang,
2000, 2000,
"GET", "GET",
function(){ langFunc,
getFile("lang/en.lang", parseLang); langFunc
}, function(){
getFile("lang/en.lang", parseLang);
}
); );
} }

View File

@@ -1,105 +1,112 @@
var ssidJson = {"random":false,"ssids":[]}; let ssidJson = {
"random": false,
function load(){ "ssids": []
getFile("run?cmd=save ssids", function(){ };
getFile("ssids.json",function(res){
const load = () => {
getFile("run?cmd=save ssids", () =>
getFile("ssids.json", res => {
ssidJson = JSON.parse(res); ssidJson = JSON.parse(res);
draw(); draw();
}); })
}); );
} }
function draw(){ const draw = () => {
var html; let html = `
<tr>
html = "<tr>" <th class="id"></th>
+ "<th class='id'></th>" <th class="ssid"></th>
+ "<th class='ssid'></th>" <th class="lock"></th>
+ "<th class='lock'></th>" <th class="save"></th>
+ "<th class='save'></th>" <th class="remove"></th>
+ "<th class='remove'></th>" </tr>
+ "</tr>"; `;
for(var i=0;i<ssidJson.ssids.length;i++){ ssidJson.ssids.map((item, i) => {
html += "<tr>"
+ "<td class='id'>"+i+"</td>" // ID html += `
+ "<td class='ssid' contenteditable='true' id='ssid_"+i+"'>"+esc(ssidJson.ssids[i][0].substring(0,ssidJson.ssids[i][2]))+"</td>" // SSID <tr>
+ "<td class='lock clickable' onclick='changeEnc("+i+")' id='enc_"+i+"'>"+(ssidJson.ssids[i][1] ? "&#x1f512;" : "-")+"</td>" // Enc <td class="id">${i}</td>
+ "<td class='save'><button class='green' onclick='save("+i+")'>"+lang("save")+"</button></td>" // Save <td class="ssid" contenteditable="true" id="ssid_${i}">${esc(ssidJson.ssids[i][0].substring(0, ssidJson.ssids[i][2]))}</td>
+ "<td class='remove'><button class='red' onclick='remove("+i+")'>X</button></td>" // Remove <td class="lock clickable" onclick="changeEnc(${i})" id="enc_${i}">${ssidJson.ssids[i][1] ? "&#x1f512;" : "-"}</td>
+ "</tr>"; <td class="save">
} <button class="green" onclick="save(${i})">${lang("save")}</button>
</td>
getE("randomBtn").innerHTML = ssidJson.random ? lang("disable_random") : lang("enable_random"); <td class="remove">
<button class="red" onclick="remove(${i})">X</button>
</td>
</tr>
`;
})
getE("randomBtn").innerHTML = lang(ssidJson.random ? "disable_random" : "enable_random");
getE("ssidTable").innerHTML = html; getE("ssidTable").innerHTML = html;
} }
function remove(id){ const remove = id => {
ssidJson.ssids.splice(id, 1); ssidJson.ssids.splice(id, 1);
getFile("run?cmd=remove ssid "+id); getFile(`run?cmd=remove ssid ${id}`);
draw(); draw();
} }
function add(){ const add = () => {
var ssidStr = getE("ssid").value; const ssidStr = getE("ssid").value;
var wpa2 = getE("enc").checked;
var clones = getE("ssidNum").value; if (ssidStr.length > 0) {
var force = getE("overwrite").checked; const wpa2 = getE("enc").checked;
const clones = getE("ssidNum").value;
if(ssidStr.length > 0){ const force = getE("overwrite").checked;
var cmdStr = "add ssid \""+ssidStr+"\""+(force ? " -f":" ")+" -cl "+clones;
if(wpa2) cmdStr += " -wpa2"; const cmdStr = `add ssid "${ssidStr}" ${force ? "-f" : ""} -cl ${clones} ${wpa2 ? -wpa2 : ""}`;
getFile("run?cmd="+cmdStr); getFile(`run?cmd=${cmdStr}`);
for(var i=0;i<clones;i++){ for (let i = 0; i < clones; i++) {
if(ssidJson.ssids.length >= 60) ssidJson.ssids.splice(0,1); if (ssidJson.ssids.length >= 60) ssidJson.ssids.splice(0,1);
ssidJson.ssids.push([ssidStr,wpa2]); ssidJson.ssids.push([ssidStr, wpa2]);
} }
draw(); draw();
} }
} }
function enableRandom(){ const enableRandom = () => {
if(ssidJson.random){ if (ssidJson.random) {
getFile("run?cmd=disable random",function(){ getFile("run?cmd=disable random", load);
load(); } else {
}); getFile(`run?cmd=enable random ${getE("interval").value}`, load);
}else{
getFile("run?cmd=enable random "+getE("interval").value,function(){
load();
});
} }
} }
function disableRandom(){ const disableRandom = () => {
} }
function addSelected(){ const addSelected = () => {
getFile("run?cmd=add ssid -s"+(getE("overwrite").checked ? " -f":"")); getFile(`run?cmd=add ssid -s ${getE("overwrite").checked ? "-f":""}`);
} }
function changeEnc(id){ const changeEnc = id => {
ssidJson.ssids[id][1] = !ssidJson.ssids[id][1]; ssidJson.ssids[id][1] = !ssidJson.ssids[id][1];
draw(); draw();
save(id); save(id);
} }
function removeAll(){ const removeAll = () => {
ssidJson.ssids = []; ssidJson.ssids = [];
getFile("run?cmd=remove ssids"); getFile("run?cmd=remove ssids");
draw(); draw();
} }
function save(id){ const save = id => {
var name = getE("ssid_"+id).innerHTML.replace("<br>","").substring(0,32); const name = getE(`ssid_${id}`).innerHTML.replace("<br>", "").substring(0, 32);
var wpa2 = ssidJson.ssids[id][1]; const wpa2 = ssidJson.ssids[id][1];
ssidJson.ssids[id] = [name,wpa2]; ssidJson.ssids[id] = [name, wpa2];
getFile("run?cmd=replace ssid "+id+" -n \""+name+"\" "+(wpa2 ? "-wpa2" : "")); getFile(`run?cmd=replace ssid ${id} -n "${name}" ${wpa2 ? "-wpa2" : ""}`);
} }