@@ -19,12 +19,15 @@ const char* SpoofedDomains[] = {"playstation.net"}; //Used only if conf->wifiCon
19
19
const char * BlockedDomains[] = {" playstation.com" , " scea.com" , " sonyentertainmentnetwork.com" }; // Used only if conf->wifiConnect is true - all these domains will be blocked in DNS queries (IP set to 0)
20
20
21
21
// number of entries and number of ports in NAT table
22
- // Needs to be reasonably small as it uses the heap, which is also used by SSL
22
+ // Needs to be reasonably small as it uses the heap, which is also used by SSL. But big enough to actually handle queries
23
23
#define NAPT 100 // 27 bytes per entry
24
24
#define NAPT_PORT 30 // 14 bytes per entry
25
25
26
26
// Debug
27
27
#define DEBUG_HEAP // The ESP8266 has very little heap memory, and both NAT routing and SSL Handshake use it.
28
+ // In my tests, the https Server needs around 25'000 bytes free heap to succesfully load a page. 30'000 is better, 20'000 not enough in my tests
29
+ // Because of this, it is essential to move a lot of static content (e.g. Strings) to Flash rather than RAM (hence the heavy use of PROGMEM macro in WebAdmin.cpp in particular)
30
+
28
31
// #define DEBUG_DNS //To debug issues related to Fake DNS
29
32
// #define DEBUG_WEBSERVER //Debug messages related to the Web Servers
30
33
#define CHRISTMAS_TREE // Builtin LED lights up when DNS replies with a Spoofed or Blocked Domain
@@ -37,13 +40,10 @@ int lastHeap = 0;
37
40
int lastTime = millis();
38
41
#endif
39
42
40
- //static const char serverCert[] = "-----BEGIN CERTIFICATE-----\r\nMIIC1DCCAj2gAwIBAgIUFQgjEtkNYfmrrpNQKHVNl3+dl08wDQYJKoZIhvcNAQEL\r\nBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNVBAcM\r\nB0ZyZW1vbnQxDDAKBgNVBAoMA2VzcDEMMAoGA1UECwwDZXNwMQwwCgYDVQQDDANl\r\nc3AxHDAaBgkqhkiG9w0BCQEWDWVzcEBlc3AubG9jYWwwHhcNMjEwMjIxMDAwMDQ4\r\nWhcNNDMwNzI4MDAwMDQ4WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZv\r\ncm5pYTEQMA4GA1UEBwwHRnJlbW9udDEMMAoGA1UECgwDZXNwMQwwCgYDVQQLDANl\r\nc3AxDDAKBgNVBAMMA2VzcDEcMBoGCSqGSIb3DQEJARYNZXNwQGVzcC5sb2NhbDCB\r\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsrfFqlV5H0ajdAkkZ51HTOseOjYj\r\nNiaUD4MA5mIRonnph6EKIWb9Yl85vVa6yfVkGn3TFebQ96MMdTfZgLuP4ryCwe6Y\r\n+tZs2g6TjGbR0O6yuA8wQ2Ln7E0T05C8oOl88SGNV4tVL6hz64oMzuVebVDo0J9I\r\nybvL0O/LhMvC4x8CAwEAAaNTMFEwHQYDVR0OBBYEFCMQIU+pZQDVySXejfbIYbLQ\r\ncLXiMB8GA1UdIwQYMBaAFCMQIU+pZQDVySXejfbIYbLQcLXiMA8GA1UdEwEB/wQF\r\nMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAFHPz3YhhXQYiERTGzt8r0LhNWdggr7t0\r\nWEVuAoEukjzv+3DVB2O+56NtDa++566gTXBGGar0pWfCwfWCEu5K6MBkBdm6Ub/A\r\nXDy+sRQTqH/jTFFh5lgxeq246kHWHGRad8664V5PoIh+OSa0G3CEB+BXy7WF82Qq\r\nqx0X6E/mDUU=\r\n-----END CERTIFICATE-----";
41
- // static const char serverKey[] = "-----BEGIN PRIVATE KEY-----\r\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALK3xapVeR9Go3QJ\r\nJGedR0zrHjo2IzYmlA+DAOZiEaJ56YehCiFm/WJfOb1Wusn1ZBp90xXm0PejDHU3\r\n2YC7j+K8gsHumPrWbNoOk4xm0dDusrgPMENi5+xNE9OQvKDpfPEhjVeLVS+oc+uK\r\nDM7lXm1Q6NCfSMm7y9Dvy4TLwuMfAgMBAAECgYEApKFbSeyQtfnpSlO9oGEmtDmG\r\nT9NdHl3tWFiydId0fTpWoKT9YwWvdnYIB12klbQicbDkyTEl4Gjnafd3ufmNsaH8\r\nZ9twopIdvvWDvGPIqGNjvTYcuczpXmQWiUnG5OTiVWI1XuZa3uZEGSFK9Ra6bE4g\r\nG2xklGZGdaqqcd6AVhECQQDnBXVXwBxExxSFppL8KUtWgyXAvJAEvkzvTOQfcCel\r\naIM5EEUofB7WZeMtDEKgBtoBl+i5PP+GnDF0zsjDFx2nAkEAxgqVQii6zURSVE2T\r\niJDihySXJ2bmLJUjRIi1nCs64I9Oz4fECVvGwZ1XU8Uzhh3ylyBSG2HjhzA5sTSC\r\n1a/tyQJAOgE12EWFE4PE1FXhm+ymXN9q8DyoEHjTilYNBRO88JwQLpi2NJcNixlj\r\n8+CbLeDqhfHlXfVB10OKa2CsKce5CwJAbhaN+DQJ+3dCSOjC3YSk2Dkn6VhTFW9m\r\nJn/UbNa/KPug9M5k1Er3RsO/OqsBxEk7hHUMD3qv74OIXpBxNnZQuQJASlwk5HZT\r\n7rULkr72fK/YYxkS0czBDIpTKqwklxU+xLSGWkSHvSvl7sK4TmQ1w8KVpjKlTCW9\r\nxKbbW0zVmGN6wQ==\r\n-----END PRIVATE KEY-----";
42
-
43
- static const char serverCert[]= " -----BEGIN CERTIFICATE-----\r\n MIIBszCCAV2gAwIBAgIUa8NoeDqaT6pFP5PHokRpKMXrT6swDQYJKoZIhvcNAQEL\r\n BQAwLjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMQ8wDQYDVQQKDAZXb2xv\r\n bG8wHhcNMjMwODMwMDE0NDIxWhcNMzQxMTE2MDE0NDIxWjAuMQswCQYDVQQGEwJK\r\n UDEOMAwGA1UECAwFVG9reW8xDzANBgNVBAoMBldvbG9sbzBcMA0GCSqGSIb3DQEB\r\n AQUAA0sAMEgCQQDFBUICgP5wFMcRCs8VRqrY3QZr72FtzvLtPTCMcgPsaBE60QJt\r\n +YAj+e2mAolbRPRk4FNNcrg5/XsURdfuAPfvAgMBAAGjUzBRMB0GA1UdDgQWBBSv\r\n ywhrMAdpJLbVx4kF9hmuTpHlLjAfBgNVHSMEGDAWgBSvywhrMAdpJLbVx4kF9hmu\r\n TpHlLjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA0EAjH+jaG47Qngl\r\n PTGjPpFmJp+LK6YHPzhqrJrAN18WziGJiaeCsuWV7j8cgGgB0U0AOybcdYMrjMOR\r\n +u+B12nV2w==\r\n -----END CERTIFICATE-----" ;
44
- static const char serverKey[] = " -----BEGIN PRIVATE KEY-----\r\n MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAxQVCAoD+cBTHEQrP\r\n FUaq2N0Ga+9hbc7y7T0wjHID7GgROtECbfmAI/ntpgKJW0T0ZOBTTXK4Of17FEXX\r\n 7gD37wIDAQABAkAcuYaFPO9bwfvABVZp4LK6CYeNJwqKavjKE/jHETx3M/cot1rM\r\n A39OZ/wCuNrqr+k4Pb2qQy2rzXJoa37lMG7ZAiEA+itu8WdfuzdOUAfkoHgsjUdz\r\n BmfaWy37q58A0druQEMCIQDJnLmp1sTDIcqoIMlIXDNwTPUc4pJj/JJSeczTQg7U\r\n 5QIhAJzSu2JzNgzLd7ktqYF6tBsAbjfWxIgiBEEqlL346x+3AiB54WAwN2C94jjE\r\n SQXF089Y7X0kmCgNgAvpBi7367BRrQIgDH+nVOtPl0Y4Yqop/7hCT3vEsvmMWgx4\r\n 9InegA0Cz68=\r\n -----END PRIVATE KEY-----" ;
43
+ static const char serverCert[] PROGMEM = " -----BEGIN CERTIFICATE-----\r\n MIIBszCCAV2gAwIBAgIUa8NoeDqaT6pFP5PHokRpKMXrT6swDQYJKoZIhvcNAQEL\r\n BQAwLjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMQ8wDQYDVQQKDAZXb2xv\r\n bG8wHhcNMjMwODMwMDE0NDIxWhcNMzQxMTE2MDE0NDIxWjAuMQswCQYDVQQGEwJK\r\n UDEOMAwGA1UECAwFVG9reW8xDzANBgNVBAoMBldvbG9sbzBcMA0GCSqGSIb3DQEB\r\n AQUAA0sAMEgCQQDFBUICgP5wFMcRCs8VRqrY3QZr72FtzvLtPTCMcgPsaBE60QJt\r\n +YAj+e2mAolbRPRk4FNNcrg5/XsURdfuAPfvAgMBAAGjUzBRMB0GA1UdDgQWBBSv\r\n ywhrMAdpJLbVx4kF9hmuTpHlLjAfBgNVHSMEGDAWgBSvywhrMAdpJLbVx4kF9hmu\r\n TpHlLjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA0EAjH+jaG47Qngl\r\n PTGjPpFmJp+LK6YHPzhqrJrAN18WziGJiaeCsuWV7j8cgGgB0U0AOybcdYMrjMOR\r\n +u+B12nV2w==\r\n -----END CERTIFICATE-----" ;
44
+ static const char serverKey[] PROGMEM = " -----BEGIN PRIVATE KEY-----\r\n MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAxQVCAoD+cBTHEQrP\r\n FUaq2N0Ga+9hbc7y7T0wjHID7GgROtECbfmAI/ntpgKJW0T0ZOBTTXK4Of17FEXX\r\n 7gD37wIDAQABAkAcuYaFPO9bwfvABVZp4LK6CYeNJwqKavjKE/jHETx3M/cot1rM\r\n A39OZ/wCuNrqr+k4Pb2qQy2rzXJoa37lMG7ZAiEA+itu8WdfuzdOUAfkoHgsjUdz\r\n BmfaWy37q58A0druQEMCIQDJnLmp1sTDIcqoIMlIXDNwTPUc4pJj/JJSeczTQg7U\r\n 5QIhAJzSu2JzNgzLd7ktqYF6tBsAbjfWxIgiBEEqlL346x+3AiB54WAwN2C94jjE\r\n SQXF089Y7X0kmCgNgAvpBi7367BRrQIgDH+nVOtPl0Y4Yqop/7hCT3vEsvmMWgx4\r\n 9InegA0Cz68=\r\n -----END PRIVATE KEY-----" ;
45
45
46
- String defaultIndex = " <!DOCTYPE html><title>hi</title><center>ESP</center>" ;
46
+ static const char defaultIndex[] PROGMEM = " <!DOCTYPE html><title>hi</title><center>ESP</center>" ;
47
47
48
48
// Global variables
49
49
DNSServer dnsServer;
@@ -105,8 +105,8 @@ bool loadFromSpiffs(String path) {
105
105
}
106
106
107
107
if (path.endsWith (" index.html" ) && !SPIFFS.exists (path)) {
108
- webServer.setContentLength (defaultIndex. length ( ));
109
- webServer.send (200 , " text/html" , defaultIndex);
108
+ webServer.setContentLength (strlen_P (defaultIndex ));
109
+ webServer.send_P (200 , " text/html" , defaultIndex);
110
110
return true ;
111
111
}
112
112
@@ -130,7 +130,7 @@ bool loadFromSpiffs(String path) {
130
130
}
131
131
132
132
if (webServer.streamFile (dataFile, dataType) != dataFile.size ()) {
133
- Serial.println (" Sent less data than expected!" );
133
+ Serial.println (F ( " Sent less data than expected!" ) );
134
134
}
135
135
dataFile.close ();
136
136
return true ;
@@ -170,16 +170,16 @@ void setup(void)
170
170
WiFi.setAutoReconnect (true );
171
171
WiFi.begin (conf->WIFI_SSID , conf->WIFI_PASS );
172
172
173
- // Serial.println("WIFI connecting");
173
+ // Serial.println(F( "WIFI connecting") );
174
174
if (WiFi.waitForConnectResult () != WL_CONNECTED) {
175
- Serial.println (" Wifi failed to connect" );
175
+ Serial.println (F ( " Wifi failed to connect" ) );
176
176
} else {
177
177
Serial.println (" Connected to " + conf->WIFI_SSID );
178
178
}
179
179
}
180
180
else
181
181
{
182
- Serial.println (" Offline mode" );
182
+ Serial.println (F ( " Offline mode" ) );
183
183
WiFi.mode (WIFI_AP);
184
184
}
185
185
@@ -193,7 +193,7 @@ void setup(void)
193
193
dnsServer.setTTL (30 );
194
194
dnsServer.setErrorReplyCode (DNSReplyCode::ServerFailure);
195
195
dnsServer.start (53 , " *" , conf->Server_IP );
196
- Serial.println (" DNS server started" );
196
+ Serial.println (F ( " DNS server started" ) );
197
197
198
198
199
199
// HTTP Web Server Setup
@@ -202,7 +202,13 @@ void setup(void)
202
202
WebAdmin webAdmin (&webServer);
203
203
204
204
// HTTPS Web Server Set up: only thing it does is instantly redirect the browser to the HTTP index page
205
- sWebServer .getServer ().setRSACert (new X509List (serverCert), new PrivateKey (serverKey));
205
+
206
+ char bufCert[1000 ]; // -------------------
207
+ char bufKey[1000 ]; // PROGMEM shenanigans
208
+ strcpy_P (bufCert,serverCert); //
209
+ strcpy_P (bufKey,serverKey); // --------------------
210
+ sWebServer .getServer ().setRSACert (new X509List (bufCert), new PrivateKey (bufKey));
211
+
206
212
sWebServer .onNotFound ([]() {
207
213
sWebServer .sendHeader (" Location" , String (" http://" + conf->Server_IP .toString () + " /index.html" ), true );
208
214
sWebServer .send (301 , " text/plain" , " " );
@@ -221,20 +227,20 @@ void setup(void)
221
227
// Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)\n", (int)ret, (int)ERR_OK);
222
228
if (ret == ERR_OK)
223
229
{
224
- Serial.println (" NAT init OK" );
230
+ Serial.println (F ( " NAT init OK" ) );
225
231
}
226
232
}
227
233
Serial.printf (" Heap after napt init: %d\n " , ESP.getFreeHeap ());
228
234
if (ret != ERR_OK)
229
235
{
230
- Serial.println (" NAPT initialization failed" );
236
+ Serial.println (F ( " NAPT initialization failed" ) );
231
237
}
232
238
}
233
239
234
240
// Start HTTP and HTTPS Web Servers
235
241
sWebServer .begin ();
236
242
webServer.begin ();
237
- Serial.println (" HTTP servers started" );
243
+ Serial.println (F ( " HTTP servers started" ) );
238
244
239
245
}
240
246
@@ -266,7 +272,7 @@ void dnsProcess () {
266
272
if (dom.indexOf (element) >= 0 )
267
273
{
268
274
#ifdef DEBUG_DNS
269
- Serial.printf (" redirected to local server \n " );
275
+ Serial.printf (F ( " redirected to local server \n " ) );
270
276
#endif
271
277
272
278
#ifdef CHRISTMAS_TREE
@@ -285,7 +291,7 @@ void dnsProcess () {
285
291
{
286
292
287
293
#ifdef DEBUG_DNS
288
- Serial.printf (" Blocked \n " );
294
+ Serial.printf (F ( " Blocked \n " ) );
289
295
#endif
290
296
291
297
#ifdef CHRISTMAS_TREE
0 commit comments