We don't need subkey info on a fingerprint slip, so don't include it by
[pgp-tools.git] / gpg-key2ps / gpg-key2ps
index 9498e6b04bac513d23f262e80353efb99b0be9cb..e73d9a6d17d3e21d89ae45b9cbe325338ed0991e 100755 (executable)
@@ -2,8 +2,8 @@
 #
 # gpg-key2ps: convert a PGP/GnuPG key into paper slips.
 # Copyright (C) 2001-2005  Simon Richter
-# Copyright (C) 2005  Thijs Kinkhorst
-# Copyright (C) 2005  Christoph Berg <cb@df7cb.de>
+# Copyright (C) 2005-2008  Thijs Kinkhorst
+# Copyright (C) 2005-2008  Christoph Berg <cb@df7cb.de>
 # Licenced under the GNU General Public License,
 # version 2 or later.
 #
@@ -14,27 +14,31 @@ use Getopt::Long;
 
 my $version = '$Rev$';
 $version =~ s/\$Rev:\s*(\d+)\s*\$/$1/;
+my $showsubkeys = 0;
 my $revokestyle = "hide";
+my $columns = 2;
 my $creationdate = scalar(localtime);
 
 sub version($) {
        my $fd = shift;
-       print $fd "gpg-key2ps $version - (c) 2001-2005 Simon Richter, Thijs Kinkhorst, Christoph Berg\n";
+       print $fd "gpg-key2ps $version - (c) 2001-2008 Simon Richter, Thijs Kinkhorst, Christoph Berg\n";
 }
 
 sub usage($$) {
        my ($fd, $exitcode) = @_;
        version ($fd);
        print $fd <<EOF;
-Usage: $0 [-p papersize] [-r revoked-style] keyid-or-name ...
+Usage: $0 [-p papersize] [-r revoked-style] [-1] [-s] keyid-or-name ...
 Options:
  -p --paper-size
+ -s --show-subkeys
  -r --revoked-style
-        hide   - Don't show revoked uids (default)
+        hide   - Don't show revoked uids and subkeys (default)
         grey   - Print text in grey
         note   - Add "[revoked]"
         show   - List revoked uids normally
         strike - Strike through lines
+ -1 Only print one column, for extra wide keys
  -h --help
  -v --version
 EOF
@@ -49,10 +53,13 @@ if (!GetOptions (
        '--help'            => \$opts->{help},
        '-v'                => \$opts->{version},
        '--version'         => \$opts->{version},
+       '-s'                => \$opts->{showsubkeys},
+       '--show-subkeys'    => \$opts->{showsubkeys},
        '-p=s'              => \$opts->{papersize},
        '--paper-size=s'    => \$opts->{papersize},
        '-r=s'              => \$opts->{revokestyle},
        '--revoked-style=s' => \$opts->{revokestyle},
+       '-1'                => \$opts->{1},
 )) {
        usage(\*STDERR, 1);
 }
@@ -66,19 +73,22 @@ if ($opts->{version}) {
        exit 0;
 }
 
-if ( $opts->{revokestyle} ) { $revokestyle = $opts->{revokestyle}; }
 if ( $opts->{papersize} ) { $ENV{'PAPERSIZE'} = $opts->{papersize}; }
+if ( $opts->{showsubkeys} ) { $showsubkeys = 1; }
+if ( $opts->{revokestyle} ) { $revokestyle = $opts->{revokestyle}; }
 
 if ( $revokestyle !~ /^(grey|hide|note|show|strike)$/ ) {
        print STDERR "Unknown revoked-style \"$revokestyle\".\n";
        usage (\*STDERR, 1);
 }
 
+if ( $opts->{1} ) { $columns = 1; }
+
 usage(\*STDERR, 1) unless scalar @ARGV >= 1;
 
 # determine the paper size through the paperconf tool
 my $w; my $h;
-if ( -x "/usr/bin/paperconf" ) {
+if ( `which paperconf` && $? == 0 ) {
        $w=`paperconf -w`;
        $h=`paperconf -h`;
        chomp($w);
@@ -92,7 +102,8 @@ if ( -x "/usr/bin/paperconf" ) {
 
 # open a gpg process we'll be reading from below
 map { s/'/'\\''/g; } @ARGV; # quote single quotes
-open(GPG, "gpg --fingerprint --with-colons '". (join "' '", @ARGV) ."' |");
+# --list-key due to #382794
+open(GPG, "gpg --list-key --with-fingerprint --with-colons '". (join "' '", @ARGV) ."' |");
 
 sub start_postscript {
 # start the PostScript output
@@ -118,7 +129,7 @@ print <<EOF;
 
 /hline {
        30 y 3 add moveto
-       w 2 div 30 sub y 3 add lineto stroke
+       w $columns div 30 sub y 3 add lineto stroke
        newline
 } def
 
@@ -156,39 +167,61 @@ print <<EOF;
        newline
 } def
 
+/sbk {
+       50 y moveto (sub) show
+       70 y moveto show showAlgorithm (/) show show
+       150 y moveto show
+       newline
+} def
+
 EOF
 
 # output the desired display for revoked uids
 if ( $revokestyle eq "grey" ) {
-       print "/revuid {\n";
-       print " .5 setgray\n";
-       print " uid\n";
-       print " 0 setgray\n";
-       print "} def\n";
+       print <<EOF;
+/revuid {
+       .5 setgray
+       uid
+       0 setgray
+} def
+/revsbk {
+       .5 setgray
+       sbk
+       0 setgray
+} def
+EOF
 } elsif ( $revokestyle eq "note" ) {
-       print "/revuid {\n";
-       print " 50 y moveto (uid) show\n";
-       print " 200 y moveto show ( [revoked]) show\n";
-       print " newline\n";
-       print "} def\n";
+       print <<EOF;
+/revuid {
+       50 y moveto (uid) show
+       200 y moveto show ( [revoked]) show
+       newline
+} def
+/revsbk {
+       sbk
+       ( [revoked]) show
+} def
+EOF
 } elsif ( $revokestyle eq "show" ) {
-       print "/revuid { uid } def\n";
+       print <<EOF;
+/revuid { uid } def
+/revsbk { sbk } def
+EOF
 } elsif ( $revokestyle eq "strike" ) {
-       print "/revuid {\n";
-       print " uid\n";
-       print " 45 y 9 add moveto h 2 div 45 sub y 18 add lineto stroke\n";
-       print "} def\n";
+       print <<EOF;
+/revuid {
+       uid
+       45 y 9 add moveto h 2 div 45 sub y 18 add lineto stroke
+} def
+/revsbk {
+       sbk
+       45 y 9 add moveto h 2 div 45 sub y 18 add lineto stroke
+} def
+EOF
 }
 
 print <<EOF;
 
-/sbk {
-       50 y moveto (sub) show
-       70 y moveto show showAlgorithm (/) show show
-       150 y moveto show
-       newline
-} def
-
 /key {
        noneedhline
 EOF
@@ -219,13 +252,20 @@ while(<GPG>) {
                $_ = "  ($fpr) fpr\n";
        }
        # user ids
+       s/\\x([0-9a-f][0-9a-f])/ chr(hex($1)) /gie;
+       $_ = `echo "$_" | iconv -ct latin1`;
        s/^uid:[^:r]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/     ($1) uid/;
        # revoked user id
        if (s/^uid:r[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ($1) revuid/) {
                next if $revokestyle eq "hide";
        }
        # subkey
-       s/^sub:[^:]*:([^:]*):([0-9]*):.{8,8}(.{8,8}):([^:]*):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:.*/    ($4) ($3) $2 ($1) sbk/;
+       if (s/^sub:[^r:]*:([^:]*):([0-9]*):.{8,8}(.{8,8}):([^:]*):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:.*/       ($4) ($3) $2 ($1) sbk/) {
+               next if ! $showsubkeys;
+       }
+       if (s/^sub:r[^:]*:([^:]*):([0-9]*):.{8,8}(.{8,8}):([^:]*):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:.*/       ($4) ($3) $2 ($1) revsbk/) {
+               next if (!$showsubkeys) || $revokestyle eq "hide";
+       }
        $numlines++;
        # print this line
        print;
@@ -237,8 +277,6 @@ unless ($started) {
        exit 1;
 }
 
-print STDERR "numlines $numlines\n";
-
 # output the remaining postscript
 print <<EOF;
 } def
@@ -250,12 +288,12 @@ print <<EOF;
        /y w 20 sub def
        1 1 num {
                gsave
-               0 0 h 2 div w rectclip
+               0 0 h $columns div w rectclip
                /upper y 11 add def
                key
                newline
                /lower y 11 add def
-               0 upper h 2 div upper h 2 div lower 0 lower 0 upper moveto lineto lineto lineto lineto stroke
+               0 upper h $columns div upper h $columns div lower 0 lower 0 upper moveto lineto lineto lineto lineto stroke
                grestore
        } for
 } def
@@ -263,9 +301,17 @@ print <<EOF;
 w 0 translate
 90 rotate
 column
-h 2 div 0 translate
+EOF
+
+if ( $columns == 2 ) {
+       print <<EOF;
+h $columns div 0 translate
 column
 
+EOF
+}
+
+print <<EOF;
 showpage
 
 %%Trailer
@@ -284,7 +330,7 @@ B<gpg-key2ps> - generates a PS file from a GnuPG keyring
 
 =head1 SYNOPSIS
 
-B<gpg-key2ps> [B<-r> I<revoked-style>] [B<-p> I<papersize>] I<keyid-or-name> [ I<...> ]
+B<gpg-key2ps> [B<-r> I<revoked-style>] [B<-p> I<papersize>] [B<-1>] [B<-s>] I<keyid-or-name> [ I<...> ]
 
 =head1 DESCRIPTION
 
@@ -302,15 +348,25 @@ The PS data is written to stdout.
 Select the output paper size. Default is to look into /etc/papersize or A4 if
 libpaper isn't installed.
 
+=item B<-s> B<--show-subkeys>
+
+Enable subkey information to be printed on the slips. Subkey information is
+normally not relevant to the key signing process.
+
 =item B<-r> B<--revoked-style> I<revoked-style>
 
-Select how to mark revoked UIDs. Five styles are available:
+Select how to mark revoked UIDs and subkeys. Five styles are available:
  B<hide> don't show at all (default),
  B<show> show normally,
  B<grey> display in 50% grey,
  B<note> add "[revoked]", and
  B<strike> strike through.
 
+=item B<-1>
+
+Print only one column of paper slips instead of the default two. Useful for keys
+with long UIDs that otherwise won't fit.
+
 =item I<keyid>
 
 Keyids to print. Multiple can be separated by spaces.
@@ -325,18 +381,34 @@ Print version and exit.
 
 =back
 
-
 =head1 SEE ALSO
 
-gpg(1)
+=over
+
+=item gpg(1)
+
+GNU Privacy Guard.
+
+=item http://pgp-tools.alioth.debian.org/
+
+The homepage of B<gpg-key2ps> and the other tools bundled in B<signing-party>.
 
-http://pgp-tools.alioth.debian.org/
+=item http://www.debian.org/events/materials/business-cards/
+
+B<gpg-key2ps> prints plain fingerprint slips. If you are looking for something
+more stylish, look at these latex templates for business cards that also
+include fingerprints.
+
+=back
 
 =head1 AUTHORS AND COPYRIGHT
 
-(c) 2001 - 2005 Simon Richter <sjr@debian.org>
+=over
+
+=item (c) 2001-2005 Simon Richter <sjr@debian.org>
 
-(c) 2005 Thijs Kinkhorst <thijs@kinkhorst.com>
+=item (c) 2005-2008 Thijs Kinkhorst <thijs@kinkhorst.com>
 
-(c) 2005 Christoph Berg <cb@df7cb.de>
+=item (c) 2005-2008 Christoph Berg <cb@df7cb.de>
 
+=back