| OLD | NEW |
| 1 #!/usr/bin/perl | 1 #!/usr/bin/perl |
| 2 | 2 |
| 3 | 3 |
| 4 # Perl c_rehash script, scan all files in a directory | 4 # Perl c_rehash script, scan all files in a directory |
| 5 # and add symbolic links to their hash values. | 5 # and add symbolic links to their hash values. |
| 6 | 6 |
| 7 my $openssl; | 7 my $openssl; |
| 8 | 8 |
| 9 my $dir = "/usr/local/ssl"; | 9 my $dir = "/usr/local/ssl"; |
| 10 my $prefix = "/usr/local/ssl"; | 10 my $prefix = "/usr/local/ssl"; |
| 11 | 11 |
| 12 if(defined $ENV{OPENSSL}) { | 12 if(defined $ENV{OPENSSL}) { |
| 13 $openssl = $ENV{OPENSSL}; | 13 $openssl = $ENV{OPENSSL}; |
| 14 } else { | 14 } else { |
| 15 $openssl = "openssl"; | 15 $openssl = "openssl"; |
| 16 $ENV{OPENSSL} = $openssl; | 16 $ENV{OPENSSL} = $openssl; |
| 17 } | 17 } |
| 18 | 18 |
| 19 $ENV{PATH} .= ":$dir/bin"; | 19 my $pwd; |
| 20 eval "require Cwd"; |
| 21 if (defined(&Cwd::getcwd)) { |
| 22 » $pwd=Cwd::getcwd(); |
| 23 } else { |
| 24 » $pwd=`pwd`; chomp($pwd); |
| 25 } |
| 26 my $path_delim = ($pwd =~ /^[a-z]\:/i) ? ';' : ':'; # DOS/Win32 or Unix delimite
r? |
| 27 |
| 28 $ENV{PATH} = "$prefix/bin" . ($ENV{PATH} ? $path_delim . $ENV{PATH} : ""); # pre
fix our path |
| 20 | 29 |
| 21 if(! -x $openssl) { | 30 if(! -x $openssl) { |
| 22 my $found = 0; | 31 my $found = 0; |
| 23 » foreach (split /:/, $ENV{PATH}) { | 32 » foreach (split /$path_delim/, $ENV{PATH}) { |
| 24 if(-x "$_/$openssl") { | 33 if(-x "$_/$openssl") { |
| 25 $found = 1; | 34 $found = 1; |
| 35 $openssl = "$_/$openssl"; |
| 26 last; | 36 last; |
| 27 } | 37 } |
| 28 } | 38 } |
| 29 if($found == 0) { | 39 if($found == 0) { |
| 30 print STDERR "c_rehash: rehashing skipped ('openssl' program not
available)\n"; | 40 print STDERR "c_rehash: rehashing skipped ('openssl' program not
available)\n"; |
| 31 exit 0; | 41 exit 0; |
| 32 } | 42 } |
| 33 } | 43 } |
| 34 | 44 |
| 35 if(@ARGV) { | 45 if(@ARGV) { |
| 36 @dirlist = @ARGV; | 46 @dirlist = @ARGV; |
| 37 } elsif($ENV{SSL_CERT_DIR}) { | 47 } elsif($ENV{SSL_CERT_DIR}) { |
| 38 » @dirlist = split /:/, $ENV{SSL_CERT_DIR}; | 48 » @dirlist = split /$path_delim/, $ENV{SSL_CERT_DIR}; |
| 39 } else { | 49 } else { |
| 40 $dirlist[0] = "$dir/certs"; | 50 $dirlist[0] = "$dir/certs"; |
| 41 } | 51 } |
| 42 | 52 |
| 53 if (-d $dirlist[0]) { |
| 54 chdir $dirlist[0]; |
| 55 $openssl="$pwd/$openssl" if (!-x $openssl); |
| 56 chdir $pwd; |
| 57 } |
| 43 | 58 |
| 44 foreach (@dirlist) { | 59 foreach (@dirlist) { |
| 45 if(-d $_ and -w $_) { | 60 if(-d $_ and -w $_) { |
| 46 hash_dir($_); | 61 hash_dir($_); |
| 47 } | 62 } |
| 48 } | 63 } |
| 49 | 64 |
| 50 sub hash_dir { | 65 sub hash_dir { |
| 51 my %hashlist; | 66 my %hashlist; |
| 52 print "Doing $_[0]\n"; | 67 print "Doing $_[0]\n"; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 110 |
| 96 # Link a certificate to its subject name hash value, each hash is of | 111 # Link a certificate to its subject name hash value, each hash is of |
| 97 # the form <hash>.<n> where n is an integer. If the hash value already exists | 112 # the form <hash>.<n> where n is an integer. If the hash value already exists |
| 98 # then we need to up the value of n, unless its a duplicate in which | 113 # then we need to up the value of n, unless its a duplicate in which |
| 99 # case we skip the link. We check for duplicates by comparing the | 114 # case we skip the link. We check for duplicates by comparing the |
| 100 # certificate fingerprints | 115 # certificate fingerprints |
| 101 | 116 |
| 102 sub link_hash_cert { | 117 sub link_hash_cert { |
| 103 my $fname = $_[0]; | 118 my $fname = $_[0]; |
| 104 $fname =~ s/'/'\\''/g; | 119 $fname =~ s/'/'\\''/g; |
| 105 » » my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout
-in '$fname'`; | 120 » » my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout
-in "$fname"`; |
| 106 chomp $hash; | 121 chomp $hash; |
| 107 chomp $fprint; | 122 chomp $fprint; |
| 108 $fprint =~ s/^.*=//; | 123 $fprint =~ s/^.*=//; |
| 109 $fprint =~ tr/://d; | 124 $fprint =~ tr/://d; |
| 110 my $suffix = 0; | 125 my $suffix = 0; |
| 111 # Search for an unused hash filename | 126 # Search for an unused hash filename |
| 112 while(exists $hashlist{"$hash.$suffix"}) { | 127 while(exists $hashlist{"$hash.$suffix"}) { |
| 113 # Hash matches: if fingerprint matches its a duplicate c
ert | 128 # Hash matches: if fingerprint matches its a duplicate c
ert |
| 114 if($hashlist{"$hash.$suffix"} eq $fprint) { | 129 if($hashlist{"$hash.$suffix"} eq $fprint) { |
| 115 print STDERR "WARNING: Skipping duplicate certif
icate $fname\n"; | 130 print STDERR "WARNING: Skipping duplicate certif
icate $fname\n"; |
| 116 return; | 131 return; |
| 117 } | 132 } |
| 118 $suffix++; | 133 $suffix++; |
| 119 } | 134 } |
| 120 $hash .= ".$suffix"; | 135 $hash .= ".$suffix"; |
| 121 print "$fname => $hash\n"; | 136 print "$fname => $hash\n"; |
| 122 $symlink_exists=eval {symlink("",""); 1}; | 137 $symlink_exists=eval {symlink("",""); 1}; |
| 123 if ($symlink_exists) { | 138 if ($symlink_exists) { |
| 124 symlink $fname, $hash; | 139 symlink $fname, $hash; |
| 125 } else { | 140 } else { |
| 126 » » » system ("cp", $fname, $hash); | 141 » » » open IN,"<$fname" or die "can't open $fname for read"; |
| 142 » » » open OUT,">$hash" or die "can't open $hash for write"; |
| 143 » » » print OUT <IN>;»# does the job for small text files |
| 144 » » » close OUT; |
| 145 » » » close IN; |
| 127 } | 146 } |
| 128 $hashlist{$hash} = $fprint; | 147 $hashlist{$hash} = $fprint; |
| 129 } | 148 } |
| 130 | 149 |
| 131 # Same as above except for a CRL. CRL links are of the form <hash>.r<n> | 150 # Same as above except for a CRL. CRL links are of the form <hash>.r<n> |
| 132 | 151 |
| 133 sub link_hash_crl { | 152 sub link_hash_crl { |
| 134 my $fname = $_[0]; | 153 my $fname = $_[0]; |
| 135 $fname =~ s/'/'\\''/g; | 154 $fname =~ s/'/'\\''/g; |
| 136 my ($hash, $fprint) = `"$openssl" crl -hash -fingerprint -noout
-in '$fname'`; | 155 my ($hash, $fprint) = `"$openssl" crl -hash -fingerprint -noout
-in '$fname'`; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 152 print "$fname => $hash\n"; | 171 print "$fname => $hash\n"; |
| 153 $symlink_exists=eval {symlink("",""); 1}; | 172 $symlink_exists=eval {symlink("",""); 1}; |
| 154 if ($symlink_exists) { | 173 if ($symlink_exists) { |
| 155 symlink $fname, $hash; | 174 symlink $fname, $hash; |
| 156 } else { | 175 } else { |
| 157 system ("cp", $fname, $hash); | 176 system ("cp", $fname, $hash); |
| 158 } | 177 } |
| 159 $hashlist{$hash} = $fprint; | 178 $hashlist{$hash} = $fprint; |
| 160 } | 179 } |
| 161 | 180 |
| OLD | NEW |