]> git.immae.eu Git - github/wallabag/wallabag.git/blame - inc/3rdparty/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php
remove autoload section in composer.json
[github/wallabag/wallabag.git] / inc / 3rdparty / htmlpurifier / HTMLPurifier / DefinitionCache / Serializer.php
CommitLineData
d4949327
NL
1<?php\r
2\r
3class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache\r
4{\r
5\r
6 /**\r
7 * @param HTMLPurifier_Definition $def\r
8 * @param HTMLPurifier_Config $config\r
9 * @return int|bool\r
10 */\r
11 public function add($def, $config)\r
12 {\r
13 if (!$this->checkDefType($def)) {\r
14 return;\r
15 }\r
16 $file = $this->generateFilePath($config);\r
17 if (file_exists($file)) {\r
18 return false;\r
19 }\r
20 if (!$this->_prepareDir($config)) {\r
21 return false;\r
22 }\r
23 return $this->_write($file, serialize($def), $config);\r
24 }\r
25\r
26 /**\r
27 * @param HTMLPurifier_Definition $def\r
28 * @param HTMLPurifier_Config $config\r
29 * @return int|bool\r
30 */\r
31 public function set($def, $config)\r
32 {\r
33 if (!$this->checkDefType($def)) {\r
34 return;\r
35 }\r
36 $file = $this->generateFilePath($config);\r
37 if (!$this->_prepareDir($config)) {\r
38 return false;\r
39 }\r
40 return $this->_write($file, serialize($def), $config);\r
41 }\r
42\r
43 /**\r
44 * @param HTMLPurifier_Definition $def\r
45 * @param HTMLPurifier_Config $config\r
46 * @return int|bool\r
47 */\r
48 public function replace($def, $config)\r
49 {\r
50 if (!$this->checkDefType($def)) {\r
51 return;\r
52 }\r
53 $file = $this->generateFilePath($config);\r
54 if (!file_exists($file)) {\r
55 return false;\r
56 }\r
57 if (!$this->_prepareDir($config)) {\r
58 return false;\r
59 }\r
60 return $this->_write($file, serialize($def), $config);\r
61 }\r
62\r
63 /**\r
64 * @param HTMLPurifier_Config $config\r
65 * @return bool|HTMLPurifier_Config\r
66 */\r
67 public function get($config)\r
68 {\r
69 $file = $this->generateFilePath($config);\r
70 if (!file_exists($file)) {\r
71 return false;\r
72 }\r
73 return unserialize(file_get_contents($file));\r
74 }\r
75\r
76 /**\r
77 * @param HTMLPurifier_Config $config\r
78 * @return bool\r
79 */\r
80 public function remove($config)\r
81 {\r
82 $file = $this->generateFilePath($config);\r
83 if (!file_exists($file)) {\r
84 return false;\r
85 }\r
86 return unlink($file);\r
87 }\r
88\r
89 /**\r
90 * @param HTMLPurifier_Config $config\r
91 * @return bool\r
92 */\r
93 public function flush($config)\r
94 {\r
95 if (!$this->_prepareDir($config)) {\r
96 return false;\r
97 }\r
98 $dir = $this->generateDirectoryPath($config);\r
99 $dh = opendir($dir);\r
100 while (false !== ($filename = readdir($dh))) {\r
101 if (empty($filename)) {\r
102 continue;\r
103 }\r
104 if ($filename[0] === '.') {\r
105 continue;\r
106 }\r
107 unlink($dir . '/' . $filename);\r
108 }\r
109 }\r
110\r
111 /**\r
112 * @param HTMLPurifier_Config $config\r
113 * @return bool\r
114 */\r
115 public function cleanup($config)\r
116 {\r
117 if (!$this->_prepareDir($config)) {\r
118 return false;\r
119 }\r
120 $dir = $this->generateDirectoryPath($config);\r
121 $dh = opendir($dir);\r
122 while (false !== ($filename = readdir($dh))) {\r
123 if (empty($filename)) {\r
124 continue;\r
125 }\r
126 if ($filename[0] === '.') {\r
127 continue;\r
128 }\r
129 $key = substr($filename, 0, strlen($filename) - 4);\r
130 if ($this->isOld($key, $config)) {\r
131 unlink($dir . '/' . $filename);\r
132 }\r
133 }\r
134 }\r
135\r
136 /**\r
137 * Generates the file path to the serial file corresponding to\r
138 * the configuration and definition name\r
139 * @param HTMLPurifier_Config $config\r
140 * @return string\r
141 * @todo Make protected\r
142 */\r
143 public function generateFilePath($config)\r
144 {\r
145 $key = $this->generateKey($config);\r
146 return $this->generateDirectoryPath($config) . '/' . $key . '.ser';\r
147 }\r
148\r
149 /**\r
150 * Generates the path to the directory contain this cache's serial files\r
151 * @param HTMLPurifier_Config $config\r
152 * @return string\r
153 * @note No trailing slash\r
154 * @todo Make protected\r
155 */\r
156 public function generateDirectoryPath($config)\r
157 {\r
158 $base = $this->generateBaseDirectoryPath($config);\r
159 return $base . '/' . $this->type;\r
160 }\r
161\r
162 /**\r
163 * Generates path to base directory that contains all definition type\r
164 * serials\r
165 * @param HTMLPurifier_Config $config\r
166 * @return mixed|string\r
167 * @todo Make protected\r
168 */\r
169 public function generateBaseDirectoryPath($config)\r
170 {\r
171 $base = $config->get('Cache.SerializerPath');\r
172 $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;\r
173 return $base;\r
174 }\r
175\r
176 /**\r
177 * Convenience wrapper function for file_put_contents\r
178 * @param string $file File name to write to\r
179 * @param string $data Data to write into file\r
180 * @param HTMLPurifier_Config $config\r
181 * @return int|bool Number of bytes written if success, or false if failure.\r
182 */\r
183 private function _write($file, $data, $config)\r
184 {\r
185 $result = file_put_contents($file, $data);\r
186 if ($result !== false) {\r
187 // set permissions of the new file (no execute)\r
188 $chmod = $config->get('Cache.SerializerPermissions');\r
189 if (!$chmod) {\r
190 $chmod = 0644; // invalid config or simpletest\r
191 }\r
192 $chmod = $chmod & 0666;\r
193 chmod($file, $chmod);\r
194 }\r
195 return $result;\r
196 }\r
197\r
198 /**\r
199 * Prepares the directory that this type stores the serials in\r
200 * @param HTMLPurifier_Config $config\r
201 * @return bool True if successful\r
202 */\r
203 private function _prepareDir($config)\r
204 {\r
205 $directory = $this->generateDirectoryPath($config);\r
206 $chmod = $config->get('Cache.SerializerPermissions');\r
207 if (!$chmod) {\r
208 $chmod = 0755; // invalid config or simpletest\r
209 }\r
210 if (!is_dir($directory)) {\r
211 $base = $this->generateBaseDirectoryPath($config);\r
212 if (!is_dir($base)) {\r
213 trigger_error(\r
214 'Base directory ' . $base . ' does not exist,\r
215 please create or change using %Cache.SerializerPath',\r
216 E_USER_WARNING\r
217 );\r
218 return false;\r
219 } elseif (!$this->_testPermissions($base, $chmod)) {\r
220 return false;\r
221 }\r
222 $old = umask(0000);\r
223 mkdir($directory, $chmod);\r
224 umask($old);\r
225 } elseif (!$this->_testPermissions($directory, $chmod)) {\r
226 return false;\r
227 }\r
228 return true;\r
229 }\r
230\r
231 /**\r
232 * Tests permissions on a directory and throws out friendly\r
233 * error messages and attempts to chmod it itself if possible\r
234 * @param string $dir Directory path\r
235 * @param int $chmod Permissions\r
236 * @return bool True if directory is writable\r
237 */\r
238 private function _testPermissions($dir, $chmod)\r
239 {\r
240 // early abort, if it is writable, everything is hunky-dory\r
241 if (is_writable($dir)) {\r
242 return true;\r
243 }\r
244 if (!is_dir($dir)) {\r
245 // generally, you'll want to handle this beforehand\r
246 // so a more specific error message can be given\r
247 trigger_error(\r
248 'Directory ' . $dir . ' does not exist',\r
249 E_USER_WARNING\r
250 );\r
251 return false;\r
252 }\r
253 if (function_exists('posix_getuid')) {\r
254 // POSIX system, we can give more specific advice\r
255 if (fileowner($dir) === posix_getuid()) {\r
256 // we can chmod it ourselves\r
257 $chmod = $chmod | 0700;\r
258 if (chmod($dir, $chmod)) {\r
259 return true;\r
260 }\r
261 } elseif (filegroup($dir) === posix_getgid()) {\r
262 $chmod = $chmod | 0070;\r
263 } else {\r
264 // PHP's probably running as nobody, so we'll\r
265 // need to give global permissions\r
266 $chmod = $chmod | 0777;\r
267 }\r
268 trigger_error(\r
269 'Directory ' . $dir . ' not writable, ' .\r
270 'please chmod to ' . decoct($chmod),\r
271 E_USER_WARNING\r
272 );\r
273 } else {\r
274 // generic error message\r
275 trigger_error(\r
276 'Directory ' . $dir . ' not writable, ' .\r
277 'please alter file permissions',\r
278 E_USER_WARNING\r
279 );\r
280 }\r
281 return false;\r
282 }\r
283}\r
284\r
285// vim: et sw=4 sts=4\r