2024-06-20 14:10:42 +00:00
< ? php
/*
* This file is part of Twig .
*
* ( c ) Fabien Potencier
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Twig\TokenParser ;
use Twig\Error\SyntaxError ;
use Twig\Node\IncludeNode ;
use Twig\Node\Node ;
use Twig\Node\SandboxNode ;
use Twig\Node\TextNode ;
use Twig\Token ;
/**
* Marks a section of a template as untrusted code that must be evaluated in the sandbox mode .
*
* { % sandbox % }
2025-01-13 09:56:01 +00:00
* { % include 'user.html.twig' % }
2024-06-20 14:10:42 +00:00
* { % endsandbox % }
*
* @ see https :// twig . symfony . com / doc / api . html #sandbox-extension for details
*
* @ internal
*/
final class SandboxTokenParser extends AbstractTokenParser
{
public function parse ( Token $token ) : Node
{
$stream = $this -> parser -> getStream ();
2025-01-13 09:56:01 +00:00
trigger_deprecation ( 'twig/twig' , '3.15' , \sprintf ( 'The "sandbox" tag is deprecated in "%s" at line %d.' , $stream -> getSourceContext () -> getName (), $token -> getLine ()));
$stream -> expect ( Token :: BLOCK_END_TYPE );
2024-06-20 14:10:42 +00:00
$body = $this -> parser -> subparse ([ $this , 'decideBlockEnd' ], true );
2025-01-13 09:56:01 +00:00
$stream -> expect ( Token :: BLOCK_END_TYPE );
2024-06-20 14:10:42 +00:00
// in a sandbox tag, only include tags are allowed
if ( ! $body instanceof IncludeNode ) {
foreach ( $body as $node ) {
if ( $node instanceof TextNode && ctype_space ( $node -> getAttribute ( 'data' ))) {
continue ;
}
if ( ! $node instanceof IncludeNode ) {
throw new SyntaxError ( 'Only "include" tags are allowed within a "sandbox" section.' , $node -> getTemplateLine (), $stream -> getSourceContext ());
}
}
}
2025-01-13 09:56:01 +00:00
return new SandboxNode ( $body , $token -> getLine ());
2024-06-20 14:10:42 +00:00
}
public function decideBlockEnd ( Token $token ) : bool
{
return $token -> test ( 'endsandbox' );
}
public function getTag () : string
{
return 'sandbox' ;
}
}