fixed sandbox mode when used with inheritance (closes #656)
authorFabien Potencier <fabien.potencier@gmail.com>
Sat, 17 Mar 2012 12:51:26 +0000 (13:51 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sat, 17 Mar 2012 16:11:40 +0000 (17:11 +0100)
The checkSecurity() method must be called by each template as we are not
using inheritance.

CHANGELOG
lib/Twig/Node/SandboxedModule.php
test/Twig/Tests/Extension/SandboxTest.php
test/Twig/Tests/Node/SandboxedModuleTest.php

index 735dd68..536ec25 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.7.0 (2012-XX-XX)
 
+ * fixed sandbox mode when used with inheritance
  * added preserveKeys support for the slice filter
  * fixed the date filter when a DateTime instance is passed with a specific timezone
  * added a trim filter
index 36d9f19..655efa3 100644 (file)
@@ -33,9 +33,7 @@ class Twig_Node_SandboxedModule extends Twig_Node_Module
 
     protected function compileDisplayBody(Twig_Compiler $compiler)
     {
-        if (null === $this->getNode('parent')) {
-            $compiler->write("\$this->checkSecurity();\n");
-        }
+        $compiler->write("\$this->checkSecurity();\n");
 
         parent::compileDisplayBody($compiler);
     }
@@ -54,16 +52,6 @@ class Twig_Node_SandboxedModule extends Twig_Node_Module
             ->write(!$this->usedFunctions ? "array()\n" : "array('".implode('\', \'', $this->usedFunctions)."')\n")
             ->outdent()
             ->write(");\n")
-        ;
-
-        if (null !== $this->getNode('parent')) {
-            $compiler
-                ->raw("\n")
-                ->write("\$this->parent->checkSecurity();\n")
-            ;
-        }
-
-        $compiler
             ->outdent()
             ->write("}\n\n")
         ;
index f2b4b03..abb7aa7 100644 (file)
@@ -31,9 +31,21 @@ class Twig_Tests_Extension_SandboxTest extends PHPUnit_Framework_TestCase
             '1_basic7' => '{{ cycle(["foo","bar"], 1) }}',
             '1_basic8' => '{{ obj.getfoobar }}{{ obj.getFooBar }}',
             '1_basic'  => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
+            '1_layout' => '{% block content %}{% endblock %}',
+            '1_child'  => '{% extends "1_layout" %}{% block content %}{{ "a"|json_encode }}{% endblock %}',
         );
     }
 
+    /**
+     * @expectedException        Twig_Sandbox_SecurityError
+     * @expectedExceptionMessage Filter "json_encode" is not allowed.
+     */
+    public function testSandboxWithInheritance()
+    {
+        $twig = $this->getEnvironment(true, array(), self::$templates, array('block'));
+        $twig->loadTemplate('1_child')->render(array());
+    }
+
     public function testSandboxGloballySet()
     {
         $twig = $this->getEnvironment(false, array(), self::$templates);
index a24857b..f1966be 100644 (file)
@@ -113,6 +113,7 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
 
     protected function doDisplay(array \$context, array \$blocks = array())
     {
+        \$this->checkSecurity();
         \$this->getParent(\$context)->display(\$context, array_merge(\$this->blocks, \$blocks));
     }
 
@@ -122,8 +123,6 @@ class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
             array('for'),
             array('cycle')
         );
-
-        \$this->parent->checkSecurity();
     }
 
     public function getTemplateName()