#!/usr/bin/perl -wT # Taint flag breaks template for-loop parsing: # https://rt.cpan.org/Public/Bug/Display.html?id=61359 use strict; use Test::More; use Text::Xslate; use Scalar::Util qw(tainted); use lib '.'; use t::lib::Util; my $dataset = { scalar_variable => 'twinkle twinkle little scalar', hash_variable => { 'hash_value_key' => 'ha-ha-ha-hash', }, array_variable => [ qw/this is an array/ ], this => { is => { a => { very => { deep => { hash => { structure => "scraping the bottom of the hashref", } } } } } }, template_if_true => 'yay', template_if_false => 'nope', array_loop => [ qw/do ray me so fah/ ], hash_loop => { animal => 'camel', mineral => 'lignite', vegetable => 'ew', }, records_loop => [ { name => 'Larry Nomates', age => 43, }, ], variable_if => 0, variable_if_else => 1, variable_expression_a => 200, variable_expression_b => 100, variable_function_arg => 'BzzZZzzZZzzZZzzZZ', }; my $gold = do { local $/; }; my $t = Text::Xslate->new( path => [path], cache => 0, function => { substr => sub { substr( $_[ 0 ], $_[ 1 ], $_[ 2 ] ) }, }, warn_handler => sub { die @_ }, ); my $s = $t->render( 'taint.tx', $dataset ); ok !tainted($s), 'not tainted'; is $s, $gold; # taint $gold foreach my $value(values %{$dataset}) { $value .= substr($^X, 0, 0) if not ref($value); } is $t->render( 'taint.tx', $dataset ), $gold; done_testing; __END__ foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo twinkle twinkle little scalar ha-ha-ha-hash an scraping the bottom of the hashref doraymesofah animal: camel mineral: lignite vegetable: ew Larry Nomates: 43 do ray me so fah animal: camel mineral: lignite vegetable: ew Larry Nomates: 43 true true true yay yay yay 22 20000 201 substring Zz