first commit
This commit is contained in:
commit
59b3cea2cc
209
lib/FHEM/Core/Password/Utils.pm
Normal file
209
lib/FHEM/Core/Password/Utils.pm
Normal file
@ -0,0 +1,209 @@
|
||||
package FHEM::Core::Password::Utils;
|
||||
|
||||
use 5.008;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use GPUtils qw(GP_Import);
|
||||
|
||||
## Import der FHEM Funktionen
|
||||
#-- Run before package compilation
|
||||
BEGIN {
|
||||
|
||||
# Import from main context
|
||||
GP_Import(
|
||||
qw(
|
||||
Log3
|
||||
setKeyValue
|
||||
getKeyValue
|
||||
getUniqueId
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
### eigene Funktionen exportieren
|
||||
require Exporter;
|
||||
our @ISA = qw(Exporter);
|
||||
our @EXPORT_OK = qw(
|
||||
new
|
||||
setStorePassword
|
||||
setDeletePassword
|
||||
getReadPassword
|
||||
setRename
|
||||
);
|
||||
our %EXPORT_TAGS = (
|
||||
ALL => [
|
||||
qw(
|
||||
new
|
||||
setStorePassword
|
||||
setDeletePassword
|
||||
getReadPassword
|
||||
setRename
|
||||
)
|
||||
],
|
||||
);
|
||||
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my $self = {
|
||||
hash => undef,
|
||||
name => undef,
|
||||
};
|
||||
|
||||
bless $self, $class;
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub setStorePassword {
|
||||
my ($self,$hash,$name,$password) = @_;
|
||||
|
||||
my $index = $hash->{TYPE} . '_' . $name . '_passwd';
|
||||
my $key = getUniqueId() . $index;
|
||||
my $enc_pwd = '';
|
||||
|
||||
if ( eval q{use Digest::MD5;1} ) {
|
||||
|
||||
$key = Digest::MD5::md5_hex( unpack "H*", $key );
|
||||
$key .= Digest::MD5::md5_hex($key);
|
||||
}
|
||||
|
||||
for my $char ( split /q{}/, $password ) {
|
||||
|
||||
my $encode = chop($key);
|
||||
$enc_pwd .= sprintf( "%.2x", ord($char) ^ ord($encode) );
|
||||
$key = $encode . $key;
|
||||
}
|
||||
|
||||
my $err = setKeyValue( $index, $enc_pwd );
|
||||
return qq{error while saving the password - $err}
|
||||
if ( defined($err) );
|
||||
|
||||
return q{password successfully saved};
|
||||
}
|
||||
|
||||
sub setDeletePassword {
|
||||
my $hash = shift;
|
||||
|
||||
setKeyValue( $hash->{TYPE} . '_' . $hash->{NAME} . '_passwd', undef );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub getReadPassword {
|
||||
my $self = shift;
|
||||
my $hash = shift;
|
||||
my $name = shift;
|
||||
|
||||
my $index = $hash->{TYPE} . '_' . $name . '_passwd';
|
||||
my $key = getUniqueId() . $index;
|
||||
my ( $password, $err );
|
||||
|
||||
Log3($name, 4, qq{GardenaSmartBridge ($name) - Read password from file});
|
||||
|
||||
( $err, $password ) = getKeyValue($index);
|
||||
|
||||
if ( defined($err) ) {
|
||||
|
||||
Log3($name, 3,
|
||||
qq{GardenaSmartBridge ($name) - unable to read password from file: $err});
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ( defined($password) ) {
|
||||
if ( eval q{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, qq{GardenaSmartBridge ($name) - No password in file});
|
||||
return undef;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub setRename {
|
||||
my $self = shift;
|
||||
my $new = shift;
|
||||
my $old = shift;
|
||||
|
||||
my $hash = $defs{$new};
|
||||
|
||||
setStorePassword( $hash, $new, getReadPassword( $hash, $old ) );
|
||||
setKeyValue( $hash->{TYPE} . '_' . $old . '_passwd', undef );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
FHEM::Core::Password::Utils - FHEM extension for password handling
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
This document describes FHEM::Core::Password::Utils version 0.3
|
||||
|
||||
=head1 SYNOPSIS
|
||||
use FHEM::Core::Password::Utils qw(:ALL);
|
||||
|
||||
our $passutil = FHEM::Core::Password::Utils->new();
|
||||
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
|
||||
|
||||
=head1 EXPORT
|
||||
|
||||
The following functions are exported by this module:
|
||||
C<setStorePassword>,C<setDeletePassword>, C<getReadPassword>, C<setRename>
|
||||
|
||||
=head1 FUNCTIONS
|
||||
Store new Password
|
||||
$passutils->setStorePassword('PASSWORD');
|
||||
|
||||
Read Password
|
||||
$passutils->getReadPassword();
|
||||
|
||||
=over 4
|
||||
|
||||
=back
|
||||
|
||||
=head1 OBJECTS
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
=head1 BUGS AND LIMITATIONS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Marko Oldenburg E<lt>fhemdevelopment AT cooltux DOT netE<gt>
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
FHEM::Core::Password::Utils is released under the same license as FHEM.
|
||||
|
||||
=cut
|
Loading…
Reference in New Issue
Block a user