X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=lib%2FFile%2FKDBX%2FEntry.pm;h=0119b67363431fe407dfd828c58934330ce26edd;hb=3a28d16f9cfdf4fa7db4b513f143374ddc7598b1;hp=8bb30c4f9ffeb4dc6fae49e1b9a6507c171d7bc3;hpb=eefcd42a336641c8927b29d12c5c59443212468f;p=chaz%2Fp5-File-KDBX diff --git a/lib/File/KDBX/Entry.pm b/lib/File/KDBX/Entry.pm index 8bb30c4..0119b67 100644 --- a/lib/File/KDBX/Entry.pm +++ b/lib/File/KDBX/Entry.pm @@ -4,18 +4,18 @@ package File::KDBX::Entry; use warnings; use strict; -use Crypt::Misc 0.029 qw(decode_b64 encode_b32r); +use Crypt::Misc 0.049 qw(decode_b64 encode_b32r); use Devel::GlobalDestruction; use Encode qw(encode); use File::KDBX::Constants qw(:history :icon); 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); -use Time::Piece; +use Time::Piece 1.33; use boolean; use namespace::clean; @@ -27,18 +27,6 @@ my $PLACEHOLDER_MAX_DEPTH = 10; my %PLACEHOLDERS; my %STANDARD_STRINGS = map { $_ => 1 } qw(Title UserName Password URL Notes); -=attr uuid - -128-bit UUID identifying the entry within the database. - -=attr icon_id - -Integer representing a default icon. See L for valid values. - -=attr custom_icon_uuid - -128-bit UUID identifying a custom icon within the database. - =attr foreground_color Text color represented as a string of the form C<#000000>. @@ -51,10 +39,6 @@ Background color represented as a string of the form C<#FFFFFF>. TODO -=attr tags - -Text string with arbitrary tags which can be used to build a taxonomy. - =attr auto_type_enabled Whether or not the entry is eligible to be matched for auto-typing. @@ -76,11 +60,7 @@ An array of window title / keystroke sequence associations. keystroke_sequence => '{USERNAME}{TAB}{PASSWORD}{ENTER}', } -Keystroke sequences can have , most commonly C<{USERNAME}> and C<{PASSWORD}>. - -=attr previous_parent_group - -128-bit UUID identifying a group within the database. +Keystroke sequences can have L, most commonly C<{USERNAME}> and C<{PASSWORD}>. =attr quality_check @@ -122,45 +102,11 @@ characters. There are methods available to provide more convenient access to binaries, including L and L. -=attr custom_data - -A set of key-value pairs used to store arbitrary data, usually used by software to keep track of state rather -than by end users (who typically work with the strings and binaries). - =attr history Array of historical entries. Historical entries are prior versions of the same entry so they all share the same UUID with the current entry. -=attr last_modification_time - -Date and time when the entry was last modified. - -=attr creation_time - -Date and time when the entry was created. - -=attr last_access_time - -Date and time when the entry was last accessed. - -=attr expiry_time - -Date and time when the entry expired or will expire. - -=attr expires - -Boolean value indicating whether or not an entry is expired. - -=attr usage_count - -The number of times an entry has been used, which typically means how many times the B string has -been accessed. - -=attr location_changed - -Date and time when the entry was last moved to a different parent group. - =attr notes Alias for the B string value. @@ -352,7 +298,7 @@ sub string_value { =method expand_string_value - $string = $entry->expand_string_value; + $string = $entry->expand_string_value($string_key); Same as L but will substitute placeholders and resolve field references. Any placeholders that do not expand to values are left as-is. @@ -362,6 +308,26 @@ See L. Some placeholders (notably field references) require the entry be connected to a database and will throw an error if it is not. +=method expand_notes + +Shortcut equivalent to C<< ->expand_string_value('Notes') >>. + +=method expand_password + +Shortcut equivalent to C<< ->expand_string_value('Password') >>. + +=method expand_title + +Shortcut equivalent to C<< ->expand_string_value('Title') >>. + +=method expand_url + +Shortcut equivalent to C<< ->expand_string_value('URL') >>. + +=method expand_username + +Shortcut equivalent to C<< ->expand_string_value('UserName') >>. + =cut sub _expand_placeholder { @@ -414,26 +380,6 @@ sub expand_string_value { return $self->_expand_string($str); } -=attr expand_notes - -Shortcut equivalent to C<< ->expand_string_value('Notes') >>. - -=attr expand_password - -Shortcut equivalent to C<< ->expand_string_value('Password') >>. - -=attr expand_title - -Shortcut equivalent to C<< ->expand_string_value('Title') >>. - -=attr expand_url - -Shortcut equivalent to C<< ->expand_string_value('URL') >>. - -=attr expand_username - -Shortcut equivalent to C<< ->expand_string_value('UserName') >>. - =method other_strings $other = $entry->other_strings; @@ -607,7 +553,7 @@ sub hmac_otp { $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; } @@ -641,7 +587,7 @@ sub time_otp { $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; } @@ -708,8 +654,8 @@ sub _hotp_params { 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'), @@ -734,8 +680,8 @@ sub _totp_params { ); 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, @@ -899,7 +845,7 @@ sub prune_history { my $max_items = $args{max_items} // eval { $self->kdbx->history_max_items } // HISTORY_DEFAULT_MAX_ITEMS; my $max_size = $args{max_size} // eval { $self->kdbx->history_max_size } // HISTORY_DEFAULT_MAX_SIZE; - my $max_age = $args{max_age} // HISTORY_DEFAULT_MAX_AGE; + my $max_age = $args{max_age} // eval { $self->kdbx->maintenance_history_days } // HISTORY_DEFAULT_MAX_AGE; # history is ordered oldest to newest my $history = $self->history; @@ -1109,7 +1055,8 @@ There is also some metadata associated with an entry. Each entry in a database i a UUID. An entry can also have an icon associated with it, and there are various timestamps. Take a look at the attributes to see what's available. -A B is a subclass of L. +A B is a subclass of L. View its documentation to see other attributes +and methods available on entries. =head2 Placeholders @@ -1191,7 +1138,7 @@ This software supports many (but not all) of the placeholders documented there. * ☑ C<{DT_UTC_MINUTE}> Minute Year component of the current UTC time * ☑ C<{DT_UTC_SECOND}> - Second component of the current UTC time -If the current date and time is <2012-07-25 17:05:34>, the "simple" form would be C<20120725170534>. +If the current date and time is C<2012-07-25 17:05:34>, the "simple" form would be C<20120725170534>. =head3 Special Key Placeholders @@ -1254,7 +1201,7 @@ a placeholder, just set it in the C<%File::KDBX::PLACEHOLDERS> hash. For example If the placeholder is expanded in the context of an entry, C<$entry> is the B object in context. Otherwise it is C. An entry is in context if, for example, the placeholder is in an entry's -strings or auto-complete key sequences. +strings or auto-type key sequences. $File::KDBX::PLACEHOLDERS{'MY_PLACEHOLDER:'} = sub { my ($entry, $arg) = @_; # ^ Notice the colon here