aboutsummaryrefslogtreecommitdiffstats
path: root/cli/icevault
diff options
context:
space:
mode:
Diffstat (limited to 'cli/icevault')
-rwxr-xr-xcli/icevault29
1 files changed, 29 insertions, 0 deletions
diff --git a/cli/icevault b/cli/icevault
index 5ad8ff2..fdc1b74 100755
--- a/cli/icevault
+++ b/cli/icevault
@@ -713,11 +713,13 @@ unless (@ARGV) {
my @USAGE = (
fill => "[-f, --force] [-p, --show-passwords] [-s, --socket=PATH] scheme://hostname/identity",
clip => "scheme://hostname/identity",
+ cp => "[-f, --force] scheme://hostname/identity1 scheme://hostname/identity2",
dump => "[-p, --show-passwords] scheme://hostname/identity",
edit => "scheme://hostname/identity",
git => "GIT-COMMAND [GIT-ARG ...]",
insert => "[-f, --force] [-s, --socket=PATH] [identity]",
ls => "[-0, --zero] [-r, --recursive] [scheme://[hostname/[identity]] ...]",
+ mv => "[-f, --force] scheme://hostname/identity1 scheme://hostname/identity2",
reencrypt => "[scheme://[hostname/[identity]] ...]",
);
@@ -1187,6 +1189,33 @@ elsif ($COMMAND eq 'reencrypt') {
, map {$_->{filename}} @filenames );
}
+elsif ($COMMAND eq 'cp' or $COMMAND eq 'mv') {
+ getopts('force|f' => "-f, --force\tOverwrite preexisting destination");
+ usage() if $#ARGV != 1;
+ my $source = shift;
+ my $target = shift;
+
+ my $sourceFilename = identity2File($source);
+ $sourceFilename =~ /\A(\/\p{Print}+)\z/ or error "Insecure C<%s>", $sourceFilename;
+ $sourceFilename = $1; # untaint $sourceFilename
+
+ my $targetFilename = identity2File($target);
+ $targetFilename =~ /\A(\/\p{Print}+)\z/ or error "Insecure C<%s>", $targetFilename;
+ $targetFilename = $1; # untaint $target
+
+ error "Source and destination are the same identity C<%s>", $source if $source eq $target;
+ error "No such identity C<%s>", $source unless -f $sourceFilename;
+ exit 1 if -f $targetFilename and !$CONFIG{force} and !promptYN "Overwrite C<%s>?", 0, $target;
+
+ copyIdentityFile $sourceFilename, $targetFilename;
+ my @filenames = $targetFilename;
+ if ($COMMAND eq 'mv') {
+ unlink $sourceFilename or error "Can't unlink C<%s>: %s", $sourceFilename, $!;
+ push @filenames, $sourceFilename;
+ }
+ commit(($COMMAND eq 'cp' ? 'copy' : 'move')." $source to $target", @filenames);
+}
+
else {
print STDERR "Usage: $NAME [COMMAND] [OPTION ...] [ARG ...]\n";
error "Unknown command C<%s>. Try C<%s> for more information.", $COMMAND, "$NAME --help";