Fix bad design that I shouldn't have ever added #1466

This commit is contained in:
Ilia Rostovtsev 2021-03-26 15:37:12 +03:00
parent 5110269a57
commit 49f75d239a
No known key found for this signature in database
GPG Key ID: 121E166DD9C821AB
3 changed files with 141 additions and 51 deletions

View File

@ -2128,9 +2128,9 @@ if ($config{'userfile'}) {
&write_data("\r\n");
&reset_byte_count();
&write_data("<html>\n");
&write_data("<head><title>401 &mdash; Unauthorized</title></head>\n");
&write_data("<body><h2 @{[get_error_style('heading')]}>401 &mdash; Unauthorized</h2>\n");
&write_data("<p @{[get_error_style('content')]}>A password is required to access this\n");
&write_data("<head>".&embed_error_styles($roots[0])."<title>401 &mdash; Unauthorized</title></head>\n");
&write_data("<body><h2 class=\"err-head\">401 &mdash; Unauthorized</h2>\n");
&write_data("<p class=\"err-content\">A password is required to access this\n");
&write_data("web server. Please try again.</p> <p>\n");
&write_data("</body></html>\n");
&log_request($loghost, undef, $reqline, 401, &byte_count());
@ -2389,8 +2389,8 @@ if (-d _) {
&write_keep_alive(0);
&write_data("\r\n");
&reset_byte_count();
&write_data("<h2 @{[get_error_style('heading')]}>Index of $simple</h2>\n");
&write_data("<pre @{[get_error_style('content')]}>\n");
&write_data("".&embed_error_styles($roots[0])."<h2 class=\"err-head\">Index of $simple</h2>\n");
&write_data("<pre class=\"err-content\">\n");
&write_data(sprintf "%-35.35s %-20.20s %-10.10s\n",
"Name", "Last Modified", "Size");
&write_data("</pre>\n");
@ -2810,10 +2810,10 @@ else {
&write_data("\r\n");
&reset_byte_count();
&write_data("<html>\n");
&write_data("<head><title>$code &mdash; $msg</title></head>\n");
&write_data("<body @{[get_error_style('body')]}><h2 @{[get_error_style('heading')]}>Error &mdash; $msg</h2>\n");
&write_data("<head>".&embed_error_styles($roots[0])."<title>$code &mdash; $msg</title></head>\n");
&write_data("<body class=\"err-body\"><h2 class=\"err-head\">Error &mdash; $msg</h2>\n");
if ($body) {
&write_data("<p @{[get_error_style('content')]}>$body</p>\n");
&write_data("<p class=\"err-content\">$body</p>\n");
}
&write_data("</body></html>\n");
}
@ -2824,6 +2824,23 @@ shutdown(SOCK, 1);
exit if (!$noexit);
}
# embed_error_styles()
# Returns HTML styles for nicer errors. For internal use only.
sub embed_error_styles
{
my ($root) = @_;
if ($root) {
my $err_style = &read_any_file("$root/unauthenticated/errors.css");
if ($err_style) {
$err_style =~ s/[\n\r]//g;
$err_style =~ s/\s+/ /g;
$err_style = "<style data-err type=\"text/css\">$err_style</style>";
return "\n$err_style\n";
}
}
return undef;
}
sub get_type
{
if ($_[0] =~ /\.([A-z0-9]+)$/) {
@ -3137,7 +3154,7 @@ local($idx, $more, $rv);
while(($idx = index($main::read_buffer, "\n")) < 0) {
if (length($main::read_buffer) > 100000 && !$nolimit) {
&http_error(414, "Request too long",
"Received excessive line <pre @{[get_error_style('content')]}>".&html_strip($main::read_buffer)."</pre>");
"Received excessive line <pre class=\"err-content\">".&html_strip($main::read_buffer)."</pre>");
}
# need to read more..
@ -4681,6 +4698,20 @@ close(CONF);
return %rv;
}
# read_any_file(file)
# Reads any given file and returns its content
sub read_any_file
{
my ($realfile) = @_;
my $rv;
return $rv if (! -r $realfile);
open(my $fh, "<".$realfile);
local $/;
$rv = <$fh>;
close($fh);
return $rv;
}
# update_vital_config()
# Updates %config with defaults, and dies if something vital is missing
sub update_vital_config
@ -6472,22 +6503,3 @@ sub getenv
my ($key) = @_;
return $ENV{ uc($key) } || $ENV{ lc($key) };
}
# get_error_style(style_for)
# Returns a style for error messages
sub get_error_style
{
my ($type, $extra_style) = @_;
my $style = ' style="font-family:Lucida Console,Courier,monospace;';
if ($type eq 'heading') {
$style .= 'color:#f12b2b;font-size:14px;padding:5px 2.5px 0;transform:scale(1,1.5);text-transform:uppercase;white-space:pre-wrap;font-weight:500;';
}
if ($type eq 'content') {
$style .= 'font-size:12.5px;padding-left:2.5px;white-space:pre-wrap;';
}
if ($type eq 'body') {
$style .= 'font-size:12.5px;';
}
$style .= "$extra_style\"";
return $style;
}

View File

@ -0,0 +1,81 @@
.err-head,
.err-content,
.err-body {
font-family: Lucida Console, Courier, monospace;
}
.err-head {
color: #f12b2b;
font-size: 14px;
font-weight: 500;
padding: 5px 2.5px 0;
text-transform: uppercase;
transform: scale(1, 1.5);
white-space: pre-wrap;
}
.err-content {
padding-left: 2.5px;
white-space: pre-wrap;
}
.err-content,
.err-body {
font-size: 12.5px;
}
.err-head[data-fatal-error-text] {
padding: 0;
}
.err-stack caption,
.err-stack > tbody > tr:first-child > td > b {
color: #151515;
font-weight: bold;
text-align: left;
}
.err-stack > tbody > tr:first-child > td > b {
border-bottom: 1px solid #151515;
}
.err-stack > tbody > tr:first-child>td {
font-family: unset;
font-size: 14px;
height: 25px;
text-transform: uppercase;
transform: scale(1, 1.2);
vertical-align: top;
}
.err-stack {
border: 1px dashed #151515
}
.err-stack.captured {
margin-left: 12px;
width: auto
}
.err-stack tr td {
font-family: Lucida Console, Courier, monospace;
font-size: 13px;
padding: 1px 10px;
transform: scale(1, 1.15);
}
.err-stack tr:not(:first-child) td.captured {
font-size: 90%;
}
.err-stack > tr:first-child > td.captured {
font-size: 96%;
padding-bottom: 7px;
padding-top: 3px;
}
.err-stack caption.err-head {
padding:0 0 10px 0;
}
.err-stack caption.err-head.captured {
color: #222;
font-size:98%;
}

View File

@ -1659,9 +1659,16 @@ elsif ($ENV{'REQUEST_URI'} =~ /json-error=1/) {
}
else {
&header($text{'error'}, "");
my $hh = $miniserv::page_capture;
my $hh = $miniserv::page_capture ? " captured" : "";
my $err_style = &read_file_contents("$root_directory/unauthenticated/errors.css");
if ($err_style) {
$err_style =~ s/[\n\r]//g;
$err_style =~ s/\s+/ /g;
$err_style = "<style data-err type=\"text/css\">$err_style</style>";
print "\n$err_style\n";
}
print "<hr>\n" if ($hh);
if ($hh) {
if ($hh) {
print "<h3 data-fatal-error-text>",($main::whatfailed ? "$main::whatfailed : " : ""),
@_,"</h3>\n";
}
@ -1673,32 +1680,22 @@ else {
$error_text = " &mdash; $error_html";
$error_html = undef;
}
print "<title>$text{'error'}</title><h3 @{[miniserv::get_error_style('heading', 'padding:0;')]} data-fatal-error-text>$text{'error'}$error_text</h3>$error_html<br>\n";
print "<title>$text{'error'}</title><h3 class=\"err-head\" data-fatal-error-text>$text{'error'}$error_text</h3>$error_html<br>\n";
}
if ($gconfig{'error_stack'}) {
# Show call stack
print "<style>\n";
print "table.config-error-stack caption, table.config-error-stack > tbody > tr:first-child > td > b {color: #151515;font-weight:bold;text-align: left;}\n";
print "table.config-error-stack > tbody > tr:first-child > td > b {border-bottom: 1px solid #151515;}\n";
print "table.config-error-stack > tbody > tr:first-child > td {height: 25px;vertical-align:top;font-size:14px;font-family:unset;transform:scale(1,1.2);text-transform:uppercase;}\n";
print "table.config-error-stack {border: 1px dashed #151515}\n";
print "table.config-error-stack {margin-left: 12px;width:auto}\n" if ($hh);
print "table.config-error-stack tr:not(:first-child) td {font-size: 90%;}\n" if ($hh);
print "table.config-error-stack tr td {padding: 1px 10px!important;font-family:Lucida Console,Courier,monospace;font-size:13px;transform:scale(1,1.15);}\n";
print "table.config-error-stack > tbody > tr:first-child > td{font-size:96%; font-size: 96%;padding-top:3px!important;padding-bottom:7px!important;}\n" if ($hh);
print "</style>\n";
my $caption_no_header_style =
&miniserv::get_error_style('heading', "padding:0 0 10px 0;" . ($hh ? "color: #222;font-size:98%;" : "") . "");
my $cls_err_caption = " class=\"err-head$hh\"";
my $cls_err_td = $hh ? " class=\"@{[&trim($hh)]}\"" : "";
print "<hr>\n" if ($hh);
print "<table class=\"config-error-stack\"><caption$caption_no_header_style>$text{'error_stack'}</caption>\n";
print "<tr> <td><b>$text{'error_file'}</b></td> ",
"<td><b>$text{'error_line'}</b></td> ",
"<td><b>$text{'error_sub'}</b></td> </tr>\n";
print "<table class=\"err-stack$hh\"><caption$cls_err_caption>$text{'error_stack'}</caption>\n";
print "<tr> <td$cls_err_td><b>$text{'error_file'}</b></td> ",
"<td$cls_err_td><b>$text{'error_line'}</b></td> ",
"<td$cls_err_td><b>$text{'error_sub'}</b></td> </tr>\n";
for($i=0; my @stack = caller($i); $i++) {
print "<tr>\n";
print "<td>$stack[1]</td>\n";
print "<td>$stack[2]</td>\n";
print "<td>$stack[3]</td>\n";
print "<td$cls_err_td>$stack[1]</td>\n";
print "<td$cls_err_td>$stack[2]</td>\n";
print "<td$cls_err_td>$stack[3]</td>\n";
print "</tr>\n";
}
print "</table>\n";
@ -3854,7 +3851,7 @@ else {
delete($ENV{'FOREIGN_ROOT_DIRECTORY'});
}
@INC = @OLDINC;
if ($@) { &error("<pre @{[miniserv::get_error_style('content')]}>Require $mod/$files[0] failed : $@</pre>"); }
if ($@) { &error("<pre class=\"err-content\">Require $mod/$files[0] failed : $@</pre>"); }
return 1;
}