| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #include <WiFi.h>
 | 
					
						
							|  |  |  | #include <WiFiClient.h>
 | 
					
						
							|  |  |  | #include <WebServer.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char* ssid = "........"; | 
					
						
							|  |  |  | const char* password = "........"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebServer server(80); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //Check if header is present and correct
 | 
					
						
							|  |  |  | bool is_authentified() { | 
					
						
							|  |  |  |   Serial.println("Enter is_authentified"); | 
					
						
							|  |  |  |   if (server.hasHeader("Cookie")) { | 
					
						
							|  |  |  |     Serial.print("Found cookie: "); | 
					
						
							|  |  |  |     String cookie = server.header("Cookie"); | 
					
						
							|  |  |  |     Serial.println(cookie); | 
					
						
							|  |  |  |     if (cookie.indexOf("ESPSESSIONID=1") != -1) { | 
					
						
							|  |  |  |       Serial.println("Authentification Successful"); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Serial.println("Authentification Failed"); | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //login page, also called for disconnect
 | 
					
						
							|  |  |  | void handleLogin() { | 
					
						
							|  |  |  |   String msg; | 
					
						
							|  |  |  |   if (server.hasHeader("Cookie")) { | 
					
						
							|  |  |  |     Serial.print("Found cookie: "); | 
					
						
							|  |  |  |     String cookie = server.header("Cookie"); | 
					
						
							|  |  |  |     Serial.println(cookie); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (server.hasArg("DISCONNECT")) { | 
					
						
							|  |  |  |     Serial.println("Disconnection"); | 
					
						
							|  |  |  |     server.sendHeader("Location", "/login"); | 
					
						
							|  |  |  |     server.sendHeader("Cache-Control", "no-cache"); | 
					
						
							|  |  |  |     server.sendHeader("Set-Cookie", "ESPSESSIONID=0"); | 
					
						
							|  |  |  |     server.send(301); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")) { | 
					
						
							|  |  |  |     if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin") { | 
					
						
							|  |  |  |       server.sendHeader("Location", "/"); | 
					
						
							|  |  |  |       server.sendHeader("Cache-Control", "no-cache"); | 
					
						
							|  |  |  |       server.sendHeader("Set-Cookie", "ESPSESSIONID=1"); | 
					
						
							|  |  |  |       server.send(301); | 
					
						
							|  |  |  |       Serial.println("Log in Successful"); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     msg = "Wrong username/password! try again."; | 
					
						
							|  |  |  |     Serial.println("Log in Failed"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>"; | 
					
						
							|  |  |  |   content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>"; | 
					
						
							|  |  |  |   content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>"; | 
					
						
							|  |  |  |   content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>"; | 
					
						
							|  |  |  |   content += "You also can go <a href='/inline'>here</a></body></html>"; | 
					
						
							|  |  |  |   server.send(200, "text/html", content); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //root page can be accessed only if authentification is ok
 | 
					
						
							|  |  |  | void handleRoot() { | 
					
						
							|  |  |  |   Serial.println("Enter handleRoot"); | 
					
						
							|  |  |  |   String header; | 
					
						
							|  |  |  |   if (!is_authentified()) { | 
					
						
							|  |  |  |     server.sendHeader("Location", "/login"); | 
					
						
							|  |  |  |     server.sendHeader("Cache-Control", "no-cache"); | 
					
						
							|  |  |  |     server.send(301); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>"; | 
					
						
							|  |  |  |   if (server.hasHeader("User-Agent")) { | 
					
						
							|  |  |  |     content += "the user agent used is : " + server.header("User-Agent") + "<br><br>"; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>"; | 
					
						
							|  |  |  |   server.send(200, "text/html", content); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //no need authentification
 | 
					
						
							|  |  |  | void handleNotFound() { | 
					
						
							|  |  |  |   String message = "File Not Found\n\n"; | 
					
						
							|  |  |  |   message += "URI: "; | 
					
						
							|  |  |  |   message += server.uri(); | 
					
						
							|  |  |  |   message += "\nMethod: "; | 
					
						
							|  |  |  |   message += (server.method() == HTTP_GET) ? "GET" : "POST"; | 
					
						
							|  |  |  |   message += "\nArguments: "; | 
					
						
							|  |  |  |   message += server.args(); | 
					
						
							|  |  |  |   message += "\n"; | 
					
						
							|  |  |  |   for (uint8_t i = 0; i < server.args(); i++) { | 
					
						
							|  |  |  |     message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   server.send(404, "text/plain", message); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void setup(void) { | 
					
						
							|  |  |  |   Serial.begin(115200); | 
					
						
							|  |  |  |   WiFi.mode(WIFI_STA); | 
					
						
							|  |  |  |   WiFi.begin(ssid, password); | 
					
						
							|  |  |  |   Serial.println(""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Wait for connection
 | 
					
						
							|  |  |  |   while (WiFi.status() != WL_CONNECTED) { | 
					
						
							|  |  |  |     delay(500); | 
					
						
							|  |  |  |     Serial.print("."); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   Serial.println(""); | 
					
						
							|  |  |  |   Serial.print("Connected to "); | 
					
						
							|  |  |  |   Serial.println(ssid); | 
					
						
							|  |  |  |   Serial.print("IP address: "); | 
					
						
							|  |  |  |   Serial.println(WiFi.localIP()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.on("/", handleRoot); | 
					
						
							|  |  |  |   server.on("/login", handleLogin); | 
					
						
							|  |  |  |   server.on("/inline", []() { | 
					
						
							|  |  |  |     server.send(200, "text/plain", "this works without need of authentification"); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.onNotFound(handleNotFound); | 
					
						
							|  |  |  |   //here the list of headers to be recorded
 | 
					
						
							|  |  |  |   const char * headerkeys[] = {"User-Agent", "Cookie"} ; | 
					
						
							|  |  |  |   size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*); | 
					
						
							|  |  |  |   //ask server to track these headers
 | 
					
						
							|  |  |  |   server.collectHeaders(headerkeys, headerkeyssize); | 
					
						
							|  |  |  |   server.begin(); | 
					
						
							|  |  |  |   Serial.println("HTTP server started"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void loop(void) { | 
					
						
							|  |  |  |   server.handleClient(); | 
					
						
							| 
									
										
										
										
											2021-03-05 13:40:52 +02:00
										 |  |  |   delay(2);//allow the cpu to switch to other tasks
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | } |