X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fp5-File-KDBX;a=blobdiff_plain;f=lib%2FFile%2FKDBX%2FDumper.pm;h=39d4782b0b842ca8b0744730105d775d266cd96b;hp=6f8d8bb120936ab361606df3bf8157ac171c4f49;hb=796fdad82448b51f9c990ca461df647341a84b7e;hpb=84a35b3fe4421abbe930586dd3a214cbb15da9b7 diff --git a/lib/File/KDBX/Dumper.pm b/lib/File/KDBX/Dumper.pm index 6f8d8bb..39d4782 100644 --- a/lib/File/KDBX/Dumper.pm +++ b/lib/File/KDBX/Dumper.pm @@ -105,13 +105,23 @@ sub reset { =method dump - $dumper->dump(\$string, $key); - $dumper->dump(*IO, $key); - $dumper->dump($filepath, $key); + $dumper->dump(\$string, %options); + $dumper->dump(\$string, $key, %options); + $dumper->dump(*IO, %options); + $dumper->dump(*IO, $key, %options); + $dumper->dump($filepath, %options); + $dumper->dump($filepath, $key, %options); Dump a KDBX file. -The C<$key> is either a L or a primitive that can be cast to a Key object. +The C<$key> is either a L or a primitive castable to a Key object. Available options: + +=for :list +* C - Database to dump (default: value of L) +* C - Alternative way to specify C<$key> (default: value of L) + +Other options are supported depending on the first argument. See L, L and +L. =cut @@ -126,10 +136,16 @@ sub dump { =method dump_string - $dumper->dump_string(\$string, $key); - \$string = $dumper->dump_string($key); + $dumper->dump_string(\$string, %options); + $dumper->dump_string(\$string, $key, %options); + \$string = $dumper->dump_string(%options); + \$string = $dumper->dump_string($key, %options); + +Dump a KDBX file to a string / memory buffer. Available options: -Dump a KDBX file to a string / memory buffer. +=for :list +* C - Database to dump (default: value of L) +* C - Alternative way to specify C<$key> (default: value of L) =cut @@ -156,9 +172,18 @@ sub dump_string { =method dump_file - $dumper->dump_file($filepath, $key); + $dumper->dump_file($filepath, %options); + $dumper->dump_file($filepath, $key, %options); + +Dump a KDBX file to a filesystem. Available options: -Dump a KDBX file to a filesystem. +=for :list +* C - Database to dump (default: value of L) +* C - Alternative way to specify C<$key> (default: value of L) +* C - File mode / permissions (see L +* C - User ID (see L) +* C - Group ID (see L) +* C - Write to the filepath atomically (default: true) =cut @@ -167,16 +192,27 @@ sub dump_file { my $filepath = shift; my %args = @_ % 2 == 0 ? @_ : (key => shift, @_); - my $key = delete $args{key}; + my $key = delete $args{key}; + my $mode = delete $args{mode}; + my $uid = delete $args{uid}; + my $gid = delete $args{gid}; + my $atomic = delete $args{atomic} // 1; + $args{kdbx} //= $self->kdbx; - require File::Temp; - my ($fh, $filepath_temp) = eval { File::Temp::tempfile("${filepath}-XXXXXX", CLEANUP => 1) }; - if (!$fh or my $err = $@) { - $err //= 'Unknown error'; - throw sprintf('Open file failed (%s): %s', $filepath_temp, $err), - error => $err, - filepath => $filepath_temp; + my ($fh, $filepath_temp); + if ($atomic) { + require File::Temp; + ($fh, $filepath_temp) = eval { File::Temp::tempfile("${filepath}-XXXXXX", UNLINK => 1) }; + if (!$fh or my $err = $@) { + $err //= 'Unknown error'; + throw sprintf('Open file failed (%s): %s', $filepath_temp, $err), + error => $err, + filepath => $filepath_temp; + } + } + else { + open($fh, '>:raw', $filepath) or throw "Open file failed ($filepath): $!", filepath => $filepath; } $fh->autoflush(1); @@ -187,22 +223,31 @@ sub dump_file { my ($file_mode, $file_uid, $file_gid) = (stat($filepath))[2, 4, 5]; - my $mode = $args{mode} // $file_mode // do { my $m = umask; defined $m ? oct(666) &~ $m : undef }; - my $uid = $args{uid} // $file_uid // -1; - my $gid = $args{gid} // $file_gid // -1; - chmod($mode, $filepath_temp) if defined $mode; - chown($uid, $gid, $filepath_temp); - rename($filepath_temp, $filepath) or throw "Failed to write file ($filepath): $!", filepath => $filepath; + if ($filepath_temp) { + $mode //= $file_mode // do { my $m = umask; defined $m ? oct(666) &~ $m : undef }; + $uid //= $file_uid // -1; + $gid //= $file_gid // -1; + chmod($mode, $filepath_temp) if defined $mode; + chown($uid, $gid, $filepath_temp); + rename($filepath_temp, $filepath) or throw "Failed to write file ($filepath): $!", + filepath => $filepath; + } return $self; } =method dump_handle - $dumper->dump_handle($fh, $key); - $dumper->dump_handle(*IO, $key); + $dumper->dump_handle($fh, %options); + $dumper->dump_handle(*IO, $key, %options); + $dumper->dump_handle($fh, %options); + $dumper->dump_handle(*IO, $key, %options); + +Dump a KDBX file to an output stream / file handle. Available options: -Dump a KDBX file to an output stream / file handle. +=for :list +* C - Database to dump (default: value of L) +* C - Alternative way to specify C<$key> (default: value of L) =cut