Whine about malformed input
[pgp-tools.git] / gpgsigs / gpgsigs
index 0caf08f68f730bcd8246b4686bb9545468df93ff..35d6d71f2c5348b7e9406faa713b1c0e1cf6667b 100755 (executable)
@@ -59,9 +59,10 @@ EOF
 
 
 my ($fromcharset, $charset, $recv_keys);
+Getopt::Long::config('bundling');
 GetOptions(
-       f => \$fromcharset,
-       t => \$charset,
+       '-f=s' => \$fromcharset,
+       '-t=s' => \$charset,
        r => \$recv_keys,
        help => sub { usage(*STDOUT, 0); },
        version => sub { version(*STDOUT); exit 0;},
@@ -142,8 +143,8 @@ map { s/^0x//i; } @mykeys;
 if (!@mykeys || scalar @ARGV) {
        usage(*STDERR, 1);
 }
-if (!grep { /^([0-9A-F]{16,16}|[0-9A-F]{8,8})$/ } @mykeys) {
-       print STDERR "Invalid keyid given\n";
+foreach my $falsekey (grep { $_ !~ /^([0-9A-F]{16,16}|[0-9A-F]{8,8})$/ } @mykeys) {
+       print STDERR "Invalid keyid $falsekey given\n";
        usage(*STDERR, 1);
 }
 
@@ -195,8 +196,21 @@ while (<SIGS>) {
                } else {
                        $class = 's';
                };
-               $sigs->{$key}->{$uid}->{$1.$2} = $class;
-               $sigs->{$key}->{$uid}->{$2} = $class;
+               # Handle the case where one UID was signed multiple times
+               # with different signature classes.
+               my $before = $sigs->{$key}->{$uid}->{$1.$2};
+               if (defined $before) {
+                       if ($before eq 'S' || $before eq 's') {
+                               $sigs->{$key}->{$uid}->{$1.$2} = $class;
+                       } elsif ($class eq 'S' || $class eq 's') {
+                               # intentionall left blank
+                       } elsif ($before < $class) {
+                               $sigs->{$key}->{$uid}->{$1.$2} = $class;
+                       };
+               } else {
+                       $sigs->{$key}->{$uid}->{$1.$2} .= $class;
+               };
+               $sigs->{$key}->{$uid}->{$2} = $sigs->{$key}->{$uid}->{$1.$2};
                next;
        }
        if ( m/^uat:/ ) {
@@ -247,10 +261,14 @@ sub print_tag
        return $r;
 }
 
+$key = undef;
+$uid = undef;
+my $line = 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");
 while (<TXT>) {
+       $line++;
        $_ = myfromrecode($_);
        if (/^MD5 Checksum:/ && defined $MD5) {
                s/[_[:xdigit:]][_ [:xdigit:]]+_/$MD5/;
@@ -268,7 +286,10 @@ while (<TXT>) {
        }
        if ( m/^uid +(.*)$/ ) {
                $uid = $1;
-               die "key is undefined" unless defined $key;
+               unless (defined $key) {
+                       warn "key is undefined - input text is possibly malformed near line $line\n";
+                       next;
+               };
                die "uid is undefined, key $key" unless defined $uid;
                die "bad tag from $key | $uid" unless defined (print_tag($key, $uid));
                print WRITE print_tag($key, $uid) . " $_";