X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=lib%2FFile%2FKDBX%2FLoader%2FKDB.pm;h=9feaaacf7e4bb3972fe944266eb9f1d372d3eefd;hb=c98fc7d0294e641cf8844306808333bdec4fea2f;hp=1f0cb3d881457a0df3b999b37cd41de77e437de5;hpb=f63182fc62b25269b1c38588dca2b3535ed1a1a2;p=chaz%2Fp5-File-KDBX diff --git a/lib/File/KDBX/Loader/KDB.pm b/lib/File/KDBX/Loader/KDB.pm index 1f0cb3d..9feaaac 100644 --- a/lib/File/KDBX/Loader/KDB.pm +++ b/lib/File/KDBX/Loader/KDB.pm @@ -7,7 +7,7 @@ use strict; use Encode qw(encode); use File::KDBX::Constants qw(:header :cipher :random_stream :icon); use File::KDBX::Error; -use File::KDBX::Util qw(:empty :io :uuid load_optional); +use File::KDBX::Util qw(:class :empty :io :uuid load_optional); use File::KDBX; use Ref::Util qw(is_arrayref is_hashref); use Scalar::Util qw(looks_like_number); @@ -15,7 +15,7 @@ use Time::Piece; use boolean; use namespace::clean; -use parent 'File::KDBX::Loader'; +extends 'File::KDBX::Loader'; our $VERSION = '999.999'; # VERSION @@ -90,16 +90,18 @@ sub convert_keepass_to_kdbx { } } - for my $entry ($kdbx->find_entries({ + $kdbx->entries + ->grep({ title => 'Meta-Info', username => 'SYSTEM', url => '$', icon_id => 0, -nonempty => 'notes', - })) { - _read_meta_stream($kdbx, $entry); - $entry->remove; - } + }) + ->each(sub { + _read_meta_stream($kdbx, $_); + $_->remove; # TODO do not signal + }); return $kdbx; } @@ -120,7 +122,7 @@ sub _read_meta_stream { read_all $fh, $buf, 5 or goto PARSE_ERROR; my ($group_id, $expanded) = unpack('L< C', $buf); my $uuid = _decode_uuid($group_id) // next; - my ($group) = $kdbx->find_groups({uuid => $uuid}); + my $group = $kdbx->groups->grep({uuid => $uuid})->next; $group->is_expanded($expanded) if $group; } } @@ -139,7 +141,7 @@ sub _read_meta_stream { read_all $fh, $buf, 20 or goto PARSE_ERROR; my ($uuid, $icon_index) = unpack('a16 L<', $buf); next if !$icons[$icon_index]; - my ($entry) = $kdbx->find_entries({uuid => $uuid}); + my $entry = $kdbx->entries->grep({uuid => $uuid})->next; $entry->custom_icon_uuid($icons[$icon_index]) if $entry; } for (my $i = 0; $i < $num_groups; ++$i) { @@ -147,7 +149,7 @@ sub _read_meta_stream { my ($group_id, $icon_index) = unpack('L<2', $buf); next if !$icons[$icon_index]; my $uuid = _decode_uuid($group_id) // next; - my ($group) = $kdbx->find_groups({uuid => $uuid}); + my $group = $kdbx->groups->grep({uuid => $uuid})->next; $group->custom_icon_uuid($icons[$icon_index]) if $group; } } @@ -232,7 +234,7 @@ sub _convert_keepass_to_kdbx_headers { $meta->{settings_changed} = _decode_datetime($from->{settings_changed}); while (my ($key, $value) = each %{$from->{custom_icons} || {}}) { - $meta->{custom_icons}{$key} = {value => $value}; + push @{$meta->{custom_icons} //= []}, {uuid => $key, data => $value}; } while (my ($key, $value) = each %{$from->{custom_data} || {}}) { $meta->{custom_data}{$key} = {value => $value};