Recursive archive attachment expansion and filetype/name checks

Harris S neb9002 at gmail.com
Tue Apr 25 11:52:59 IST 2006


In-Reply-To=4fac50550604241729u16efcb61r4b3773c8778db3e3 at mail.gmail.com

Hello Julian,

Thank you for your prompt reply :-)

However, I think I have nailed it down (although I would appreciate it
if you told me I did a mistake going into such lengths.... I hope not
:-S )


The MS code does not deal yet with gz (or tgz..) and it does not
effectively identify the file as an archive (Idea - At the expense of
compatibility with W32 platforms, could the 'file' system be used to
identify archives instead of the small $buffer code snippet?)

It turns out that the Archive::Zip module will not expand gz archives
anyway, so even if the system was able to identify it, it would not be
able to expand it.
(Archive::Extract, I did not particularly like it, but what about
using as a last resort?)

As gzip can only pack one archive at a time, and with the
proliferation of winZip which does autoexpand gz's (ok... XP native
zip support is far more dangerous), I thought I should have a go at
hacking the code.

Below is the result of this morning's effort (and hopefully to a live
system today) :-)

Regards,

Harris
-----------------------------------------------

1747c1747
<   my($cyclecounter, $rarerror);
---
>   my($cyclecounter, $rarerror, $gziperror);
1906a1907,1908
>                 # Added by Harris
>                 $buffer eq "\x1f\x8b\x08\x08" ||
1931c1933,1943
<       # If unpacking as a zip failed, try it as a rar
---
>       # If unpacking as a zip failed, try it as a gzip
>
>       # GZIP unpacking
>       # Added by Harris
>
>       $gziperror = "";
>       #print STDERR "About to unpack gzip $part\n";
>       $gziperror = $this->UnpackGzip($part, $explodeinto);
>       #print STDERR "* * * * * * * UnpackGzip $part returned $ziperror\n";
>       # If unpacking as a gzip failed, try it as a rar
>
2400a2413,2430
>
> # Unpack a gzip file into the named directory.
> # Return 1 if an error occurred, else 0.
> # Return 0 on success.
> sub UnpackGzip {
>   my($this, $gzipname, $explodeinto) = @_;
>
>   my($gzip);
>
>   #print STDERR "Unpacking $gzipname\n";
>   return 1 if -s "$explodeinto/$gzipname" == 4_237_4; # zip of death?
>   return 1 unless $gzip = SafePipe( "gunzip -d -S $explodeinto/$gzipname -o gzip_out $gzipname 2>/dev/null", 10);
>
>   return 0;
> }
>
>
>


More information about the MailScanner mailing list