]> git.llucax.com Git - software/mutt-debian.git/blob - debian/patches/upstream/547980-smime_keys-chaining.patch
upstream/311296-rand-mktemp.patch: more random file creation in /tmp, see CVE CAN...
[software/mutt-debian.git] / debian / patches / upstream / 547980-smime_keys-chaining.patch
1 To suppose certificate chaining in smime_keys, see upstream
2 http://bugs.mutt.org/3339
3
4 --- a/smime_keys.pl
5 +++ b/smime_keys.pl
6 @@ -81,6 +81,30 @@
7  # OPS
8  #
9  
10
11 +sub get_certs {
12 +    my $file = shift;
13 +    return undef unless (defined($file) && -e $file);
14 +
15 +    open IN, "<$file";
16 +
17 +    my @certs = ();
18 +    my $in_cert = 0;
19 +    my $cert = q{};
20 +    while ( <IN> ) {
21 +        $in_cert = 1 if ( /^-----BEGIN CERTIFICATE-----$/ );
22 +        $cert .= $_;
23 +
24 +        if ( /^-----END CERTIFICATE-----$/ )  {
25 +            push @certs, $cert;
26 +            $cert = q{};
27 +            $in_cert = 0;
28 +        }
29 +    }
30 +
31 +    return @certs;
32 +}
33 +
34  if(@ARGV == 1 and $ARGV[0] eq "init") {
35      init_paths;
36  }
37 @@ -91,13 +115,27 @@
38      change_label($ARGV[1]);
39  }
40  elsif(@ARGV == 2 and $ARGV[0] eq "add_cert") {
41 -    my $format = -B $ARGV[1] ? 'DER' : 'PEM'; 
42 -    my $cmd = "$opensslbin x509 -noout -hash -in $ARGV[1] -inform $format";
43 -    my $cert_hash = `$cmd`;
44 -    $? and die "'$cmd' returned $?";
45 -    chomp($cert_hash); 
46 -    my $label = query_label;
47 -    &add_certificate($ARGV[1], \$cert_hash, 1, $label, '?');
48 +    foreach my $cert ( get_certs( $ARGV[1] ) ) {
49 +
50 +        my $file = sprintf( '/tmp/smime-%d.%d', $$, int(rand( 999999 ) ) );
51 +        print STDERR "TMPFILE: $file\n";
52 +        if ( -e $file ) {
53 +            die( "ERROR: TMPFILE $file existss?!?!" );
54 +        }
55 +        open OUT, ">$file";
56 +        print OUT $cert;
57 +        close OUT;
58 +
59 +        my $format = -B $file ? 'DER' : 'PEM'; 
60 +        my $cmd = "$opensslbin x509 -noout -hash -in $file -inform $format";
61 +
62 +        my $cert_hash = `$cmd`;
63 +        $? and die "'$cmd' returned $?";
64 +        chomp($cert_hash); 
65 +        my $label = query_label;
66 +        &add_certificate($ARGV[1], \$cert_hash, 1, $label, '?');
67 +        unlink $file;
68 +    }
69  }
70  elsif(@ARGV == 2 and $ARGV[0] eq "add_pem") {
71      -e $ARGV[1] and -s $ARGV[1] or die("$ARGV[1] is nonexistent or empty.");
72 @@ -381,9 +419,10 @@
73      print "the key ID. This has to be _one_ word (no whitespaces).\n\n";
74  
75      print "Enter label: ";
76 -    chomp($input = <STDIN>);
77 +    $input = <STDIN>;
78 +    chomp($input) if ( defined($input) );
79  
80 -    my ($label, $junk) = split(/\s/, $input, 2);     
81 +    my ($label, $junk) = split(/\s/, $input, 2) if ( defined($input) );
82      
83      defined $junk 
84          and print "\nUsing '$label' as label; ignoring '$junk'\n";