X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/17b2afe721d5b8fd2468fca56e91fe83bf49be64..46b880f8390ac82d746add01de38a05155743374:/IkiWiki/CGI.pm diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 3fadc462e..e75ebcd27 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -239,6 +239,9 @@ sub check_banned ($$) { print $q->header(-status => "403 Forbidden"); $session->delete(); print gettext("You are banned."); + # Internet Explorer won't show custom 404 responses + # unless they're >= 512 bytes + print " " x 512; cgi_savesession($session); exit; } @@ -291,6 +294,50 @@ sub cgi_savesession ($) { umask($oldmask); } +# cgi_goto(CGI, [page]) +# Redirect to a specified page, or display "not found". If not specified, +# the page param from the CGI object is used. +sub cgi_goto ($;$) { + my $q = shift; + my $page = shift; + + if (!defined $page) { + $page = decode_utf8($q->param("page")); + + if (!defined $page) { + error("missing page parameter"); + } + } + + loadindex(); + + # If the page is internal (like a comment), see if it has a + # permalink. Comments do. + if (isinternal($page) && + defined $pagestate{$page}{meta}{permalink}) { + redirect($q, $pagestate{$page}{meta}{permalink}); + } + + my $link = bestlink("", $page); + + if (! length $link) { + print $q->header(-status => "404 Not Found"); + print misctemplate(gettext("missing page"), + "

". + sprintf(gettext("The page %s does not exist."), + htmllink("", "", $page)). + "

". + # Internet Explorer won't show custom 404 responses + # unless they're >= 512 bytes + (" " x 512)); + } + else { + redirect($q, urlto($link, undef, 1)); + } + + exit; +} + sub cgi (;$$) { my $q=shift; my $session=shift; @@ -317,7 +364,14 @@ sub cgi (;$$) { error("\"do\" parameter missing"); } } - + + # goto is the preferred name for this; recentchanges_link and + # commenter are for compatibility with any saved URLs + if ($do eq 'goto' || $do eq 'recentchanges_link' || + $do eq 'commenter') { + cgi_goto($q); + } + # Need to lock the wiki before getting a session. lockwiki(); loadindex();