gpgsigs: In LaTeX mode, use the samepage env to not split entries at pagebreaks.
[pgp-tools.git] / gpgsigs / gpgsigs
index af1a379530429fe8c09d3280ab71cdeb1b9b8db4..50505d24251bbb6c58f62c0a25af78dc41b38c4a 100755 (executable)
@@ -20,6 +20,7 @@
 # see the Debian changelog for further changes.
 
 my $VERSION = qq$Rev$;
+$ENV{PATH} .= ":/usr/share/signing-party";
 
 use strict;
 use warnings;
@@ -54,6 +55,8 @@ separate multiple keyids with ','
 -r            call gpg --recv-keys before proceeding
 -f <charset>  convert <keytxt> from charset
 -t <charset>  convert UIDs to charset in output
+--refresh     regenerate UID lists on keys
+--latex       generate LaTeX output including photo IDs
 EOF
        exit $error;
 }
@@ -150,32 +153,38 @@ print STDERR "Running --list-sigs, this will take a while ";
 open SIGS, "gpg --fixed-list-mode --with-colons --list-sigs @mykeys @keys 2>/dev/null |"
        or die "can't get gpg listing";
 
-my ($key, $uid, $sigs, $uidstatus);
+my ($key, $uid, $sigs, $photocount);
 while (<SIGS>) {
        if ( m/^pub:(?:.*?:){3,3}([0-9A-F]{16,16}):/ ) {
                $key = $1;
                print STDERR ".";
+               undef $photocount;
                next;
        }
        if ( m/^uid:(.):(?:.*?:){7,7}(.*):/s ) {
-               $uidstatus = $1;
+               my $uidstatus = $1;
                $uid = $2;
                $uid =~ s/\\x([0-9a-f][0-9a-f])/ chr(hex($1)) /gie;
                $uid = myrecode($uid, "UTF-8", $charset);
 
                my ($shortkey) = substr $key, -8;
                # Remember non-revoked uids
-               if ($uidstatus ne "r") {
-                       push @{$uids{$shortkey}}, $uid;
-               }
-
+               next if $uidstatus eq "r";
+               push @{$uids{$shortkey}}, $uid;
                next;
        }
-       if ( m/^uat:(.):/ ) { # uat:-::::2006-08-03::27BAEAF742BD253C2F3F03B043DC1536880193C4::1 7993:
-               $uidstatus = $1;
-               next if $uidstatus ne "-";
-               system "gpg --photo-viewer 'convert - %k.eps' --list-options show-photos --list-key $key";
-               $uid = "Photo ID";
+       if ( m/^uat:(.)::::[^:]+::([0-9A-F]+)::\d+ (\d+)/ ) { # uat:-::::2006-08-03::27BAEAF742BD253C2F3F03B043DC1536880193C4::1 7993:
+               my $uidstatus = $1;
+               # $2 is hash of attribute data
+               my $size = $3 - 19; # FIXME: find a nicer way to find out picture size
+               $uid = "[jpeg image of size $size]";
+               next if $uidstatus eq "r";
+               if ($latex and not $photocount) { # call once per key
+                       my ($shortkey) = substr $key, -8;
+                       system "rm -f $shortkey.[1-9]*.eps";
+                       system "gpg --photo-viewer 'gpgsigs-eps-helper $shortkey' --list-options show-photos --list-key $key > /dev/null";
+                       $photocount = 1;
+               }
                my ($shortkey) = substr $key, -8;
                push @{$uids{$shortkey}}, $uid;
                next;
@@ -233,28 +242,37 @@ close MD;
 open MD, "gpg --with-colons --print-md sha256 $keytxt|" or warn "can't get gpg sha256\n";
 my $SHA256 = <MD>;
 close MD;
+open MD, "gpg --with-colons --print-md ripemd160 $keytxt|" or warn "can't get gpg ripemd160\n";
+my $RIPEMD160 = <MD>;
+close MD;
 
 my @MD5 = split /:/, $MD5;
 my @SHA1 = split /:/, $SHA1;
 my @SHA256 = split /:/, $SHA256;
+my @RIPEMD160 = split /:/, $RIPEMD160;
 $MD5 = $MD5[2];
 $SHA1 = $SHA1[2];
 $SHA256 = $SHA256[2];
+$RIPEMD160 = $RIPEMD160[2];
 
 $MD5 =~ s/(.{16})/$1 /;
 $SHA1 =~ s/(.{20})/$1 /;
 $SHA256 =~ s/(.{32})/$1 /;
+$RIPEMD160 =~ s/(.{20})/$1 /;
 $MD5 =~ s/([0-9A-Z]{2})/$1 /ig;
 $SHA1 =~ s/([0-9A-Z]{4})/$1 /ig;
 $SHA256 =~ s/([0-9A-Z]{4})/$1 /ig;
+$RIPEMD160 =~ s/([0-9A-Z]{4})/$1 /ig;
 
 chomp $MD5;
 chomp $SHA1;
 chomp $SHA256;
+chomp $RIPEMD160;
 my $metatxt = quotemeta($keytxt);
 $MD5 =~ s/^$metatxt:\s*//;
 $SHA1 =~ s/^$metatxt:\s*//;
 $SHA256 =~ s/^$metatxt:\s*//;
+$RIPEMD160 =~ s/^$metatxt:\s*//;
 
 
 # write out result
@@ -279,6 +297,7 @@ sub print_tag
 $key = undef;
 $uid = undef;
 my $line = 0;
+my $keys = 0;
 print STDERR "Annotating $keytxt, writing into $outfile\n";
 open (TXT, $keytxt) or die ("Cannot open $keytxt\n");
 open (WRITE, '>'.$outfile) or die ("Cannot open $outfile for writing\n");
@@ -289,6 +308,7 @@ if ($latex) {
 \usepackage[margin=2cm]{geometry}
 \usepackage{alltt}
 \usepackage{graphicx}
+\usepackage{grffile}
 \begin{document}
 \begin{alltt}
 EOF
@@ -306,6 +326,22 @@ while (<TXT>) {
        if (/^SHA256 Checksum:/ && defined $SHA256) {
                s/[_[:xdigit:]][_ [:xdigit:]]+_/$SHA256/;
        }
+       if (/^RIPEMD160 Checksum:/ && defined $RIPEMD160) {
+               s/[_[:xdigit:]][_ [:xdigit:]]+_/$RIPEMD160/;
+       }
+
+       if ( m/^[0-9]+\s+\[ \] Fingerprint OK/ ){
+               if ($latex) {
+                       if ($keys > 0) {
+                               print WRITE "\\end{samepage}\n";
+                       }
+                       print WRITE "\\begin{samepage}\n";
+                       ++$keys;
+               }
+               print WRITE;
+               next;
+       }
+
        if ( m/^pub  +(?:\d+)[DR]\/([0-9A-F]{8}) [0-9]{4}-[0-9]{2}-[0-9]{2} *(.*)/ ) {
                $key = $1;
                $uid = $2;
@@ -314,6 +350,7 @@ while (<TXT>) {
                #       next;
                #}
                print WRITE;
+               undef $photocount;
                next;
        }
 
@@ -329,9 +366,10 @@ while (<TXT>) {
                if ($refresh or $latex) {
                        foreach $uid (@{$uids{$key}}) {
                                print WRITE print_tag($key, $uid) . " $uid\n";
-                               if ($latex and ($uid eq "Photo ID")) {
+                               if ($latex and ($uid =~ /^\[jpeg image/)) {
+                                       $photocount++;
                                        print WRITE "\\begin{flushright}\n";
-                                       print WRITE "\\includegraphics[height=3cm]{$key.eps}\n";
+                                       print WRITE "\\includegraphics[height=3cm]{$key.$photocount}\n";
                                        print WRITE "\\end{flushright}\n";
                                }
                        }
@@ -353,6 +391,10 @@ while (<TXT>) {
        print WRITE;
 }
 
+if ($latex && ($keys > 0)) {
+       print WRITE "\\end{samepage}\n";
+}
+
 print WRITE "Legend:\n";
 my $num_myuids = 0;
 foreach my $i (0 .. @mykeys - 1) {
@@ -386,33 +428,44 @@ B<gpgsigs> - annotate list of GnuPG keys with already done signatures
 
 =head1 SYNOPSIS
 
-B<gpgsigs> [-r] [-f I<charset>] [-t I<charset>] I<keyid>I<[>B<,>I<keyidI<[>B<,>I<...>I<]>>I<]> F<keytxt> [F<outfile>]
+B<gpgsigs> [I<options>] I<keyid>I<[>B<,>I<keyidI<[>B<,>I<...>I<]>>I<]> F<keytxt> [F<outfile>]
 
 =head1 DESCRIPTION
 
 B<gpgsigs> was written to assist the user in signing keys during a keysigning
 party. It takes as input a file containing keys in C<gpg --list-keys> format
 and prepends every line with a tag indicating if the user has already signed
-that uid. When the file contains C<MD5 Checksum:> or C<SHA1 Checksum:> lines
-and placeholders (C<__ __>), the checksum is inserted.
+that uid. When the file contains C<ALGO Checksum:> lines and placeholders
+(C<__ __>), the checksum is inserted. ALGO can be set to the following algorithms:
+MD5 SHA1 SHA256 or RIPEMD160.
 
 =head1 OPTIONS
 
 =over
 
-=item -r
+=item B<-r>
 
 Call I<gpg --recv-keys> before creating the output.
 
-=item -f I<charset>
+=item B<-f> I<charset>
 
 Convert F<keytxt> from I<charset>. The default is ISO-8859-1.
 
-=item -t I<charset>
+=item B<-t> I<charset>
 
 Convert UIDs to I<charset>. The default is derived from LC_ALL, LC_CTYPE, and
 LANG, and if all these are unset, the default is ISO-8859-1.
 
+=item B<--refresh>
+
+Refresh the UID lists per key from gpg. Useful when UIDs were added or revoked
+since the input text was generated.
+
+=item B<--latex>
+
+Generate LaTeX output, including photo IDs. Implies B<--refresh>.
+B<Note:> This writes eps files to the current directory.
+
 =item I<keyid>
 
 Use this keyid (8 or 16 byte) for annotation. Multiple keyids can be separated