heinz-otto / fhemcl

FHEM HTTP Client
0 stars 1 forks source link

Get token via http head and return on failure #4

Closed sidey79 closed 5 years ago

sidey79 commented 5 years ago

Get the error code via http head request and return with exitcode 1 if there was an error or no csrf token was provided

sidey79 commented 5 years ago

Ich muss gestehen, der Zugriff via HTTP Head verursacht eine Fehlermeldung im FHEM Log. 019.03.06 22:25:30 3: WEB_127.0.0.1_57071: unsupported HTTP method HEAD, rejecting it.

Leider auch noch mit loglevel 3. Das ist eigentlich quatsch, denn er hat einen http header zurück geliefert.

heinz-otto commented 5 years ago

Einen Fehler hatte ich an der Stelle noch nie und ich will ja, dass es auch ohne csrf Token funktioniert? Ich verstehe den Auslöser für diese Änderung nicht.

sidey79 commented 5 years ago

Auslöser war, dass ich feststellen wollte ob der Fhemweb Dienst überhaupt läuft. Es gab nur bislang keine Rückmeldung.

Das Umstellen auf die Head Anfrage habe ich gemacht, da uns der Content an dieser Stelle nicht interessiert.

heinz-otto commented 5 years ago

Ich verstehe die Beschreibung der beiden Optionen so als ob es für uns keinen Sinn macht -I zu nutzen. Es liefert das Gleiche aber ausführlicher. To get curl to show detailed information about a single file, you should use -I/--head option. It displays all available info on a single file for HTTP and FTP. The HTTP information is a lot more extensive.

For HTTP, you can get the header information (the same as -I would show) shown before the data by using -i/--include. Curl understands the -D/--dump-header option when getting files from both FTP and HTTP, and it will then store the headers in the specified file.

sidey79 commented 5 years ago

Wieso kommst Du zu diesem Schluss? Mit -I wird ein http head request gesendet.

Ohne -I wird ein Http Get gemacht. Den brauchen wir doch nicht.

heinz-otto commented 5 years ago

Naja ich bin da nicht so tief drin. Ich dachte aber Option -D macht genau auch diesen Head Request, nur kürzer als -I. -D ist ja nicht -d :)

sidey79 commented 5 years ago

So habe ich das nicht verstanden. Die -D Option macht einen GET Request und zeigt dir aber nur den Header an. Der Server liefert aber alles aus.

heinz-otto commented 5 years ago

Ich habe beide Varianten nochmal probiert: pi@raspib:~ $ curl -s -D - "$hosturl/fhem?XHR=1" HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache, no-store, must-revalidate X-FHEM-csrfToken: csrf_94953165283244 Content-Type: text/plain; charset=UTF-8

pi@raspib:~ $ curl -Is "$hosturl/fhem?XHR=1" HTTP/1.1 405 Method Not Allowed X-FHEM-csrfToken: csrf_94953165283244 Content-Length: 0

In beiden Fällen ist die Antwort kurz. Content-Length: 0 In beiden Fällen kommt der Token. Im Fall -Is kommt eine Fehlermeldung - das wäre für mich ein k.O. Kriterium. Nicht existierender Webservice bekommt man in beiden Fällen nicht mit. Eine andere Beurteilung fällt mir irgendwie schwer. Ich finde zum Teil widersprüchliche Aussagen und Diskussionen zu dem Thema. Ich kann mich erinnern, die Idee den Token so zu ermitteln kam nicht von mir, das wurde seiner zeit in einem Thread diskutiert und empfohlen.

sidey79 commented 5 years ago

Wie gesagt. 1. Option ist ein HTTP Get und der liefert 2. Option ein HTTP Head.

Dass FHEM liefert, die Head Option wäre nicht erlaubt. Naja was soll ich dazu sagen. Müsste man in fhemweb patchen, da sie ja sogar den header liefert.

Ich habe das nun nicht nachgeprüft, aber soweit ich das sehe liefert fhem?XHR=1 tatsächlich keinen Inhalt. Also genau das, wozu das HTTP Protokoll die HEAD Methode implementiert hat. Die hat wohl jemand nachgebaut... gruselig :)

heinz-otto commented 5 years ago

Ja wollte ich auch gerade sagen ohne XHR passiert das: pi@raspib:~ $ curl -IXGET "$hosturl/fhem" HTTP/1.1 200 OK Content-Length: 4753 Cache-Control: no-cache, no-store, must-revalidate X-FHEM-csrfToken: csrf_94953165283244 Content-Type: text/html; charset=UTF-8

Naja ob nachgebaut oder einer von vielen Wegen? XHR spricht ja konkret die XML Schnittstelle des Webservices an. Oder besser eine spezielle Programm Schnittstelle. Die liefert dann im Falle FHEMWEB die Header aus.

heinz-otto commented 5 years ago

Ob ich das jetzt richtig gemacht habe? In dem ich meinen Codevorschlag einfach in deinen geschrieben habe? Was wäre die richtige Vorgehensweise gewesen?

sidey79 commented 5 years ago

Meiner Meinung nach ist das absolut die richtige Vorgehensweise.

Ich finde das auch richtig klasse. :)

Würde ich auch so übernehemen 👍

Nebenbei, gehört aber nicht direkt zu dieser Änderung: Ich habe mir dein Script noch weiter optimiert, da es mir ein paar kleinere Problemchen bereitet hat

  1. Ich habe die Ausgabe von Meldungen deaktiviert (gut wäre hier natürlich ein schalter)
  2. Ich habe mit die Antwort ohne html tags liefern lassen, die durchsucht werden müssen curl -s --data "fwcsrf=$token" "$hosturl/fhem?cmd=$cmd&XHR=1"
  3. Ich hätte gerne eine Option dem Script einen token zu übergeben um die Abfrage nach dem Token zu überspringen