X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/01e4cb1464d07afb22d22bf98116a3ed9126612b..6223b697b4a75e0162878e8181b5df3184c7a0a3:/IkiWiki/Plugin/getsource.pm diff --git a/IkiWiki/Plugin/getsource.pm b/IkiWiki/Plugin/getsource.pm index 4e74eaea0..0a21413bd 100644 --- a/IkiWiki/Plugin/getsource.pm +++ b/IkiWiki/Plugin/getsource.pm @@ -9,7 +9,7 @@ use open qw{:utf8 :std}; sub import { hook(type => "getsetup", id => "getsource", call => \&getsetup); hook(type => "pagetemplate", id => "getsource", call => \&pagetemplate); - hook(type => "sessioncgi", id => "getsource", call => \&cgi_getsource); + hook(type => "cgi", id => "getsource", call => \&cgi_getsource); } sub getsetup () { @@ -17,10 +17,11 @@ sub getsetup () { plugin => { safe => 1, rebuild => 1, + section => "web", }, getsource_mimetype => { type => "string", - example => "application/octet-stream", + example => "text/plain; charset=utf-8", description => "Mime type for returned source.", safe => 1, rebuild => 0, @@ -39,39 +40,53 @@ sub pagetemplate (@) { } } -sub cgi_getsource ($$) { +sub cgi_getsource ($) { my $cgi=shift; - my $session=shift; - # Note: we use sessioncgi rather than just cgi - # because we need $IkiWiki::pagesources{} to be - # populated. - - return unless (defined $cgi->param('do') && - $cgi->param("do") eq "getsource"); + return unless defined $cgi->param('do') && + $cgi->param("do") eq "getsource"; IkiWiki::decode_cgi_utf8($cgi); my $page=$cgi->param('page'); - if ($IkiWiki::pagesources{$page}) { - - my $data = IkiWiki::readfile(IkiWiki::srcfile($IkiWiki::pagesources{$page})); - - if (! $config{getsource_mimetype}) { - $config{getsource_mimetype} = "text/plain"; - } - - print "Content-Type: $config{getsource_mimetype}\r\n"; - - print ("\r\n"); - - print $data; - - exit 0; + if (! defined $page || $page !~ /$config{wiki_file_regexp}/) { + error("invalid page parameter"); } - - error("Unable to find page source for page: $page"); + + # For %pagesources. + IkiWiki::loadindex(); + + if (! exists $pagesources{$page}) { + IkiWiki::cgi_custom_failure( + $cgi, + "404 Not Found", + IkiWiki::cgitemplate($cgi, gettext("missing page"), + "
". + sprintf(gettext("The page %s does not exist."), + htmllink("", "", $page)). + "
")); + exit; + } + + if (! defined pagetype($pagesources{$page})) { + IkiWiki::cgi_custom_failure( + $cgi->header(-status => "403 Forbidden"), + IkiWiki::cgitemplate($cgi, gettext("not a page"), + "". + sprintf(gettext("%s is an attachment, not a page."), + htmllink("", "", $page)). + "
")); + exit; + } + + if (! $config{getsource_mimetype}) { + $config{getsource_mimetype} = "text/plain; charset=utf-8"; + } + + print "Content-Type: $config{getsource_mimetype}\r\n"; + print ("\r\n"); + print readfile(srcfile($pagesources{$page})); exit 0; }