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 Data::Dumper; #only for Debugging
|
||||
|
||||
## Import der FHEM Funktionen
|
||||
#-- Run before package compilation
|
||||
BEGIN {
|
||||
@ -91,3 +93,164 @@ sub Undef {
|
||||
|
||||
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