1 : <?php
2 :
3 : /**
4 : * PHPIDS
5 : *
6 : * Requirements: PHP5, SimpleXML
7 : *
8 : * Copyright (c) 2008 PHPIDS group (http://php-ids.org)
9 : *
10 : * PHPIDS is free software; you can redistribute it and/or modify
11 : * it under the terms of the GNU Lesser General Public License as published by
12 : * the Free Software Foundation, version 3 of the License, or
13 : * (at your option) any later version.
14 : *
15 : * PHPIDS is distributed in the hope that it will be useful,
16 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : * GNU Lesser General Public License for more details.
19 : *
20 : * You should have received a copy of the GNU Lesser General Public License
21 : * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.
22 : *
23 : * PHP version 5.1.6+
24 : *
25 : * @category Security
26 : * @package PHPIDS
27 : * @author Mario Heiderich <mario.heiderich@gmail.com>
28 : * @author Christian Matthies <ch0012@gmail.com>
29 : * @author Lars Strojny <lars@strojny.net>
30 : * @license http://www.gnu.org/licenses/lgpl.html LGPL
31 : * @link http://php-ids.org/
32 : */
33 :
34 1 : require_once 'IDS/Caching/Interface.php';
35 :
36 : /**
37 : * File caching wrapper
38 : *
39 : * This class inhabits functionality to get and set cache via a static flatfile.
40 : *
41 : * @category Security
42 : * @package PHPIDS
43 : * @author Christian Matthies <ch0012@gmail.com>
44 : * @author Mario Heiderich <mario.heiderich@gmail.com>
45 : * @author Lars Strojny <lars@strojny.net>
46 : * @copyright 2007 The PHPIDS Group
47 : * @license http://www.gnu.org/licenses/lgpl.html LGPL
48 : * @version Release: $Id:File.php 517 2007-09-15 15:04:13Z mario $
49 : * @link http://php-ids.org/
50 : * @since Version 0.4
51 : */
52 1 : class IDS_Caching_File implements IDS_Caching_Interface
53 : {
54 :
55 : /**
56 : * Caching type
57 : *
58 : * @var string
59 : */
60 : private $type = null;
61 :
62 : /**
63 : * Cache configuration
64 : *
65 : * @var array
66 : */
67 : private $config = null;
68 :
69 : /**
70 : * Path to cache file
71 : *
72 : * @var string
73 : */
74 : private $path = null;
75 :
76 : /**
77 : * Holds an instance of this class
78 : *
79 : * @var object
80 : */
81 : private static $cachingInstance = null;
82 :
83 : /**
84 : * Constructor
85 : *
86 : * @param string $type caching type
87 : * @param array $init the IDS_Init object
88 : *
89 : * @return void
90 : */
91 : public function __construct($type, $init)
92 : {
93 :
94 1 : $this->type = $type;
95 1 : $this->config = $init->config['Caching'];
96 1 : $this->path = $init->getBasePath() . $this->config['path'];
97 :
98 1 : if (file_exists($this->path) && !is_writable($this->path)) {
99 0 : throw new Exception('Make sure all files in ' .
100 0 : htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') .
101 0 : 'are writeable!');
102 : }
103 1 : }
104 :
105 : /**
106 : * Returns an instance of this class
107 : *
108 : * @param string $type caching type
109 : * @param array $init the IDS_Init object
110 : *
111 : * @return object $this
112 : */
113 : public static function getInstance($type, $init)
114 : {
115 45 : if (!self::$cachingInstance) {
116 1 : self::$cachingInstance = new IDS_Caching_File($type, $init);
117 1 : }
118 :
119 45 : return self::$cachingInstance;
120 : }
121 :
122 : /**
123 : * Writes cache data into the file
124 : *
125 : * @param array $data the cache data
126 : *
127 : * @throws Exception if cache file couldn't be created
128 : * @return object $this
129 : */
130 : public function setCache(array $data)
131 : {
132 44 : if (!is_writable(preg_replace('/[\/][^\/]+\.[^\/]++$/', null,
133 44 : $this->path))) {
134 0 : throw new Exception('Temp directory ' .
135 0 : htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') .
136 0 : ' seems not writable');
137 : }
138 :
139 44 : if ((!file_exists($this->path) || (time()-filectime($this->path)) >
140 44 : $this->config['expiration_time'])) {
141 3 : $handle = @fopen($this->path, 'w+');
142 :
143 3 : if (!$handle) {
144 0 : throw new Exception("Cache file couldn't be created");
145 : }
146 :
147 3 : fwrite($handle, serialize($data));
148 3 : fclose($handle);
149 3 : }
150 :
151 44 : return $this;
152 : }
153 :
154 : /**
155 : * Returns the cached data
156 : *
157 : * Note that this method returns false if either type or file cache is
158 : * not set
159 : *
160 : * @return mixed cache data or false
161 : */
162 : public function getCache()
163 : {
164 :
165 : // make sure filters are parsed again if cache expired
166 43 : if (file_exists($this->path) && (time()-filectime($this->path)) <
167 43 : $this->config['expiration_time']) {
168 42 : $data = unserialize($this->readFile($this->path));
169 42 : return $data;
170 : }
171 :
172 1 : return false;
173 : }
174 :
175 : /**
176 : * Read file and stripslashes if required
177 : *
178 : * @param string $filename Name of the file to read
179 : * @return string
180 : */
181 : protected function readFile($filename)
182 : {
183 42 : @set_magic_quotes_runtime(0);
184 42 : $content = file_get_contents($filename);
185 42 : if (function_exists('get_magic_quotes_runtime') and
186 42 : get_magic_quotes_runtime()) {
187 :
188 0 : $content = stripslashes($content);
189 0 : }
190 42 : return $content;
191 : }
192 : }
193 :
194 : /*
195 : * Local variables:
196 : * tab-width: 4
197 : * c-basic-offset: 4
198 : * End:
199 : */
|