Apply patch from Uwe Kleine-König to deal with latin1 characters
[pgp-tools.git] / gpg-key2ps / gpg-key2ps
index da3231c7dd8f224ac84629af26de5a3250f94018..4fbafad840c365c569c31e4dd542b2090acfb959 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # gpg-key2ps: convert a PGP/GnuPG key into paper slips.
 # Copyright (C) 2001-2005  Simon Richter
-# Copyright (C) 2005-2007  Thijs Kinkhorst
+# 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,6 +14,7 @@ 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);
@@ -27,9 +28,10 @@ sub usage($$) {
        my ($fd, $exitcode) = @_;
        version ($fd);
        print $fd <<EOF;
-Usage: $0 [-p papersize] [-r revoked-style] [-1] 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 and subkeys (default)
         grey   - Print text in grey
@@ -51,6 +53,8 @@ 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},
@@ -69,8 +73,9 @@ 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";
@@ -116,7 +121,21 @@ print <<EOF;
 /w $w def
 /h $h def
 
-/Times-Roman findfont 9 scalefont setfont 
+/reencode {
+       exch findfont
+       dup length dict
+       begin {
+               1 index /FID eq
+               { pop pop }
+               { def } ifelse
+       } forall
+       /Encoding ISOLatin1Encoding def
+       currentdict
+       end
+       definefont
+} bind def
+
+/Times-Roman /trlatin1 reencode 9 scalefont setfont
 
 /newline {
        /y y 10 sub def
@@ -248,16 +267,18 @@ while(<GPG>) {
        }
        # user ids
        s/\\x([0-9a-f][0-9a-f])/ chr(hex($1)) /gie;
-       $_ = `echo "$_" | iconv -ct latin1`;
+       $_ = `echo "$_" | iconv -c -f utf-8 -t latin1`;
        s/^uid:[^:r]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/     ($1) uid/;
        # revoked user id
        if (s/^uid:r[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:([^:]*):.*/ ($1) revuid/) {
                next if $revokestyle eq "hide";
        }
        # subkey
-       s/^sub:[^r:]*:([^:]*):([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 $revokestyle eq "hide";
+               next if (!$showsubkeys) || $revokestyle eq "hide";
        }
        $numlines++;
        # print this line
@@ -323,7 +344,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
 
@@ -341,6 +362,11 @@ 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 and subkeys. Five styles are available:
@@ -350,6 +376,11 @@ Select how to mark revoked UIDs and subkeys. Five styles are available:
  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.
@@ -390,7 +421,7 @@ include fingerprints.
 
 =item (c) 2001-2005 Simon Richter <sjr@debian.org>
 
-=item (c) 2005-2007 Thijs Kinkhorst <thijs@kinkhorst.com>
+=item (c) 2005-2008 Thijs Kinkhorst <thijs@kinkhorst.com>
 
 =item (c) 2005-2008 Christoph Berg <cb@df7cb.de>