X-Git-Url: http://git.sthu.org/?a=blobdiff_plain;f=caff%2Fcaff;h=a804dbca3bcbbad5e2eac71b2b3d4f400491fb7e;hb=d7e01f3b7fde1dbd12ae0bbabdbdbfdbebe74f0d;hp=bd15a779be60ba82a856d04657c288a3bef9d509;hpb=8bf98816d3e3389940782d16638b26fabadf4dc6;p=pgp-tools.git diff --git a/caff/caff b/caff/caff index bd15a77..a804dbc 100755 --- a/caff/caff +++ b/caff/caff @@ -271,7 +271,7 @@ sub load_config() { die ("keyid is not defined.\n") unless defined $CONFIG{'keyid'}; die ("keyid is not an array ref\n") unless (ref $CONFIG{'keyid'} eq 'ARRAY'); for my $keyid (@{$CONFIG{'keyid'}}) { - $keyid =~ /^[A-Fa-f0-9]{16}$/ or die ("key $keyid is not a long (16 digit) keyid.\n"); + $keyid =~ /^[A-F0-9]{16}$/i or die ("key $keyid is not a long (16 digit) keyid.\n"); }; @{$CONFIG{'keyid'}} = map { uc } @{$CONFIG{'keyid'}}; $CONFIG{'export-sig-age'}= 24*60*60 unless defined $CONFIG{'export-sig-age'}; @@ -501,9 +501,16 @@ sub export_key($$) { my $gpg = GnuPG::Interface->new(); $gpg->call( $CONFIG{'gpg'} ); - $gpg->options->hash_init( - 'homedir' => $gnupghome, - 'armor' => 1 ); + if (defined $gnupghome) { + $gpg->options->hash_init( + 'homedir' => $gnupghome, + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always } ], + 'armor' => 1 ); + } else { + $gpg->options->hash_init( + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always } ], + 'armor' => 1 ); + }; $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); my $pid = $gpg->export_keys(handles => $handles, command_args => [ $keyid ]); @@ -521,7 +528,9 @@ sub import_key($$) { my $gpg = GnuPG::Interface->new(); $gpg->call( $CONFIG{'gpg'} ); - $gpg->options->hash_init( 'homedir' => $gnupghome ); + $gpg->options->hash_init( + 'homedir' => $gnupghome, + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always } ] ); $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); my $pid = $gpg->import_keys(handles => $handles); @@ -580,7 +589,7 @@ sub send_mail($$$@) { my $gpg = GnuPG::Interface->new(); $gpg->call( $CONFIG{'gpg'} ); $gpg->options->hash_init( 'homedir' => $GNUPGHOME, - 'extra_args' => '--always-trust', + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always } ], 'armor' => 1 ); $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); @@ -725,6 +734,10 @@ if ($params->{'local-user'}) { for my $keyid (@ARGV) { $keyid =~ s/^0x//i; unless ($keyid =~ /^([A-F0-9]{8}|[A-F0-9]{16}||[A-F0-9]{40})$/i) { + if ($keyid =~ /^[A-F0-9]{32}$/) { + info("Ignoring v3 fingerprint $keyid. v3 keys are obsolete."); + next; + }; print STDERR "$keyid is not a keyid.\n"; usage(\*STDERR, 1); }; @@ -740,27 +753,35 @@ $CONFIG{'no-sign'} = $params->{'no-sign'} if defined $params->{'no-sign' ################# # import own keys ################# +for my $keyid (@{$CONFIG{'keyid'}}) { my $gpg = GnuPG::Interface->new(); $gpg->call( $CONFIG{'gpg'} ); $gpg->options->hash_init( 'homedir' => $GNUPGHOME, - 'extra_args' => '--keyserver='.$CONFIG{'keyserver'} ); + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always --with-colons --fixed-list-mode --fast-list-mode } ] ); $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); - $gpg->options->hash_init( 'extra_args' => [ '--with-colons', '--fixed-list-mode' ] ); - my $pid = $gpg->list_public_keys(handles => $handles, command_args => $CONFIG{'keyid'}); + my $pid = $gpg->list_public_keys(handles => $handles, command_args => $keyid); my ($stdout, $stderr, $status) = readwrite_gpg('', $inputfd, $stdoutfd, $stderrfd, $statusfd); waitpid $pid, 0; + if ($stdout eq '') { - warn ("No data from gpg for list-key\n"); - next; + warn ("No data from gpg for list-key\n"); # There should be at least 'tru:' everywhere. }; - foreach my $keyid (@{$CONFIG{'keyid'}}) { - unless ($stdout =~ /^pub:(?:[^:]*:){3,3}$keyid:/m) { - info("Importing $keyid"); - system "gpg --export $keyid | gpg --import --homedir $GNUPGHOME"; - } + unless ($stdout =~ /^pub:(?:[^:]*:){3,3}$keyid:/m) { + info("Key $keyid not found in caff's home. Getting it from your normal GnuPGHome."); + my $key = export_key(undef, $keyid); + if (!defined $key || $key eq '') { + warn ("Did not get key $keyid from your normal GnuPGHome\n"); + next; + }; + my $result = import_key($GNUPGHOME, $key); + unless ($result) { + warn ("Could not import $keyid into caff's gnupghome.\n"); + next; + }; } +} ############################# # receive keys from keyserver @@ -775,7 +796,7 @@ if ($CONFIG{'no-download'}) { $gpg->call( $CONFIG{'gpg'} ); $gpg->options->hash_init( 'homedir' => $GNUPGHOME, - 'extra_args' => '--keyserver='.$CONFIG{'keyserver'} ); + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always }, '--keyserver='.$CONFIG{'keyserver'} ] ); $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); my $pid = $gpg->recv_keys(handles => $handles, command_args => [ @KEYIDS ]); @@ -835,6 +856,8 @@ unless ($CONFIG{'no-sign'}) { push @command, '--local-user', $USER if (defined $USER); push @command, "--homedir=$GNUPGHOME"; push @command, '--secret-keyring', $CONFIG{'secret-keyring'}; + push @command, '--no-auto-check-trustdb'; + push @command, '--trust-model=always'; push @command, '--edit', $keyid; push @command, 'sign'; push @command, split ' ', $CONFIG{'gpg-sign-args'} || ""; @@ -852,10 +875,11 @@ for my $keyid (@keyids_ok) { ################# my $gpg = GnuPG::Interface->new(); $gpg->call( $CONFIG{'gpg'} ); - $gpg->options->hash_init( 'homedir' => $GNUPGHOME ); + $gpg->options->hash_init( + 'homedir' => $GNUPGHOME, + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always --with-colons --fixed-list-mode } ] ); $gpg->options->meta_interactive( 0 ); my ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); - $gpg->options->hash_init( 'extra_args' => [ '--with-colons', '--fixed-list-mode' ] ); my $pid = $gpg->list_public_keys(handles => $handles, command_args => [ $keyid ]); my ($stdout, $stderr, $status) = readwrite_gpg('', $inputfd, $stdoutfd, $stderrfd, $statusfd); waitpid $pid, 0; @@ -913,7 +937,7 @@ for my $keyid (@keyids_ok) { $gpg->call( $CONFIG{'gpg-delsig'} ); $gpg->options->hash_init( 'homedir' => $tempdir, - 'extra_args' => [ '--with-colons', '--fixed-list-mode', '--command-fd=0', '--no-tty' ] ); + 'extra_args' => [ qw{ --no-auto-check-trustdb --trust-model=always --with-colons --fixed-list-mode --command-fd=0 --no-tty } ] ); ($inputfd, $stdoutfd, $stderrfd, $statusfd, $handles) = make_gpg_fds(); $pid = $gpg->wrap_call( commands => [ '--edit' ], @@ -1059,7 +1083,7 @@ for my $keyid (@keyids_ok) { if (!$uid->{'is_uat'} && ($uid->{'text'} =~ /@/)) { my $address = $uid->{'text'}; $address =~ s/.*<(.*)>.*/$1/; - if (ask("Send mail to '$address' for $uid->{'text'}?", 1, $CONFIG{'mail'})) { + if (ask("Mail signature for $uid->{'text'} to '$address'?", 1, $CONFIG{'mail'})) { my $mail = send_mail($address, $can_encrypt, $longkeyid, $uid, @attached); my $keydir = "$KEYSBASE/$DATE_STRING";