[erledigt] X_Attr: keine Auswertung des Rückgabewerts

Begonnen von mBielemeier, 12 Juli 2020, 08:55:41

Vorheriges Thema - Nächstes Thema

mBielemeier

Hallo,

ich entwickle gerade ein Modul um Passwörter nicht im Klartext, sondern nur als SHA256 in FHEM zu speichern. Dazu manipuliere ich wie im Wiki beschrieben den Attributwert über $_[3]. Die Manipulation sehe ich auch im Log, in der Attributliste wird aber der Originalwert gespeichert.

Ich bin mir sicher, dass die Funktion mal so war wie im Wiki beschrieben, kann aber nicht mehr reproduzieren, bei welcher Perl/FHEM-Version es noch ging.

Zitat aus dem Wiki (https://wiki.fhem.de/wiki/DevelopmentModuleIntro#X_Attr)
ZitatZusätzlich ist es möglich auch übergebene Attributwerte zu verändern bzw. zu korrigieren, indem man im Parameterarray @_ den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 (entspricht dem 4. Element) im Parameterarray, also $_[3].

Meine Funktion:

sub PasswordCheck_Attr($$$$)
{
my ( $cmd, $name, $attrName, $attrValue ) = @_;
   
  # $cmd  - Vorgangsart - kann die Werte "del" (löschen) oder "set" (setzen) annehmen
# $name - Gerätename
# $attrName/$attrValue sind Attribut-Name und Attribut-Wert
    Log3 $name, 1, "PasswordCheck attr $name $cmd $attrName $attrValue";
if ($cmd eq "set") {
if ($attrName =~ /password_.*/) {
if (length($attrValue) < 16) {
$attrValue = sha256_base64($attrValue);
$_[3] = $attrValue;
}
addToDevAttrList($name, $attrName);
}
}
    Log3 $name, 1, "PasswordCheck attr $name $cmd $attrName $_[3]";
return undef;
}


Ausgeführter Befehl:
attr Password password_A 3459

Log-Datei:
2020.07.12 08:27:07 1: PasswordCheck attr Password set password_A 3459
2020.07.12 08:27:07 1: PasswordCheck attr Password set password_A 3LV3B/bwDtFttPJcw7PsyyxMREOY+iYtb1MIoSkXRRI


Auszug aus der "Raw definition" enthält trotzdem den Originalwert
attr Password password_A 3459
erwarten würde ich nach Wiki
attr Password password_A 3LV3B/bwDtFttPJcw7PsyyxMREOY+iYtb1MIoSkXRRI

Meine Perl-Version v5.30.0
Meine FHEM-Version Rev. 22082 2020-05-31

Übersehe ich etwas? Für eine Hilfestellung wäre ich dankbar.

Viele Grüße
Manfred
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

rudolfkoenig

Bin fuer Wiki nicht zustaendig, aber in fhem.pl/CommandAttr() steht _nach_ dem Aufruf von AttrFn
    $attr{$sdev}{$attrName} = $attrVal;
insofern habe ich meine Schwierigkeit vorzustellen, wie das Modifizieren des Wertes in AttrFn funktionieren soll.
Beabsichtigt war es jedenfalls nicht. Fuer die gleiche Aufgabe (s.u, allowed) verwende ich set.

ZitatÜbersehe ich etwas?
fhem.pl bietet ein Interface fuer Authentisierung an ($hash->{AuthenticateFn}), mit einer konkreten Implementation (allowed), was das Passwort als SHA256 speichert. Verwendet wird dieses Interface via Authenticate() von FHEMWEB, telnet und MQTT2_SERVER

Apropos: da SHA256 nur im Zusammenhang mit einem Server sinnvoll ist: welcher Server soll der Nutzniesser sein?


mBielemeier

Hallo,

erst mal zum Apropos:
Zitatda SHA256 nur im Zusammenhang mit einem Server sinnvoll ist: welcher Server soll der Nutzniesser sein?
Ich habe mir ein Modul als Ergänzung für die FHEM-Alarmanlage geschrieben. Zum Entschärfen ist dann eine PIN-Eingabe notwendig und diesen PIN wollte ich nicht im Klartext abspeichern, aber auch in keinem Log wiederfinden. Also speichere ich nur den SHA256 für jeden Berechtigten in den Attributen und vergleiche beim SET auch wieder mittels SHA256 welcher PIN eingegeben wurde. Auch im abgesetzten Keypad (über WLAN mit esp8266) wird SHA256 berechnet und nur der verschlüsselte Teil per MQTT geschickt.

Und nun zum Modifizieren des Wertes in AttrFn:
Ich habe mir die Stelle in fhem.pl angesehen und gebe dir Recht. Dann habe ich im SVN nach alten Versionen gesucht, alle möglichen Änderungen ausprobiert bis zum Absturz der fhem.pl, dann alles wieder gespeichert wie ursprünglich und nun das Eigenartige: Es funktioniert wieder, die Attribute enthalten von Anfang an nur den SHA256-Code. Wie Anwender so schön sagen: Ich habe gar nichts gemacht ;) Allowed schau ich mir trotzdem mal an.

Falls Interesse an Ursachenforschung besteht, baue ich ein ganz leeres FHEM und teste mein Modul dann.

Viele Grüße
Manfred
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

betateilchen

Zitat von: mBielemeier am 12 Juli 2020, 15:17:58
erst mal zum Apropos:Ich habe mir ein Modul als Ergänzung für die FHEM-Alarmanlage geschrieben. Zum Entschärfen ist dann eine PIN-Eingabe notwendig und diesen PIN wollte ich nicht im Klartext abspeichern

Das könntest Du aber auch einfach mit einem Einmal-Passwort erledigen und den Google Authenticator verwenden. Durch das Einmalpasswort brauchst Du dann überhaupt nichts irgendwo abspeichern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mBielemeier

Zitat von: betateilchen am 13 Juli 2020, 13:17:46Das könntest Du aber auch einfach mit einem Einmal-Passwort erledigen und den Google Authenticator verwenden
Der war mir noch nicht bei FHEM über den Weg gelaufen. Ist ein interessanter Ansatz, den ich mir jetzt mal genauer anschau.

Ich habe aber gerne mindestens eine Möglichkeit, ohne laufendes Internet alles in FHEM zu schalten. Deshalb dieses eigene Passwortmodul.

Zitat von: rudolfkoenig am 12 Juli 2020, 09:58:46
fhem.pl bietet ein Interface fuer Authentisierung an ($hash->{AuthenticateFn}), mit einer konkreten Implementation (allowed)
Mir geht es nicht um den generellen Zugang, der ist natürlich per allowed gelöst. Es geht mir um das kurzzeitige Aktivieren von Devices und das Widerrufen/Entschärfen in der Alarmanlage.

FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

betateilchen

Zitat von: mBielemeier am 13 Juli 2020, 17:58:03
Es geht mir um das kurzzeitige Aktivieren von Devices und das Widerrufen/Entschärfen in der Alarmanlage.

Sowas erledige ich per email an mein FHEM, im Betreff der email muss ein gültiges Einmal-Passwort stehen, damit FHEM erkennen kann, dass diese email auch tatsächlich von mir stammt.

Zitat von: mBielemeier am 13 Juli 2020, 17:58:03
Der war mir noch nicht bei FHEM über den Weg gelaufen. Ist ein interessanter Ansatz, den ich mir jetzt mal genauer anschau.

help GoogleAuth
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatEs geht mir um das kurzzeitige Aktivieren von Devices und das Widerrufen/Entschärfen in der Alarmanlage.

Allowed kann man aber dafuer relativ einfach "missbrauchen":
fhem> define al allowed
fhem> attr al validFor al
fhem> set al basicAuth userName PassWord
fhem> list al basicAuth
al                       SHA256:5CB835B5:6m+sOzGVzFmcUtgHSr2cnOnhLBSq3u6MqTFV3xmMcao
fhem> { Authenticate({SNAME=>'al',NAME=>'al',TYPE=>'allowed'}, "basicAuth:".encode_base64("userName:PassWord")) }
1
fhem> { Authenticate({SNAME=>'al',NAME=>'al',TYPE=>'allowed'}, "basicAuth:".encode_base64("userName:BadWord")) }
2

betateilchen

Auch ich werde den Eindruck nicht los, dass sich hier ein Anwender mal wieder unnötig das Leben schwer macht und etwas zu entwickeln versucht, wofür es in FHEM schon lange diverse praxiserprobte Lösungswege gibt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mBielemeier

Hätte nicht gedacht, dass Allowed auch so universell eingesetzt werden kann. Würde mein kleines Modul jetzt nicht schon laufen, wäre das die Lösung.

betateilchen, unnötig schwer wars nicht, da ist eher der Weg das Ziel und für meine ersten Perl-Schritte war das Problem noch leicht genug. GoogleAuth funktioniert auch ganz einfach, aber wie ich schon sagte, habe ich als erste Lösung gerne eine, die komplett im Haus ohne Internet funktioniert.
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

mBielemeier

Um zum Ursprünglichen zurückzukommen:

Zitat von: rudolfkoenig am 12 Juli 2020, 09:58:46
... in fhem.pl/CommandAttr() steht _nach_ dem Aufruf von AttrFn
    $attr{$sdev}{$attrName} = $attrVal;
insofern habe ich meine Schwierigkeit vorzustellen, wie das Modifizieren des Wertes in AttrFn funktionieren soll.
Beabsichtigt war es jedenfalls nicht. ...
Ich habe nun wieder was gelernt: in Perl sind Funktionsargumente immer Pass-by-reference, wenn @_ manipuliert wird, wirkt sich das also unmittelbar auf die im Aufruf genutzte Variable aus. Da  $attrVal auch im Aufruf AttrFn steht, gilt also doch die Beschreibung aus dem Wiki. Da hatte ich eher eine Störung im Perl auf meinem Rasberry, die jetzt ja auch nicht mehr reproduzierbar ist.

Ich setze das Thema dann auch auf erledigt. Vielen Dank für die Erklärung und die Anregungen.
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

rudolfkoenig

Zitatin Perl sind Funktionsargumente immer Pass-by-reference
Und ich war (bin?) der Ansicht: pass-by-value.

mBielemeier

Zitat von: rudolfkoenig am 14 Juli 2020, 13:44:05
Und ich war (bin?) der Ansicht: pass-by-value.

Ich weiß nicht, wie offiziell diese Seite ist, aber ich habe Vergleichbares an vielen Stellen gefunden: https://www.perltutorial.org/passing-parameters-to-subroutine/.
Das hat mich letzendlich überzeugt, dass explizites pass-by-reference nur in einigen Sonderfällen benötigt wird. Wie pass-by-value erzwungen werden kann, habe ich nicht herausgefunden, geht scheinbar nicht.
FHEM 6.1 Raspberry 4, CUL868+CUL433 auf ESP8266-Basis, FS20, IT-Steckdosen, ESP8266-MQTT, Zigbee, Shelly

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Wo du Recht hast...
Ich muss meine Aussagen von frueher korrigieren: Aendern des Attributwertes (oder gar den AttributNamen) in AttrFn ist moeglich, aber da es nicht beabsichtigt ist, will nicht garantieren, dass es so bleibt.

ZitatWie pass-by-value erzwungen werden kann, habe ich nicht herausgefunden, geht scheinbar nicht.
Eine Kopie der Variable der Funktion uebergeben.

herrmannj

ZitatWie pass-by-value erzwungen werden kann, habe ich nicht herausgefunden, geht scheinbar nicht.
Der verlinkte Beitrag https://www.perltutorial.org/passing-parameters-to-subroutine/ beschreibt doch beide Varianten sehr gut. Wie man ein Verhalten analog zu pass-by-value erreicht, wird im zweiten Teil exakt beschrieben. ->
sub do_something{
    my ($p1,$p2) = @_;
}