fix duplicate call of methods if using sandbox
authornikic <+@ni-po.com>
Thu, 17 Mar 2011 17:26:29 +0000 (18:26 +0100)
committernikic <+@ni-po.com>
Thu, 17 Mar 2011 17:27:08 +0000 (18:27 +0100)
lib/Twig/Extension/Sandbox.php
lib/Twig/Node/SandboxedPrint.php
test/Twig/Tests/Node/SandboxedPrintTest.php

index c5cbbbf..bf76c11 100644 (file)
@@ -91,6 +91,15 @@ class Twig_Extension_Sandbox extends Twig_Extension
         }
     }
 
+    public function ensureToStringAllowed($obj)
+    {
+        if (is_object($obj)) {
+            $this->policy->checkMethodAllowed($obj, '__toString');
+        }
+
+        return $obj;
+    }
+
     /**
      * Returns the name of the extension.
      *
index 619ff99..fe374a7 100644 (file)
@@ -36,18 +36,10 @@ class Twig_Node_SandboxedPrint extends Twig_Node_Print
     {
         $compiler
             ->addDebugInfo($this)
-            ->write('if (is_object(')
-            ->raw('$_tmp = ')
-            ->subcompile($this->removeNodeFilter($this->getNode('expr')))
-            ->raw(')) {'."\n")
-            ->indent()
-            ->write('$this->env->getExtension(\'sandbox\')->checkMethodAllowed(')
-            ->raw('$_tmp, \'__toString\');'."\n")
-            ->outdent()
-            ->write('}'."\n")
+            ->write('echo $this->env->getExtension(\'sandbox\')->ensureToStringAllowed(')
+            ->subcompile($this->getNode('expr'))
+            ->raw(");\n")
         ;
-
-        parent::compile($compiler);
     }
 
     /**
index 6e30241..85adddf 100644 (file)
@@ -37,10 +37,7 @@ class Twig_Tests_Node_SandboxedPrintTest extends Twig_Tests_Node_TestCase
         $tests = array();
 
         $tests[] = array(new Twig_Node_SandboxedPrint(new Twig_Node_Expression_Constant('foo', 0), 0), <<<EOF
-if (is_object(\$_tmp = "foo")) {
-    \$this->env->getExtension('sandbox')->checkMethodAllowed(\$_tmp, '__toString');
-}
-echo "foo";
+echo \$this->env->getExtension('sandbox')->ensureToStringAllowed("foo");
 EOF
         );