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