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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
loader.php
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\template\twig;
015
016 /**
017 * Twig Template loader
018 */
019 class loader extends \Twig_Loader_Filesystem
020 {
021 protected $safe_directories = array();
022
023 /**
024 * Set safe directories
025 *
026 * @param array $directories Array of directories that are safe (empty to clear)
027 * @return \Twig_Loader_Filesystem
028 */
029 public function setSafeDirectories($directories = array())
030 {
031 $this->safe_directories = array();
032
033 if (!empty($directories))
034 {
035 foreach ($directories as $directory)
036 {
037 $this->addSafeDirectory($directory);
038 }
039 }
040
041 return $this;
042 }
043
044 /**
045 * Add safe directory
046 *
047 * @param string $directory Directory that should be added
048 * @return \Twig_Loader_Filesystem
049 */
050 public function addSafeDirectory($directory)
051 {
052 $directory = phpbb_realpath($directory);
053
054 if ($directory !== false)
055 {
056 $this->safe_directories[] = $directory;
057 }
058
059 return $this;
060 }
061
062 /**
063 * Get current safe directories
064 *
065 * @return array
066 */
067 public function getSafeDirectories()
068 {
069 return $this->safe_directories;
070 }
071
072 /**
073 * Override for parent::validateName()
074 *
075 * This is done because we added support for safe directories, and when Twig
076 * findTemplate() is called, validateName() is called first, which would
077 * always throw an exception if the file is outside of the configured
078 * template directories.
079 */
080 protected function validateName($name)
081 {
082 return;
083 }
084
085 /**
086 * Find the template
087 *
088 * Override for Twig_Loader_Filesystem::findTemplate to add support
089 * for loading from safe directories.
090 */
091 protected function findTemplate($name)
092 {
093 $name = (string) $name;
094
095 // normalize name
096 $name = preg_replace('#/{2,}#', '/', strtr($name, '\\', '/'));
097
098 // If this is in the cache we can skip the entire process below
099 // as it should have already been validated
100 if (isset($this->cache[$name])) {
101 return $this->cache[$name];
102 }
103
104 // First, find the template name. The override above of validateName
105 // causes the validateName process to be skipped for this call
106 $file = parent::findTemplate($name);
107
108 try
109 {
110 // Try validating the name (which may throw an exception)
111 parent::validateName($name);
112 }
113 catch (\Twig_Error_Loader $e)
114 {
115 if (strpos($e->getRawMessage(), 'Looks like you try to load a template outside configured directories') === 0)
116 {
117 // Ok, so outside of the configured template directories, we
118 // can now check if we're within a "safe" directory
119
120 // Find the real path of the directory the file is in
121 $directory = phpbb_realpath(dirname($file));
122
123 if ($directory === false)
124 {
125 // Some sort of error finding the actual path, must throw the exception
126 throw $e;
127 }
128
129 foreach ($this->safe_directories as $safe_directory)
130 {
131 if (strpos($directory, $safe_directory) === 0)
132 {
133 // The directory being loaded is below a directory
134 // that is "safe". We're good to load it!
135 return $file;
136 }
137 }
138 }
139
140 // Not within any safe directories
141 throw $e;
142 }
143
144 // No exception from validateName, safe to load.
145 return $file;
146 }
147 }
148