#!/usr/bin/perl
#FiltUx 2.0
#Filtro para escanear correos electronicos para detectar la presencia de virus.
#Elaborado por: OrvUx <orvux@ipsgroup1.com>
#Licencia GPL
#Puede modificar y distribuir este archivo siempre y cuando haga referencia a la Licencia GPL
#Reemplazar la cadena orvux por el usuario real y root@dominio por la direccion real del 
#Administrador del servidor.
#El archivo sign.orv debe contener la firma.
use strict;
use Mail::Internet;
use MIME::Lite;
use Fcntl ':flock';
my $msg;
my $mail;
my @mail=<>;
my $intVeces=0;
my $strPacketReturnBuffer;
my $strFrom;
my $strLinea;
my $intVirus=0;
my $strSubj;
$mail=Mail::Internet->new(\@mail);
my $Cabecera=$mail->head();
$strFrom=$Cabecera->get('From:');
$strSubj=$Cabecera->get('Subject:'); 
foreach $strLinea (@{$mail->body})
{
	if ($strLinea=~/.*name=.*(\.cmd|\.bat|\.exe|\.vbs|\.zip|\.htm|\.com|\.scr|\.pif|\.js|\.mp3|\.wav|\.ram|\.avi).*/i)
	{
		$intVeces++;
	}
}
if ($intVeces == 0)
{
	open F1, ">>/var/spool/mail/orvux" or die "Can't open file orvux";
	fcntl(F1,LOCK_EX,$strPacketReturnBuffer) or die "Can't lock file orvux";
	$mail->add_signature('/home/users/orvux/sign.orv');
	print F1 $mail->as_mbox_string() or die "Can't Write to file orvux";
	fcntl(F1,LOCK_UN,$strPacketReturnBuffer) or die "Can't unlock file orvux";
	close F1 or die "Can't close file orvux";
}
else
{
	open F3, ">/home/users/orvux/mail.orv" or die "Can't Create file orvux/mail.orv";
	fcntl(F3,LOCK_EX,$strPacketReturnBuffer) or die "Can't lock file orvux/mail.orv";
	print F3 $mail->as_mbox_string() or die "Can't Write to file orvux/mail.orv";
	fcntl(F3,LOCK_UN,$strPacketReturnBuffer) or die "Can't Unlock file orvux/mail.orv";
	close F3 or die "Can't Close file orvux/mail.orv";
	if (! open(ANTIV,"/usr/local/bin/clamscan -i --unzip -m --stdout --no-summary /home/users/orvux/mail.orv |"))
	{
        	die "No puedo establecer la pipa.\n";
	}
	while(<ANTIV>)
	{
        	if($_=~/FOUND/i)
        	{
		#Descomentar la linea siguiente si se quiere obtener el nombre del virus.($Virus)
   		#	($Archivo,$Virus,$Mensaje)=split;
                	$intVirus=1;
        	}
		last if($intVirus==1);
	}
	if ($intVirus == 1)
	{
		open F2, ">>/home/users/orvux/borrados.log" or die "Can't Open file orvux/borrados.log";
		fcntl(F2,LOCK_EX,$strPacketReturnBuffer) or die "Can't lock file orvux/borrados.log";
		$mail->add_signature('/home/users/orvux/sign.orv');
		print F2 $mail->as_mbox_string() or die "Can't Write to file orvux/borrados.log";
		fcntl(F2,LOCK_UN,$packet_return_buffer) or die "Can't Unlock file orvux/borrados.log";
		close F2 or die "Can't Close file orvux/borrados.log";
		$msg = MIME::Lite->new(From    => 'root@dominio',
                       To      => $strFrom,
                       Subject => 'Su mensaje contiene virus ('.$strSubj.')',
                       Type    => 'TEXT',
                       Data    => "Hola:\n\tHemos recibido un mensaje suyo con virus y lo hemos eliminado del buzon de: orvux.\n\tEste proceso es automatico, ninguna persona ha visto su correo.\n\nGracias.\n\nroot\n\n\n-- \nFiltrado con: FiltUx 2.0 (orvux\@ipsgroup1.com)\nVerificado contra virus con: ClamAV 0.67 (http://www.clamav.net/");
		$msg->send();

	}
	else
	{
		open F1, ">>/var/spool/mail/orvux" or die "Can't open file orvux";
	        fcntl(F1,LOCK_EX,$strPacketReturnBuffer) or die "Can't lock file orvux";
		$mail->add_signature('/home/users/orvux/sign.orv');
        	print F1 $mail->as_mbox_string() or die "Can't Write to file orvux";
	        fcntl(F1,LOCK_UN,$packet_return_buffer) or die "Can't unlock file orvux";
        	close F1 or die "Can't close file orvux";
	}
}
