/htdocs/core/class/antivir.class.php
PHP | 167 lines | 60 code | 25 blank | 82 comment | 5 complexity | e47c72166a14a05e553a42357127aa38 MD5 | raw file
Possible License(s): LGPL-2.0
- <?php
- /* Copyright (C) 2000-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
- * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
- * Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
- * Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * or see http://www.gnu.org/
- */
- /**
- * \file htdocs/core/class/antivir.class.php
- * \brief File of class to scan viruses
- * \author Laurent Destailleur.
- */
- /**
- * \class AntiVir
- * \brief Class to scan for virus
- */
- class AntiVir
- {
- var $error;
- var $errors;
- var $output;
- var $db;
- /**
- * Constructor
- *
- * @param DoliDB $db Database handler
- * @return AntiVir
- */
- function AntiVir($db)
- {
- $this->db=$db;
- }
- /**
- * Scan a file with antivirus.
- * This function runs the command defined in setup. This antivirus command must return 0 if OK.
- *
- * @param file File to scan
- * @return int <0 if KO (-98 if error, -99 if virus), 0 if OK
- */
- function dol_avscan_file($file)
- {
- global $conf;
- $return = 0;
- $fullcommand=$this->getCliCommand($file);
- //$fullcommand='"c:\Program Files (x86)\ClamWin\bin\clamscan.exe" --database="C:\Program Files (x86)\ClamWin\lib" "c:\temp\aaa.txt"';
- $fullcommand.=' 2>&1'; // This is to get error output
- $output=array();
- $return_var=0;
- $safemode=ini_get("safe_mode");
- // Create a clean fullcommand
- dol_syslog("AntiVir::dol_avscan_file Run command=".$fullcommand." with safe_mode ".($safe_mode?"on":"off"));
- // Run CLI command. If run of Windows, you can get return with echo %ERRORLEVEL%
- $lastline=exec($fullcommand, $output, $return_var);
- //print "x".$lastline." - ".join(',',$output)." - ".$return_var."y";exit;
- /*
- $outputfile=$conf->admin->dir_temp.'/dol_avscan_file.out.'.session_id();
- $handle = fopen($outputfile, 'w');
- if ($handle)
- {
- $handlein = popen($fullcommand, 'r');
- while (!feof($handlein))
- {
- $read = fgets($handlein);
- fwrite($handle,$read);
- }
- pclose($handlein);
- $errormsg = fgets($handle,2048);
- $this->output=$errormsg;
- fclose($handle);
- if (! empty($conf->global->MAIN_UMASK))
- @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
- }
- else
- {
- $langs->load("errors");
- dol_syslog("Failed to open file ".$outputfile,LOG_ERR);
- $this->error="ErrorFailedToWriteInDir";
- $return=-1;
- }
- */
- dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',',$output));
- $returncodevirus=1;
- if ($return_var == $returncodevirus) // Virus found
- {
- $this->errors=$output;
- return -99;
- }
- if ($return_var > 0) // If other error
- {
- $this->errors=$output;
- return -98;
- }
- // If return code = 0
- return 1;
- }
- /**
- * \brief get full Command Line to run
- * \param file File to scan
- * \return string Full command line to run
- */
- function getCliCommand($file)
- {
- global $conf;
- $maxreclevel = 5 ; // maximal recursion level
- $maxfiles = 1000; // maximal number of files to be scanned within archive
- $maxratio = 200; // maximal compression ratio
- $bz2archivememlim = 0; // limit memory usage for bzip2 (0/1)
- $maxfilesize = 10485760; // archived files larger than this value (in bytes) will not be scanned
- $command=$conf->global->MAIN_ANTIVIRUS_COMMAND;
- $param=$conf->global->MAIN_ANTIVIRUS_PARAM;
- $param=preg_replace('/%maxreclevel/',$maxreclevel,$param);
- $param=preg_replace('/%maxfiles/',$maxfiles,$param);
- $param=preg_replace('/%maxratio/',$maxratio,$param);
- $param=preg_replace('/%bz2archivememlim/',$bz2archivememlim,$param);
- $param=preg_replace('/%maxfilesize/',$maxfilesize,$param);
- $param=preg_replace('/%file/',trim($file),$param);
- if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM))
- $param=$param." ".escapeshellarg(trim($file));
- if (preg_match("/\s/",$command)) $command=escapeshellarg($command); // Use quotes on command. Using escapeshellcmd fails.
- $ret=$command.' '.$param;
- //$ret=$command.' '.$param.' 2>&1';
- //print "xx".$ret."xx";exit;
- return $ret;
- }
- }
- ?>