2021-01-11 18:04:59 +01:00
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
2020-05-07 23:25:37 +02:00
var nameJson = [ ] ;
2021-01-11 18:04:59 +01:00
var scanJson = { aps : [ ] , stations : [ ] } ;
function drawScan ( ) {
2020-05-07 23:25:37 +02:00
var html ;
var selected ;
var width ;
var color ;
var macVendor ;
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
// Access Points
getE ( "apNum" ) . innerHTML = scanJson . aps . length ;
2020-05-07 23:25:37 +02:00
html = "<tr>"
+ "<th class='id'></th>"
+ "<th class='ssid'>SSID</th>"
+ "<th class='name'>Name</th>"
+ "<th class='ch'>Ch</th>"
+ "<th class='rssi'>RSSI</th>"
+ "<th class='enc'>Enc</th>"
+ "<th class='lock'></th>"
+ "<th class='mac'>MAC</th>"
+ "<th class='vendor'>Vendor</th>"
+ "<th class='selectColumn'></th>"
+ "<th class='remove'></th>"
+ "</tr>" ;
2021-01-11 18:04:59 +01:00
for ( var i = 0 ; i < scanJson . aps . length ; i ++ ) {
selected = scanJson . aps [ i ] [ scanJson . aps [ i ] . length - 1 ] ;
2020-05-07 23:25:37 +02:00
width = parseInt ( scanJson . aps [ i ] [ 3 ] ) + 130 ;
2018-03-24 18:15:59 +01:00
2021-01-11 18:04:59 +01:00
if ( width < 50 ) color = "meter_red" ;
else if ( width < 70 ) color = "meter_orange" ;
2018-03-24 18:15:59 +01:00
else color = "meter_green" ;
2021-01-11 18:04:59 +01:00
2020-05-07 23:25:37 +02:00
html += ( selected ? "<tr class='selected'>" : "<tr>" )
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
// RSSI
2021-01-11 18:04:59 +01:00
+ "<td class='rssi'><div class='meter_background'> <div class='meter_forground " + color + "' style='width: " + width + "%;'><div class='meter_value'>" + scanJson . aps [ i ] [ 3 ] + "</div></div> </div></td>"
+ "<td class='enc'>" + esc ( scanJson . aps [ i ] [ 4 ] ) + "</td>" // ENC
+ "<td class='lock'>" + ( scanJson . aps [ i ] [ 4 ] == "-" ? "" : "🔒" ) + "</td>" // Lock Emoji
+ "<td class='mac'>" + esc ( scanJson . aps [ i ] [ 5 ] ) + "</td>" // MAC
+ "<td class='vendor'>" + esc ( scanJson . aps [ i ] [ 6 ] ) + "</td>" // Vendor
2020-05-07 23:25:37 +02:00
// Select
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
+ "</tr>" ;
}
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
getE ( "apTable" ) . innerHTML = html ;
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
// Stations
getE ( "stNum" ) . innerHTML = scanJson . stations . length ;
2020-05-07 23:25:37 +02:00
html = "<tr>"
+ "<th class='id'></th>"
+ "<th class='vendor'>Vendor</th>"
+ "<th class='mac'>MAC</th>"
+ "<th class='ch'>Ch</th>"
+ "<th class='name'>Name</th>"
+ "<th class='pkts'>Pkts</th>"
+ "<th class='ap'>AP</th>"
+ "<th class='lastseen'>Last seen</th>"
+ "<th class='selectColumn'></th>"
+ "<th class='remove'></th>"
+ "</tr>" ;
2021-01-11 18:04:59 +01:00
for ( var i = 0 ; i < scanJson . stations . length ; i ++ ) {
selected = scanJson . stations [ i ] [ scanJson . stations [ i ] . length - 1 ] ;
2020-05-07 23:25:37 +02:00
ap = "" ;
2021-01-11 18:04:59 +01:00
if ( scanJson . stations [ i ] [ 5 ] >= 0 )
2020-05-07 23:25:37 +02:00
ap = esc ( scanJson . aps [ scanJson . stations [ i ] [ 5 ] ] [ 0 ] ) ;
2021-01-11 18:04:59 +01:00
2020-05-07 23:25:37 +02:00
html += ( selected ? "<tr class='selected'>" : "<tr>" )
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
// Select
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
+ "</tr>" ;
}
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
getE ( "stTable" ) . innerHTML = html ;
}
2021-01-11 18:04:59 +01:00
function drawNames ( ) {
2020-05-07 23:25:37 +02:00
var html ;
var selected ;
2021-01-11 18:04:59 +01:00
2020-05-07 23:25:37 +02:00
// Names
2018-03-24 18:15:59 +01:00
getE ( "nNum" ) . innerHTML = nameJson . length ;
2020-05-07 23:25:37 +02:00
html = "<tr>"
+ "<th class='id'></th>"
+ "<th class='mac'>MAC</th>"
+ "<th class='vendor'>Vendor</th>"
+ "<th class='name'>Name</th>"
+ "<th class='ap'>AP-BSSID</th>"
+ "<th class='ch'>Ch</th>"
+ "<th class='save'></th>"
+ "<th class='selectColumn'></th>"
+ "<th class='remove'></th>"
+ "</tr>" ;
2021-01-11 18:04:59 +01:00
for ( var i = 0 ; i < nameJson . length ; i ++ ) {
selected = nameJson [ i ] [ nameJson [ i ] . length - 1 ] ;
2020-05-07 23:25:37 +02:00
html += ( selected ? "<tr class='selected'>" : "<tr>" )
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
// Select
2021-01-11 18:04:59 +01:00
+ "<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
2020-05-07 23:25:37 +02:00
+ "</tr>" ;
}
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
getE ( "nTable" ) . innerHTML = html ;
}
2021-01-11 18:04:59 +01:00
2019-04-19 15:58:59 +02:00
var duts ;
var elxtime ;
2021-01-11 18:04:59 +01:00
function scan ( type ) {
2019-04-19 15:58:59 +02:00
getE ( 'RButton' ) . disabled = true ;
2021-01-11 18:04:59 +01:00
switch ( type ) {
2019-04-19 15:58:59 +02:00
case 0 :
getE ( 'scanOne' ) . disabled = true ;
getE ( 'scanZero' ) . style . visibility = 'hidden' ;
elxtime = 2450 ;
break ;
case 1 :
getE ( 'scanZero' ) . disabled = true ;
getE ( 'scanOne' ) . style . visibility = 'hidden' ;
2021-01-11 18:04:59 +01:00
elxtime = parseInt ( getE ( "scanTime" ) . value + "000" ) + 1500 ;
2019-04-19 15:58:59 +02:00
}
2018-03-24 18:15:59 +01:00
var cmdStr = "scan "
2021-01-11 18:04:59 +01:00
+ ( type == 0 ? "aps " : "stations -t " + getE ( "scanTime" ) . value + "s" )
+ " -ch " + getE ( "ch" ) . options [ getE ( "ch" ) . selectedIndex ] . value ;
getFile ( "run?cmd=" + cmdStr ) ;
2019-04-19 15:58:59 +02:00
duts = parseInt ( type ) ;
setTimeout ( buttonFunc , elxtime )
}
2021-01-11 18:04:59 +01:00
function buttonFunc ( ) {
2019-04-19 15:58:59 +02:00
switch ( duts ) {
case 0 :
getE ( 'scanZero' ) . style . visibility = 'visible' ;
getE ( 'scanOne' ) . disabled = false ;
break ;
case 1 :
getE ( 'scanOne' ) . style . visibility = 'visible' ;
getE ( 'scanZero' ) . disabled = false ;
}
getE ( 'RButton' ) . disabled = false ;
2018-03-24 18:15:59 +01:00
}
2021-01-11 18:04:59 +01:00
function load ( ) {
2018-03-24 18:15:59 +01:00
// APs and Stations
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=save scan" , function ( ) {
getFile ( "scan.json" , function ( res ) {
2018-03-24 18:15:59 +01:00
scanJson = JSON . parse ( res ) ;
drawScan ( ) ;
2020-05-07 23:25:37 +02:00
} ) ;
} ) ;
2018-03-24 18:15:59 +01:00
// Names
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=save names" , function ( ) {
getFile ( "names.json" , function ( res ) {
2018-03-24 18:15:59 +01:00
nameJson = JSON . parse ( res ) ;
drawNames ( ) ;
2020-05-07 23:25:37 +02:00
} ) ;
} ) ;
2018-03-24 18:15:59 +01:00
}
2021-01-11 18:04:59 +01:00
function selectRow ( type , id , selected ) {
switch ( type ) {
2018-03-24 18:15:59 +01:00
case 0 :
2020-05-07 23:25:37 +02:00
scanJson . aps [ id ] [ 7 ] = selected ;
drawScan ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( selected ? "" : "de" ) + "select ap " + id ) ;
2020-05-07 23:25:37 +02:00
break ;
2018-03-24 18:15:59 +01:00
case 1 :
2020-05-07 23:25:37 +02:00
scanJson . stations [ id ] [ 7 ] = selected ;
drawScan ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( selected ? "" : "de" ) + "select station " + id ) ;
2020-05-07 23:25:37 +02:00
break ;
2018-03-24 18:15:59 +01:00
case 2 :
2020-05-07 23:25:37 +02:00
save ( id ) ;
nameJson [ id ] [ 5 ] = selected ;
drawNames ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( selected ? "" : "de" ) + "select name " + id ) ;
2018-03-24 18:15:59 +01:00
}
}
2021-01-11 18:04:59 +01:00
function remove ( type , id ) {
switch ( type ) {
2018-03-24 18:15:59 +01:00
case 0 :
2020-05-07 23:25:37 +02:00
scanJson . aps . splice ( id , 1 ) ;
drawScan ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=remove ap " + id ) ;
2018-03-24 18:15:59 +01:00
break ;
case 1 :
2020-05-07 23:25:37 +02:00
scanJson . stations . splice ( id , 1 ) ;
drawScan ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=remove station " + id ) ;
2018-03-24 18:15:59 +01:00
break ;
case 2 :
2020-05-07 23:25:37 +02:00
nameJson . splice ( id , 1 ) ;
drawNames ( ) ;
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=remove name " + id ) ;
2018-03-24 18:15:59 +01:00
}
}
2021-01-11 18:04:59 +01:00
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>" , "" ) ;
2020-05-07 23:25:37 +02:00
var changed = mac != nameJson [ id ] [ 0 ] || name != nameJson [ id ] [ 2 ] || apbssid != nameJson [ id ] [ 3 ] || ch != nameJson [ id ] [ 4 ] ;
2021-01-11 18:04:59 +01:00
if ( changed ) {
2018-03-27 10:26:45 +02:00
nameJson [ id ] [ 0 ] = mac ;
nameJson [ id ] [ 2 ] = name ;
nameJson [ id ] [ 3 ] = apbssid ;
nameJson [ id ] [ 4 ] = ch ;
2021-01-11 18:04:59 +01:00
if ( nameJson [ id ] [ 0 ] . length != 17 ) {
2020-05-07 23:25:37 +02:00
showMessage ( "ERROR: MAC invalid" ) ;
return ;
2018-03-27 10:26:45 +02:00
}
2021-01-11 18:04:59 +01:00
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" : "" ) ) ;
2018-03-27 10:26:45 +02:00
drawNames ( ) ;
2018-03-24 18:15:59 +01:00
}
}
2021-01-11 18:04:59 +01:00
function add ( type , id ) {
if ( nameJson . length >= 25 ) {
2020-05-07 23:25:37 +02:00
showMessage ( "Device Name List is full!" ) ;
return ;
2021-01-11 18:04:59 +01:00
}
switch ( type ) {
2018-03-24 18:15:59 +01:00
case 0 :
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=add name \"" + scanJson . aps [ id ] [ 0 ] + "\" -ap " + id ) ;
2018-03-24 18:15:59 +01:00
scanJson . aps [ id ] [ 1 ] = scanJson . aps [ id ] [ 0 ] ; // name = SSID
2021-01-11 18:04:59 +01:00
nameJson . push ( [ scanJson . aps [ id ] [ 5 ] , scanJson . aps [ id ] [ 6 ] , scanJson . aps [ id ] [ 0 ] , "" , scanJson . aps [ id ] [ 2 ] , false ] ) ;
2018-03-24 18:15:59 +01:00
drawScan ( ) ;
break ;
case 1 :
2021-01-11 18:04:59 +01:00
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 ] ) ;
2018-03-24 18:15:59 +01:00
drawScan ( ) ;
break ;
case 2 :
2021-01-11 18:04:59 +01:00
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 ] ) ;
2018-03-24 18:15:59 +01:00
drawNames ( ) ;
}
2021-01-11 18:04:59 +01:00
2018-03-24 18:15:59 +01:00
drawNames ( ) ;
}
2021-01-11 18:04:59 +01:00
function selectAll ( type , select ) {
switch ( type ) {
2018-03-24 18:15:59 +01:00
case 0 :
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( select ? "" : "de" ) + "select aps" ) ;
for ( var i = 0 ; i < scanJson . aps . length ; i ++ ) scanJson . aps [ i ] [ 7 ] = select ;
2018-03-24 18:15:59 +01:00
drawScan ( ) ;
break ;
case 1 :
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( select ? "" : "de" ) + "select stations" ) ;
for ( var i = 0 ; i < scanJson . stations . length ; i ++ ) scanJson . stations [ i ] [ 7 ] = select ;
2018-03-24 18:15:59 +01:00
drawScan ( ) ;
break ;
case 2 :
2021-01-11 18:04:59 +01:00
getFile ( "run?cmd=" + ( select ? "" : "de" ) + "select names" ) ;
for ( var i = 0 ; i < nameJson . length ; i ++ ) nameJson [ i ] [ 5 ] = select ;
2018-03-24 18:15:59 +01:00
drawNames ( ) ;
}
}