Revision history for File-KDBX.
+0.904 2022-07-07 21:51:17-0600
+ * Use expanded title, username in OTP parameters.
+
0.903 2022-05-11 17:17:13-0600
* Fixed parsing KDBX4 datetimes on 32-bit perls.
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.025.
Changes
LICENSE
MANIFEST
"Charles McGarvey <ccm@cpan.org>"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010",
+ "generated_by" : "Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010",
"license" : [
"perl_5"
],
"provides" : {
"File::KDBX" : {
"file" : "lib/File/KDBX.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Cipher" : {
"file" : "lib/File/KDBX/Cipher.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Cipher::CBC" : {
"file" : "lib/File/KDBX/Cipher/CBC.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Cipher::Stream" : {
"file" : "lib/File/KDBX/Cipher/Stream.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Constants" : {
"file" : "lib/File/KDBX/Constants.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper" : {
"file" : "lib/File/KDBX/Dumper.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper::KDB" : {
"file" : "lib/File/KDBX/Dumper/KDB.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper::Raw" : {
"file" : "lib/File/KDBX/Dumper/Raw.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper::V3" : {
"file" : "lib/File/KDBX/Dumper/V3.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper::V4" : {
"file" : "lib/File/KDBX/Dumper/V4.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Dumper::XML" : {
"file" : "lib/File/KDBX/Dumper/XML.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Entry" : {
"file" : "lib/File/KDBX/Entry.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Error" : {
"file" : "lib/File/KDBX/Error.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Group" : {
"file" : "lib/File/KDBX/Group.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::IO" : {
"file" : "lib/File/KDBX/IO.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::IO::Crypt" : {
"file" : "lib/File/KDBX/IO/Crypt.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::IO::HashBlock" : {
"file" : "lib/File/KDBX/IO/HashBlock.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::IO::HmacBlock" : {
"file" : "lib/File/KDBX/IO/HmacBlock.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Iterator" : {
"file" : "lib/File/KDBX/Iterator.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::KDF" : {
"file" : "lib/File/KDBX/KDF.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::KDF::AES" : {
"file" : "lib/File/KDBX/KDF/AES.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::KDF::Argon2" : {
"file" : "lib/File/KDBX/KDF/Argon2.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key" : {
"file" : "lib/File/KDBX/Key.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key::ChallengeResponse" : {
"file" : "lib/File/KDBX/Key/ChallengeResponse.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key::Composite" : {
"file" : "lib/File/KDBX/Key/Composite.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key::File" : {
"file" : "lib/File/KDBX/Key/File.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key::Password" : {
"file" : "lib/File/KDBX/Key/Password.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Key::YubiKey" : {
"file" : "lib/File/KDBX/Key/YubiKey.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader" : {
"file" : "lib/File/KDBX/Loader.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader::KDB" : {
"file" : "lib/File/KDBX/Loader/KDB.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader::Raw" : {
"file" : "lib/File/KDBX/Loader/Raw.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader::V3" : {
"file" : "lib/File/KDBX/Loader/V3.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader::V4" : {
"file" : "lib/File/KDBX/Loader/V4.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Loader::XML" : {
"file" : "lib/File/KDBX/Loader/XML.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Object" : {
"file" : "lib/File/KDBX/Object.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Safe" : {
"file" : "lib/File/KDBX/Safe.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Transaction" : {
"file" : "lib/File/KDBX/Transaction.pm",
- "version" : "0.903"
+ "version" : "0.904"
},
"File::KDBX::Util" : {
"file" : "lib/File/KDBX/Util.pm",
- "version" : "0.903"
+ "version" : "0.904"
}
},
"release_status" : "stable",
"web" : "https://github.com/chazmcgarvey/File-KDBX"
}
},
- "version" : "0.903",
+ "version" : "0.904",
"x_authority" : "cpan:CCM",
- "x_generated_by_perl" : "v5.34.1",
- "x_serialization_backend" : "Cpanel::JSON::XS version 4.27",
+ "x_generated_by_perl" : "v5.36.0",
+ "x_serialization_backend" : "Cpanel::JSON::XS version 4.30",
"x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later"
}
configure_requires:
ExtUtils::MakeMaker: '0'
dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010'
+generated_by: 'Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
provides:
File::KDBX:
file: lib/File/KDBX.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Cipher:
file: lib/File/KDBX/Cipher.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Cipher::CBC:
file: lib/File/KDBX/Cipher/CBC.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Cipher::Stream:
file: lib/File/KDBX/Cipher/Stream.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Constants:
file: lib/File/KDBX/Constants.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper:
file: lib/File/KDBX/Dumper.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper::KDB:
file: lib/File/KDBX/Dumper/KDB.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper::Raw:
file: lib/File/KDBX/Dumper/Raw.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper::V3:
file: lib/File/KDBX/Dumper/V3.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper::V4:
file: lib/File/KDBX/Dumper/V4.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Dumper::XML:
file: lib/File/KDBX/Dumper/XML.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Entry:
file: lib/File/KDBX/Entry.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Error:
file: lib/File/KDBX/Error.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Group:
file: lib/File/KDBX/Group.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::IO:
file: lib/File/KDBX/IO.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::IO::Crypt:
file: lib/File/KDBX/IO/Crypt.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::IO::HashBlock:
file: lib/File/KDBX/IO/HashBlock.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::IO::HmacBlock:
file: lib/File/KDBX/IO/HmacBlock.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Iterator:
file: lib/File/KDBX/Iterator.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::KDF:
file: lib/File/KDBX/KDF.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::KDF::AES:
file: lib/File/KDBX/KDF/AES.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::KDF::Argon2:
file: lib/File/KDBX/KDF/Argon2.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key:
file: lib/File/KDBX/Key.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key::ChallengeResponse:
file: lib/File/KDBX/Key/ChallengeResponse.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key::Composite:
file: lib/File/KDBX/Key/Composite.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key::File:
file: lib/File/KDBX/Key/File.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key::Password:
file: lib/File/KDBX/Key/Password.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Key::YubiKey:
file: lib/File/KDBX/Key/YubiKey.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader:
file: lib/File/KDBX/Loader.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader::KDB:
file: lib/File/KDBX/Loader/KDB.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader::Raw:
file: lib/File/KDBX/Loader/Raw.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader::V3:
file: lib/File/KDBX/Loader/V3.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader::V4:
file: lib/File/KDBX/Loader/V4.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Loader::XML:
file: lib/File/KDBX/Loader/XML.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Object:
file: lib/File/KDBX/Object.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Safe:
file: lib/File/KDBX/Safe.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Transaction:
file: lib/File/KDBX/Transaction.pm
- version: '0.903'
+ version: '0.904'
File::KDBX::Util:
file: lib/File/KDBX/Util.pm
- version: '0.903'
+ version: '0.904'
recommends:
Compress::Raw::Zlib: '0'
File::KDBX::XS: '0'
bugtracker: https://github.com/chazmcgarvey/File-KDBX/issues
homepage: https://github.com/chazmcgarvey/File-KDBX
repository: https://github.com/chazmcgarvey/File-KDBX.git
-version: '0.903'
+version: '0.904'
x_authority: cpan:CCM
-x_generated_by_perl: v5.34.1
+x_generated_by_perl: v5.36.0
x_serialization_backend: 'YAML::Tiny version 1.73'
x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.025.
use strict;
use warnings;
"lib" => 0,
"utf8" => 0
},
- "VERSION" => "0.903",
+ "VERSION" => "0.904",
"test" => {
"TESTS" => "t/*.t"
}
VERSION
- version 0.903
+ version 0.904
SYNOPSIS
master keys. It is up to you to pick or generate strong keys.
The KDBX format allows for the key derivation function to be tuned. The
- idea is that you want each single brute-foce attempt to be expensive
+ idea is that you want each single brute-force attempt to be expensive
(in terms of time, CPU usage or memory usage), so that making a lot of
attempts (which would be required if you have a strong master key) gets
really expensive.
equal to 5".
If you find the disambiguating structures to be distracting or
- confusing, you can also the "simple_expression_query" in
+ confusing, you can also use the "simple_expression_query" in
File::KDBX::Util function as a more intuitive alternative. The
following example is equivalent to the previous:
queries generally. We could have just used a literal number.
The important thing to notice here is how we wrapped the condition in
- another arrayref with a single key-value pair where the key is the name
+ another hashref with a single key-value pair where the key is the name
of an operator and the value is the thing to match against. The
supported operators are:
use boolean;
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our $WARNINGS = 1;
fieldhashes \my (%SAFE, %KEYS);
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
generate strong keys.
The KDBX format allows for the key derivation function to be tuned. The idea is that you want each single
-brute-foce attempt to be expensive (in terms of time, CPU usage or memory usage), so that making a lot of
+brute-force attempt to be expensive (in terms of time, CPU usage or memory usage), so that making a lot of
attempts (which would be required if you have a strong master key) gets I<really> expensive.
How expensive you want to make each attempt is up to you and can depend on the application.
It helps to read it right-to-left, like "usage_count is greater than or equal to 5".
-If you find the disambiguating structures to be distracting or confusing, you can also the
+If you find the disambiguating structures to be distracting or confusing, you can also use the
L<File::KDBX::Util/simple_expression_query> function as a more intuitive alternative. The following example is
equivalent to the previous:
Note: L<File::KDBX::Constants/ICON_SMARTPHONE> is just a constant from L<File::KDBX::Constants>. It isn't
special to this example or to queries generally. We could have just used a literal number.
-The important thing to notice here is how we wrapped the condition in another arrayref with a single key-value
+The important thing to notice here is how we wrapped the condition in another hashref with a single key-value
pair where the key is the name of an operator and the value is the thing to match against. The supported
operators are:
use Scalar::Util qw(looks_like_number);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
my %CIPHERS;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Cipher';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has key_size => 32;
sub iv_size { 16 }
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Cipher';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has 'counter', is => 'ro', default => 0;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
use Scalar::Util qw(dualvar);
use namespace::clean -except => 'import';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
BEGIN {
my %CONSTANTS = (
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
use Scalar::Util qw(looks_like_number openhandle);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub new {
=head1 VERSION
-version 0.903
+version 0.904
=head1 ATTRIBUTES
extends 'File::KDBX::Dumper';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _write_magic_numbers { '' }
sub _write_headers { '' }
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::Dumper';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _dump {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Dumper';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _write_headers {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 BUGS
extends 'File::KDBX::Dumper';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has _binaries_written => {}, is => 'ro';
=head1 VERSION
-version 0.903
+version 0.904
=head1 BUGS
extends 'File::KDBX::Dumper';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has allow_protection => 1;
=head1 VERSION
-version 0.903
+version 0.904
=head1 ATTRIBUTES
use File::KDBX::Error;
use File::KDBX::Util qw(:assert :class :coercion :erase :function :uri generate_uuid load_optional);
use Hash::Util::FieldHash;
-use List::Util qw(first sum0);
+use List::Util qw(any first sum0);
use Ref::Util qw(is_coderef is_hashref is_plain_hashref);
use Scalar::Util qw(blessed looks_like_number);
use Storable qw(dclone);
extends 'File::KDBX::Object';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
my $PLACEHOLDER_MAX_DEPTH = 10;
my %PLACEHOLDERS;
$params{secret} = encode_b32r($params{secret}) if !$params{base32};
$params{base32} = 1;
- my $otp = eval {Pass::OTP::otp(%params, @_) };
+ my $otp = eval { Pass::OTP::otp(%params, @_) };
if (my $err = $@) {
throw 'Unable to generate HOTP', error => $err;
}
$params{secret} = encode_b32r($params{secret}) if !$params{base32};
$params{base32} = 1;
- my $otp = eval {Pass::OTP::otp(%params, @_) };
+ my $otp = eval { Pass::OTP::otp(%params, @_) };
if (my $err = $@) {
throw 'Unable to generate TOTP', error => $err;
}
my %params = (
type => 'hotp',
- issuer => $self->title || 'KDBX',
- account => $self->username || 'none',
+ issuer => $self->expand_title || 'KDBX',
+ account => $self->expand_username || 'none',
digits => 6,
counter => $self->string_value('HmacOtp-Counter') // 0,
$self->_otp_secret_params('Hmac'),
);
my %params = (
type => 'totp',
- issuer => $self->title || 'KDBX',
- account => $self->username || 'none',
+ issuer => $self->expand_title || 'KDBX',
+ account => $self->expand_username || 'none',
digits => $self->string_value('TimeOtp-Length') // 6,
algorithm => $algorithms{$self->string_value('TimeOtp-Algorithm') || ''} || 'sha1',
period => $self->string_value('TimeOtp-Period') // 30,
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
keystroke_sequence => '{USERNAME}{TAB}{PASSWORD}{ENTER}',
}
-Keystroke sequences can have </Placeholders>, most commonly C<{USERNAME}> and C<{PASSWORD}>.
+Keystroke sequences can have L</Placeholders>, most commonly C<{USERNAME}> and C<{PASSWORD}>.
=head2 quality_check
Aliases for the B<UserName> string value.
-=head2 expand_notes
-
-Shortcut equivalent to C<< ->expand_string_value('Notes') >>.
-
-=head2 expand_password
-
-Shortcut equivalent to C<< ->expand_string_value('Password') >>.
-
-=head2 expand_title
-
-Shortcut equivalent to C<< ->expand_string_value('Title') >>.
-
-=head2 expand_url
-
-Shortcut equivalent to C<< ->expand_string_value('URL') >>.
-
-=head2 expand_username
-
-Shortcut equivalent to C<< ->expand_string_value('UserName') >>.
-
=head1 METHODS
=head2 string
=head2 expand_string_value
- $string = $entry->expand_string_value;
+ $string = $entry->expand_string_value($string_key);
Same as L</string_value> but will substitute placeholders and resolve field references. Any placeholders that
do not expand to values are left as-is.
Some placeholders (notably field references) require the entry be connected to a database and will throw an
error if it is not.
+=head2 expand_notes
+
+Shortcut equivalent to C<< ->expand_string_value('Notes') >>.
+
+=head2 expand_password
+
+Shortcut equivalent to C<< ->expand_string_value('Password') >>.
+
+=head2 expand_title
+
+Shortcut equivalent to C<< ->expand_string_value('Title') >>.
+
+=head2 expand_url
+
+Shortcut equivalent to C<< ->expand_string_value('URL') >>.
+
+=head2 expand_username
+
+Shortcut equivalent to C<< ->expand_string_value('UserName') >>.
+
=head2 other_strings
$other = $entry->other_strings;
use Scalar::Util qw(blessed looks_like_number);
use namespace::clean -except => 'import';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our @EXPORT = qw(alert error throw);
=head1 VERSION
-version 0.903
+version 0.904
=head1 ATTRIBUTES
extends 'File::KDBX::Object';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
# has uuid => sub { generate_uuid(printable => 1) };
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'IO::Handle';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _croak { require Carp; goto &Carp::croak }
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::IO';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our $BUFFER_SIZE = 16384;
our $ERROR;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::IO';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our $ALGORITHM = 'SHA256';
our $BLOCK_SIZE = 1048576; # 1MiB
our $ERROR;
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::IO';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our $BLOCK_SIZE = 1048576; # 1MiB
our $ERROR;
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
BEGIN { mark_as_loaded('Iterator::Simple::Iterator') }
extends 'Iterator::Simple::Iterator';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub new {
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
use Scalar::Util qw(blessed);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
my %KDFS;
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::KDF';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
# Rounds higher than this are eligible for forking:
my $FORK_OPTIMIZATION_THRESHOLD = 100_000;
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::KDF';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub salt { $_[0]->{+KDF_PARAM_ARGON2_SALT} or throw 'Salt is not set' }
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
use Scalar::Util qw(blessed openhandle);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
fieldhashes \my %SAFE;
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::Key';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub init {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Key';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub init {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Key';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has 'type', is => 'ro';
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Key';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub init {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Key::ChallengeResponse';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
# It can take some time for the USB device to be ready again, so we can retry a few times.
our $RETRY_COUNT = 5;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
use Scalar::Util qw(looks_like_number openhandle);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub new {
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::Loader';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
my $DEFAULT_EXPIRATION = Time::Piece->strptime('2999-12-31 23:59:59', '%Y-%m-%d %H:%M:%S');
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
extends 'File::KDBX::Loader';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _read {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
extends 'File::KDBX::Loader';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _read_header {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 BUGS
extends 'File::KDBX::Loader';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub _read_header {
my $self = shift;
=head1 VERSION
-version 0.903
+version 0.904
=head1 BUGS
extends 'File::KDBX::Loader';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
has '_reader', is => 'ro';
has '_safe', is => 'ro', default => sub { File::KDBX::Safe->new(cipher => $_[0]->kdbx->random_stream) };
=head1 VERSION
-version 0.903
+version 0.904
=head1 BUGS
use Scalar::Util qw(blessed weaken);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
fieldhashes \my (%KDBX, %PARENT, %TXNS, %REFS, %SIGNALS);
=head1 VERSION
-version 0.903
+version 0.904
=head1 DESCRIPTION
use Scalar::Util qw(refaddr);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub new {
=head1 VERSION
-version 0.903
+version 0.904
=head1 SYNOPSIS
use File::KDBX::Util qw(:class);
use namespace::clean;
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
sub new {
=head1 VERSION
-version 0.903
+version 0.904
=head1 ATTRIBUTES
use boolean;
use namespace::clean -except => 'import';
-our $VERSION = '0.903'; # VERSION
+our $VERSION = '0.904'; # VERSION
our %EXPORT_TAGS = (
assert => [qw(DEBUG assert)],
=head1 VERSION
-version 0.903
+version 0.904
=head1 FUNCTIONS