Twig_NodeVisitor_Sandbox implements sandboxing.
@package twig @author Fabien Potencier <fabien@symfony.com>
Expanded class hierarchy of Twig_NodeVisitor_Sandbox
class Twig_NodeVisitor_Sandbox implements Twig_NodeVisitorInterface {
protected $inAModule = false;
protected $tags;
protected $filters;
protected $functions;
/**
* Called before child nodes are visited.
*
* @param Twig_NodeInterface $node The node to visit
* @param Twig_Environment $env The Twig environment instance
*
* @return Twig_NodeInterface The modified node
*/
public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) {
// in a sandbox tag, only include tags are allowed
if ($node instanceof Twig_Node_Sandbox && !$node
->getNode('body') instanceof Twig_Node_Include) {
foreach ($node
->getNode('body') as $n) {
if ($n instanceof Twig_Node_Text && ctype_space($n
->getAttribute('data'))) {
continue;
}
if (!$n instanceof Twig_Node_Include) {
throw new Twig_Error_Syntax('Only "include" tags are allowed within a "sandbox" section', $n
->getLine());
}
}
}
if ($node instanceof Twig_Node_Module) {
$this->inAModule = true;
$this->tags = array();
$this->filters = array();
$this->functions = array();
return $node;
}
elseif ($this->inAModule) {
// look for tags
if ($node
->getNodeTag()) {
$this->tags[] = $node
->getNodeTag();
}
// look for filters
if ($node instanceof Twig_Node_Expression_Filter) {
$this->filters[] = $node
->getNode('filter')
->getAttribute('value');
}
// look for functions
if ($node instanceof Twig_Node_Expression_Function) {
$this->functions[] = $node
->getAttribute('name');
}
// wrap print to check __toString() calls
if ($node instanceof Twig_Node_Print) {
return new Twig_Node_SandboxedPrint($node
->getNode('expr'), $node
->getLine(), $node
->getNodeTag());
}
}
return $node;
}
/**
* Called after child nodes are visited.
*
* @param Twig_NodeInterface $node The node to visit
* @param Twig_Environment $env The Twig environment instance
*
* @return Twig_NodeInterface The modified node
*/
public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) {
if ($node instanceof Twig_Node_Module) {
$this->inAModule = false;
return new Twig_Node_SandboxedModule($node, array_unique($this->filters), array_unique($this->tags), array_unique($this->functions));
}
return $node;
}
/**
* {@inheritdoc}
*/
public function getPriority() {
return 0;
}
}
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
Twig_NodeVisitor_Sandbox:: |
protected | property | ||
Twig_NodeVisitor_Sandbox:: |
protected | property | ||
Twig_NodeVisitor_Sandbox:: |
protected | property | ||
Twig_NodeVisitor_Sandbox:: |
protected | property | ||
Twig_NodeVisitor_Sandbox:: |
public | function |
Called before child nodes are visited. Overrides Twig_NodeVisitorInterface:: |
|
Twig_NodeVisitor_Sandbox:: |
public | function |
Returns the priority for this visitor. Overrides Twig_NodeVisitorInterface:: |
|
Twig_NodeVisitor_Sandbox:: |
public | function |
Called after child nodes are visited. Overrides Twig_NodeVisitorInterface:: |