sub template_file ($) {
my $name=shift;
- my $tpage="templates/$name";
+ my $tpage=($name =~ s/^\///) ? $name : "templates/$name";
if ($name !~ /\.tmpl$/ && exists $pagesources{$tpage}) {
$tpage=$pagesources{$tpage};
$name.=".tmpl";
}
my $template=srcfile($tpage, 1);
- if (defined $template) {
+ if (! defined $template) {
+ $name=~s:/::; # avoid path traversal
+ foreach my $dir ($config{templatedir},
+ "$installdir/share/ikiwiki/templates") {
+ if (-e "$dir/$name") {
+ $template="$dir/$name";
+ last;
+ }
+ }
+ }
+
+ if (defined $template) {
return $template, $tpage if wantarray;
return $template;
}
-
- foreach my $dir ($config{templatedir},
- "$installdir/share/ikiwiki/templates") {
- return "$dir/$name" if -e "$dir/$name";
- }
return;
}
return unless defined $filename;
- require HTML::Template;
- return HTML::Template->new(
+ my @opts=(
filter => sub {
my $text_ref = shift;
${$text_ref} = decode_utf8(${$text_ref});
@_,
no_includes => 1,
);
+ return @opts if wantarray;
+
+ require HTML::Template;
+ return HTML::Template->new(@opts);
}
sub template ($;@) {
my $title=shift;
my $pagebody=shift;
- my $template=template("misc.tmpl",
+ my $template=template("misc.tmpl");
+ $template->param(
title => $title,
indexlink => indexlink(),
wikiname => $config{wikiname},