Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

SafeAnalysis.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 4.35 KiB


 001  <?php
 002   
 003  class Twig_NodeVisitor_SafeAnalysis implements Twig_NodeVisitorInterface
 004  {
 005      protected $data = array();
 006      protected $safeVars = array();
 007   
 008      public function setSafeVars($safeVars)
 009      {
 010          $this->safeVars = $safeVars;
 011      }
 012   
 013      public function getSafe(Twig_NodeInterface $node)
 014      {
 015          $hash = spl_object_hash($node);
 016          if (isset($this->data[$hash])) {
 017              foreach ($this->data[$hash] as $bucket) {
 018                  if ($bucket['key'] === $node) {
 019                      return $bucket['value'];
 020                  }
 021              }
 022          }
 023      }
 024   
 025      protected function setSafe(Twig_NodeInterface $node, array $safe)
 026      {
 027          $hash = spl_object_hash($node);
 028          if (isset($this->data[$hash])) {
 029              foreach ($this->data[$hash] as &$bucket) {
 030                  if ($bucket['key'] === $node) {
 031                      $bucket['value'] = $safe;
 032   
 033                      return;
 034                  }
 035              }
 036          }
 037          $this->data[$hash][] = array(
 038              'key' => $node,
 039              'value' => $safe,
 040          );
 041      }
 042   
 043      public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
 044      {
 045          return $node;
 046      }
 047   
 048      public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
 049      {
 050          if ($node instanceof Twig_Node_Expression_Constant) {
 051              // constants are marked safe for all
 052              $this->setSafe($node, array('all'));
 053          } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
 054              // blocks are safe by definition
 055              $this->setSafe($node, array('all'));
 056          } elseif ($node instanceof Twig_Node_Expression_Parent) {
 057              // parent block is safe by definition
 058              $this->setSafe($node, array('all'));
 059          } elseif ($node instanceof Twig_Node_Expression_Conditional) {
 060              // intersect safeness of both operands
 061              $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
 062              $this->setSafe($node, $safe);
 063          } elseif ($node instanceof Twig_Node_Expression_Filter) {
 064              // filter expression is safe when the filter is safe
 065              $name = $node->getNode('filter')->getAttribute('value');
 066              $args = $node->getNode('arguments');
 067              if (false !== $filter = $env->getFilter($name)) {
 068                  $safe = $filter->getSafe($args);
 069                  if (null === $safe) {
 070                      $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
 071                  }
 072                  $this->setSafe($node, $safe);
 073              } else {
 074                  $this->setSafe($node, array());
 075              }
 076          } elseif ($node instanceof Twig_Node_Expression_Function) {
 077              // function expression is safe when the function is safe
 078              $name = $node->getAttribute('name');
 079              $args = $node->getNode('arguments');
 080              $function = $env->getFunction($name);
 081              if (false !== $function) {
 082                  $this->setSafe($node, $function->getSafe($args));
 083              } else {
 084                  $this->setSafe($node, array());
 085              }
 086          } elseif ($node instanceof Twig_Node_Expression_MethodCall) {
 087              if ($node->getAttribute('safe')) {
 088                  $this->setSafe($node, array('all'));
 089              } else {
 090                  $this->setSafe($node, array());
 091              }
 092          } elseif ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name) {
 093              $name = $node->getNode('node')->getAttribute('name');
 094              // attributes on template instances are safe
 095              if ('_self' == $name || in_array($name, $this->safeVars)) {
 096                  $this->setSafe($node, array('all'));
 097              } else {
 098                  $this->setSafe($node, array());
 099              }
 100          } else {
 101              $this->setSafe($node, array());
 102          }
 103   
 104          return $node;
 105      }
 106   
 107      protected function intersectSafe(array $a = null, array $b = null)
 108      {
 109          if (null === $a || null === $b) {
 110              return array();
 111          }
 112   
 113          if (in_array('all', $a)) {
 114              return $b;
 115          }
 116   
 117          if (in_array('all', $b)) {
 118              return $a;
 119          }
 120   
 121          return array_intersect($a, $b);
 122      }
 123   
 124      /**
 125       * {@inheritdoc}
 126       */
 127      public function getPriority()
 128      {
 129          return 0;
 130      }
 131  }
 132