File-Scan

 view release on metacpan or  search on metacpan

examples/procmail/scanvirus.pl  view on Meta::CPAN

			if(/^[A-Za-z0-9\+\=\/]{76}\x0d?\x0a[A-Za-z0-9\+\=\/]{76}\x0d?\x0a/o) {
				my $error = &decode_b64_file(\%hash, $tmp_dir, $file);
				&logs("error.log", $error) if($error);
				return("Base64 encoded file");
			}
			return("");
		}
	);
	my $status = 0;
	FILE: for my $file (keys(%{$files})) {
		my $virus = $fs->scan($file);
		if(scalar(keys(%hash))) {
			$status = &init_scan($tmp_dir, \%hash, $from, $user);
			$files = {%{$files}, %hash};
			%hash = ();
			$status and return($status);
		}
		if(my $e = $fs->error) {
			$preserve = 1;
			&logs("error.log", "$e\n");
			next FILE;
		}
		unless($status) {
			my ($shortfn) = ($file =~ /([^\/]+)$/o);
			if($virus) {
				$status = 1;
				delete($files->{$file});
				my $string = join("", "\"$shortfn\" (", $virus, ")");
				&logs("virus.log", "[$string] From: $from\n");
				&virus_mail($string, $from, $to, $user);
			} else {
				&suspicious_mail($shortfn, $from, $to) if($suspicious eq "yes");
			}
		}
	}
	return($status);
}

#---deliver_msg-----------------------------------------------------------

sub deliver_msg {
	my $msg = shift;
	my $line_from = shift;
	my $user = shift;
	my $maildir = shift;

	my $mailbox = "$maildir/$user";
	open(MSG, "<$msg") or &close_app("$!");
	open(MAILBOX, ">>$mailbox") or &close_app("$!");
	flock(MAILBOX, LOCK_EX);
	seek(MAILBOX, 0, SEEK_END);
	print MAILBOX $line_from;
	while(<MSG>) { print MAILBOX $_; }
	print MAILBOX "\n"; 
	flock(MAILBOX, LOCK_UN);
	close(MAILBOX);
	close(MSG);

	chmod(0600, $mailbox);
	my ($uid, $gid) = (getpwnam($user))[2,3];
	chown($uid, $gid, $mailbox) if($uid && $gid);

	return();
}

#---clean_dir-------------------------------------------------------------

sub clean_dir {
	my $dir = shift;

	my @files = ();
	opendir(DIRECTORY, $dir) or return("Can't opendir $dir: $!");
	while(defined(my $file = readdir(DIRECTORY))) {
		next if($file =~ /^\.\.?$/);
		push(@files, "$dir/$file");
	}
	closedir(DIRECTORY);
	for my $file (@files) {
		if($file =~ /^(.+)$/s) { unlink($1) or return("Could not delete $1: $!"); }
	}
	rmdir($dir) or return("Couldn't remove dir $dir: $!");
	return();
}

#---set_addr--------------------------------------------------------------

sub set_addr {
	my $user = shift || "unknown";
	my $email = shift || "unknown";

	my $name = &getusername($user);
	return("$name <$email>");
}

#---getusername-----------------------------------------------------------

sub getusername {
	my $user = shift || return("unknown");

	my ($name) = split(/,/, (getpwnam($user))[6]);
	return($name || "unknown");
}

#---suspicious_mail-------------------------------------------------------

sub suspicious_mail {
	my $file = shift;
	my $from = shift;
	my $to = shift;
 
	my $data = <<DATATXT;
Suspicious file alert: $file

The e-mail from $from has a suspicious file attachement.

Please take a look at the suspicious file.

Thank You.

$copyrg



( run in 1.098 second using v1.01-cache-2.11-cpan-71847e10f99 )