/usr/share/perl5/Text/MicroMason/TemplatePath.pm is in libtext-micromason-perl 2.21-1.
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | package Text::MicroMason::TemplatePath;
use strict;
use File::Spec;
use base 'Text::MicroMason::TemplateDir';
######################################################################
sub resolve_path {
my ($self, $src_data) = @_;
# Absolute file path: use that filename.
return $src_data if File::Spec->file_name_is_absolute($src_data);
# Relative filename: use a path search
# Our path for this file will be the current directory, if there is
# one, followed by the configured path.
my @path = @{$self->{template_path}};
my $current = $self->{source_file};
unshift @path, $current if $current;
# Check path for an existing template file.
foreach my $dir (@path) {
my $fn = File::Spec->canonpath(File::Spec->catfile($dir, $src_data));
next unless -e $fn;
return $fn;
}
# We couldn't find a matching template, croak.
$self->croak_msg("Text::MicroMason::TemplatePath: template '$src_data' not found in path.\n");
}
# $contents = $mason->read_file( $filename );
sub read_file {
my ( $self, $file ) = @_;
if ( my $root = $self->{strict_root} ) {
my $path = File::Spec->canonpath( $file );
# warn "Checking for '$root' in '$path'\n";
( $path =~ /\A\Q$root\E(\/|(?<=\/))(?!\.\.)/ )
or $self->croak_msg("Text::MicroMason::TemplatePath: Template not in required base path '$root'");
}
return $self->NEXT('read_file', $file );
}
sub cache_key {
my $self = shift;
my ($src_type, $src_data, %options) = @_;
return $self->NEXT('cache_key', @_) unless $src_type eq 'file';
return $self->resolve_path($src_data);
}
######################################################################
1;
######################################################################
=head1 NAME
Text::MicroMason::TemplatePath - Template Path Searching
=head1 SYNOPSIS
Instead of using this class directly, pass its name to be mixed in:
use Text::MicroMason;
my $mason = Text::MicroMason->new( -TemplatePath, template_path => [ '/foo', '/bar' ] );
Use the standard compile and execute methods to parse and evaluate templates:
print $mason->compile( file=>$filepath )->( 'name'=>'Dave' );
print $mason->execute( file=>$filepath, 'name'=>'Dave' );
Templates stored in files are searched for in the specified template_path:
print $mason->execute( file=>"includes/greeting.msn", 'name'=>'Charles');
When including other files into a template you can use relative paths:
<& ../includes/greeting.msn, name => 'Alice' &>
When a file is included in the template, the including template's
current directory is added to the beginning of the template search path.
=head1 DESCRIPTION
This module works similarly to the related TemplateDir mix-in. However,
instead of specifying a single root which must contain all templates,
TemplatePath allows you to specify an arrayref of directories which will
be searched in order whenever a template filename must be resolved.
Using a TemplatePath object, absolute filenames are used as-is. If a
relative template filenames or file paths is used, every directory in
the specified template_path is checked for the existence of the
template, and the first existing template file is used.
If a template includes another template using <& ... &>, then the
including template's location is added to the beginning of the template
search path list, for the resolution of the included template's
filename. This allows the included template to be specified relative to
the including template, but also lets the template search fall back to
the configured template search path if necessary.
=head2 Supported Attributes
=over 4
=item template_path
An array ref containing a list of directories in which to search for
relative template filenames.
=item strict_root
Optional directory beyond which not to read files. Unlike TemplateDir,
this must be a specific file path. Causes read_file to croak if any
filename outside of the root is provided. You should make sure that all
paths specified in template_path are inside the specified strict_root.
(Note that this is not a chroot jail and only affects attempts to load a
file as a template; for greater security see the chroot() builtin and
L<Text::MicroMason::Safe>.)
=back
=head2 Private Methods
=over 4
=item read_file
Intercepts file access to check for strict_root.
=back
=head2 EXCEPTIONS
The following additional exceptions are generated by
Text::MicroMason::TemplatePath when appropriate:
=over 4
=item *
Text::MicroMason::TemplatePath: template '%s' not found in path.
This indicates that the specified template name does not exist in any of
the directories in the configured path.
=item *
Text::MicroMason::TemplatePath: Template not in required base path '%s'
The template found in the configured template path was not within the
configured strict_root directory. This may be caused by requesting an
absolute template filename not within strict_root, or by specifying a
strict_root which does not match the configured template path.
=back
=head1 SEE ALSO
For an overview of this templating framework, see L<Text::MicroMason>.
This is a mixin class intended for use with L<Text::MicroMason::Base>.
For distribution, installation, support, copyright and license
information, see L<Text::MicroMason::Docs::ReadMe>.
=cut
|