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

path_helper.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 11.65 KiB


001  <?php
002  /**
003  *
004  * This file is part of the phpBB Forum Software package.
005  *
006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
007  * @license GNU General Public License, version 2 (GPL-2.0)
008  *
009  * For full copyright and license information, please see
010  * the docs/CREDITS.txt file.
011  *
012  */
013   
014  namespace phpbb;
015   
016  /**
017  * A class with various functions that are related to paths, files and the filesystem
018  */
019  class path_helper
020  {
021      /** @var \phpbb\symfony_request */
022      protected $symfony_request;
023   
024      /** @var \phpbb\filesystem */
025      protected $filesystem;
026   
027      /** @var \phpbb\request\request_interface */
028      protected $request;
029   
030      /** @var string */
031      protected $phpbb_root_path;
032   
033      /** @var string */
034      protected $adm_relative_path;
035   
036      /** @var string */
037      protected $php_ext;
038   
039      /** @var string */
040      protected $web_root_path;
041   
042      /**
043      * Constructor
044      *
045      * @param \phpbb\symfony_request $symfony_request
046      * @param \phpbb\filesystem $filesystem
047      * @param \phpbb\request\request_interface $request
048      * @param string $phpbb_root_path Relative path to phpBB root
049      * @param string $php_ext PHP file extension
050      * @param mixed $adm_relative_path Relative path admin path to adm/ root
051      */
052      public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
053      {
054          $this->symfony_request = $symfony_request;
055          $this->filesystem = $filesystem;
056          $this->request = $request;
057          $this->phpbb_root_path = $phpbb_root_path;
058          $this->php_ext = $php_ext;
059          $this->adm_relative_path = $adm_relative_path;
060      }
061   
062      /**
063      * Get the phpBB root path
064      *
065      * @return string
066      */
067      public function get_phpbb_root_path()
068      {
069          return $this->phpbb_root_path;
070      }
071   
072      /**
073      * Get the adm root path
074      *
075      * @return string
076      */
077      public function get_adm_relative_path()
078      {
079          return $this->adm_relative_path;
080      }
081   
082      /**
083      * Get the php extension
084      *
085      * @return string
086      */
087      public function get_php_ext()
088      {
089          return $this->php_ext;
090      }
091   
092      /**
093      * Update a web path to the correct relative root path
094      *
095      * This replaces $phpbb_root_path . some_url with
096      *    get_web_root_path() . some_url
097      *
098      * @param string $path The path to be updated
099      * @return string
100      */
101      public function update_web_root_path($path)
102      {
103          if (strpos($path, $this->phpbb_root_path) === 0)
104          {
105              $path = substr($path, strlen($this->phpbb_root_path));
106   
107              $web_root_path = $this->get_web_root_path();
108              if (substr($web_root_path, -8) === 'app.php/' && substr($path, 0, 7) === 'app.php')
109              {
110                  $path = substr($path, 8);
111              }
112   
113              return $this->filesystem->clean_path($web_root_path . $path);
114          }
115   
116          return $path;
117      }
118   
119      /**
120      * Strips away the web root path and prepends the normal root path
121      *
122      * This replaces get_web_root_path() . some_url with
123      *    $phpbb_root_path . some_url
124      *
125      * @param string $path The path to be updated
126      * @return string
127      */
128      public function remove_web_root_path($path)
129      {
130          if (strpos($path, $this->get_web_root_path()) === 0)
131          {
132              $path = substr($path, strlen($this->get_web_root_path()));
133   
134              return $this->phpbb_root_path . $path;
135          }
136   
137          return $path;
138      }
139   
140      /**
141      * Get a relative root path from the current URL
142      *
143      * @return string
144      */
145      public function get_web_root_path()
146      {
147          if ($this->symfony_request === null)
148          {
149              return $this->phpbb_root_path;
150          }
151   
152          if (null !== $this->web_root_path)
153          {
154              return $this->web_root_path;
155          }
156   
157          // Path info (e.g. /foo/bar)
158          $path_info = $this->filesystem->clean_path($this->symfony_request->getPathInfo());
159   
160          // Full request URI (e.g. phpBB/app.php/foo/bar)
161          $request_uri = $this->symfony_request->getRequestUri();
162   
163          // Script name URI (e.g. phpBB/app.php)
164          $script_name = $this->symfony_request->getScriptName();
165   
166          /*
167          * If the path info is empty but we're using app.php, then we
168          *    might be using an empty route like app.php/ which is
169          *    supported by symfony's routing
170          */
171          if ($path_info === '/' && preg_match('/app\.' . $this->php_ext . '\/$/', $request_uri))
172          {
173              return $this->web_root_path = $this->filesystem->clean_path('./../' . $this->phpbb_root_path);
174          }
175   
176          /*
177          * If the path info is empty (single /), then we're not using
178          *    a route like app.php/foo/bar
179          */
180          if ($path_info === '/')
181          {
182              return $this->web_root_path = $this->phpbb_root_path;
183          }
184   
185          /*
186          * Check AJAX request:
187          * If the current request is a AJAX we need to fix the paths.
188          * We need to get the root path based on the Referer, so we can use
189          * the generated URLs in the template of the Referer. If we do not
190          * generate the relative path based on the Referer, but based on the
191          * currently requested URL, the generated URLs will not point to the
192          * intended locations:
193          *    Referer                desired URL            desired relative root path
194          *    memberlist.php        faq.php                ./
195          *    memberlist.php        app.php/foo/bar        ./
196          *    app.php/foo            memberlist.php        ../
197          *    app.php/foo            app.php/fox            ../
198          *    app.php/foo/bar        memberlist.php        ../../
199          *    ../page.php            memberlist.php        ./phpBB/
200          *    ../sub/page.php        memberlist.php        ./../phpBB/
201          *
202          * The referer must be specified as a parameter in the query.
203          */
204          if ($this->request->is_ajax() && $this->symfony_request->get('_referer'))
205          {
206              $referer_web_root_path = $this->get_web_root_path_from_ajax_referer(
207                  $this->symfony_request->get('_referer'),
208                  $this->symfony_request->getSchemeAndHttpHost() . $this->symfony_request->getBasePath()
209              );
210              return $this->web_root_path = $this->phpbb_root_path . $referer_web_root_path;
211          }
212   
213          // How many corrections might we need?
214          $corrections = substr_count($path_info, '/');
215   
216          /*
217          * If the script name (e.g. phpBB/app.php) does not exists in the
218          * requestUri (e.g. phpBB/app.php/foo/template), then we are rewriting
219          * the URL. So we must reduce the slash count by 1.
220          */
221          if (strpos($request_uri, $script_name) !== 0)
222          {
223              $corrections--;
224          }
225   
226          // Prepend ../ to the phpbb_root_path as many times as / exists in path_info
227          $this->web_root_path = $this->filesystem->clean_path(
228              './' . str_repeat('../', $corrections) . $this->phpbb_root_path
229          );
230          return $this->web_root_path;
231      }
232   
233      /**
234      * Get the web root path of the referer form an ajax request
235      *
236      * @param string $absolute_referer_url
237      * @param string $absolute_board_url
238      * @return string
239      */
240      public function get_web_root_path_from_ajax_referer($absolute_referer_url, $absolute_board_url)
241      {
242          // If the board URL is in the beginning of the referer, this means
243          // we the referer is in the board URL or a subdirectory of it.
244          // So we just need to count the / (slashes) in the left over part of
245          // the referer and prepend ../ the the current root_path, to get the
246          // web root path of the referer.
247          if (strpos($absolute_referer_url, $absolute_board_url) === 0)
248          {
249              $relative_referer_path = substr($absolute_referer_url, strlen($absolute_board_url));
250              $has_params = strpos($relative_referer_path, '?');
251              if ($has_params !== false)
252              {
253                  $relative_referer_path = substr($relative_referer_path, 0, $has_params);
254              }
255              $corrections = substr_count($relative_referer_path, '/');
256              return $this->phpbb_root_path . str_repeat('../', $corrections - 1);
257          }
258   
259          // If not, it's a bit more complicated. We go to the parent directory
260          // of the referer until we find the remaining referer in the board URL.
261          // Foreach directory we need to add a ../ to the fixed root_path.
262          // When we finally found it, we need to remove the remaining referer
263          // from the board URL, to get the boards root path.
264          // If the then append these two strings, we get our fixed web root path.
265          $fixed_root_path = '';
266          $referer_dir = $absolute_referer_url;
267          $has_params = strpos($referer_dir, '?');
268          if ($has_params !== false)
269          {
270              $referer_dir = substr($referer_dir, 0, $has_params);
271          }
272   
273          // If we do not find a slash at the end of the referer, we come
274          // from a file. So the first dirname() does not need a traversal
275          // path correction.
276          if (substr($referer_dir, -1) !== '/')
277          {
278              $referer_dir = dirname($referer_dir);
279          }
280   
281          while (strpos($absolute_board_url, $referer_dir) !== 0)
282          {
283              $fixed_root_path .= '../';
284              $referer_dir = dirname($referer_dir);
285          }
286   
287          $fixed_root_path .= substr($absolute_board_url, strlen($referer_dir) + 1);
288          // Add trailing slash
289          return $this->phpbb_root_path . $fixed_root_path . '/';
290      }
291   
292      /**
293      * Eliminates useless . and .. components from specified URL
294      *
295      * @param string $url URL to clean
296      *
297      * @return string Cleaned URL
298      */
299      public function clean_url($url)
300      {
301          $delimiter_position = strpos($url, '://');
302          // URL should contain :// but it shouldn't start with it.
303          // Do not clean URLs that do not fit these constraints.
304          if (empty($delimiter_position))
305          {
306              return $url;
307          }
308          $scheme = substr($url, 0, $delimiter_position) . '://';
309          // Add length of URL delimiter to position
310          $path = substr($url, $delimiter_position + 3);
311   
312          return $scheme . $this->filesystem->clean_path($path);
313      }
314   
315      /**
316      * Glue URL parameters together
317      *
318      * @param array $params URL parameters in the form of array(name => value)
319      * @return string Returns the glued string, e.g. name1=value1&amp;name2&amp;name3=value3
320      */
321      public function glue_url_params($params)
322      {
323          $_params = array();
324   
325          foreach ($params as $key => $value)
326          {
327              // some parameters do not have value
328              if ($value !== null)
329              {
330                  $_params[] = $key . '=' . $value;
331              }
332              else
333              {
334                  $_params[] = $key;
335              }
336          }
337          return implode('&amp;', $_params);
338      }
339   
340      /**
341      * Get the base and parameters of a URL
342      *
343      * @param string $url URL to break apart
344      * @param bool $is_amp Is the parameter separator &amp;. Defaults to true.
345      * @return array Returns the base and parameters in the form of array('base' => string, 'params' => array(name => value))
346      */
347      public function get_url_parts($url, $is_amp = true)
348      {
349          $separator = ($is_amp) ? '&amp;' : '&';
350          $params = array();
351   
352          if (strpos($url, '?') !== false)
353          {
354              $base = substr($url, 0, strpos($url, '?'));
355              $args = substr($url, strlen($base) + 1);
356              $args = ($args) ? explode($separator, $args) : array();
357   
358              foreach ($args as $argument)
359              {
360                  if (empty($argument))
361                  {
362                      continue;
363                  }
364   
365                  // some parameters don't have value
366                  if (strpos($argument, '=') !== false)
367                  {
368                      list($key, $value) = explode('=', $argument, 2);
369                  }
370                  else
371                  {
372                      $key = $argument;
373                      $value = null;
374                  }
375   
376                  if ($key === '')
377                  {
378                      continue;
379                  }
380   
381                  $params[$key] = $value;
382              }
383          }
384          else
385          {
386              $base = $url;
387          }
388   
389          return array(
390              'base'        => $base,
391              'params'    => $params,
392          );
393      }
394   
395      /**
396      * Strip parameters from an already built URL.
397      *
398      * @param string $url URL to strip parameters from
399      * @param array|string $strip Parameters to strip.
400      * @param bool $is_amp Is the parameter separator &amp;. Defaults to true.
401      * @return string Returns the new URL.
402      */
403      public function strip_url_params($url, $strip, $is_amp = true)
404      {
405          $url_parts = $this->get_url_parts($url, $is_amp);
406          $params = $url_parts['params'];
407   
408          if (!is_array($strip))
409          {
410              $strip = array($strip);
411          }
412   
413          if (!empty($params))
414          {
415              // Strip the parameters off
416              foreach ($strip as $param)
417              {
418                  unset($params[$param]);
419              }
420          }
421   
422          return $url_parts['base'] . (($params) ? '?' . $this->glue_url_params($params) : '');
423      }
424   
425      /**
426      * Append parameters to an already built URL.
427      *
428      * @param string $url URL to append parameters to
429      * @param array $new_params Parameters to add in the form of array(name => value)
430      * @param bool $is_amp Is the parameter separator &amp;. Defaults to true.
431      * @return string Returns the new URL.
432      */
433      public function append_url_params($url, $new_params, $is_amp = true)
434      {
435          $url_parts = $this->get_url_parts($url, $is_amp);
436          $params = array_merge($url_parts['params'], $new_params);
437   
438          // Move the sid to the end if it's set
439          if (isset($params['sid']))
440          {
441              $sid = $params['sid'];
442              unset($params['sid']);
443              $params['sid'] = $sid;
444          }
445   
446          return $url_parts['base'] . (($params) ? '?' . $this->glue_url_params($params) : '');
447      }
448  }
449