außerhalb von handleNotAuthorized() testen? oder ist da dein Code irgendwie durcheinander?
Könntest du evtl bitte mal den kompletten Code posten?
- - - Aktualisiert - - -
klappt nicht bei mir, oder dein Code ist unvollständig...
Änderungen:
Dann funktioniert es. Allerdings wahrscheinlich nur, weil nach dem Password der String auch endet. Sollte nach &upwd=yy noch was stehen wie: &upwd=yy&name=uschi könnte es sein, dass es wieder nicht funktioniert. Das habe ich nicht probiert.Code:if ( client.available() ) { char c = client.read(); .... }else stringok = true; if ( stringok && (strlen(strupwd) == strlen(website_upwd)) && (strcmp(website_upwd, strupwd) == 0) ) { authorized = true; //debug //Serial.print("check: authorized="); Serial.println(authorized); readString = "", stringok = false; return; } void handleNotAuthorized() { .... bool stringok = false;
Geändert von Moppi (19.08.2018 um 18:02 Uhr)
außerhalb von handleNotAuthorized() testen? oder ist da dein Code irgendwie durcheinander?
Könntest du evtl bitte mal den kompletten Code posten?
- - - Aktualisiert - - -
klappt nicht bei mir, oder dein Code ist unvollständig...
Erst hat es funktioniert, nun wieder nicht. Merkwürdige Sache!
Fest steht, dass in der Schleife die Variable readString zusammengesetzt wird. Das muss von der Prüfung des Passwortes abgekoppelt werden. Zurzeit läuft das Ding in einer Schleife und macht nach jedem Zeichen den Test, ob das Passwort schon stimmig ist. Das geht nicht. Warum nach mehrfachen Versuchen meine Änderungen auch nichts mehr bringen, zuvor aber schon, ist auch ein Rätsel. Daher kann man das erst mal vergessen. Ich hatte nur Codeschnipsel aufgeführt und die Änderungen in Rot, damit man sieht wo die im Quelltext stehen.
- - - Aktualisiert - - -
Dieses Konstrukt:
müsste erstmal geändert werden in das:Code://read char by request if (readString.length() < TOKLEN) { //store characters to string readString += c; Serial.println(c); }
damit der String komplett gelesen wird.Code://read char by request while (readString.length() < TOKLEN) { //store characters to string readString += c; Serial.println(c); }
Und hier erkennt man das erste Problem, dass sich nämlich das Lesen der Zeichen einzig nach TOKLEN richtet. TOKLEN muss daher zuerst die Länge haben, die das vom Browser übermittelte Passwort eben hat.
Die Schwierigkeit daran ist, dass die Abarbeitung des gesamten Input-Strings (der vom Browser kommt) Zeichen um Zeichen geschieht, in einer Schleife, wo dann auch auf '\n' geprüft wird und ob das Passwort richtig ist. Und das ist alles ineinander verschachtelt.
hast du denn einen Vorschlag (neuer Code für handleNotAuthorized ), wie es korrekt funktioniert?
bisher hat der Code (auch deiner oben mit den roten Änderungen) noch nicht funktioniert, bei diesem wurde noch nicht einmal das 100%ig korrekte Passwort akzeptiert...
Aber wie gesagt, wenn dein Code von dir getestet wurde, dann poste ihn doch bitte einmal vollständig (handleNotAuthorized)!
Ich glaub ja:
Ersetzen tust Du bitte nur die Funktion handleNotAuthorized().Code:void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); //--------------------------------------- // debug // authorized=true; strcpy(strinput, ""); strcpy(strupwd, ""); strcpy(struname, ""); while ( client.connected() ) { if (authorized) return; if ( client.available() ) { char c = client.read(); //read char by request readString = ""; while ( (readString.length() < TOKLEN) && (c != '\n') ) { readString += c; c = client.read(); } readString.toCharArray(strinput, MAXLEN); // cstringarg( char* haystack, char* vname, char* sarg ) // haystack pattern: &varname=1234abc, delimiters &, \n, \0, SPACE, EOF cstringarg(strinput, "uname", struname); // uname cstringarg(strinput, "upwd", strupwd); // upwd // debug Serial.print("strupwd >>>"); Serial.print(strupwd); Serial.println("<<<"); Serial.print("website_upwd>>>"); Serial.print(website_upwd); Serial.println("<<<"); Serial.print("readString>>>");Serial.println(readString); if ( (strlen(strupwd) == strlen(website_upwd)) && (strcmp(website_upwd, strupwd) == 0) ) { authorized = true; //debug //Serial.print("check: authorized="); Serial.println(authorized); readString = ""; return; } //if HTTP request has ended if (c == '\n') { client.flush(); //now output html data header String script = ""; script += ("HTTP/1.1 401 Log-In Required"); script += ("Content-Type: text/html \n"); script += ("\n"); // do not forget this one //???? script += ("<!DOCTYPE html> \n"); script += ("<html> \n"); script += ("<head> \n"); // utf-8 für "°" Zeichen script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ; script += "<title>" ; script += website_title ; script += "</title> \n" ; script += "</head> \n" ; script += "<body> \n" ; script += "<h1><p style=\"color:rgb(255,0,191);\"> " + (String)website_url ; script += (String)": <wbr> <wbr> " + "Not authorized !</p> </h1> \n" ; script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n"); script += ("<FORM ACTION='/' method=GET > \n"); script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2><INPUT TYPE=SUBMIT></h2> \n"); script += ("</FORM> \n"); script += ("<BR> \n"); script += ("</body> \n"); script += ("</html> \n"); client.print(script); //stopping client client.stop(); delay(1); //clearing string for next read //readString = ""; } } delay(1); } }
Zuerst muss der gesamte String vom Browser gelesen werden oder bis TOKLEN erreicht ist. Danach kann man die Parameter mit cstringarg rausfischen und das dann prüfen.
Vorher war es anders herum: Erst wurde der Parameter für Passwort geprüft und dann ein Zeichen von den gesendeten Browserdaten gelesen, das eine Zeichen wurde angehängt und dann begann der Spaß von vorn.
Geändert von Moppi (19.08.2018 um 19:49 Uhr)
JAAAAAAA !!
PERFEKT! WUNDERBAR!
TAUSEND DANK!
Lesezeichen