Updated web files + progmem hosted web server

This commit is contained in:
Stefan Kremser
2018-04-03 17:38:55 +02:00
parent ca3d07ee77
commit 55157ec923
22 changed files with 166 additions and 60 deletions

View File

@@ -15,9 +15,9 @@
Uncomment the type of LED you're using Uncomment the type of LED you're using
Only one of them can be defined at a time! Only one of them can be defined at a time!
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
#define DIGITAL_LED //#define DIGITAL_LED
//#define RGB_LED //#define RGB_LED
//#define NEOPIXEL_LED #define NEOPIXEL_LED
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Adjust following settings for your type of LED Adjust following settings for your type of LED
@@ -39,8 +39,8 @@
#define LED_DYNAMIC_BRIGHTNESS false // brightness in scan mode depending on packet rate and deauths per second #define LED_DYNAMIC_BRIGHTNESS false // brightness in scan mode depending on packet rate and deauths per second
// === Settings for Neopixel LED === // // === Settings for Neopixel LED === //
#define LED_NEOPIXEL_NUM 1 #define LED_NEOPIXEL_NUM 12
#define LED_NEOPIXEL_PIN 9 #define LED_NEOPIXEL_PIN 14
// if it doesn't work try changing NEO_GRB to NEO_GRBW // if it doesn't work try changing NEO_GRB to NEO_GRBW
#define LED_NEOPIXEL Adafruit_NeoPixel(LED_NEOPIXEL_NUM, LED_NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800) #define LED_NEOPIXEL Adafruit_NeoPixel(LED_NEOPIXEL_NUM, LED_NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800)
@@ -51,9 +51,9 @@
Adjust the pins to match your setup Adjust the pins to match your setup
Comment out the buttons you don't use. Comment out the buttons you don't use.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
#define BUTTON_UP 12 //#define BUTTON_UP 12
#define BUTTON_DOWN 13 //#define BUTTON_DOWN 13
#define BUTTON_A 14 //#define BUTTON_A 14
//#define BUTTON_LEFT 12 //#define BUTTON_LEFT 12
//#define BUTTON_RIGHT 13 //#define BUTTON_RIGHT 13
@@ -64,8 +64,8 @@
Only one of them can be defined at a time! Only one of them can be defined at a time!
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/ */
#define DEAUTHER_DISPLAY SSD1306Wire display = SSD1306Wire(0x3c, 5, 4); // for 0.96" OLED //#define DEAUTHER_DISPLAY SSD1306Wire display = SSD1306Wire(0x3c, 5, 4); // for 0.96" OLED
//#define DEAUTHER_DISPLAY SH1106Wire display = SH1106Wire(0x3c, 5, 4); // for 1.3" OLED #define DEAUTHER_DISPLAY SH1106Wire display = SH1106Wire(0x3c, 13, 12); // for 1.3" OLED
/* RST = GPIO 5 (D1) /* RST = GPIO 5 (D1)
DC = GPIO 4 (D2) DC = GPIO 4 (D2)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@
#include <ESP8266mDNS.h> #include <ESP8266mDNS.h>
#include <FS.h> #include <FS.h>
extern "C" { extern "C" {
#include "user_interface.h" #include "user_interface.h"
} }
#define WIFI_MODE_OFF 0 #define WIFI_MODE_OFF 0
@@ -35,8 +35,8 @@ String wifi_config_ssid = str(W_PWNED);
String wifi_config_password = str(W_DEAUTHER); String wifi_config_password = str(W_DEAUTHER);
String wifi_config_path = str(W_WEBINTERFACE); String wifi_config_path = str(W_WEBINTERFACE);
void stopAP(){ void stopAP() {
if(wifiMode == WIFI_MODE_AP){ if (wifiMode == WIFI_MODE_AP) {
wifi_promiscuous_enable(0); wifi_promiscuous_enable(0);
WiFi.persistent(false); WiFi.persistent(false);
WiFi.disconnect(true); WiFi.disconnect(true);
@@ -55,8 +55,8 @@ void wifiUpdate() {
} }
} }
String getWifiMode(){ String getWifiMode() {
switch(wifiMode){ switch (wifiMode) {
case WIFI_MODE_OFF: case WIFI_MODE_OFF:
return W_MODE_OFF; return W_MODE_OFF;
break; break;
@@ -73,7 +73,7 @@ String getWifiMode(){
String getContentType(String filename) { String getContentType(String filename) {
if (server.hasArg(str(W_DOWNLOAD).c_str())) return str(W_STREAM); if (server.hasArg(str(W_DOWNLOAD).c_str())) return str(W_STREAM);
else if (filename.endsWith(str(W_DOT_GZIP).c_str())) filename = filename.substring(0,filename.length()-3); //return str(W_GZIP); else if (filename.endsWith(str(W_DOT_GZIP).c_str())) filename = filename.substring(0, filename.length() - 3); //return str(W_GZIP);
else if (filename.endsWith(str(W_DOT_HTM).c_str())) return str(W_HTML); else if (filename.endsWith(str(W_DOT_HTM).c_str())) return str(W_HTML);
else if (filename.endsWith(str(W_DOT_HTML).c_str())) return str(W_HTML); else if (filename.endsWith(str(W_DOT_HTML).c_str())) return str(W_HTML);
else if (filename.endsWith(str(W_DOT_CSS).c_str())) return str(W_CSS); else if (filename.endsWith(str(W_DOT_CSS).c_str())) return str(W_CSS);
@@ -93,7 +93,7 @@ bool handleFileRead(String path) {
prnt(W_AP_REQUEST); prnt(W_AP_REQUEST);
prnt(path); prnt(path);
if (!path.charAt(0) == SLASH) path = String(SLASH) + path; if (!path.charAt(0) == SLASH) path = String(SLASH) + path;
if (path.charAt(path.length()-1) == SLASH) path += str(W_INDEX_HTML);; if (path.charAt(path.length() - 1) == SLASH) path += str(W_INDEX_HTML);;
String contentType = getContentType(path); String contentType = getContentType(path);
if (!SPIFFS.exists(path)) { if (!SPIFFS.exists(path)) {
@@ -194,15 +194,21 @@ void handleFileList() {
server.send(200, str(W_JSON).c_str(), output); server.send(200, str(W_JSON).c_str(), output);
} }
void sendProgmem(const char* ptr, uint32_t size, const char* type) {
server.sendHeader(PSTR("Content-Encoding"), PSTR("gzip"));
server.sendHeader(PSTR("Cache-Control"), PSTR("max-age=86400"));
server.send_P(200, type, ptr, size);
}
// path = folder of web files, ssid = name of network, password = password ("0" => no password), hidden = if the network is visible, captivePortal = enable a captive portal // path = folder of web files, ssid = name of network, password = password ("0" => no password), hidden = if the network is visible, captivePortal = enable a captive portal
void startAP(String path, String ssid, String password, uint8_t ch, bool hidden, bool captivePortal) { void startAP(String path, String ssid, String password, uint8_t ch, bool hidden, bool captivePortal) {
if(password.length() < 8){ if (password.length() < 8) {
prntln(W_ERROR_PASSWORD); prntln(W_ERROR_PASSWORD);
return; return;
} }
if(!path.charAt(0) == SLASH) path = String(SLASH)+path; if (!path.charAt(0) == SLASH) path = String(SLASH) + path;
if(password == String(ZERO)) password = String(NEWLINE); if (password == String(ZERO)) password = String(NEWLINE);
wifi_config_path = path; wifi_config_path = path;
wifi_config_ssid = ssid; wifi_config_ssid = ssid;
@@ -221,16 +227,86 @@ void startAP(String path, String ssid, String password, uint8_t ch, bool hidden,
server.on(str(W_LIST).c_str(), HTTP_GET, handleFileList); //list directory server.on(str(W_LIST).c_str(), HTTP_GET, handleFileList); //list directory
server.on(str(W_RUN).c_str(), HTTP_GET, [](){
// ================================================================
// post here the output of the webConverter.py
if (settings.getWebSpiffs()) {
server.on(PSTR("/attack.html"), HTTP_GET, []() {
sendProgmem(attackhtml, sizeof(attackhtml), PSTR("text/html"));
});
server.on(PSTR("/index.html"), HTTP_GET, []() {
sendProgmem(indexhtml, sizeof(indexhtml), PSTR("text/html"));
});
server.on(PSTR("/info.html"), HTTP_GET, []() {
sendProgmem(infohtml, sizeof(infohtml), PSTR("text/html"));
});
server.on(PSTR("/scan.html"), HTTP_GET, []() {
sendProgmem(scanhtml, sizeof(scanhtml), PSTR("text/html"));
});
server.on(PSTR("/settings.html"), HTTP_GET, []() {
sendProgmem(settingshtml, sizeof(settingshtml), PSTR("text/html"));
});
server.on(PSTR("/ssids.html"), HTTP_GET, []() {
sendProgmem(ssidshtml, sizeof(ssidshtml), PSTR("text/html"));
});
server.on(PSTR("/style.css"), HTTP_GET, []() {
sendProgmem(stylecss, sizeof(stylecss), PSTR("text/css"));
});
server.on(PSTR("/attack.js"), HTTP_GET, []() {
sendProgmem(attackjs, sizeof(attackjs), PSTR("application/javascript"));
});
server.on(PSTR("/scan.js"), HTTP_GET, []() {
sendProgmem(scanjs, sizeof(scanjs), PSTR("application/javascript"));
});
server.on(PSTR("/settings.js"), HTTP_GET, []() {
sendProgmem(settingsjs, sizeof(settingsjs), PSTR("application/javascript"));
});
server.on(PSTR("/site.js"), HTTP_GET, []() {
sendProgmem(sitejs, sizeof(sitejs), PSTR("application/javascript"));
});
server.on(PSTR("/ssids.js"), HTTP_GET, []() {
sendProgmem(ssidsjs, sizeof(ssidsjs), PSTR("application/javascript"));
});
server.on(PSTR("/cs.lang"), HTTP_GET, []() {
sendProgmem(cslang, sizeof(cslang), PSTR("application/json"));
});
server.on(PSTR("/de.lang"), HTTP_GET, []() {
sendProgmem(delang, sizeof(delang), PSTR("application/json"));
});
server.on(PSTR("/en.lang"), HTTP_GET, []() {
sendProgmem(enlang, sizeof(enlang), PSTR("application/json"));
});
server.on(PSTR("/fr.lang"), HTTP_GET, []() {
sendProgmem(frlang, sizeof(frlang), PSTR("application/json"));
});
server.on(PSTR("/tlh.lang"), HTTP_GET, []() {
sendProgmem(tlhlang, sizeof(tlhlang), PSTR("application/json"));
});
}
server.on(str(W_DEFAULT_LANG).c_str(), HTTP_GET, []() {
if (settings.getWebSpiffs()) {
if (settings.getLang() == String(F("cs"))) sendProgmem(cslang, sizeof(cslang), PSTR("application/json"));
else if (settings.getLang() == String(F("de"))) sendProgmem(delang, sizeof(delang), PSTR("application/json"));
else if (settings.getLang() == String(F("en"))) sendProgmem(enlang, sizeof(enlang), PSTR("application/json"));
else if (settings.getLang() == String(F("fr"))) sendProgmem(frlang, sizeof(frlang), PSTR("application/json"));
else if (settings.getLang() == String(F("tlh"))) sendProgmem(tlhlang, sizeof(tlhlang), PSTR("application/json"));
else handleFileRead("/web/lang/" + settings.getLang() + ".lang");
} else {
handleFileRead("/web/lang/" + settings.getLang() + ".lang");
}
});
// ================================================================
server.on(str(W_RUN).c_str(), HTTP_GET, []() {
server.send(200, str(W_TXT), str(W_OK).c_str()); server.send(200, str(W_TXT), str(W_OK).c_str());
serialInterface.runCommands(server.arg(str(W_CMD).c_str())); serialInterface.runCommands(server.arg(str(W_CMD).c_str()));
}); });
server.on(str(W_DEFAULT_LANG).c_str(), HTTP_GET, [](){ server.on("/attack.json", HTTP_GET, []() {
handleFileRead("/web/lang/"+settings.getLang()+".lang");
});
server.on("/attack.json", HTTP_GET, [](){
server.send(200, str(W_JSON), attack.getStatusJSON()); server.send(200, str(W_JSON), attack.getStatusJSON());
}); });
@@ -251,7 +327,7 @@ void startAP(String path, String ssid, String password, uint8_t ch, bool hidden,
// aggressively caching static assets // aggressively caching static assets
//server.serveStatic("/lang", SPIFFS, String(wifi_config_path+"/lang").c_str(),"max-age=86400"); //server.serveStatic("/lang", SPIFFS, String(wifi_config_path+"/lang").c_str(),"max-age=86400");
server.serveStatic("/js" , SPIFFS, String(wifi_config_path+"/js").c_str(), "max-age=86400"); server.serveStatic("/js" , SPIFFS, String(wifi_config_path + "/js").c_str(), "max-age=86400");
//called when the url is not defined here //called when the url is not defined here
//use it to load content from SPIFFS //use it to load content from SPIFFS
@@ -270,7 +346,7 @@ void startAP(String path, String ssid, String password, uint8_t ch, bool hidden,
void printWifiStatus() { void printWifiStatus() {
char s[150]; char s[150];
sprintf(s,str(W_STATUS_OUTPUT).c_str(), sprintf(s, str(W_STATUS_OUTPUT).c_str(),
wifi_config_path.c_str(), wifi_config_path.c_str(),
str(wifiMode == WIFI_MODE_OFF ? W_OFF : (wifiMode == WIFI_MODE_AP ? W_AP : W_STATION)).c_str(), str(wifiMode == WIFI_MODE_OFF ? W_OFF : (wifiMode == WIFI_MODE_AP ? W_AP : W_STATION)).c_str(),
wifi_config_ssid.c_str(), wifi_config_ssid.c_str(),
@@ -296,8 +372,8 @@ void loadWifiConfigDefaults() {
wifi_config_captivePortal = settings.getCaptivePortal(); wifi_config_captivePortal = settings.getCaptivePortal();
} }
void resumeAP(){ void resumeAP() {
if(wifiMode != WIFI_MODE_AP){ if (wifiMode != WIFI_MODE_AP) {
wifiMode = WIFI_MODE_AP; wifiMode = WIFI_MODE_AP;
wifi_promiscuous_enable(0); wifi_promiscuous_enable(0);
WiFi.softAPConfig(apIP, apIP, netMsk); WiFi.softAPConfig(apIP, apIP, netMsk);

View File

@@ -47,6 +47,8 @@ js_files = []
lang_files = [] lang_files = []
progmem_definitions = "" progmem_definitions = ""
copy_files_function = "" copy_files_function = ""
webserver_events = ""
load_lang = ""
filelist = Path(dir).glob('**/*') filelist = Path(dir).glob('**/*')
for x in filelist: for x in filelist:
@@ -88,6 +90,7 @@ for file in html_files:
hex_formatted_content = hex_formatted_content[:-2] hex_formatted_content = hex_formatted_content[:-2]
progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n" progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n"
copy_files_function += ' if(!SPIFFS.exists(String(F("/web/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/' + base_file + '.gz")));\n' copy_files_function += ' if(!SPIFFS.exists(String(F("/web/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/' + base_file + '.gz")));\n'
webserver_events += 'server.on(PSTR("/' + base_file + '"), HTTP_GET, [](){\n sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("text/html"));\n});\n'
for file in css_files: for file in css_files:
base_file = os.path.basename(str(file)) base_file = os.path.basename(str(file))
@@ -115,6 +118,7 @@ for file in css_files:
hex_formatted_content = hex_formatted_content[:-2] hex_formatted_content = hex_formatted_content[:-2]
progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n" progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n"
copy_files_function += ' if(!SPIFFS.exists(String(F("/web/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/' + base_file + '.gz")));\n' copy_files_function += ' if(!SPIFFS.exists(String(F("/web/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/' + base_file + '.gz")));\n'
webserver_events += 'server.on(PSTR("/' + base_file + '"), HTTP_GET, [](){\n sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("text/css"));\n});\n'
for file in js_files: for file in js_files:
q = PurePath('js') q = PurePath('js')
@@ -146,6 +150,7 @@ for file in js_files:
hex_formatted_content = hex_formatted_content[:-2] hex_formatted_content = hex_formatted_content[:-2]
progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n" progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n"
copy_files_function += ' if(!SPIFFS.exists(String(F("/web/js/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/js/' + base_file + '.gz")));\n' copy_files_function += ' if(!SPIFFS.exists(String(F("/web/js/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/js/' + base_file + '.gz")));\n'
webserver_events += 'server.on(PSTR("/' + base_file + '"), HTTP_GET, [](){\n sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("application/javascript"));\n});\n'
for file in lang_files: for file in lang_files:
q = PurePath('lang') q = PurePath('lang')
@@ -165,6 +170,7 @@ for file in lang_files:
content = f_in.read() content = f_in.read()
f_in.close() f_in.close()
array_name = base_file.replace(".", "") array_name = base_file.replace(".", "")
lang_name = base_file.replace(".lang", "")
hex_formatted_content = "" hex_formatted_content = ""
hex_content = binascii.hexlify(content) hex_content = binascii.hexlify(content)
hex_content = hex_content.decode("UTF-8") hex_content = hex_content.decode("UTF-8")
@@ -174,6 +180,11 @@ for file in lang_files:
hex_formatted_content = hex_formatted_content[:-2] hex_formatted_content = hex_formatted_content[:-2]
progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n" progmem_definitions += "const char " + array_name + "[] PROGMEM = {" + hex_formatted_content + "};\n"
copy_files_function += ' if(!SPIFFS.exists(String(F("/web/lang/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/lang/' + base_file + '.gz")));\n' copy_files_function += ' if(!SPIFFS.exists(String(F("/web/lang/' + base_file + '.gz"))) || force) progmemToSpiffs(' + array_name + ', sizeof(' + array_name + '), String(F("/web/lang/' + base_file + '.gz")));\n'
webserver_events += 'server.on(PSTR("/' + base_file + '"), HTTP_GET, [](){\n sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("application/json"));\n});\n'
if(len(load_lang) > 0):
load_lang += ' else if(settings.getLang() == String(F("'+lang_name+'"))) sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("application/json"));\n'
else:
load_lang += ' if(settings.getLang() == String(F("'+lang_name+'"))) sendProgmem(' + array_name + ', sizeof(' + array_name + '), PSTR("application/json"));\n'
base_file = os.path.basename(license_file_path) base_file = os.path.basename(license_file_path)
new_file = str(os.path.join(str(compressed), str("LICENSE"))) new_file = str(os.path.join(str(compressed), str("LICENSE")))
@@ -219,3 +230,16 @@ f.write("#endif")
f.close() f.close()
print("\n[+] Done, happy uploading :)") print("\n[+] Done, happy uploading :)")
print("Here are the updated functions for wifi.h, in case you added or removed files:")
print();
print('if(settings.getWebSpiffs()){')
print(webserver_events)
print('}')
print("server.on(str(W_DEFAULT_LANG).c_str(), HTTP_GET, [](){")
print(" if(settings.getWebSpiffs()){")
print(load_lang)
print(' else handleFileRead("/web/lang/"+settings.getLang()+".lang");')
print(' } else {')
print(' handleFileRead("/web/lang/"+settings.getLang()+".lang");')
print(' }')
print("});");