|
Packit |
c4476c |
#!perl -T
|
|
Packit |
c4476c |
# Tests for taint-mode features
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
use lib 'blib/lib';
|
|
Packit |
c4476c |
use Text::Template;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
die "This is the test program for Text::Template version 1.46.
|
|
Packit |
c4476c |
You are using version $Text::Template::VERSION instead.
|
|
Packit |
c4476c |
That does not make sense.\n
|
|
Packit |
c4476c |
Aborting"
|
|
Packit |
c4476c |
unless $Text::Template::VERSION == 1.46;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
my $r = int(rand(10000));
|
|
Packit |
c4476c |
my $file = "tt$r";
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# makes its arguments tainted
|
|
Packit |
c4476c |
sub taint {
|
|
Packit |
c4476c |
for (@_) {
|
|
Packit |
c4476c |
$_ .= substr($0,0,0); # LOD
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
print "1..21\n";
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
my $n =1;
|
|
Packit |
c4476c |
print "ok ", $n++, "\n";
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
my $template = 'The value of $n is {$n}.';
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
open T, "> $file" or die "Couldn't write temporary file $file: $!";
|
|
Packit |
c4476c |
print T $template, "\n";
|
|
Packit |
c4476c |
close T or die "Couldn't finish temporary file $file: $!";
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
sub should_fail {
|
|
Packit |
c4476c |
my $obj = Text::Template->new(@_);
|
|
Packit |
c4476c |
eval {$obj->fill_in()};
|
|
Packit |
c4476c |
if ($@) {
|
|
Packit |
c4476c |
print "ok $n # $@\n";
|
|
Packit |
c4476c |
} else {
|
|
Packit |
c4476c |
print "not ok $n # (didn't fail)\n";
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
$n++;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
sub should_work {
|
|
Packit |
c4476c |
my $obj = Text::Template->new(@_);
|
|
Packit |
c4476c |
eval {$obj->fill_in()};
|
|
Packit |
c4476c |
if ($@) {
|
|
Packit |
c4476c |
print "not ok $n # $@\n";
|
|
Packit |
c4476c |
} else {
|
|
Packit |
c4476c |
print "ok $n\n";
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
$n++;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
sub should_be_tainted {
|
|
Packit |
c4476c |
if (Text::Template::_is_clean($_[0])) {
|
|
Packit |
c4476c |
print "not ok $n\n"; $n++; return;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
print "ok $n\n"; $n++; return;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
sub should_be_clean {
|
|
Packit |
c4476c |
unless (Text::Template::_is_clean($_[0])) {
|
|
Packit |
c4476c |
print "not ok $n\n"; $n++; return;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
print "ok $n\n"; $n++; return;
|
|
Packit |
c4476c |
}
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# Tainted filename should die with and without UNTAINT option
|
|
Packit |
c4476c |
# untainted filename should die without UNTAINT option
|
|
Packit |
c4476c |
# filehandle should die without UNTAINT option
|
|
Packit |
c4476c |
# string and array with tainted data should die either way
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# (2)-(7)
|
|
Packit |
c4476c |
my $tfile = $file;
|
|
Packit |
c4476c |
taint($tfile);
|
|
Packit |
c4476c |
should_be_tainted($tfile);
|
|
Packit |
c4476c |
should_be_clean($file);
|
|
Packit |
c4476c |
should_fail TYPE => 'file', SOURCE => $tfile;
|
|
Packit |
c4476c |
should_fail TYPE => 'file', SOURCE => $tfile, UNTAINT => 1;
|
|
Packit |
c4476c |
should_fail TYPE => 'file', SOURCE => $file;
|
|
Packit |
c4476c |
should_work TYPE => 'file', SOURCE => $file, UNTAINT => 1;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# (8-9)
|
|
Packit |
c4476c |
open H, "< $file" or die "Couldn't open $file for reading: $!; aborting";
|
|
Packit |
c4476c |
should_fail TYPE => 'filehandle', SOURCE => \*H;
|
|
Packit |
c4476c |
close H;
|
|
Packit |
c4476c |
open H, "< $file" or die "Couldn't open $file for reading: $!; aborting";
|
|
Packit |
c4476c |
should_work TYPE => 'filehandle', SOURCE => \*H, UNTAINT => 1;
|
|
Packit |
c4476c |
close H;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# (10-15)
|
|
Packit |
c4476c |
my $ttemplate = $template;
|
|
Packit |
c4476c |
taint($ttemplate);
|
|
Packit |
c4476c |
should_be_tainted($ttemplate);
|
|
Packit |
c4476c |
should_be_clean($template);
|
|
Packit |
c4476c |
should_fail TYPE => 'string', SOURCE => $ttemplate;
|
|
Packit |
c4476c |
should_fail TYPE => 'string', SOURCE => $ttemplate, UNTAINT => 1;
|
|
Packit |
c4476c |
should_work TYPE => 'string', SOURCE => $template;
|
|
Packit |
c4476c |
should_work TYPE => 'string', SOURCE => $template, UNTAINT => 1;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# (16-19)
|
|
Packit |
c4476c |
my $array = [ $template ];
|
|
Packit |
c4476c |
my $tarray = [ $ttemplate ];
|
|
Packit |
c4476c |
should_fail TYPE => 'array', SOURCE => $tarray;
|
|
Packit |
c4476c |
should_fail TYPE => 'array', SOURCE => $tarray, UNTAINT => 1;
|
|
Packit |
c4476c |
should_work TYPE => 'array', SOURCE => $array;
|
|
Packit |
c4476c |
should_work TYPE => 'array', SOURCE => $array, UNTAINT => 1;
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
# (20-21) Test _unconditionally_untaint utility function
|
|
Packit |
c4476c |
Text::Template::_unconditionally_untaint($ttemplate);
|
|
Packit |
c4476c |
should_be_clean($ttemplate);
|
|
Packit |
c4476c |
Text::Template::_unconditionally_untaint($tfile);
|
|
Packit |
c4476c |
should_be_clean($tfile);
|
|
Packit |
c4476c |
|
|
Packit |
c4476c |
END { unlink $file }
|
|
Packit |
c4476c |
|