ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilVirusScanner.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
19{
26 var $type;
27
35
42
49
56
63
70
77
84
91
98
105
112
118 var $lng;
119
125 var $log;
126
131 function ilVirusScanner($a_scancommand, $a_cleancommand)
132 {
133 global $ilias, $lng, $log;
134
135 $this->ilias = & $ilias;
136 $this->lng = & $lng;
137 $this->log = & $log;
138 $this->scanCommand = $a_scancommand;
139 $this->cleanCommand = $a_cleancommand;
140
141 $this->type = "simulate";
142 $this->scanZipFiles = false;
143 }
144
149 public function scanBuffer($buffer)
150 {
151 return $this->scanFileFromBuffer($buffer);
152 }
153
158 protected function scanFileFromBuffer($buffer)
159 {
160 $bufferFile = $this->createBufferFile($buffer);
161 $isInfected = $this->scanFile($bufferFile);
162 $this->removeBufferFile($bufferFile);
163 return $isInfected;
164 }
165
170 protected function createBufferFile($buffer)
171 {
172 $bufferFile = ilUtil::ilTempnam();
173 file_put_contents($bufferFile, $buffer);
174 return $bufferFile;
175 }
176
180 protected function removeBufferFile($bufferFile)
181 {
182 unlink($bufferFile);
183 }
184
197 function scanFile($a_filepath, $a_origname = "")
198 {
199 // This function needs to be redefined in child classes.
200 // It should:
201 // - call the external scanner for a_filepath
202 // - set scanFilePath to a_filepath
203 // - set scanFileOrigName to a_origname
204 // - set scanFileIsInfected according the scan result
205 // - set scanResult to the scanner output message
206 // - call logScanResult() if file is infected
207 // - return the output message, if file is infected
208 // - return an empty string, if file is not infected
209
210 $this->scanFilePath = $a_filepath;
211 $this->scanFileOrigName = $a_origname;
212
213 if ($a_origname == "infected.txt" or $a_origname == "cleanable.txt")
214 {
215 $this->scanFileIsInfected = true;
216 $this->scanResult =
217 "FILE INFECTED: [". $a_filepath. "] (VIRUS: simulated)";
218 $this->logScanResult();
219 return $this->scanResult;
220 }
221 else
222 {
223 $this->scanFileIsInfected = false;
224 $this->scanResult = "";
225 return "";
226 }
227 }
228
229
242 function cleanFile($a_filepath, $a_origname = "")
243 {
244 // This function needs to be redefined in child classes
245 // It should:
246 // - call the external cleaner
247 // - set cleanFilePath to a_filepath
248 // - set cleanFileOrigName to a_origname
249 // - set cleanFileIsCleaned according the clean result
250 // - set cleanResult to the cleaner output message
251 // - call logCleanResult in any case
252 // - return the output message, if file is cleaned
253 // - return an empty string, if file is not cleaned
254
255 $this->cleanFilePath = $a_filepath;
256 $this->cleanFileOrigName = $a_origname;
257
258 if ($a_origname == "cleanable.txt")
259 {
260 $this->cleanFileIsCleaned = true;
261 $this->cleanResult =
262 "FILE CLEANED: [". $a_filepath. "] (VIRUS: simulated)";
263 $this->logCleanResult();
264 return $this->cleanResult;
265 }
266 else
267 {
268 $this->cleanFileIsCleaned = false;
269 $this->cleanResult =
270 "FILE NOT CLEANED: [". $a_filepath. "] (VIRUS: simulated)";
271 $this->logCleanResult();
272 return "";
273 }
274 }
275
281 function fileCleaned()
282 {
284 }
285
291 function logScanResult()
292 {
293 $mess = "Virus Scanner (". $this->type. ")";
294 if ($this->scanFileOrigName)
295 {
296 $mess .= " (File " . $this->scanFileOrigName . ")";
297 }
298 $mess .= ": " . ereg_replace("(\r|\n)+", "; ", $this->scanResult);
299
300 $this->log->write($mess);
301 }
302
308 function logCleanResult()
309 {
310 $mess = "Virus Cleaner (". $this->type. ")";
311 if ($this->cleanFileOrigName)
312 {
313 $mess .= " (File ". $this->cleanFileOrigName. ")";
314 }
315 $mess .= ": " . ereg_replace("(\r|\n)+", "; ", $this->cleanResult);
316
317 $this->log->write($mess);
318 }
319
326 function getScanResult()
327 {
328 return $this->scanResult;
329 }
330
337 function getCleanResult()
338 {
339 return $this->cleanResult;
340 }
341
348 function getScanMessage()
349 {
350 if ($this->scanFileIsInfected)
351 {
352 $ret = sprintf($this->lng->txt("virus_infected"), $this->scanFileOrigName);
353 }
354 else
355 {
356 $ret = sprintf($this->lng->txt("virus_not_infected"),$this->scanFileOrigName);
357 }
358
359 if ($this->scanResult)
360 {
361 $ret .= " ". $this->lng->txt("virus_scan_message")
362 . "<br />"
363 . str_replace($this->scanFilePath, $this->scanFileOrigName,
364 nl2br($this->scanResult));
365 }
366 return $ret;
367 }
368
376 {
377 if ($this->cleanFileIsCleaned)
378 {
379 $ret = sprintf($this->lng->txt("virus_cleaned"), $this->cleanFileOrigName);
380 }
381 else
382 {
383 $ret = sprintf($this->lng->txt("virus_not_cleaned"),$this->cleanFileOrigName);
384 }
385
386 if ($this->cleanResult)
387 {
388 $ret .= " ". $this->lng->txt("virus_clean_message")
389 . "<br />"
390 . str_replace($this->cleanFilePath, $this->cleanFileOrigName,
391 nl2br($this->cleanResult));
392 }
393 return $ret;
394 }
395
403 {
404 return $this->scanZipFiles;
405 }
406}
407?>
static ilTempnam($a_temp_path=null)
Create a temporary file in an ILIAS writable directory.
Base class for the interface to an external virus scanner.
getCleanMessage()
get a located message with the result from the last clean
logScanResult()
write the result of the last scan to the log
scanFile($a_filepath, $a_origname="")
scan a file for viruses
ilVirusScanner($a_scancommand, $a_cleancommand)
Constructor @access public.
getScanResult()
get the pure output of the external scan
logCleanResult()
write the result of the last clean to the log
removeBufferFile($bufferFile)
getScanZipFiles()
get info if class can scan ZIP files
getCleanResult()
get the pure output of the external scan
cleanFile($a_filepath, $a_origname="")
clean an infected file
getScanMessage()
get a located message with the result from the last scan
fileCleaned()
returns wether file has been cleaned successfully or not
redirection script todo: (a better solution should control the processing via a xml file)