Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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

AbstractFlashRestriction.php

Zuletzt modifiziert: 02.04.2025, 15:04 - Dateigröße: 7.20 KiB


001  <?php
002   
003  /**
004  * @package   s9e\TextFormatter
005  * @copyright Copyright (c) 2010-2022 The s9e authors
006  * @license   http://www.opensource.org/licenses/mit-license.php The MIT License
007  */
008  namespace s9e\TextFormatter\Configurator\TemplateChecks;
009   
010  use DOMElement;
011  use DOMNode;
012  use DOMXPath;
013  use s9e\TextFormatter\Configurator\Exceptions\UnsafeTemplateException;
014  use s9e\TextFormatter\Configurator\Items\Tag;
015  use s9e\TextFormatter\Configurator\TemplateCheck;
016   
017  /**
018  * NOTE: when this check is enabled, DisallowObjectParamsWithGeneratedName should be enabled too.
019  *       Otherwise, <param/> elements with a dynamic 'name' attribute could be used to bypass this
020  *       restriction. For the same reason, DisallowCopy, DisallowDisableOutputEscaping,
021  *       DisallowDynamicAttributeNames, DisallowDynamicElementNames and DisallowUnsafeCopyOf should
022  *       all be enabled too
023  */
024  abstract class AbstractFlashRestriction extends TemplateCheck
025  {
026      /**
027      * @var string Name of the default setting
028      */
029      public $defaultSetting;
030   
031      /**
032      * @var string Name of the highest setting allowed
033      */
034      public $maxSetting;
035   
036      /**
037      * @var bool Whether this restriction applies only to elements using any kind of dynamic markup:
038      *           XSL elements or attribute value templates
039      */
040      public $onlyIfDynamic;
041   
042      /**
043      * @var string Name of the restricted setting
044      */
045      protected $settingName;
046   
047      /**
048      * @var array Valid settings
049      */
050      protected $settings;
051   
052      /**
053      * @var DOMElement <xsl:template/> node
054      */
055      protected $template;
056   
057      /**
058      * Constructor
059      *
060      * @param  string $maxSetting    Max setting allowed
061      * @param  bool   $onlyIfDynamic Whether this restriction applies only to elements using any kind
062      *                               of dynamic markup: XSL elements or attribute value templates
063      */
064      public function __construct($maxSetting, $onlyIfDynamic = false)
065      {
066          $this->maxSetting    = $maxSetting;
067          $this->onlyIfDynamic = $onlyIfDynamic;
068      }
069   
070      /**
071      * Test for the set Flash restriction
072      *
073      * @param  DOMElement $template <xsl:template/> node
074      * @param  Tag        $tag      Tag this template belongs to
075      * @return void
076      */
077      public function check(DOMElement $template, Tag $tag)
078      {
079          $this->template = $template;
080          $this->checkEmbeds();
081          $this->checkObjects();
082      }
083   
084      /**
085      * Test given element's attributes
086      *
087      * @param  DOMElement $embed Context element
088      * @return void
089      */
090      protected function checkAttributes(DOMElement $embed)
091      {
092          $settingName = strtolower($this->settingName);
093          $useDefault  = true;
094          foreach ($embed->attributes as $attribute)
095          {
096              $attrName = strtolower($attribute->name);
097              if ($attrName === $settingName)
098              {
099                  $this->checkSetting($attribute, $attribute->value);
100                  $useDefault = false;
101              }
102          }
103          if ($useDefault)
104          {
105              $this->checkSetting($embed, $this->defaultSetting);
106          }
107      }
108   
109      /**
110      * Test whether given element has dynamic attributes that match the setting's name
111      *
112      * @param  DOMElement $embed Context element
113      * @return void
114      */
115      protected function checkDynamicAttributes(DOMElement $embed)
116      {
117          $settingName = strtolower($this->settingName);
118          foreach ($embed->getElementsByTagNameNS(self::XMLNS_XSL, 'attribute') as $attribute)
119          {
120              $attrName = strtolower($attribute->getAttribute('name'));
121              if ($attrName === $settingName)
122              {
123                  throw new UnsafeTemplateException('Cannot assess the safety of dynamic attributes', $attribute);
124              }
125          }
126      }
127   
128      /**
129      * Test the presence of dynamic params in given object
130      *
131      * @param  DOMElement $object Context element
132      * @return void
133      */
134      protected function checkDynamicParams(DOMElement $object)
135      {
136          foreach ($this->getObjectParams($object) as $param)
137          {
138              foreach ($param->getElementsByTagNameNS(self::XMLNS_XSL, 'attribute') as $attribute)
139              {
140                  // Test for a dynamic "value" attribute
141                  if (strtolower($attribute->getAttribute('name')) === 'value')
142                  {
143                      throw new UnsafeTemplateException('Cannot assess the safety of dynamic attributes', $attribute);
144                  }
145              }
146          }
147      }
148   
149      /**
150      * Check embed elements in given template
151      *
152      * @return void
153      */
154      protected function checkEmbeds()
155      {
156          foreach ($this->getElements('embed') as $embed)
157          {
158              // Test <xsl:attribute/> descendants
159              $this->checkDynamicAttributes($embed);
160   
161              // Test the element's attributes
162              $this->checkAttributes($embed);
163          }
164      }
165   
166      /**
167      * Check object elements in given template
168      *
169      * @return void
170      */
171      protected function checkObjects()
172      {
173          foreach ($this->getElements('object') as $object)
174          {
175              // Make sure this object doesn't have dynamic params
176              $this->checkDynamicParams($object);
177   
178              // Test the element's <param/> descendants
179              $params = $this->getObjectParams($object);
180              foreach ($params as $param)
181              {
182                  $this->checkSetting($param, $param->getAttribute('value'));
183              }
184              if (empty($params))
185              {
186                  $this->checkSetting($object, $this->defaultSetting);
187              }
188          }
189      }
190   
191      /**
192      * Test whether given setting is allowed
193      *
194      * @param  DOMNode $node    Target node
195      * @param  string  $setting Setting
196      * @return void
197      */
198      protected function checkSetting(DOMNode $node, $setting)
199      {
200          if (!isset($this->settings[strtolower($setting)]))
201          {
202              // Test whether the value contains an odd number of {
203              if (preg_match('/(?<!\\{)\\{(?:\\{\\{)*(?!\\{)/', $setting))
204              {
205                  throw new UnsafeTemplateException('Cannot assess ' . $this->settingName . " setting '" . $setting . "'", $node);
206              }
207   
208              throw new UnsafeTemplateException('Unknown ' . $this->settingName . " value '" . $setting . "'", $node);
209          }
210   
211          $value    = $this->settings[strtolower($setting)];
212          $maxValue = $this->settings[strtolower($this->maxSetting)];
213   
214          if ($value > $maxValue)
215          {
216              throw new UnsafeTemplateException($this->settingName . " setting '" . $setting . "' exceeds restricted value '" . $this->maxSetting . "'", $node);
217          }
218      }
219   
220      /**
221      * Test whether given node contains dynamic content (XSL elements or attribute value template)
222      *
223      * @param  DOMElement $node Node
224      * @return bool
225      */
226      protected function isDynamic(DOMElement $node)
227      {
228          if ($node->getElementsByTagNameNS(self::XMLNS_XSL, '*')->length)
229          {
230              return true;
231          }
232   
233          // Look for any attributes containing "{" in this element or its descendants
234          $xpath = new DOMXPath($node->ownerDocument);
235          $query = './/@*[contains(., "{")]';
236   
237          foreach ($xpath->query($query, $node) as $attribute)
238          {
239              // Test whether the value contains an odd number of {
240              if (preg_match('/(?<!\\{)\\{(?:\\{\\{)*(?!\\{)/', $attribute->value))
241              {
242                  return true;
243              }
244          }
245   
246          return false;
247      }
248   
249      /**
250      * Get all elements the restriction applies to
251      *
252      * @param  string       $tagName Element's name
253      * @return DOMElement[]
254      */
255      protected function getElements($tagName)
256      {
257          $nodes = [];
258          foreach ($this->template->ownerDocument->getElementsByTagName($tagName) as $node)
259          {
260              if (!$this->onlyIfDynamic || $this->isDynamic($node))
261              {
262                  $nodes[] = $node;
263              }
264          }
265   
266          return $nodes;
267      }
268   
269      /**
270      * Get all param elements attached to given object
271      *
272      * @param  DOMElement   $object Context element
273      * @return DOMElement[]
274      */
275      protected function getObjectParams(DOMElement $object)
276      {
277          $params      = [];
278          $settingName = strtolower($this->settingName);
279          foreach ($object->getElementsByTagName('param') as $param)
280          {
281              $paramName = strtolower($param->getAttribute('name'));
282              if ($paramName === $settingName && $param->parentNode->isSameNode($object))
283              {
284                  $params[] = $param;
285              }
286          }
287   
288          return $params;
289      }
290  }