/usr/share/perl5/IkiWiki/Plugin/404.pm is in ikiwiki 3.20120202ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #!/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
package IkiWiki::Plugin::404;
use warnings;
use strict;
use IkiWiki 3.00;
sub import {
hook(type => "cgi", id => '404', call => \&cgi);
hook(type => "getsetup", id => '404', call => \&getsetup);
IkiWiki::loadplugin("goto");
}
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,
section => "web",
}
}
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;
if (exists $ENV{REDIRECT_STATUS} &&
$ENV{REDIRECT_STATUS} eq '404') {
my $page = cgi_page_from_404(
Encode::decode_utf8($ENV{REDIRECT_URL}),
$config{url}, $config{usedirs});
IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
}
}
1;
|