caff: Make importing of keys to be signed from the normal gpg optional (--keys-from...
[pgp-tools.git] / caff / caff
index f32d5b5da615e71526f8c3cc2e32045f969490db..11655a4dcc2a3fd8f8269ea97981abd72a535304 100755 (executable)
--- a/caff/caff
+++ b/caff/caff
@@ -90,6 +90,10 @@ configuration file.
 
 Import keys from file. Can be supplied more than once.
 
+=item B<--keys-from-gnupg> I<file>
+
+Try to import keys from your standard GnuPG keyrings.
+
 =back
 
 =head1 FILES
@@ -305,7 +309,7 @@ http://pgp-tools.alioth.debian.org/
 
 =head1 SEE ALSO
 
-gpg(1), pgp-clean(1), /usr/share/doc/signing-party/caff/caffrc.sample.
+gpg(1), pgp-clean(1), /usr/share/doc/signing-party/caff/
 
 =cut
 
@@ -325,6 +329,7 @@ use GnuPG::Interface;
 my %CONFIG;
 my $REVISION = '$Rev$';
 my ($REVISION_NUMER) = $REVISION =~ /(\d+)/;
+$REVISION_NUMER = 'unknown' unless defined $REVISION_NUMER;
 my $VERSION = "0.0.0.$REVISION_NUMER";
 
 # Global variables
@@ -971,25 +976,25 @@ sub get_local_user_keys() {
 #         1 if the key could not be exported.\n
 #         2 if the key could not be imported.
 #
-sub import_key_from_user_gnupghome() {
-    my $err;
-    my ($asciikey, $dst_gpghome) = @_;
-
-    trace("Exporting key $asciikey from your normal GnuPGHOME.");
-    my $key = export_key(undef, $asciikey);
-    if (defined $key && $key ne '') {
-        trace("Importing key $asciikey into $GNUPGHOME.");
-        if (import_key($GNUPGHOME, $key)) {
-            $err = 0;
-        } else {
-            warn("Could not import $asciikey into caff's gnupghome.");
-            $err = 2;
-        }
-    } else {
-        $err = 1;
-    }
-
-    return $err;
+sub import_key_from_user_gnupghome($$) {
+       my $err;
+       my ($asciikey, $dst_gpghome) = @_;
+
+       trace("Exporting key $asciikey from your normal GnuPGHOME.");
+       my $key = export_key(undef, $asciikey);
+       if (defined $key && $key ne '') {
+               trace("Importing key $asciikey into $GNUPGHOME.");
+               if (import_key($GNUPGHOME, $key)) {
+                       $err = 0;
+               } else {
+                       warn("Could not import $asciikey into caff's gnupghome.");
+                       $err = 2;
+               }
+       } else {
+               $err = 1;
+       }
+
+       return $err;
 }
 
 ##
@@ -1001,30 +1006,30 @@ sub import_key_from_user_gnupghome() {
 # @return 0 if successful\n
 #         1 if an error occured.
 #
-sub import_key_files() {
-    my $err;
-    my ($keyfile, $dst_gpghome) = @_;
-
-    my $gpg = GnuPG::Interface->new();
-    $gpg->call( $CONFIG{'gpg'} );
-    $gpg->options->hash_init(
-        'homedir' => $dst_gpghome,
-        '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, command_args => $keyfile);
-    my ($stdout, $stderr, $status) = readwrite_gpg('', $inputfd, $stdoutfd, $stderrfd, $statusfd);
-    info("Importing keys from file $keyfile");
-    waitpid $pid, 0;
-
-    if ($status !~ /^\[GNUPG:\] IMPORT_OK/m) {
-        warn $stderr;
-        $err = 1;
-    } else {
-        $err = 0;
-    }
-
-    return $err;
+sub import_key_files($$) {
+       my $err;
+       my ($keyfile, $dst_gpghome) = @_;
+
+       my $gpg = GnuPG::Interface->new();
+       $gpg->call( $CONFIG{'gpg'} );
+       $gpg->options->hash_init(
+               'homedir' => $dst_gpghome,
+               '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, command_args => $keyfile);
+       my ($stdout, $stderr, $status) = readwrite_gpg('', $inputfd, $stdoutfd, $stderrfd, $statusfd);
+       info("Importing keys from file $keyfile");
+       waitpid $pid, 0;
+
+       if ($status !~ /^\[GNUPG:\] IMPORT_OK/m) {
+               warn $stderr;
+               $err = 1;
+       } else {
+               $err = 0;
+       }
+
+       return $err;
 }
 
 ##
@@ -1036,26 +1041,22 @@ sub import_key_files() {
 # found.
 #
 sub import_keys_to_sign() {
-    # Check if we can find the gpg key from our normal gnupghome, and then
-    # try to import it into our working gnupghome directory
-    my $imported_keys = 0;
-    foreach my $keyid (@KEYIDS) {
-        if (!&import_key_from_user_gnupghome($keyid, $GNUPGHOME)) {
-            info("Key $keyid imported from your normal GnuPGHOME.");
-            $imported_keys++;
-        }
-    }
-
-    # If all of the keys have been successfully imported, there is no need to
-    # go further
-    return 1 if ($imported_keys == scalar (@KEYIDS));
-
-    # Import user specified key files
-    foreach my $keyfile (@{$CONFIG{'key-files'}}) {
-        &import_key_files($keyfile, $GNUPGHOME);
-    }
-
-    return 0;
+       # Check if we can find the gpg key from our normal gnupghome, and then
+       # try to import it into our working gnupghome directory
+       if ($CONFIG{'keys-from-gnupg'}) {
+               foreach my $keyid (@KEYIDS) {
+                       if (!import_key_from_user_gnupghome($keyid, $GNUPGHOME)) {
+                               info("Key $keyid imported from your normal GnuPGHOME.");
+                       }
+               }
+       };
+
+       # Import user specified key files
+       foreach my $keyfile (@{$CONFIG{'key-files'}}) {
+               import_key_files($keyfile, $GNUPGHOME);
+       }
+
+       return 0;
 }
 
 ###################
@@ -1082,6 +1083,7 @@ if (!GetOptions (
        '-S'              =>  \$params->{'no-sign'},
        '--no-sign'       =>  \$params->{'no-sign'},
        '--key-file=s@'   =>  \$params->{'key-files'},
+       '--keys-from-gnupg' =>  \$params->{'keys-from-gnupg'},
        )) {
        usage(\*STDERR, 1);
 };
@@ -1101,6 +1103,8 @@ $CONFIG{'no-sign'}     = $params->{'no-sign'}     if defined $params->{'no-sign'
 $CONFIG{'no-mail'}     = $params->{'no-mail'}     if defined $params->{'no-mail'};
 $CONFIG{'mail'}        = $params->{'mail'}        if defined $params->{'mail'};
 
+$CONFIG{'keys-from-gnupg'} = $params->{'keys-from-gnupg'} if defined $params->{'keys-from-gnupg'};
+
 # If old 'no-mail' parameter, or if the 'mail' parameter is set to 'no'
 if ( defined $CONFIG{'no-mail'} || 
      ( defined $CONFIG{'mail'} && $CONFIG{'mail'}  eq 'no' ) ) {
@@ -1130,10 +1134,10 @@ for my $keyid (map { split /\n/ } @ARGV) { # caff "`cat txt`" is a single argume
 # import own keys
 #################
 for my $keyid (@{$CONFIG{'keyid'}}) {
-    info("Importing key $keyid from your normal GnuPGHome.");
-    if (&import_key_from_user_gnupghome($keyid, $GNUPGHOME)) {
-        mywarn("Key $keyid not found.");
-    }
+       info("Importing key $keyid from your normal GnuPGHome.");
+       if (import_key_from_user_gnupghome($keyid, $GNUPGHOME)) {
+               mywarn("Key $keyid not found.");
+       }
 }
 
 &import_keys_to_sign();
@@ -1215,7 +1219,7 @@ if ($CONFIG{'ask-sign'} && ! $CONFIG{'no-sign'}) {
 }
        
 unless ($CONFIG{'no-sign'}) {
-       my @local_user = &get_local_user_keys();
+       my @local_user = get_local_user_keys();
 
        info("Sign the following keys according to your policy, then exit gpg with 'save' after signing each key");
        for my $keyid (@keyids_ok) {