File-KDBX
view release on metacpan or search on metacpan
lib/File/KDBX.pm view on Meta::CPAN
package File::KDBX;
# ABSTRACT: Encrypted database to store secret text and files
use 5.010;
use warnings;
use strict;
use Crypt::Digest qw(digest_data);
use Crypt::PRNG qw(random_bytes);
use Devel::GlobalDestruction;
use File::KDBX::Constants qw(:all :icon);
use File::KDBX::Error;
use File::KDBX::Safe;
use File::KDBX::Util qw(:class :coercion :empty :search :uuid erase simple_expression_query snakify);
use Hash::Util::FieldHash qw(fieldhashes);
use List::Util qw(any first);
use Ref::Util qw(is_ref is_arrayref is_plain_hashref);
use Scalar::Util qw(blessed);
use Time::Piece 1.33;
use boolean;
use namespace::clean;
our $VERSION = '0.906'; # VERSION
our $WARNINGS = 1;
fieldhashes \my (%SAFE, %KEYS);
sub new {
my $class = shift;
# copy constructor
return $_[0]->clone if @_ == 1 && blessed $_[0] && $_[0]->isa($class);
my $data;
$data = shift if is_plain_hashref($_[0]);
my $self = bless $data // {}, $class;
$self->init(@_);
$self->_set_nonlazy_attributes if !$data;
return $self;
}
sub DESTROY { local ($., $@, $!, $^E, $?); !in_global_destruction and $_[0]->reset }
sub init {
my $self = shift;
my %args = @_;
@$self{keys %args} = values %args;
return $self;
}
sub reset {
my $self = shift;
erase $self->headers->{+HEADER_INNER_RANDOM_STREAM_KEY};
erase $self->inner_headers->{+INNER_HEADER_INNER_RANDOM_STREAM_KEY};
erase $self->{raw};
%$self = ();
$self->_remove_safe;
return $self;
}
sub clone {
my $self = shift;
require Storable;
return Storable::dclone($self);
}
sub STORABLE_freeze {
my $self = shift;
my $cloning = shift;
( run in 1.834 second using v1.01-cache-2.11-cpan-39bf76dae61 )