1: <?php
2:
3: class HTMLPurifier_DefinitionCache_Serializer extends
4: HTMLPurifier_DefinitionCache
5: {
6:
7: public function add($def, $config) {
8: if (!$this->checkDefType($def)) return;
9: $file = $this->generateFilePath($config);
10: if (file_exists($file)) return false;
11: if (!$this->_prepareDir($config)) return false;
12: return $this->_write($file, serialize($def), $config);
13: }
14:
15: public function set($def, $config) {
16: if (!$this->checkDefType($def)) return;
17: $file = $this->generateFilePath($config);
18: if (!$this->_prepareDir($config)) return false;
19: return $this->_write($file, serialize($def), $config);
20: }
21:
22: public function replace($def, $config) {
23: if (!$this->checkDefType($def)) return;
24: $file = $this->generateFilePath($config);
25: if (!file_exists($file)) return false;
26: if (!$this->_prepareDir($config)) return false;
27: return $this->_write($file, serialize($def), $config);
28: }
29:
30: public function get($config) {
31: $file = $this->generateFilePath($config);
32: if (!file_exists($file)) return false;
33: return unserialize(file_get_contents($file));
34: }
35:
36: public function remove($config) {
37: $file = $this->generateFilePath($config);
38: if (!file_exists($file)) return false;
39: return unlink($file);
40: }
41:
42: public function flush($config) {
43: if (!$this->_prepareDir($config)) return false;
44: $dir = $this->generateDirectoryPath($config);
45: $dh = opendir($dir);
46: while (false !== ($filename = readdir($dh))) {
47: if (empty($filename)) continue;
48: if ($filename[0] === '.') continue;
49: unlink($dir . '/' . $filename);
50: }
51: }
52:
53: public function cleanup($config) {
54: if (!$this->_prepareDir($config)) return false;
55: $dir = $this->generateDirectoryPath($config);
56: $dh = opendir($dir);
57: while (false !== ($filename = readdir($dh))) {
58: if (empty($filename)) continue;
59: if ($filename[0] === '.') continue;
60: $key = substr($filename, 0, strlen($filename) - 4);
61: if ($this->isOld($key, $config)) unlink($dir . '/' . $filename);
62: }
63: }
64:
65: 66: 67: 68: 69:
70: public function generateFilePath($config) {
71: $key = $this->generateKey($config);
72: return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
73: }
74:
75: 76: 77: 78: 79:
80: public function generateDirectoryPath($config) {
81: $base = $this->generateBaseDirectoryPath($config);
82: return $base . '/' . $this->type;
83: }
84:
85: 86: 87: 88: 89:
90: public function generateBaseDirectoryPath($config) {
91: $base = $config->get('Cache.SerializerPath');
92: $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
93: return $base;
94: }
95:
96: 97: 98: 99: 100: 101: 102:
103: private function _write($file, $data, $config) {
104: $result = file_put_contents($file, $data);
105: if ($result !== false) {
106:
107: $chmod = $config->get('Cache.SerializerPermissions');
108: if (!$chmod) {
109: $chmod = 0644;
110: }
111: $chmod = $chmod & 0666;
112: chmod($file, $chmod);
113: }
114: return $result;
115: }
116:
117: 118: 119: 120: 121:
122: private function _prepareDir($config) {
123: $directory = $this->generateDirectoryPath($config);
124: $chmod = $config->get('Cache.SerializerPermissions');
125: if (!$chmod) {
126: $chmod = 0755;
127: }
128: if (!is_dir($directory)) {
129: $base = $this->generateBaseDirectoryPath($config);
130: if (!is_dir($base)) {
131: trigger_error('Base directory '.$base.' does not exist,
132: please create or change using %Cache.SerializerPath',
133: E_USER_WARNING);
134: return false;
135: } elseif (!$this->_testPermissions($base, $chmod)) {
136: return false;
137: }
138: $old = umask(0000);
139: mkdir($directory, $chmod);
140: umask($old);
141: } elseif (!$this->_testPermissions($directory, $chmod)) {
142: return false;
143: }
144: return true;
145: }
146:
147: 148: 149: 150: 151: 152: 153:
154: private function _testPermissions($dir, $chmod) {
155:
156: if (is_writable($dir)) return true;
157: if (!is_dir($dir)) {
158:
159:
160: trigger_error('Directory '.$dir.' does not exist',
161: E_USER_WARNING);
162: return false;
163: }
164: if (function_exists('posix_getuid')) {
165:
166: if (fileowner($dir) === posix_getuid()) {
167:
168: $chmod = $chmod | 0700;
169: if (chmod($dir, $chmod)) return true;
170: } elseif (filegroup($dir) === posix_getgid()) {
171: $chmod = $chmod | 0070;
172: } else {
173:
174:
175: $chmod = $chmod | 0777;
176: }
177: trigger_error('Directory '.$dir.' not writable, '.
178: 'please chmod to ' . decoct($chmod),
179: E_USER_WARNING);
180: } else {
181:
182: trigger_error('Directory '.$dir.' not writable, '.
183: 'please alter file permissions',
184: E_USER_WARNING);
185: }
186: return false;
187: }
188:
189: }
190:
191:
192: