Handle hostnames with upper-case letters
[webmin.git] / certmgr / view.cgi
1 #!/usr/local/bin/perl
2 # view.cgi
3 # Views certificates and keys in detail
4
5 require './certmgr-lib.pl';
6 $access{'view'} || &error($text{'ecannot'});
7 &ReadParse();
8
9 if (!$in{'wildcard'}){$in{'wildcard'}=$config{'default_wildcard'}}
10 $wildcard_pattern=$in{'wildcard'};
11 $wildcard_pattern=~s/\./\\./g;
12 $wildcard_pattern=~s/\*/[^\/]*?/g;
13 $wildcard_pattern=~s/\?/./g;
14
15
16 if ($in{'dl'} ne "yes" && $in{'pkcs12'} ne "yes") {
17         &header($text{'view_title'}, "");
18         print &ui_hr();
19 }
20 if ($in{'delete'} eq "yes"){
21         if ($in{'keyfile'}) { $file=$in{'keyfile'} }
22         elsif ($in{'certfile'}) { $file=$in{'certfile'} }
23         elsif ($in{'csrfile'}) { $file=$in{'csrfile'} }
24         elsif ($in{'keycertfile'}) { $file=$in{'keycertfile'} }
25         if (!($file)&&((-f $file)||(-s $file))){ print "<b>$file</b>: $text{'view_e_nofile'}\n<p>\n"; }
26         if (unlink($file)) { print "<b>$file</b>: $text{'view_deleted'}\n<p>\n"; }
27         else { print "<b>$file</b>: $text{'view_e_not_deleted'}\n<p>\n"; }
28         &footer("", $text{'index_return'});
29         exit;
30 }
31
32 if (($in{'filename'}) && ($in{'view'} eq $text{'view_view'})) {
33         $in{'filename'}=$config{'ssl_dir'}."/".$in{'filename'};
34         if (!open(FILE,$in{'filename'})) {
35                 print "$text{'e_file'}\n<p>\n";
36                 &footer("", $text{'index_return'});
37                 exit;
38         }
39         while(<FILE>){ $buffer.=$_;}
40         if ($buffer=~/^\s*-+BEGIN\s*RSA\s*PRIVATE\s*KEY-*\s*$/mi) { $key=1; }
41         if ($buffer=~/^\s*-+BEGIN\s*CERTIFICATE-*\s*$/mi) { $cert=1; }
42         if ($buffer=~/^\s*-+BEGIN\s*CERTIFICATE\s*REQUEST-*\s*$/mi) { $csr=1; }
43         if (($key)&&($cert)) {$in{'keycertfile'}=$in{'filename'};}
44         elsif ($key) {$in{'keyfile'}=$in{'filename'};}
45         elsif ($cert) {$in{'certfile'}=$in{'filename'};}
46         elsif ($csr) {$in{'csrfile'}=$in{'filename'};}
47         else {
48                 print "$text{'e_file'}<br>\n$text{'e_notcert'}\n<p>\n";
49                 &footer("", $text{'index_return'});
50                 exit;
51         }
52         undef($buffer);
53         undef($key);
54         undef($cert);
55                 
56 }
57
58 if ($in{'keyfile'}) {
59         if ($in{'dl'} eq 'yes') {
60                 # Just output in PEM format
61                 &output_cert($in{'keyfile'});
62         } elsif ($in{'pkcs12'} eq 'yes') {
63                 # Just output in PKCS8 format
64                 &output_pkcs12($in{'keyfile'});
65         }
66
67         open(OPENSSL,"$config{'openssl_cmd'} rsa -in $in{'keyfile'} -text -noout|");
68         while(<OPENSSL>){ $buffer.=$_; }
69         close(OPENSSL);
70         print "<table border><tr $tb> <td align=center><b>$in{'keyfile'}</b></td> </tr>\n<tr $cb> <td>\n";
71         if (!$buffer) { print $text{'e_file'};}
72         else {&print_key_info(1,$buffer);}
73         print "</td></tr></table>\n";
74         &download_form("keyfile", $in{'keyfile'}, $text{'key'});
75         print &ui_hr();
76         &footer("", $text{'index_return'});
77         exit;
78 }
79 if ($in{'certfile'}||$in{'csrfile'}) {
80         if ($in{'csrfile'}){
81                 $in{'certfile'}=$in{'csrfile'};
82                 $text{'certificate'}=$text{'csr'};
83         }
84         if ($in{'dl'} eq 'yes') {
85                 # Just output in PEM format
86                 &output_cert($in{'certfile'});
87         } elsif ($in{'pkcs12'} eq 'yes') {
88                 # Just output in PKCS8 format
89                 &output_pkcs12($in{'certfile'});
90         }
91
92         if ($in{'csrfile'}) {
93                 open(OPENSSL,"$config{'openssl_cmd'} req -in $in{'certfile'} -text -noout|");
94         } else {
95                 open(OPENSSL,"$config{'openssl_cmd'} x509 -in $in{'certfile'} -text -fingerprint -noout|");
96         }
97         while(<OPENSSL>){ $buffer.=$_; }
98         close(OPENSSL);
99         print "<table border><tr $tb> <td align=center><b>$in{'certfile'}</b></td> </tr>\n<tr $cb> <td>\n";
100         if (!$buffer) { print $text{'e_file'};}
101         else {&print_cert_info(1,$buffer);}
102         print "</td></tr></table>\n";
103         &download_form("certfile", $in{'certfile'}, $text{'certificate'});
104         print &ui_hr();
105         &footer("", $text{'index_return'});
106         exit;
107 }
108 if ($in{'keycertfile'}) {
109         if ($in{'dl'} eq 'yes') {
110                 # Just output in PEM format
111                 &output_cert($in{'keycertfile'});
112         } elsif ($in{'pkcs12'} eq 'yes') {
113                 # Just output in PKCS8 format
114                 &output_pkcs12($in{'keycertfile'});
115         }
116
117         open(OPENSSL,"$config{'openssl_cmd'} x509 -in $in{'keycertfile'} -text -fingerprint -noout|");
118         while(<OPENSSL>){ $buffer.=$_; }
119         close(OPENSSL);
120         print "<table border><tr $tb> <td align=center colspan=2><b>$in{'keycertfile'}</b></td> </tr>\n";
121                         print "<tr $cb><td align=center><b>$text{'certificate'}</b></td><td align=center><b>$text{'key'}</b></td></tr>\n<tr $cb valign=top> <td>\n";
122         if (!$buffer) { print $text{'e_file'};}
123         else {&print_cert_info(1,$buffer);}
124         print "</td><td>\n";
125         undef($buffer);
126         open(OPENSSL,"$config{'openssl_cmd'} rsa -in $in{'keycertfile'} -text -noout|");
127         while(<OPENSSL>){ $buffer.=$_; }
128         close(OPENSSL);
129         if (!$buffer) { print $text{'e_file'};}
130         else {&print_key_info(1,$buffer);}
131         print "</td></tr></table>\n";
132         &download_form("keycertfile", $in{'keycertfile'},
133                        "$text{'certificate'} / $text{'key'}");
134         print &ui_hr();
135         &footer("", $text{'index_return'});
136         exit;
137 }
138
139
140 print "<form action=view.cgi method=post>\n";
141 print "<table border>\n<tr $tb> <td><center><b>$text{'view_select'}</b></center></td> </tr>\n";
142 print "<tr $cb><td><table border=0><td>$text{'view_wildcard'}:</td><td><input name=wildcard value=\"$in{'wildcard'}\"></td>";
143 print "<td><input type=submit name=update value=\"$text{'view_update'}\"></td></tr>\n";
144 print "<tr><td colspan=2><select name=filename>\n";
145 print "<option value='' selected>$text{'view_choose'}\n";
146 foreach $f ( grep { /^(.*\/)*$wildcard_pattern$/ && -f "$config{'ssl_dir'}/$_" } &getfiles($config{'ssl_dir'})) { print "<option value=\"$f\">$config{'ssl_dir'}/$f\n"; }
147 print "</select>\n";
148 print "</td><td><input type=submit name=view value=\"$text{'view_view'}\"></td></tr></table></td></tr></table>\n";
149 print "</form>\n";
150 print &ui_hr();
151 &footer("", $text{'index_return'});
152
153 sub output_cert
154 {
155 print "Content-type: text/plain\n\n";
156 open(OPENSSL, $_[0]);
157 while(<OPENSSL>){ print; }
158 close(OPENSSL);
159 exit;
160 }
161
162 sub output_pkcs12
163 {
164 print "Content-type: application/pkcs12\n\n";
165 local $qp = quotemeta($in{'pass'});
166 open(OPENSSL, "$config{'openssl_cmd'} pkcs12 -in $_[0] -export -passout pass:$qp |");
167 while(<OPENSSL>){ print; }
168 close(OPENSSL);
169 exit;
170 }
171
172 sub pkcs12_filename
173 {
174 local $fn = &my_urlize($_[0]);
175 $fn =~ s/\.pem$/\.p12/i;
176 return $fn;
177 }
178
179 # download_form(mode, file, suffix)
180 sub download_form
181 {
182 local ($mode, $keyfile, $suffix) = @_;
183 $suffix = "";
184 $keyfile =~ /\/([^\/]*)$/;
185 local $filename = &my_urlize($1);
186 local $p12filename = &pkcs12_filename($1);
187
188 print "<table border=0><tr><td>\n";
189 print "<form action=view.cgi/$filename method=post>\n";
190 print "<input type=hidden name=dl value=yes>\n";
191 print "<input type=hidden name=$mode value=\"$keyfile\">\n";
192 print "<input type=submit value=\"$text{'view_download'} $suffix\"></form>\n";
193 print "</td><td>\n";
194
195 print "<form action=view.cgi/$p12filename method=post>\n";
196 print "<input type=hidden name=pkcs12 value=yes>\n";
197 print "<input type=hidden name=$mode value=\"$keyfile\">\n";
198 print "<input type=submit value=\"$text{'view_download'} $suffix $text{'view_pkcs12'}\">\n";
199 print "<input type=password name=pass size=20>\n";
200 print "</form>\n";
201 print "</td><td>\n";
202
203 print "<form action=view.cgi method=post>\n";
204 print "<input type=hidden name=delete value=yes>\n";
205 print "<input type=hidden name=$mode value=\"$keyfile\">\n";
206 print "<input type=submit value=\"$text{'view_delete'} $suffix\"></form>\n";
207 print "</td></tr></table>\n";
208 }
209