diff --git a/FHEM/98_Matrix.pm b/FHEM/98_Matrix.pm
index a5ecf61..896eae1 100644
--- a/FHEM/98_Matrix.pm
+++ b/FHEM/98_Matrix.pm
@@ -23,13 +23,16 @@
# Usage:
#
##########################################################################
-# $Id: 98_Matrix.pm 28158 2022-11-02 19:56:00Z Man-fred $
+# $Id: 98_Matrix.pm 29553 2022-11-03 22:43:00Z Man-fred $
package main;
use strict;
use warnings;
use HttpUtils;
+use JSON;
use vars qw(%data);
+use FHEM::Core::Authentication::Passwords qw(:ALL);
+#use FHEM::Core::Authentication::Passwords qw(&setStorePassword);
my $Module_Version = '0.0.7';
@@ -40,6 +43,7 @@ sub Matrix_PerformHttpRequest($$$)
my ($hash, $def, $value) = @_;
my $now = gettimeofday();
my $name = $hash->{NAME};
+ my $passwd = $hash->{helper}->{passwdobj}->getReadPassword($name);
my $param = {
timeout => 10,
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
@@ -59,15 +63,15 @@ sub Matrix_PerformHttpRequest($$$)
my $device_id = ReadingsVal($name, 'device_id', undef) ? ', "device_id":"'.ReadingsVal($name, 'device_id', undef).'"' : "";
if ($def eq "register"){
$param->{'url'} = $hash->{server}."/_matrix/client/v3/register";
- $param->{'data'} = '{"type":"m.login.password", "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$hash->{password}.'"}';
+ $param->{'data'} = '{"type":"m.login.password", "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$passwd.'"}';
}
if ($def eq"reg2"){
$param->{'url'} = $hash->{server}."/_matrix/client/v3/register";
- $param->{'data'} = '{"username":"'.$hash->{user}.'", "password":"'.$hash->{password}.'", "auth": {"session":"'.$data{MATRIX}{"$name"}{"session"}.'","type":"m.login.dummy"}}';
+ $param->{'data'} = '{"username":"'.$hash->{user}.'", "password":"'.$passwd.'", "auth": {"session":"'.$data{MATRIX}{"$name"}{"session"}.'","type":"m.login.dummy"}}';
}
if ($def eq "login"){
$param->{'url'} = $hash->{server}."/_matrix/client/v3/login";
- $param->{'data'} = '{"type":"m.login.password", "refresh_token": true, "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$hash->{password}.'"'
+ $param->{'data'} = '{"type":"m.login.password", "refresh_token": true, "identifier":{ "type":"m.id.user", "user":"'.$hash->{user}.'" }, "password":"'.$passwd.'"'
.$device_id.'}';
}
if ($def eq "refresh"){
@@ -85,7 +89,7 @@ sub Matrix_PerformHttpRequest($$$)
$value = AttrVal($name, "MatrixQuestion_$value",$value); # if ($value =~ /[0-9]/);
my @question = split(':',$value);
my $size = @question;
- $value =~ tr/:/
/;
+ $value =~ s/:/
/g;
# min. question and one answer
if (int(@question) >= 2){
$param->{'url'} = $hash->{server}.'/_matrix/client/v3/rooms/'.AttrVal($name, 'MatrixMessage', '!!').'/send/m.poll.start?access_token='.$data{MATRIX}{"$name"}{"access_token"};
@@ -166,7 +170,7 @@ sub Matrix_ParseHttpResponse($)
}
elsif($data ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
Log3 $name, 3, $def." returned: $data"; # Eintrag fürs Log
- my $decoded = eval { decode_json($data) };
+ my $decoded = eval { JSON::decode_json($data) };
Log3 $name, 2, "$name: json error: $@ in data" if( $@ );
if ($param->{code} == 200){
$data{MATRIX}{"$name"}{"FAILS"} = 0;
@@ -322,14 +326,15 @@ sub Matrix_Define {
my ($hash, $def) = @_;
my @param = split('[ \t]+', $def);
- if(int(@param) < 4) {
- return "too few parameters: define Matrix ";
+ if(int(@param) < 3) {
+ return "too few parameters: define Matrix ";
}
$hash->{name} = $param[0];
$hash->{server} = $param[2];
$hash->{user} = $param[3];
$hash->{password} = $param[4];
+ $hash->{helper}->{passwdobj} = FHEM::Core::Authentication::Passwords->new($hash->{TYPE});
my $name = $param[0];
#$data{MATRIX}{"$name"}{"FAILS"} = 0;
@@ -356,7 +361,7 @@ sub Matrix_Undef {
sub Matrix_Startproc {
my ($hash) = @_;
my $name = $hash->{NAME};
- Log3 $name, 1, "$name: Matrix_Startproc V".$hash->{ModuleVersion}." -> V".$Module_Version;
+ Log3 $name, 1, "$name: Matrix_Startproc V".$hash->{ModuleVersion}." -> V".$Module_Version if ($hash->{ModuleVersion});
# Update necessary?
$hash->{ModuleVersion} = $Module_Version;
}
@@ -445,6 +450,12 @@ sub Matrix_Set {
elsif ($opt eq "poll" || $opt eq "poll.fullstate") {
readingsSingleUpdate($hash, $opt, $value, 1); # Readings erzeugen
}
+ elsif ($opt eq "password") {
+ # Can't call method "setStorePassword" on an undefined value at ./FHEM/98_Matrix.pm line 451.
+ my ($erg,$err) = $hash->{helper}->{passwdobj}->setStorePassword($name,$value);
+ Log3 $name, 1, "$name : Matrix_Set $opt - $value -";
+ return undef;
+ }
elsif ($opt eq "filter") {
return Matrix_PerformHttpRequest($hash, $opt, '');
}
@@ -464,7 +475,7 @@ sub Matrix_Set {
return Matrix_PerformHttpRequest($hash, $opt, '');
}
else {
- return "Unknown argument $opt, choose one of filter:noArg question.start question.end poll:0,1 poll.fullstate:0,1 msg register login:noArg refresh:noArg";
+ return "Unknown argument $opt, choose one of filter:noArg password question.start question.end poll:0,1 poll.fullstate:0,1 msg register login:noArg refresh:noArg";
}
#return "$opt set to $value. Try to get it.";
@@ -478,7 +489,7 @@ sub Matrix_Attr {
$attr_value =~ tr/: /~:/;
addToDevAttrList("mt", "MatrixMessage:".$attr_value);
} elsif($attr_name eq "xxMatrixMessage") {
- @_[3] =~ tr/~/:/;
+ $_[3] =~ tr/~/:/;
} else {
return ;
}
@@ -500,9 +511,9 @@ sub Matrix_Attr {
Define
- define <name>
+ define <name>
- Example: define matrix Matrix matrix.com fhem asdf
+ Example: define matrix Matrix matrix.com fhem
noch ins Englische:
1. Anmerkung: Zur einfachen Einrichtung habe ich einen Matrix-Element-Client mit "--profile=fhem" gestartet und dort die Registrierung und die Räume vorbereitet. Achtung: alle Räume müssen noch unverschlüsselt sein um FHEM anzubinden. Alle Einladungen in Räume und Annehmen von Einladungen geht hier viel einfacher. Aus dem Element-Client dann die Raum-IDs merken für das Modul.
@@ -519,6 +530,8 @@ sub Matrix_Attr {
Options:
+ - password
+ Set the password to login
- register
without function, do not use this
- login
@@ -583,9 +596,9 @@ sub Matrix_Attr {
Define
- define <name>
+ define <name>
- Beispiel: define matrix Matrix matrix.com fhem asdf
+ Beispiel: define matrix Matrix matrix.com fhem
1. Anmerkung: Zur einfachen Einrichtung habe ich einen Matrix-Element-Client mit "--profile=fhem" gestartet und dort die Registrierung und die Räume vorbereitet. Achtung: alle Räume müssen noch unverschlüsselt sein um FHEM anzubinden. Alle Einladungen in Räume und Annehmen von Einladungen geht hier viel einfacher. Aus dem Element-Client dann die Raum-IDs merken für das Modul.
2. Anmerkung: sets, gets, Attribute und Readings müssen noch besser bezeichnet werden.
@@ -601,6 +614,8 @@ sub Matrix_Attr {
Options:
+ - password
+ Setzt das Passwort zum Login
- register
noch ohne Funktion!
- login