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