X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=lib%2FFile%2FKDBX%2FLoader%2FV4.pm;h=34802090cc422c71e30403f72765b3477a785738;hb=4dc2a1996dfcf2dfda3c554daa2f5f59fa763494;hp=2180d28df8d37c9b11ed301cc83becc47fe856ea;hpb=eb5adf956fc6b9285b43ce6965eea728573e7864;p=chaz%2Fp5-File-KDBX diff --git a/lib/File/KDBX/Loader/V4.pm b/lib/File/KDBX/Loader/V4.pm index 2180d28..3480209 100644 --- a/lib/File/KDBX/Loader/V4.pm +++ b/lib/File/KDBX/Loader/V4.pm @@ -22,13 +22,13 @@ use Crypt::Mac::HMAC qw(hmac); use Encode qw(decode); use File::KDBX::Constants qw(:header :inner_header :variant_map :compression); use File::KDBX::Error; -use File::KDBX::Util qw(:io :load assert_64bit erase_scoped); +use File::KDBX::Util qw(:class :io :load assert_64bit erase_scoped); use File::KDBX::IO::Crypt; use File::KDBX::IO::HmacBlock; use boolean; use namespace::clean; -use parent 'File::KDBX::Loader'; +extends 'File::KDBX::Loader'; our $VERSION = '999.999'; # VERSION @@ -45,7 +45,7 @@ sub _read_header { $buf .= $val; } - $type = KDBX_HEADER($type); + $type = to_header_constant($type); if ($type == HEADER_END) { # done } @@ -225,10 +225,7 @@ sub _read_inner_header { my $fh = shift; my $kdbx = $self->kdbx; - read_all $fh, my $buf, 5 or throw 'Expected inner header type and size', - compression_error => $IO::Uncompress::Gunzip::GunzipError, - crypt_error => $File::KDBX::IO::Crypt::ERROR, - hmac_error => $File::KDBX::IO::HmacBLock::ERROR; + read_all $fh, my $buf, 5 or throw 'Expected inner header type and size'; my ($type, $size) = unpack('C L<', $buf); my $val; @@ -236,23 +233,18 @@ sub _read_inner_header { read_all $fh, $val, $size or throw 'Expected inner header value', type => $type, size => $size; } - my $dualtype = KDBX_INNER_HEADER($type); - - if (!defined $dualtype) { - alert "Ignoring unknown inner header type ($type)", type => $type, size => $size, value => $val; - return wantarray ? ($type => $val) : $type; - } - elsif ($dualtype == INNER_HEADER_END) { + $type = to_inner_header_constant($type) // $type; + if ($type == INNER_HEADER_END) { # nothing } - elsif ($dualtype == INNER_HEADER_INNER_RANDOM_STREAM_ID) { + elsif ($type == INNER_HEADER_INNER_RANDOM_STREAM_ID) { $val = unpack('L<', $val); - $kdbx->inner_headers->{$dualtype} = $val; + $kdbx->inner_headers->{$type} = $val; } - elsif ($dualtype == INNER_HEADER_INNER_RANDOM_STREAM_KEY) { - $kdbx->inner_headers->{$dualtype} = $val; + elsif ($type == INNER_HEADER_INNER_RANDOM_STREAM_KEY) { + $kdbx->inner_headers->{$type} = $val; } - elsif ($dualtype == INNER_HEADER_BINARY) { + elsif ($type == INNER_HEADER_BINARY) { my $msize = $size - 1; my ($flags, $data) = unpack("C a$msize", $val); my $id = scalar keys %{$kdbx->binaries}; @@ -261,8 +253,12 @@ sub _read_inner_header { $flags & INNER_HEADER_BINARY_FLAG_PROTECT ? (protect => true) : (), }; } + else { + alert "Ignoring unknown inner header type ($type)", type => $type, size => $size, value => $val; + return wantarray ? ($type => $val) : $type; + } - return wantarray ? ($dualtype => $val) : $dualtype; + return wantarray ? ($type => $val) : $type; } 1;