From c2dafcb4e5e8c9f654c0ad5719607366cf84b75a Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 14:36:23 +0000 Subject: CGI: add cgi_goto(CGI, [page]) This redirects to the given page (or if none is given, the page parameter given to the CGI), or displays an error with a create link if the page doesn't exist. --- IkiWiki/CGI.pm | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 3fadc462e..a6b485edb 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -291,6 +291,47 @@ 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 "Content-type: text/html\n\n"; + print misctemplate(gettext("missing page"), + "

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

"); + } + else { + redirect($q, urlto($link, undef, 1)); + } + + exit; +} + sub cgi (;$$) { my $q=shift; my $session=shift; -- cgit v1.2.3 From 18f4aeffb1841f8b455a5e31811695102262a06a Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 14:48:44 +0000 Subject: CGI: if the "do" parameter is goto, recentchanges_link or commenter, redirect to a page This can replace equivalent functionality in comments and recentchanges. --- IkiWiki/CGI.pm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index a6b485edb..949390e68 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -358,7 +358,12 @@ sub cgi (;$$) { error("\"do\" parameter missing"); } } - + + 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(); -- cgit v1.2.3 From 5ce3a0130030f3b07e163727f16d212b2fda6259 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 15:05:17 +0000 Subject: CGI: document why commenter and recentchanges_link are supported --- IkiWiki/CGI.pm | 2 ++ 1 file changed, 2 insertions(+) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 949390e68..f23d44fd6 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -359,6 +359,8 @@ sub cgi (;$$) { } } + # 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); -- cgit v1.2.3 From 78d1b2340eeacdad7bcccb9c7fa450ac47728341 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 16:51:13 +0000 Subject: CGI: if the page is missing, give the "missing page" a 404 status --- IkiWiki/CGI.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index f23d44fd6..fe8457262 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -318,7 +318,7 @@ sub cgi_goto ($;$) { my $link = bestlink("", $page); if (! length $link) { - print "Content-type: text/html\n\n"; + print $q->header(-status => "404 Not Found"); print misctemplate(gettext("missing page"), "

". sprintf(gettext("The page %s does not exist."), -- cgit v1.2.3 From 8322b8c9c82941c4052bcc8a0d1824a92d6426a0 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 18:07:42 +0000 Subject: CGI: add cgi_page_from_404(), which remaps a path like $REDIRECT_URL to an IkiWiki page name Also add a regression test --- IkiWiki/CGI.pm | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index fe8457262..82cad40c8 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -332,6 +332,46 @@ sub cgi_goto ($;$) { exit; } +sub cgi_page_from_404 ($$$) { + my $path = shift; + my $baseurl = shift; + my $usedirs = shift; + + # fail if missing from environment or whatever + return undef unless defined $path; + return undef unless defined $baseurl; + + # with usedirs on, path is like /~fred/foo/bar/ or /~fred/foo/bar or + # /~fred/foo/bar/index.html + # with usedirs off, path is like /~fred/foo/bar.html + # baseurl is like 'http://people.example.com/~fred' + + # convert baseurl to ~fred + unless ($baseurl =~ s{^https?://[^/]+/?}{}) { + return undef; + } + + # convert path to /~fred/foo/bar + if ($usedirs) { + $path =~ s/\/*(?:index\.$config{htmlext})?$//; + } + else { + $path =~ s/\.$config{htmlext}$//; + } + + # remove /~fred/ + unless ($path =~ s{^/*\Q$baseurl\E/*}{}) { + return undef; + } + + # special case for the index + unless ($path) { + return 'index'; + } + + return $path; +} + sub cgi (;$$) { my $q=shift; my $session=shift; -- cgit v1.2.3 From 170b86a2efb1908355f5812eaa3f3de4a2dcaa49 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 18:09:24 +0000 Subject: CGI: set up goto hook so that /ikiwiki.cgi?do=goto can be an Apache ErrorDocument --- IkiWiki/CGI.pm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 82cad40c8..7e968d966 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -403,7 +403,14 @@ sub cgi (;$$) { # commenter are for compatibility with any saved URLs if ($do eq 'goto' || $do eq 'recentchanges_link' || $do eq 'commenter') { - cgi_goto($q); + my $page = undef; + + if ($ENV{REDIRECT_STATUS} eq '404') { + $page = cgi_page_from_404($ENV{REDIRECT_URL}, + $config{url}, $config{usedirs}); + } + + cgi_goto($q, $page); } # Need to lock the wiki before getting a session. -- cgit v1.2.3 From dedbe110f27e77051c8e49e0a53b8cdd148dd752 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 18:26:37 +0000 Subject: CGI: pad error responses with 512 bytes of spaces so IE will display them IE displays its own error responses unless the server's was >= 512 bytes. http://support.microsoft.com/default.aspx?scid=kb;en-us;Q294807 --- IkiWiki/CGI.pm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 7e968d966..8734cdd49 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; } @@ -323,7 +326,10 @@ sub cgi_goto ($;$) { "

". 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)); -- cgit v1.2.3 From 46b880f8390ac82d746add01de38a05155743374 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 22:32:10 +0000 Subject: Split apache404 into an independent plugin Also make it ignore the 'do' parameter at Joey's suggestion, to have one less thing to remember when configuring. --- IkiWiki/CGI.pm | 49 +------------------------------------------------ 1 file changed, 1 insertion(+), 48 deletions(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 8734cdd49..e75ebcd27 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -338,46 +338,6 @@ sub cgi_goto ($;$) { exit; } -sub cgi_page_from_404 ($$$) { - my $path = shift; - my $baseurl = shift; - my $usedirs = shift; - - # fail if missing from environment or whatever - return undef unless defined $path; - return undef unless defined $baseurl; - - # with usedirs on, path is like /~fred/foo/bar/ or /~fred/foo/bar or - # /~fred/foo/bar/index.html - # with usedirs off, path is like /~fred/foo/bar.html - # baseurl is like 'http://people.example.com/~fred' - - # convert baseurl to ~fred - unless ($baseurl =~ s{^https?://[^/]+/?}{}) { - return undef; - } - - # convert path to /~fred/foo/bar - if ($usedirs) { - $path =~ s/\/*(?:index\.$config{htmlext})?$//; - } - else { - $path =~ s/\.$config{htmlext}$//; - } - - # remove /~fred/ - unless ($path =~ s{^/*\Q$baseurl\E/*}{}) { - return undef; - } - - # special case for the index - unless ($path) { - return 'index'; - } - - return $path; -} - sub cgi (;$$) { my $q=shift; my $session=shift; @@ -409,14 +369,7 @@ sub cgi (;$$) { # commenter are for compatibility with any saved URLs if ($do eq 'goto' || $do eq 'recentchanges_link' || $do eq 'commenter') { - my $page = undef; - - if ($ENV{REDIRECT_STATUS} eq '404') { - $page = cgi_page_from_404($ENV{REDIRECT_URL}, - $config{url}, $config{usedirs}); - } - - cgi_goto($q, $page); + cgi_goto($q); } # Need to lock the wiki before getting a session. -- cgit v1.2.3 From c886bea32084a920f3ba26b3f96327681f5db917 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Sat, 31 Jan 2009 23:01:10 +0000 Subject: Split cgi_goto into a goto plugin --- IkiWiki/CGI.pm | 51 --------------------------------------------------- 1 file changed, 51 deletions(-) (limited to 'IkiWiki/CGI.pm') diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index e75ebcd27..c91914564 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -294,50 +294,6 @@ 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; @@ -365,13 +321,6 @@ sub cgi (;$$) { } } - # 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(); -- cgit v1.2.3