add SetFn and NotifyFn
add functions for password handling
This commit is contained in:
		@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user