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

@ -2,7 +2,7 @@ Do not redistribute, advertise or sell this software as a "jammer"!!!
MIT License
Copyright (c) 2018 Stefan Kremser
Copyright (c) 2020 Spacehuhn Technologies
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,104 +1,121 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
<script src="js/attack.js"></script>
</head>
<body onload="loadLang()">
<nav>
<a href="scan.html" data-translate="scan">Scan</a>
<a href="ssids.html" data-translate="ssids">SSIDs</a>
<a href="attack.html" data-translate="attacks">Attacks</a>
<a href="settings.html" data-translate="settings">Settings</a>
<a class="right" href="info.html" data-translate="info">Info</a>
</nav>
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="attacks">Attacks</h1>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="attack_info">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
<script src="js/attack.js"></script>
</head>
<body onload="loadLang()">
<nav>
<ul class="menu">
<li><a href="scan.html" data-translate="scan">Scan</a></li>
<li><a href="ssids.html" data-translate="ssids">SSIDs</a></li>
<li><a href="attack.html" data-translate="attacks">Attack</a></li>
<li><a href="settings.html" data-translate="settings">Settings</a></li>
</ul>
</nav>
<div id="status"></div>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header" data-translate="attacks">Attacks</h1>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="attack_info">
- You might lose connection when starting an attack!<br>
- You need to select a target for the deauth attack.<br>
- You need a saved SSID for the beacon and probe attack.<br>
- Click reload to refresh the packet rate.<br>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and look at the serial monitor for further debugging.</span><br>
</p>
<button onclick="load()" class="right" data-translate="reload">reload</button>
<table>
<tr>
<th data-translate="attacks">Attacks</th>
<th data-translate="targets">Targets</th>
<th>Pkts/s</th>
<th data-translate="start_stop">START / STOP</th>
</tr>
<tr>
<td>Deauth</td>
<td id="deauthTargets">0</td>
<td id="deauthPkts">0/0</td>
<td><button id="deauth" onclick="start(0)" class="select" data-translate="start">START</button></td>
</tr>
<tr>
<td>Beacon</td>
<td id="beaconTargets">0</td>
<td id="beaconPkts">0/0</td>
<td><button id="beacon" onclick="start(1)" class="select" data-translate="start">START</button></td>
</tr>
<tr>
<td>Probe</td>
<td id="probeTargets">0</td>
<td id="probePkts">0/0</td>
<td><button id="probe" onclick="start(2)" class="select" data-translate="start">START</button></td>
</tr>
<tr>
<td colspan="2">All Pkts/s:</td>
<td colspan="2" id="allpkts">0</td>
</tr>
</table>
<h2>Deauth</h2>
<p data-translate="deauth_desc">
Closes the connection of WiFi devices by sending deauthentication frames to access points and client devices you selected.<br>
This is only possible because a lot of devices don't use the 802.11w-2009 standard that offers a protection against this attack.<br>
Please only select one target! When you select multiple targets that run on different channels and start the attack,
it will quickly switch between those channels and you have no chance to reconnect to the access point that hosts this web interface.
</p>
<h2>Beacon</h2>
<p data-translate="beacon_desc">
Beacon packets are used to advertise access points. By continuously sending beacon packets out, it will look like you created new WiFi networks.<br>
You can specify the network names under SSIDs.<br>
</p>
<h2>Probe</h2>
<p data-translate="probe_desc">
Probe requests are sent by client devices to ask if a known network is nearby.<br>
Use this attack to confuse WiFi trackers by asking for networks that you specified in the SSID list.<br>
It's unlikely you will see any impact by this attack with your home network.<br>
</p>
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and
look at the serial monitor for further debugging.</span><br>
</p>
<button onclick="load()" class="right" data-translate="reload">reload</button>
<table>
<tr>
<th data-translate="attacks">Attacks</th>
<th data-translate="targets">Targets</th>
<th>Pkts/s</th>
<th data-translate="start_stop">START / STOP</th>
</tr>
<tr>
<td>Deauth</td>
<td id="deauthTargets">0</td>
<td id="deauthPkts">0/0</td>
<td><button id="deauth" onclick="start(0)" class="select" data-translate="start">START</button>
</td>
</tr>
<tr>
<td>Beacon</td>
<td id="beaconTargets">0</td>
<td id="beaconPkts">0/0</td>
<td><button id="beacon" onclick="start(1)" class="select" data-translate="start">START</button>
</td>
</tr>
<tr>
<td>Probe</td>
<td id="probeTargets">0</td>
<td id="probePkts">0/0</td>
<td><button id="probe" onclick="start(2)" class="select" data-translate="start">START</button>
</td>
</tr>
<tr>
<td colspan="2">All Pkts/s:</td>
<td colspan="2" id="allpkts">0</td>
</tr>
</table>
<h2>Deauth</h2>
<p data-translate="deauth_desc">
Closes the connection of WiFi devices by sending deauthentication frames to access points and client
devices you selected.<br>
This is only possible because a lot of devices don't use the 802.11w-2009 standard that offers a
protection against this attack.<br>
Please only select one target! When you select multiple targets that run on different channels and
start the attack,
it will quickly switch between those channels and you have no chance to reconnect to the access
point that hosts this web interface.
</p>
<h2>Beacon</h2>
<p data-translate="beacon_desc">
Beacon packets are used to advertise access points. By continuously sending beacon packets out, it
will look like you created new WiFi networks.<br>
You can specify the network names under SSIDs.<br>
</p>
<h2>Probe</h2>
<p data-translate="probe_desc">
Probe requests are sent by client devices to ask if a known network is nearby.<br>
Use this attack to confuse WiFi trackers by asking for networks that you specified in the SSID
list.<br>
It's unlikely you will see any impact by this attack with your home network.<br>
</p>
</div>
</div>
</body>
</html>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

View File

@ -1,52 +1,60 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
</head>
<body onload="loadLang()">
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="warning">WARNING</h1>
<p class="centered" data-translate="disclaimer">
This project is a proof of concept for testing and educational purposes.<br>
Neither the ESP8266, nor its SDK was meant or build for such purposes. Bugs can occur!<br>
<br>
Use it only against your own networks and devices!<br>
<br>
It uses valid Wi-Fi frames described in the IEEE 802.11 standard and does not block or disrupt any frequencies.<br>
Please check the legal regulations in your country before using it.<br>
<br>
Please don't refer to this project as "jammer", that totally undermines the real purpose of this project!<br>
If you do, it only proves that you didn't understand anything of what this project stands for.<br>
Publishing content about this without without a proper explanation shows that you only do it for the clicks,
fame and/or money and have no respect for intellectual property, the community behind it and the fight for a better WiFi standard.<br>
<br>
For more information visit:
</p>
<p class="centered bold">
<a href="https://github.com/spacehuhn/esp8266_deauther">github.com/spacehuhn/esp8266_deauther</a><br>
<br>
<br>
<a class="button" href="scan.html" data-translate="disclaimer-button">I have read and understood the notice above</a>
</p>
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
</head>
<body onload="loadLang()">
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header" data-translate="warning">WARNING</h1>
<p class="centered" data-translate="disclaimer">
This project is a proof of concept for testing and educational purposes.<br>
Neither the ESP8266, nor its SDK was meant or build for such purposes. Bugs can occur!<br>
<br>
Use it only against your own networks and devices!<br>
<br>
It uses valid Wi-Fi frames described in the IEEE 802.11 standard and does not block or disrupt any
frequencies.<br>
Please check the legal regulations in your country before using it.<br>
<br>
Please don't refer to this project as "jammer", as it undermines the real purpose of this
project!<br>
If you do, it only proves that you didn't understand anything of what this project stands for.<br>
Publishing content about this without without a proper explanation shows that you only do it for the
clicks,
fame and/or money and have no respect for intellectual property, the community behind it and the
fight for a better WiFi standard.<br>
<br>
For more information visit:<br>
<a
href="https://github.com/spacehuhntech/esp8266_deauther">github.com/spacehuhntech/esp8266_deauther</a>
</p>
<p class="centered bold">
<a class="button" href="scan.html" data-translate="disclaimer-button">I have read and understood the
notice above</a>
</p>
</div>
</div>
</body>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

View File

@ -1,88 +1,121 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
</head>
<body onload="loadLang()">
<nav>
<a href="scan.html" data-translate="scan">Scan</a>
<a href="ssids.html" data-translate="ssids">SSIDs</a>
<a href="attack.html" data-translate="attacks">Attacks</a>
<a href="settings.html" data-translate="settings">Settings</a>
<a class="right" href="info.html" data-translate="info">Info</a>
</nav>
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="info">Info</h1>
<h2>ESP8266 Deauther</h2>
<p>
<span class="bold">Copyright (c) 2018 Stefan Kremser</span><br />
<br />
This project is licensed under the MIT License. See the <a href="LICENSE">license file</a> for details.<br />
The source code is available on <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a>.<br />
<br />
Use it only for testing or educational purposes against your own networks and devices!<br />
<br />
<span class="bold">Please don't refer to this project as "jammer", that totally undermines the real purpose of this project!</span>
</p>
<h2>Credits</h2>
<p>
A huge thanks to:<br>
<ul>
<li><a href="http://github.com/deantonious" target="_blank">@deantonious</a></li>
<li><a href="http://github.com/jLynx" target="_blank">@jLynx</a></li>
<li><a href="http://github.com/lspoplove" target="_blank">@lspoplove</a></li>
<li><a href="http://github.com/schinfo" target="_blank">@schinfo</a></li>
<li><a href="http://github.com/tobozo" target="_blank">@tobozo</a></li>
<li><a href="http://github.com/xdavidhu" target="_blank">@xdavidhu</a></li>
<li><a href="http://github.com/PwnKitteh" target="_blank">@PwnKitteh</a></li>
</ul>
for helping out with various things regarding this project and keeping it alive!<br>
<br>
I also want to thank Espressif and their community for this awesome chip and all the software and hardware projects around it and the countless tutorials you can find online!<br>
<br>
Shoutout to everyone working on the libraries used for this project:<br>
<ul>
<li><a href="https://github.com/ThingPulse/esp8266-oled-ssd1306" target="_blank">esp8266-oled-ssd1306</a></li>
<li><a href="https://github.com/bblanchon/ArduinoJson" target="_blank">ArduinoJson</a></li>
<li><a href="https://github.com/ivanseidel/LinkedList" target="_blank">LinkedList</a></li>
</ul>
<br>
Also thanks to everyone that supports this project by <a href="http://spacehuhn.de/donate" target="_blank">donating]</a>, beeing my <a href="http://patreon.com/spacehuhn" target="_blank">patron</a> or buying one of the <a href="https://www.tindie.com/stores/lspoplove" target="_blank">official Deauther boards</a> from DSTIKE.<br>
</p>
<h2>Contact</h2>
<p>
Web: <a target="_blank" href="http://spacehuhn.com/">spacehuhn.com</a><br>
GitHub: <a target="_blank" href="http://github.com/spacehuhn/">github.com/spacehuhn</a><br />
Twitter: <a target="_blank" href="http://twitter.com/spacehuhn/">@spacehuhn</a><br />
E-mail: mail@spacehuhn.com<br />
<br>
If you would like to support me with my projects, please consider becoming a patron on <a target="_blank" href="https://patreon.com/spacehuhn">patreon.com/spacehuhn</a>.<br />
<br>
Or buy the official hardware for this project from DSTIKE on <a target="_blank" href="https://www.tindie.com/stores/lspoplove/">tindie.com/stores/lspoplove</a>.
</p>
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
</head>
<body onload="loadLang()">
<nav>
<ul class="menu">
<li><a href="scan.html" data-translate="scan">Scan</a></li>
<li><a href="ssids.html" data-translate="ssids">SSIDs</a></li>
<li><a href="attack.html" data-translate="attacks">Attack</a></li>
<li><a href="settings.html" data-translate="settings">Settings</a></li>
</ul>
</nav>
<div id="status"></div>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header">Credits</h1>
<h2>Disclaimer</h2>
<p data-translate="disclaimer">
This project is a proof of concept for testing and educational purposes.<br>
Neither the ESP8266, nor its SDK was meant or build for such purposes. Bugs can occur!<br>
<br>
Use it only against your own networks and devices!<br>
<br>
It uses valid Wi-Fi frames described in the IEEE 802.11 standard and does not block or disrupt any
frequencies.<br>
Please check the legal regulations in your country before using it.<br>
<br>
Please don't refer to this project as "jammer", as it undermines the real purpose of this
project!<br>
If you do, it only proves that you didn't understand anything of what this project stands for.<br>
Publishing content about this without without a proper explanation shows that you only do it for the
clicks,
fame and/or money and have no respect for intellectual property, the community behind it and the
fight for a better WiFi standard.<br>
<br>
For more information visit:<br>
<a
href="https://github.com/spacehuhntech/esp8266_deauther">github.com/spacehuhntech/esp8266_deauther</a>
</p>
<h2>Acknowledgements</h2>
<p>
A huge thanks to:<br>
<ul>
<li><a href="http://github.com/deantonious" target="_blank">@deantonious</a></li>
<li><a href="http://github.com/jLynx" target="_blank">@jLynx</a></li>
<li><a href="http://github.com/lspoplove" target="_blank">@lspoplove</a></li>
<li><a href="http://github.com/schinfo" target="_blank">@schinfo</a></li>
<li><a href="http://github.com/tobozo" target="_blank">@tobozo</a></li>
<li><a href="http://github.com/xdavidhu" target="_blank">@xdavidhu</a></li>
<li><a href="http://github.com/PwnKitteh" target="_blank">@PwnKitteh</a></li>
</ul>
for helping out with various things regarding this project and keeping it alive!<br>
<br>
Also thanks to everyone working on the libraries used for this project:<br>
<ul>
<li><a href="https://github.com/ThingPulse/esp8266-oled-ssd1306"
target="_blank">esp8266-oled-ssd1306</a></li>
<li><a href="https://github.com/bblanchon/ArduinoJson" target="_blank">ArduinoJson</a></li>
<li><a href="https://github.com/adafruit/Adafruit_DotStar" target="_blank">Adafruit DotStar</a></li>
<li><a href="https://github.com/adafruit/Adafruit_NeoPixel" target="_blank">Adafruit NeoPixel</a>
</li>
<li><a href="https://github.com/NorthernWidget/DS3231" target="_blank">DS3231</a></li>
<li><a href="https://github.com/xoseperez/my92xx" target="_blank">my92xx</a></li>
</ul>
We also thank Espressif and their community for this awesome chip and all the software and
hardware projects around it and the countless tutorials you can find online!<br>
</p>
<h2>License</h2>
<p>
<b>In regards to the firmware:</b><br>
<br>
MIT License<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<br>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:<br>
<br>
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.<br>
<br>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</p>
</div>
</div>
</body>
</html>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

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" : ""));
}

View File

@ -1,23 +0,0 @@
MIT License
Copyright (c) 2018 Stefan Kremser
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
Do not redistribute, advertising or sell of this softwae as "jammer"!
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,110 +1,120 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
<script src="js/scan.js"></script>
</head>
<body onload="loadLang()">
<nav>
<a href="scan.html" data-translate="scan">Scan</a>
<a href="ssids.html" data-translate="ssids">SSIDs</a>
<a href="attack.html" data-translate="attacks">Attacks</a>
<a href="settings.html" data-translate="settings">Settings</a>
<a class="right" href="info.html" data-translate="info">Info</a>
</nav>
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="scan">Scan</h1>
<button id=scanZero onclick="scan(0)">Scan APs</button>
<button id=scanOne onclick="scan(1)">Scan Stations</button>
<button id=RButton onclick="load()" data-translate="reload" class="right">Reload</button>
</div>
</div>
<div class="row">
<div class="col-6">
<label for="ch" data-translate="channel">Channel</label>
</div>
<div class="col-6">
<select id="ch" name="ch">
<option value="all" data-translate="all">All</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
</select>
</div>
</div>
<div class="row">
<div class="col-6">
<label data-translate="station_scan_time">Station Scan Time</label>
</div>
<div class="col-6">
<input type="number" value="15" id="scanTime">s
</div>
</div>
<div class="row">
<div class="col-12">
<p>
<span class="red" data-translate="info_span">INFO: </span><br>
<span data-translate="scan_info">
- Click Scan and wait until the blue LED on your board turns off (or changes to green), then click on Reload.<br>
- The web interface will be unavailable during a station scan and you will have to reconnect!<br>
- Please select only one target!<br>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and look at the serial monitor for further debugging.</span>
</p>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<hr>
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<h2><span>Access Points</span>: <span id="apNum"></span></h2>
<table id="apTable"></table>
<button onclick="selectAll(0,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(0,false)" data-translate="deselect_all">deselect all</button>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
<script src="js/scan.js"></script>
</head>
<hr>
<body onload="loadLang()">
<nav>
<ul class="menu">
<li><a href="scan.html" data-translate="scan">Scan</a></li>
<li><a href="ssids.html" data-translate="ssids">SSIDs</a></li>
<li><a href="attack.html" data-translate="attacks">Attack</a></li>
<li><a href="settings.html" data-translate="settings">Settings</a></li>
</ul>
</nav>
<h2><span>Stations</span>: <span id="stNum"></span></h2>
<table id="stTable"></table>
<button onclick="selectAll(1,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(1,false)" data-translate="deselect_all">deselect all</button>
<div id="status"></div>
<hr>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header" data-translate="scan">Scan</h1>
<h2><span data-translate="devices">Saved Devices</span>: <span id="nNum"></span></h2>
<table id="nTable"></table>
<button onclick="selectAll(2,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(2,false)" data-translate="deselect_all">deselect all</button>
<button onclick="add(2)" data-translate="new">new</button>
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
<button id=scanZero onclick="scan(0)">Scan APs</button>
<button id=scanOne onclick="scan(1)">Scan Stations</button>
<button id=RButton onclick="load()" data-translate="reload" class="right">Reload</button>
</div>
</div>
</body>
</html>
<div class="row">
<div class="col-6">
<label for="ch" data-translate="channel">Channel</label>
</div>
<div class="col-6">
<select id="ch" name="ch">
<option value="all" data-translate="all">All</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
</select>
</div>
</div>
<div class="row">
<div class="col-6">
<label data-translate="station_scan_time">Station Scan Time</label>
</div>
<div class="col-6">
<input type="number" value="15" id="scanTime">s
</div>
</div>
<div class="row">
<div class="col-12">
<p>
<span class="red" data-translate="info_span">INFO: </span><br>
<span data-translate="scan_info">
- Click Scan and wait until the blue LED on your board turns off (or changes to green), then
click on Reload.<br>
- The web interface will be unavailable during a station scan and you will have to
reconnect!<br>
- Please select only one target!<br>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and
look at the serial monitor for further debugging.</span>
</p>
<hr>
<h2><span>Access Points</span>: <span id="apNum"></span></h2>
<table id="apTable"></table>
<button onclick="selectAll(0,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(0,false)" data-translate="deselect_all">deselect all</button>
<hr>
<h2><span>Stations</span>: <span id="stNum"></span></h2>
<table id="stTable"></table>
<button onclick="selectAll(1,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(1,false)" data-translate="deselect_all">deselect all</button>
<hr>
<h2><span data-translate="devices">Saved Devices</span>: <span id="nNum"></span></h2>
<table id="nTable"></table>
<button onclick="selectAll(2,true)" data-translate="select_all">select all</button>
<button onclick="selectAll(2,false)" data-translate="deselect_all">deselect all</button>
<button onclick="add(2)" data-translate="new">new</button>
</div>
</div>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

View File

@ -1,64 +1,66 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
<script src="js/settings.js"></script>
</head>
<body onload="loadLang()">
<nav>
<a href="scan.html" data-translate="scan">Scan</a>
<a href="ssids.html" data-translate="ssids">SSIDs</a>
<a href="attack.html" data-translate="attacks">Attacks</a>
<a href="settings.html" data-translate="settings">Settings</a>
<a class="right" href="info.html" data-translate="info">Info</a>
</nav>
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="settings">Settings</h1>
<button onclick="getFile('run?cmd=stopap')" class="red" data-translate="wifi_off">WiFi off</button>
<button onclick="getFile('run?cmd=reset;;save settings')" class="red" data-translate="reset">Reset</button>
<button onclick="getFile('run?cmd=reboot')" class="red right" data-translate="reboot">reboot</button>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="settings_info">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
<script src="js/settings.js"></script>
</head>
<body onload="loadLang()">
<nav>
<ul class="menu">
<li><a href="scan.html" data-translate="scan">Scan</a></li>
<li><a href="ssids.html" data-translate="ssids">SSIDs</a></li>
<li><a href="attack.html" data-translate="attacks">Attack</a></li>
<li><a href="settings.html" data-translate="settings">Settings</a></li>
</ul>
</nav>
<div id="status"></div>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header" data-translate="settings">Settings</h1>
<button onclick="getFile('run?cmd=stopap')" class="red" data-translate="wifi_off">WiFi off</button>
<button onclick="getFile('run?cmd=reset;;save settings')" class="red"
data-translate="reset">Reset</button>
<button onclick="getFile('run?cmd=reboot')" class="red right" data-translate="reboot">reboot</button>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="settings_info">
- Some settings require a reboot.<br>
- Click save to make sure that your changes are applied.<br>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and look at the serial monitor for further debugging.</span><br>
</p>
<button onclick="save()" data-translate="save">save</button>
<button onclick="load()" class="right" data-translate="reload">reload</button>
</div>
</div>
<div id="settingsList"></div>
<div class="row">
<div class="col-12">
<button onclick="save()" class="green">save</button>
<button onclick="load()">reload</button>
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and
look at the serial monitor for further debugging.</span><br>
</p>
<button onclick="save()" data-translate="save">save</button>
<button onclick="load()" class="right" data-translate="reload">reload</button>
</div>
</div>
</body>
</html>
<div id="settingsList"></div>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

View File

@ -1,114 +1,120 @@
<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="description" content="ESP8266 Deauther">
<meta name="author" content="Spacehuhn - Stefan Kremser">
<meta name="theme-color" content="#36393E" />
<title>ESP8266 Deauther</title>
<link rel="stylesheet" href="style.css">
<script src="js/site.js"></script>
<script src="js/ssids.js"></script>
</head>
<body onload="loadLang()">
<nav>
<a href="scan.html" data-translate="scan">Scan</a>
<a href="ssids.html" data-translate="ssids">SSIDs</a>
<a href="attack.html" data-translate="attacks">Attacks</a>
<a href="settings.html" data-translate="settings">Settings</a>
<a class="right" href="info.html" data-translate="info">Info</a>
</nav>
<div class="container">
<div class="row">
<div class="col-12">
<div id="error" class="hide"></div>
<h1 class="header" data-translate="ssids">SSIDs</h1>
</div>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8, minimal-ui">
<meta name="theme-color" content="#36393E">
<meta name="description" content="ESP8266 Deauther">
<title>ESP8266 Deauther</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="js/site.js"></script>
<script src="js/ssids.js"></script>
</head>
<body onload="loadLang()">
<nav>
<ul class="menu">
<li><a href="scan.html" data-translate="scan">Scan</a></li>
<li><a href="ssids.html" data-translate="ssids">SSIDs</a></li>
<li><a href="attack.html" data-translate="attacks">Attack</a></li>
<li><a href="settings.html" data-translate="settings">Settings</a></li>
</ul>
</nav>
<div id="status"></div>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="header" data-translate="ssids">SSIDs</h1>
</div>
<div class="row">
<div class="col-6">
<label for="ssid">SSID</label>
</div>
<div class="col-6">
<input type="text" id="ssid" name="ssid" placeholder="SSID" maxlength="32">
</div>
</div>
<div class="row">
<div class="col-6">
<label for="ssid">SSID</label>
</div>
<div class="row">
<div class="col-6">
<label>WPA2</label>
</div>
<div class="col-6">
<label class='checkBoxContainer'><input id="enc" type='checkbox'><span class='checkmark'></span></label>
</div>
<div class="col-6">
<input type="text" id="ssid" name="ssid" placeholder="SSID" maxlength="32">
</div>
<div class="row">
<div class="col-6">
<label data-translate="number">Number</label>
</div>
<div class="col-6">
<input id="ssidNum" type="number" value="1" max="60" min="1">
</div>
</div>
<div class="row">
<div class="col-6">
<label>WPA2</label>
</div>
<div class="row">
<div class="col-6">
<label data-translate="overwrite">Overwrite</label>
</div>
<div class="col-6">
<label class='checkBoxContainer'><input id="overwrite" type='checkbox' checked><span class='checkmark'></span></label>
</div>
<div class="col-6">
<label class='checkBoxContainer'><input id="enc" type='checkbox'><span class='checkmark'></span></label>
</div>
<div class="row">
<div class="col-12">
<button onclick="add()" data-translate="add">add</button>
<button onclick="addSelected()" data-translate="add_selected">clone selected APs</button>
</div>
</div>
<div class="row">
<div class="col-6">
<label data-translate="number">Number</label>
</div>
<div class="row">
<div class="col-12">
<button onclick="load()" class="right" data-translate="reload">Reload</button>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="ssids_info">
<div class="col-6">
<input id="ssidNum" type="number" value="1" max="60" min="1">
</div>
</div>
<div class="row">
<div class="col-6">
<label data-translate="overwrite">Overwrite</label>
</div>
<div class="col-6">
<label class='checkBoxContainer'><input id="overwrite" type='checkbox' checked><span
class='checkmark'></span></label>
</div>
</div>
<div class="row">
<div class="col-12">
<button onclick="add()" data-translate="add">add</button>
<button onclick="addSelected()" data-translate="add_selected">clone selected APs</button>
</div>
</div>
<div class="row">
<div class="col-12">
<button onclick="load()" class="right" data-translate="reload">Reload</button>
<p>
<span class="red" data-translate="info_span">INFO:</span><br>
<span data-translate="ssids_info">
- This SSID list is used for the beacon and probe attack.<br>
- Each SSID can be up to 32 characters.<br>
- Don't forget to click save when you edited a SSID.<br>
- You have to click Reload after cloning SSIDs.<br>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and look at the serial monitor for further debugging.</span><br>
</p>
<hr>
</div>
</div>
<div class="row">
<div class="col-6">
<label for="interval" data-translate="time_interval">Time Interval</label>
</div>
<div class="col-6">
<input id="interval" name="interval" type="number" value="10" max="600" min="1">s
</div>
</div>
<div class="row">
<div class="col-12">
<button onclick="enableRandom()" id="randomBtn">Enable Random Mode</button>
<p data-translate="random_desc">Enable the random mode to generate a random SSID list in a given interval.</p>
<hr>
<table id="ssidTable"></table>
<button onclick="removeAll()" class="red" data-translate="remove_all">Remove All</button>
</div>
</div>
<div class="row">
<div class="col-12">
<div id="copyright">
<a href="https://github.com/spacehuhn/esp8266_deauther/wiki" target="_blank">Wiki</a> | <a href="https://github.com/spacehuhn/esp8266_deauther" target="_blank">GitHub</a><br>
<br>
Version 2.5<br>
Copyright (c) 2020 Spacehuhn Technologies<br>
<a href="https://github.com/spacehuhn" target="_blank">github.com/spacehuhn</a>
</div>
</div>
</span>
<span data-translate="info_disclaimer">In case of an unexpected error, please reload the site and
look at the serial monitor for further debugging.</span><br>
</p>
<hr>
</div>
</div>
</body>
</html>
<div class="row">
<div class="col-6">
<label for="interval" data-translate="time_interval">Time Interval</label>
</div>
<div class="col-6">
<input id="interval" name="interval" type="number" value="10" max="600" min="1">s
</div>
</div>
<div class="row">
<div class="col-12">
<button onclick="enableRandom()" id="randomBtn">Enable Random Mode</button>
<p data-translate="random_desc">Enable the random mode to generate a random SSID list in a given
interval.</p>
<hr>
<table id="ssidTable"></table>
<button onclick="removeAll()" class="red" data-translate="remove_all">Remove All</button>
</div>
</div>
</div>
<footer>
<span id="version">Version 2.6.0</span>
<br>
<br>
<a href="http://deauther.maltronics.com" target="_blank">Wiki</a> | <a href="info.html">Credits</a>
</footer>
</body>
</html>

View File

@ -1,3 +1,5 @@
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
/* Global */
body {
background: #36393e;
@ -13,7 +15,7 @@ h1 {
color: #bfbfbb;
padding: 0.2em 1em;
border-radius: 3px;
border-left: solid #4974a9 5px;
border-left: solid #20c20e 5px;
font-weight: 100;
}
@ -24,7 +26,7 @@ h2 {
color: #bfbfbb;
padding: 0.4em 1.8em;
border-radius: 3px;
border-left: solid #4974a9 5px;
border-left: solid #20c20e 5px;
font-weight: 100;
}
@ -84,13 +86,14 @@ p{
text-decoration: underline;
}
#error {
text-align: center;
color: #fff;
background: #af3535;
border-radius: 5px;
padding: 10px;
margin-top: 10px;
#status {
text-align: center;
text-transform: capitalize;
padding: 5px;
color: #fff;
position: sticky;
top: 0;
z-index: 99;
}
#closeError{
@ -100,8 +103,8 @@ p{
cursor: pointer;
}
#copyright{
font-size: 0.95em;
footer {
font-size: .95em;
text-align: center;
margin-top: 3em;
margin-bottom: 3em;
@ -274,24 +277,35 @@ th, td {
}
}
/* Navigation bar */
nav {
display: block;
padding: 8px 10px;
background: #2f3136;
background: #1d2236
font-weight: bold;
padding: 0 10px;
}
nav a {
color: #bfbfbf;
padding: 0.5em;
display: inline-block;
text-decoration: none;
color: inherit;
padding: 0 .5em;
}
nav a:hover{
background: #36393f;
color:#cecece;
border-radius: 4px;
.menu {
list-style-type: none;
margin: 0;
padding: 0;
margin: 0 auto;
display: flex;
flex-direction: row;
display:block;
}
.menu li {
margin: 10px 20px 10px 0;
display: inline-block;
}
.menu li:last-child {
float: right;
}
/* Inputs and buttons */