Handle multiple sigs with different classes properly
[pgp-tools.git] / gpgsigs / gpgsigs
index 0caf08f68f730bcd8246b4686bb9545468df93ff..c49ef00bfda9b4548eb14356e7fbffb77f823347 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,19 @@ 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 ($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:/ ) {