Rückgabe von Longpoll maskiert Steuerzeichen nicht vollständig

Begonnen von Dr. Boris Neubert, 04 September 2016, 20:34:22

Vorheriges Thema - Nächstes Thema

justme1968

irgendwo ist noch was inkonsistent.

define uff8 dummy;
setreading utf8 state Ä ö ü; °;C


wird in der device detail ansicht zunächst als Ä ö ü °C angezeigt. erst nach longpoll update durch nochmaliges setreading eingabe dann als Ä ö ü °C. in der raum übersicht wird es scheinbar immer korrekt angezeigt.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Das ist eine ganz andere Baustelle:
- makeTable in 01_FHEMWEB.pm escaped (wie heisst das auf deutsch eigentlich?) HTML, bis auf das kuerzlich eingefuehrten <html>.*</html>
- die Statusanzeige (FW_devState) macht sowas nicht
- die longpoll Anzeige in fhemweb.js nimmt HTML an (Zeile 638: $(this).html(d[2]);), richtig waere .html() fuer <html>.*</html>, sonst .text().

Umbau ist relativ einfach, FW_devState ist aber problematisch, weil da nochmal ein <div> mit title um den Wert herum gestrickt wird, und weil diverse Widgets (readingsGroup?) HTML fuer diesen Teil zurueckschicken.

Vorschlag: FW_devState bleibt, fhemweb.js Zeile 638 wird umgebaut.
Habs so eingecheckt, bitte testen.

Dr. Boris Neubert

Zitat von: rudolfkoenig am 05 Oktober 2016, 08:56:55
@Boris: kannst du bite das Gleiche fuer dein Problemfall machen?

Mache ich, bin aber vor dem WE nicht an meinem Rechner. Bitte um Geduld.]
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

justme1968

#18
leider gibt es immer noch probleme mit der aktuellen lösung: https://forum.fhem.de/index.php/topic,14425.msg499805.html#msg499805. ich habe kurz geschaut und es liegt daran das anführungzeichen durch \u0022 ersetzt werden. damit ist der string nicht mehr valides html.

auf die schnelle habe ich getestet das es hilft den string in <html></html> einzuschliessen. das hilft aber nur weil dadurch das komplette maskieren abgestellt wird. das geht natürlich schief wenn im string zeichen drin sind die in json nicht erlaubt sind.

die 'korrekte' lösung muss:
- json und html encoding regeln trennen
- auf fhem seite json korrekt encoden
- auf js seite das json korrekt decoder
- was auf fhem seite los geschickt wird muss auf js seite nach encoden und decoden identisch ankommen.

ich hatte noch keine zeit zu schauen an welchem der 4 punkte es genau noch nicht passt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

habe noch etwas weiter geforscht. es sind nicht die \u0022 sondern das neue maskieren von html. wenn ich <html>...</html> für die longpoll updates verwende ist es ok. das habe ich jetzt erst mal so eingecheckt.

mal sehen ob es weitere nebeneffekte gibt.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dr. Boris Neubert

Hallo,

habe versucht, die Situation von vor einigen Wochen nachzustellen mit der aktuellen Version aus dem Repo.

Das Problem entstand, wenn ein Attribut mit einem Wert vorbelegt wird, der in JSON nicht vorkommen darf. Das wurde nicht korrekt maskiert. Das tritt z.B. bei ECMDDevice auf, wenn \000 als Trenner verwendet wird, Mit der folgenden Minimalkonfiguration kann man das herstellen:


attr global statefile fhem.save   
attr global verbose 5                 
attr global port 7072 global
attr global modpath /pfad/zum/fhem-code/fhem

define ui FHEMWEB 8083 global

define D Dummy
set D Anfangswert
{ $attr{D}{killer}="\000" }


Den resultierenden JSON-Kode lasse ich mir dann mit

http://meinfhemserver:8083/fhem/?cmd=jsonlist2+D

anzeigen. Ich habe aber den Befehl nicht mehr hinbekommen, durch ein HTTP GET die Gesamtkonfiguration direkt als JSON zurückliefern zu lassen. Bei fehlerhaftem JSON-Kode gibt das nämlich auch gleich Gemecker vom Browser.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo,

ich habe mit der obigen Konfiguration aber noch was viel schlimmeres: die Konsole geht nicht mehr.

neubert@sauron:~$ telnet sauron 8083
Trying 127.0.1.1...
Connected to sauron.
Escape character is '^]'.
list

HTTP/1.1 302 Found
Content-Length: 0
Location: /fhem

Connection closed by foreign host.


Nach Eingabe von list drücke ich Enter. Nichts passiert. Ich drücke nochmal Enter. Die HTTP-Meldung erscheint und die Session stirbt. FHEM läuft aber weiter. Im Log steht dazu:

2016.10.09 11:09:14 4: Connection accepted from ui_127.0.0.1_45794
2016.10.09 11:09:17 4: ui_127.0.0.1_45794 list ; BUFLEN:0
2016.10.09 11:09:17 4: ui: redirecting  to /fhem


Ich habe einen extra Beitrag aufgemacht, damit er als neues Thema abgespalten werden kann, wenn es ein anderes Problem ist.
Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Aeh: list ist doch kein HTTP Befehl.
Versuch mal sowas wie (zweimal RETURN am Ende), funktioniert bei mir, und liefert HTML zurueck.

GET /fhem?cmd=list


rudolfkoenig

Ich fuehle mich unwohl mit deinem Attributswert, als C-Programmierer ist mir das 0 Zeichen immer suspekt.
Im JSON steht jedenfalls was Richtiges:

    "Attributes": {
      "killer": "\u0000",
      "userattr": "killer"
    }


Dr. Boris Neubert

#24
Zitat von: rudolfkoenig am 09 Oktober 2016, 12:03:57
Aeh: list ist doch kein HTTP Befehl.
:-[  :-[  :-[  Ich schäme mich.

Oh dear! Ich bin so was von urlaubsreif. Das Wochenende macht mich fertig. Ich kann nach 10 Jahren FHEM 7072 nicht mehr von 8083 unterscheiden. Entschuldige, dass ich Dir mit meinem Unfug die Zeit gestohlen habe.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo Rudi,

Zitat von: rudolfkoenig am 09 Oktober 2016, 12:13:17
Ich fuehle mich unwohl mit deinem Attributswert, als C-Programmierer ist mir das 0 Zeichen immer suspekt.

solange wir Binärdaten in Readings und Attributen nicht verbieten, müssen wir überall in FHEM damit rechnen. Es betrifft den ganzen Bereich der nichtdruckbaren Zeichen, insbesondere \n und \r. Insbesondere sehe ich derzeit eine Schwierigkeit darin, wie Sonderzeichen über die verschiedenen Wege nach FHEM hereinkommen sollen (Konfigurationsdatei, Telnet, Webinterface, fhem.save) und wie sie dem Benutzer angezeigt werden (Webinterface, Logdateien). Anfang des Jahres ist das Problem bei meinem ECMD hochgepoppt, da dort weder bei der Eingabe klar ist, ob im Log \r nun Backslash-R oder Carriage Return bedeutet, und wie ich Carriage Return ins Attribut reingeschrieben bekomme. Das Problem ist weniger die konsistente Umsetzung sondern die Vereinbarung, wie wir mit Sonderzeichen grundsätzlich umgehen wollen, was also "konsistent" bedeutet. Das müssen wir ein andermal in einem anderen Thread erörtern - meine FHEM-Entwicklungskapazitäten incl. Diskussionen dazu sind leider derzeit ausgenullt.

Zitat
Im JSON steht jedenfalls was Richtiges:

    "Attributes": {
      "killer": "\u0000",
      "userattr": "killer"
    }


Genau. Das ist Ergebnis der Änderungen, die Du gemacht hast. Mein Problem, weswegen ich das Thema eröffnet habe, ist damit wohl erledigt.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

stromer-12

kann es sein, das hier noch ein "x" fehlt?

Zeile 2711
sub
FW_longpollInfo($@)
{
  my $fmt = shift;
  if($fmt && $fmt eq "JSON") {
    my @a;
    map { my $x = $_; #Forum 57377, ASCII 0-19 \ "
-          $x=~ s/([\x00-\x1f\x22\x5c\7f])/sprintf '\u%04x', ord($1)/ge;
+          $x=~ s/([\x00-\x1f\x22\x5c\x7f])/sprintf '\u%04x', ord($1)/ge;
          push @a,$x; } @_;
    return '["'.join('","', @a).'"]';
  } else {
    return join('<<', @_);
  }
}


FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

rudolfkoenig