File Coverage

blib/lib/File/VirusScan/Engine/Command/NAI/Uvscan.pm
Criterion Covered Total %
statement 22 66 33.3
branch 0 30 0.0
condition 0 3 0.0
subroutine 8 9 88.8
pod 1 2 50.0
total 31 110 28.1


line stmt bran cond sub pod time code
1             package File::VirusScan::Engine::Command::NAI::Uvscan;
2 1     1   98363 use strict;
  1         9  
  1         23  
3 1     1   5 use warnings;
  1         2  
  1         20  
4 1     1   4 use Carp;
  1         2  
  1         50  
5              
6 1     1   343 use File::VirusScan::Engine::Command;
  1         3  
  1         5  
7 1     1   43 use vars qw( @ISA );
  1         1  
  1         38  
8             @ISA = qw( File::VirusScan::Engine::Command );
9              
10 1     1   4 use Cwd 'abs_path';
  1         2  
  1         35  
11              
12 1     1   364 use File::VirusScan::Result;
  1         2  
  1         414  
13              
14             sub default_arguments
15             {
16 5     5 0 35 return [ qw( --mime --noboot --secure --allole ) ];
17             }
18              
19             sub scan
20             {
21 0     0 1   my ($self, $path) = @_;
22              
23 0           my $abs = abs_path($path);
24 0 0 0       if ($abs && $abs ne $path) {
25 0           $path = $abs;
26             }
27              
28 0           my ($exitcode, $scan_response) = eval { $self->_run_commandline_scanner(join(' ', $self->{command}, @{ $self->{args} }, $path, '2>&1'), qr/Found/,); };
  0            
  0            
29              
30 0 0         if($@) {
31 0           return File::VirusScan::Result->error($@);
32             }
33              
34 0 0         if(0 == $exitcode) {
35 0           return File::VirusScan::Result->clean();
36             }
37              
38 0 0         if(2 == $exitcode) {
39 0           return File::VirusScan::Result->error('Driver integrity check failed');
40             }
41              
42 0 0         if(6 == $exitcode) {
43              
44             # "A general problem occurred" -- idiot Windoze
45             # programmers... nothing else to do but pass it on
46 0           return File::VirusScan::Result->error('General problem occurred');
47             }
48              
49 0 0         if(8 == $exitcode) {
50 0           return File::VirusScan::Result->error('Could not find a driver');
51             }
52              
53 0 0         if(12 == $exitcode) {
54 0           return File::VirusScan::Result->error('Scanner tried to clean file, but failed');
55             }
56              
57 0 0         if(13 == $exitcode) {
58              
59             # Finally, the virus-hit case
60             #
61             # TODO: what if more than one virus found?
62             # TODO: can/should we capture infected filenames?
63              
64             # Sigh... stupid NAI can't have a standard message. Go
65             # through hoops to get virus name.
66 0           $scan_response =~ s/ !+//;
67 0           $scan_response =~ s/!+//;
68              
69 0           my $virus_name = '';
70              
71 0           for ($scan_response) {
72 0 0         m/Found: EICAR test file/i && do {
73 0           $virus_name = 'EICAR-Test';
74 0           last;
75             };
76 0 0         m/^\s+Found the (\S+) .*virus/i && do {
77 0           $virus_name = $1;
78 0           last;
79             };
80 0 0         m/Found the (.*) trojan/i && do {
81 0           $virus_name = $1;
82 0           last;
83             };
84 0 0         m/Found .* or variant (.*)/i && do {
85 0           $virus_name = $1;
86 0           last;
87             };
88             }
89              
90 0 0         if($virus_name eq '') {
91 0           $virus_name = 'unknown-NAI-virus';
92             }
93              
94 0           return File::VirusScan::Result->virus($virus_name);
95             }
96              
97 0 0         if(19 == $exitcode) {
98 0           return File::VirusScan::Result->error('Self-check failed');
99             }
100              
101 0 0         if(102 == $exitcode) {
102 0           return File::VirusScan::Result->error('User quit using --exit-on-error');
103             }
104              
105 0           return File::VirusScan::Result->error("Unknown return code from uvscan: $exitcode");
106             }
107              
108             1;
109             __END__