File-KDBX
view release on metacpan or search on metacpan
lib/File/KDBX/Key.pm view on Meta::CPAN
package File::KDBX::Key;
# ABSTRACT: A credential that can protect a KDBX file
use warnings;
use strict;
use Devel::GlobalDestruction;
use File::KDBX::Error;
use File::KDBX::Safe;
use File::KDBX::Util qw(erase);
use Hash::Util::FieldHash qw(fieldhashes);
use Module::Load;
use Ref::Util qw(is_arrayref is_coderef is_hashref is_ref is_scalarref);
use Scalar::Util qw(blessed openhandle);
use namespace::clean;
our $VERSION = '0.906'; # VERSION
fieldhashes \my %SAFE;
sub new {
my $class = shift;
my %args = @_ % 2 == 1 ? (primitive => shift, @_) : @_;
my $primitive = $args{primitive};
delete $args{primitive} if !$args{keep_primitive};
return $primitive->hide if blessed $primitive && $primitive->isa($class);
my $self = bless \%args, $class;
return $self->init($primitive) if defined $primitive;
return $self;
}
sub DESTROY {
local ($., $@, $!, $^E, $?);
!in_global_destruction and do { $_[0]->_clear_raw_key; eval { erase \$_[0]->{primitive} } }
}
sub init {
my $self = shift;
my $primitive = shift // throw 'Missing key primitive';
my $pkg;
if (is_arrayref($primitive)) {
$pkg = __PACKAGE__.'::Composite';
}
elsif (is_scalarref($primitive) || openhandle($primitive)) {
$pkg = __PACKAGE__.'::File';
}
elsif (is_coderef($primitive)) {
$pkg = __PACKAGE__.'::ChallengeResponse';
}
elsif (!is_ref($primitive)) {
$pkg = __PACKAGE__.'::Password';
}
elsif (is_hashref($primitive) && defined $primitive->{composite}) {
$pkg = __PACKAGE__.'::Composite';
$primitive = $primitive->{composite};
}
elsif (is_hashref($primitive) && defined $primitive->{password}) {
$pkg = __PACKAGE__.'::Password';
$primitive = $primitive->{password};
}
elsif (is_hashref($primitive) && defined $primitive->{file}) {
$pkg = __PACKAGE__.'::File';
$primitive = $primitive->{file};
}
elsif (is_hashref($primitive) && defined $primitive->{responder}) {
$pkg = __PACKAGE__.'::ChallengeResponse';
$primitive = $primitive->{responder};
( run in 0.602 second using v1.01-cache-2.11-cpan-39bf76dae61 )