2009-07-26 17:22:56 +02:00
|
|
|
#!/usr/bin/perl
|
|
|
|
package IkiWiki::Plugin::getsource;
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
use IkiWiki;
|
|
|
|
use open qw{:utf8 :std};
|
|
|
|
|
|
|
|
sub import {
|
|
|
|
hook(type => "getsetup", id => "getsource", call => \&getsetup);
|
|
|
|
hook(type => "pagetemplate", id => "getsource", call => \&pagetemplate);
|
2009-07-26 17:33:12 +02:00
|
|
|
hook(type => "cgi", id => "getsource", call => \&cgi_getsource);
|
2009-07-26 17:22:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
sub getsetup () {
|
|
|
|
return
|
|
|
|
plugin => {
|
|
|
|
safe => 1,
|
|
|
|
rebuild => 1,
|
2010-02-12 10:22:15 +01:00
|
|
|
section => "web",
|
2009-07-26 17:22:56 +02:00
|
|
|
},
|
|
|
|
getsource_mimetype => {
|
|
|
|
type => "string",
|
2009-07-26 17:36:17 +02:00
|
|
|
example => "text/plain; charset=utf-8",
|
2009-07-26 17:22:56 +02:00
|
|
|
description => "Mime type for returned source.",
|
|
|
|
safe => 1,
|
|
|
|
rebuild => 0,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
sub pagetemplate (@) {
|
|
|
|
my %params=@_;
|
|
|
|
|
|
|
|
my $page=$params{page};
|
|
|
|
my $template=$params{template};
|
|
|
|
|
|
|
|
if (length $config{cgiurl}) {
|
|
|
|
$template->param(getsourceurl => IkiWiki::cgiurl(do => "getsource", page => $page));
|
|
|
|
$template->param(have_actions => 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-26 17:33:12 +02:00
|
|
|
sub cgi_getsource ($) {
|
2009-07-26 17:22:56 +02:00
|
|
|
my $cgi=shift;
|
|
|
|
|
2009-08-08 18:27:48 +02:00
|
|
|
return unless defined $cgi->param('do') &&
|
|
|
|
$cgi->param("do") eq "getsource";
|
2009-07-26 17:22:56 +02:00
|
|
|
|
|
|
|
IkiWiki::decode_cgi_utf8($cgi);
|
|
|
|
|
|
|
|
my $page=$cgi->param('page');
|
|
|
|
|
2009-08-08 18:27:48 +02:00
|
|
|
if (! defined $page || $page !~ /$config{wiki_file_regexp}/) {
|
|
|
|
error("invalid page parameter");
|
|
|
|
}
|
|
|
|
|
2009-08-08 18:23:50 +02:00
|
|
|
# For %pagesources.
|
2009-07-26 17:33:12 +02:00
|
|
|
IkiWiki::loadindex();
|
|
|
|
|
2009-07-26 17:59:26 +02:00
|
|
|
if (! exists $pagesources{$page}) {
|
2009-07-26 17:45:01 +02:00
|
|
|
IkiWiki::cgi_custom_failure(
|
2009-12-15 00:16:47 +01:00
|
|
|
$cgi,
|
|
|
|
"404 Not Found",
|
2011-01-05 22:15:38 +01:00
|
|
|
IkiWiki::cgitemplate($cgi, gettext("missing page"),
|
2009-07-26 17:45:01 +02:00
|
|
|
"<p>".
|
|
|
|
sprintf(gettext("The page %s does not exist."),
|
|
|
|
htmllink("", "", $page)).
|
|
|
|
"</p>"));
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
2009-07-26 17:59:26 +02:00
|
|
|
if (! defined pagetype($pagesources{$page})) {
|
2009-07-26 17:48:25 +02:00
|
|
|
IkiWiki::cgi_custom_failure(
|
|
|
|
$cgi->header(-status => "403 Forbidden"),
|
2011-01-05 22:15:38 +01:00
|
|
|
IkiWiki::cgitemplate($cgi, gettext("not a page"),
|
2009-07-26 17:48:25 +02:00
|
|
|
"<p>".
|
|
|
|
sprintf(gettext("%s is an attachment, not a page."),
|
|
|
|
htmllink("", "", $page)).
|
|
|
|
"</p>"));
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
2009-07-26 17:45:01 +02:00
|
|
|
if (! $config{getsource_mimetype}) {
|
|
|
|
$config{getsource_mimetype} = "text/plain; charset=utf-8";
|
2009-07-26 17:22:56 +02:00
|
|
|
}
|
|
|
|
|
2009-07-26 17:45:01 +02:00
|
|
|
print "Content-Type: $config{getsource_mimetype}\r\n";
|
|
|
|
print ("\r\n");
|
2009-07-27 12:58:36 +02:00
|
|
|
print readfile(srcfile($pagesources{$page}));
|
2009-07-26 17:45:01 +02:00
|
|
|
|
2009-07-26 17:22:56 +02:00
|
|
|
exit 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
1
|