X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=lib%2FFile%2FKDBX%2FLoader%2FXML.pm;h=00676a1cf7772614520194ec83d2d508d8d099a8;hb=c98fc7d0294e641cf8844306808333bdec4fea2f;hp=806b261664b99605aab6d04d22d1910d2dce9737;hpb=05e0bcef1c2165c556b910314312866dc4a667b7;p=chaz%2Fp5-File-KDBX diff --git a/lib/File/KDBX/Loader/XML.pm b/lib/File/KDBX/Loader/XML.pm index 806b261..00676a1 100644 --- a/lib/File/KDBX/Loader/XML.pm +++ b/lib/File/KDBX/Loader/XML.pm @@ -9,22 +9,19 @@ use Encode qw(decode); use File::KDBX::Constants qw(:version :time); use File::KDBX::Error; use File::KDBX::Safe; -use File::KDBX::Util qw(:text assert_64bit gunzip erase_scoped); +use File::KDBX::Util qw(:class :text assert_64bit gunzip erase_scoped); use Scalar::Util qw(looks_like_number); use Time::Piece; use XML::LibXML::Reader; use boolean; use namespace::clean; -use parent 'File::KDBX::Loader'; +extends 'File::KDBX::Loader'; our $VERSION = '999.999'; # VERSION -sub _reader { $_[0]->{_reader} } - -sub _binaries { $_[0]->{binaries} //= {} } - -sub _safe { $_[0]->{safe} //= File::KDBX::Safe->new(cipher => $_[0]->kdbx->random_stream) } +has '_reader', is => 'ro'; +has '_safe', is => 'ro', default => sub { File::KDBX::Safe->new(cipher => $_[0]->kdbx->random_stream) }; sub _read { my $self = shift; @@ -39,7 +36,7 @@ sub _read_inner_body { my $reader = $self->{_reader} = XML::LibXML::Reader->new(IO => $fh); - delete $self->{safe}; + delete $self->{_safe}; my $root_done; my $pattern = XML::LibXML::Pattern->new('/KeePassFile/Meta|/KeePassFile/Root'); @@ -63,7 +60,7 @@ sub _read_inner_body { throw 'Failed to parse KeePass XML'; } - $self->kdbx->_safe($self->_safe) if $self->{safe}; + $self->kdbx->_safe($self->_safe) if $self->{_safe}; $self->_resolve_binary_refs; } @@ -168,16 +165,15 @@ sub _read_xml_custom_data { sub _read_xml_custom_icons { my $self = shift; - return $self->_read_xml_element( + return $self->_read_xml_element([], Icon => sub { my $self = shift; - my $icon = $self->_read_xml_element( + $self->_read_xml_element( UUID => 'uuid', Data => 'binary', Name => 'text', # KDBX4.1 LastModificationTime => 'datetime', # KDBX4.1 ); - $icon->{uuid} => $icon; }, ); } @@ -371,10 +367,10 @@ sub _resolve_binary_refs { my $self = shift; my $kdbx = $self->kdbx; - my $entries = $kdbx->all_entries(history => 1); my $pool = $kdbx->binaries; - for my $entry (@$entries) { + my $entries = $kdbx->entries(history => 1); + while (my $entry = $entries->next) { while (my ($key, $binary) = each %{$entry->binaries}) { my $ref = $binary->{ref} // next; next if defined $binary->{value};