2009-01-31 23:32:10 +01:00
|
|
|
#!/usr/bin/perl
|
|
|
|
# Copyright © 2009 Simon McVittie <http://smcv.pseudorandom.co.uk/>
|
|
|
|
# Licensed under the GNU GPL, version 2, or any later version published by the
|
|
|
|
# Free Software Foundation
|
2009-02-01 01:26:36 +01:00
|
|
|
package IkiWiki::Plugin::404;
|
2009-01-31 23:32:10 +01:00
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use IkiWiki 3.00;
|
|
|
|
|
|
|
|
sub import {
|
2009-02-01 01:26:36 +01:00
|
|
|
hook(type => "cgi", id => '404', call => \&cgi);
|
2009-02-01 00:01:10 +01:00
|
|
|
IkiWiki::loadplugin("goto");
|
2009-01-31 23:32:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sub getsetup () {
|
|
|
|
return
|
|
|
|
plugin => {
|
|
|
|
# not really a matter of safety, but enabling/disabling
|
|
|
|
# through a web interface is useless - it needs web
|
|
|
|
# server admin action too
|
|
|
|
safe => 0,
|
|
|
|
rebuild => 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 $cgi=shift;
|
|
|
|
|
2009-03-09 18:52:51 +01:00
|
|
|
if (exists $ENV{REDIRECT_STATUS} &&
|
|
|
|
$ENV{REDIRECT_STATUS} eq '404') {
|
2009-12-15 00:07:24 +01:00
|
|
|
my $page = cgi_page_from_404(
|
|
|
|
Encode::decode_utf8($ENV{REDIRECT_URL}),
|
2009-01-31 23:32:10 +01:00
|
|
|
$config{url}, $config{usedirs});
|
2009-02-01 00:01:10 +01:00
|
|
|
IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
|
2009-01-31 23:32:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|