add SetFn and NotifyFn
add functions for password handling
This commit is contained in:
parent
528e16b166
commit
67de42264f
@ -37,6 +37,8 @@ use utf8;
|
|||||||
|
|
||||||
use GPUtils qw(GP_Import GP_Export);
|
use GPUtils qw(GP_Import GP_Export);
|
||||||
|
|
||||||
|
use Data::Dumper; #only for Debugging
|
||||||
|
|
||||||
## Import der FHEM Funktionen
|
## Import der FHEM Funktionen
|
||||||
#-- Run before package compilation
|
#-- Run before package compilation
|
||||||
BEGIN {
|
BEGIN {
|
||||||
@ -91,3 +93,164 @@ sub Undef {
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub Notify {
|
||||||
|
my $hash = shift // return;
|
||||||
|
my $dev = shift // return;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my $devname = $dev->{NAME};
|
||||||
|
my $devtype = $dev->{TYPE};
|
||||||
|
my $events = deviceEvents( $dev, 1 );
|
||||||
|
return if ( !$events );
|
||||||
|
|
||||||
|
Log3( $name, 4,
|
||||||
|
"AutoShuttersControl ($name) - Devname: "
|
||||||
|
. $devname
|
||||||
|
. " Name: "
|
||||||
|
. $name
|
||||||
|
. " Notify: "
|
||||||
|
. Dumper $events); # mit Dumper
|
||||||
|
|
||||||
|
PushToStorage($hash)
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
grep /^backup.done/,
|
||||||
|
@{$events}
|
||||||
|
and $devname eq 'global'
|
||||||
|
&& $init_done)
|
||||||
|
)
|
||||||
|
and defined( $hash->{UID} )
|
||||||
|
);
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub Set {
|
||||||
|
my $hash = shift // return;
|
||||||
|
my $aArg = shift // return;
|
||||||
|
|
||||||
|
my $name = shift @$aArg;
|
||||||
|
my $cmd = shift @$aArg
|
||||||
|
// return qq{"set $name" needs at least one argument};
|
||||||
|
|
||||||
|
if ( lc $cmd eq 'addpassword' ) {
|
||||||
|
return "usage: $cmd <password>" if ( scalar( @{$aArg} ) != 1 );
|
||||||
|
|
||||||
|
StorePassword( $hash, $name, $aArg->[0] );
|
||||||
|
}
|
||||||
|
elsif ( lc $cmd eq 'deletepassword' ) {
|
||||||
|
return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 );
|
||||||
|
|
||||||
|
DeletePassword($hash);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 'Unknown argument '
|
||||||
|
. $cmd
|
||||||
|
. ', choose one of addpassword,deletepassword';
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub PushToStorage {
|
||||||
|
my $hash = shift;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub StorePassword {
|
||||||
|
my $hash = shift;
|
||||||
|
my $name = shift;
|
||||||
|
my $password = shift;
|
||||||
|
|
||||||
|
my $index = $hash->{TYPE} . "_" . $name . "_passwd";
|
||||||
|
my $key = getUniqueId() . $index;
|
||||||
|
my $enc_pwd = "";
|
||||||
|
|
||||||
|
if ( eval "use Digest::MD5;1" ) {
|
||||||
|
|
||||||
|
$key = Digest::MD5::md5_hex( unpack "H*", $key );
|
||||||
|
$key .= Digest::MD5::md5_hex($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $char ( split //, $password ) {
|
||||||
|
|
||||||
|
my $encode = chop($key);
|
||||||
|
$enc_pwd .= sprintf( "%.2x", ord($char) ^ ord($encode) );
|
||||||
|
$key = $encode . $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $err = setKeyValue( $index, $enc_pwd );
|
||||||
|
return "error while saving the password - $err" if ( defined($err) );
|
||||||
|
|
||||||
|
return "password successfully saved";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ReadPassword {
|
||||||
|
my $hash = shift;
|
||||||
|
my $name = shift;
|
||||||
|
|
||||||
|
my $index = $hash->{TYPE} . "_" . $name . "_passwd";
|
||||||
|
my $key = getUniqueId() . $index;
|
||||||
|
my ( $password, $err );
|
||||||
|
|
||||||
|
Log3 $name, 4, "backupToStorage ($name) - Read password from file";
|
||||||
|
|
||||||
|
( $err, $password ) = getKeyValue($index);
|
||||||
|
|
||||||
|
if ( defined($err) ) {
|
||||||
|
|
||||||
|
Log3 $name, 3,
|
||||||
|
"backupToStorage ($name) - unable to read password from file: $err";
|
||||||
|
return undef;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( defined($password) ) {
|
||||||
|
if ( eval "use Digest::MD5;1" ) {
|
||||||
|
|
||||||
|
$key = Digest::MD5::md5_hex( unpack "H*", $key );
|
||||||
|
$key .= Digest::MD5::md5_hex($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $dec_pwd = '';
|
||||||
|
|
||||||
|
for my $char ( map { pack( 'C', hex($_) ) } ( $password =~ /(..)/g ) ) {
|
||||||
|
|
||||||
|
my $decode = chop($key);
|
||||||
|
$dec_pwd .= chr( ord($char) ^ ord($decode) );
|
||||||
|
$key = $decode . $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dec_pwd;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
Log3 $name, 3, "backupToStorage ($name) - No password in file";
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub Rename {
|
||||||
|
my $new = shift;
|
||||||
|
my $old = shift;
|
||||||
|
|
||||||
|
my $hash = $defs{$new};
|
||||||
|
|
||||||
|
StorePassword( $hash, $new, ReadPassword( $hash, $old ) );
|
||||||
|
setKeyValue( $hash->{TYPE} . "_" . $old . "_passwd", undef );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user