X-Git-Url: https://git.sthu.org/?a=blobdiff_plain;f=gpgsigs%2Fgpgsigs;h=7678c196d6cb424414de2df45c9ca38f68950c6a;hb=a35a7302a1bcb2d71ef0e7b0d3655684769bc82c;hp=38db0ec686b37ec134d90fe2c989d1594336d58c;hpb=3e6648e9d2988775d405042b74e884bee29fd019;p=pgp-tools.git diff --git a/gpgsigs/gpgsigs b/gpgsigs/gpgsigs index 38db0ec..7678c19 100755 --- a/gpgsigs/gpgsigs +++ b/gpgsigs/gpgsigs @@ -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;}, @@ -75,44 +76,19 @@ $charset = "ISO-8859-1" unless $charset =~ /[\.-]/; $charset =~ s/.*\.//; $charset =~ s/@.*//; -my ($rf, $rt, $if, $it); -if (eval "require Locale::Recode") { - $rf = Locale::Recode->new (from => $fromcharset, to => $charset) if $fromcharset; - $rt = Locale::Recode->new (from => 'UTF-8', to => $charset); -} elsif (eval "require Text::Iconv") { - $if = Text::Iconv->new($fromcharset, $charset) if $fromcharset; - $it = Text::Iconv->new("UTF-8", $charset); -} -sub myfromrecode($) { - my ($text) = @_; - if (defined $rf) { - my $orig = $text; - $rf->recode($text); - return $text; - } elsif (defined $if) { - return $if->convert($text); - } else { - my $pid = open3(\*WTRFH, \*RDRFH, \*ERRFH, 'recode', "$fromcharset..$charset"); - print WTRFH $text; - close WTRFH; - local $/ = undef; - my $result = ; - close RDRFH; - close ERRFH; - waitpid $pid, 0; - die ("'recode' failed, is it installed?\n") unless defined $result; - return $result; - } -} +sub myrecode($$$) { + my ($text, $from, $to) = @_; + + if (eval "require Locale::Recode") { + my $rt = Locale::Recode->new (from => $from, to => $to); -sub myrecode($) { - my ($text) = @_; - if (defined $rt) { my $orig = $text; $rt->recode($text); return $text; - } elsif (defined $it) { + } elsif (eval "require Text::Iconv") { + my $it = Text::Iconv->new($from, $to); + my $result = $it->convert($text); warn ("Could not convert '$text'\n") unless defined $result; return (defined $result) ? $result : $text @@ -142,8 +118,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); } @@ -179,12 +155,39 @@ while () { next; } if ( m/^uid:(?:.*?:){8,8}(.*):/s ) { - $uid = myrecode($1); + $uid = $1; + $uid =~ s/\\x([0-9a-f][0-9a-f])/ chr(hex($1)) /gie; + $uid = myrecode($uid, "UTF-8", $charset); next; } - if ( m/^sig:(?:.*?:){3,3}([0-9A-F]{8})([0-9A-F]{8}):(?:.*?:){3,3}(.*):.*?:/ ) { - $sigs->{$key}->{$uid}->{$1.$2} = $3; - $sigs->{$key}->{$uid}->{$2} = $3; + if ( m/^sig:(?:.*?:){3,3}([0-9A-F]{8})([0-9A-F]{8}):(?:.*?:){5,5}(.*?):/ ) { + my $class = $3; + if ($class eq '10x') { + $class = 'S'; + } elsif ($class eq '11x') { + $class = '1'; + } elsif ($class eq '12x') { + $class = '2'; + } elsif ($class eq '13x') { + $class = '3'; + } else { + $class = 's'; + }; + # 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:/ ) { @@ -205,13 +208,23 @@ for my $k ( keys %{$sigs} ) { # read checksums -open MD, "gpg --print-md md5 $keytxt|" or warn "can't get gpg md5\n"; +open MD, "gpg --with-colons --print-md md5 $keytxt|" or warn "can't get gpg md5\n"; my $MD5 = ; close MD; -open MD, "gpg --print-md sha1 $keytxt|" or warn "can't get gpg sha1\n"; +open MD, "gpg --with-colons --print-md sha1 $keytxt|" or warn "can't get gpg sha1\n"; my $SHA1 = ; close MD; +my @MD5 = split /:/, $MD5; +my @SHA1 = split /:/, $SHA1; +$MD5 = $MD5[2]; +$SHA1 = $SHA1[2]; + +$MD5 =~ s/(.{16})/$1 /; +$SHA1 =~ s/(.{20})/$1 /; +$MD5 =~ s/([0-9A-Z]{2})/$1 /ig; +$SHA1 =~ s/([0-9A-Z]{4})/$1 /ig; + chomp $MD5; chomp $SHA1; my $metatxt = quotemeta($keytxt); @@ -225,21 +238,28 @@ sub print_tag my ($key, $uid) = @_; if (! defined $sigs->{$key}->{$uid}) { warn "uid '$uid' not found on key $key\n"; + #for (keys %{ $sigs->{$key} }) { + # print STDERR "only have $_\n"; + #}; return '(' . (' ' x @mykeys) . ')'; } my $r = '('; foreach my $mykey (@mykeys) { - $r .= defined $sigs->{$key}->{$uid}->{$mykey} ? "S" : " "; + $r .= defined $sigs->{$key}->{$uid}->{$mykey} ? $sigs->{$key}->{$uid}->{$mykey} : ' '; } $r .= ')'; 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 () { - $_ = myfromrecode($_); + $line++; + $_ = myrecode($_, $fromcharset, $charset); if (/^MD5 Checksum:/ && defined $MD5) { s/[_[:xdigit:]][_ [:xdigit:]]+_/$MD5/; } @@ -256,7 +276,10 @@ while () { } 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) . " $_";