use MIME::Parser;
use PMG::Utils;
+use PMG::MIMEUtils;
my $unpackers = {
$inputfilename = '/dev/null' if !$inputfilename;
- # same algorythm as used inside SA
+ # same algorithm as used inside SA
my $fd = fileno (STDIN);
close STDIN;
$self->{debug} = $param{debug} || 0;
$self->{mime} = {};
+ $self->{filenames} = {};
- $self->{ufid} = 0; # counter to creat unique file names
- $self->{udid} = 0; # counter to creat unique dir names
- $self->{ulid} = 0; # counter to creat unique link names
+ $self->{ufid} = 0; # counter to create unique file names
+ $self->{udid} = 0; # counter to create unique dir names
+ $self->{ulid} = 0; # counter to create unique link names
$self->{todo} = [];
my $ratio = $usize/$compsize;
- die "compresion ratio too large (> $self->{maxratio})"
+ die "compression ratio too large (> $self->{maxratio})"
if $ratio > $self->{maxratio};
}
my $sizediff = $csize ? $size - $csize : $size;
- die "compresion ratio too large (> $self->{maxratio})"
+ die "compression ratio too large (> $self->{maxratio})"
if $self->{maxratio} && (($self->{size} + $sizediff) > $self->{ratioquota});
die "archive too large (> $self->{quota})"
sub add_glob_mime_type {
my ($self, $filename) = @_;
- if (my $ct = xdg_mime_get_mime_type_from_file_name (basename ($filename))) {
- $self->{mime}->{$ct} = 1 if $ct ne 'application/octet-stream';
- }
-}
-
-sub walk_mime_entity {
- my ($self, $entity) = @_;
-
- my $count = 0;
- my $size = 0;
-
- my $ct = $entity->head->mime_attr ('content-type');
- $self->{mime}->{$ct} = 1 if $ct && length ($ct) < 256;
-
- if (my $body = $entity->bodyhandle) {
- my $path = $body->path;
- $size = -s $path;
- $count = 1;
- }
+ my $basename = basename($filename);
+ $self->{filenames}->{$basename} = 1;
- foreach my $part ($entity->parts) {
- if (my ($n, $s) = $self->walk_mime_entity ($part)) {
- $count += $n;
- $size += $s;
- }
+ if (my $ct = xdg_mime_get_mime_type_from_file_name($basename)) {
+ $self->{mime}->{$ct} = 1 if $ct ne 'application/octet-stream';
}
-
- return ($count, $size);
}
-
sub unpack_mime {
my ($self, $app, $filename, $tmpdir, $csize, $filesize) = @_;
run_with_timeout ($timeout, sub {
# Create a new MIME parser:
- my $parser = new MIME::Parser;
- $parser->output_under ($tmpdir);
- $parser->extract_nested_messages (1);
- $parser->ignore_errors (1);
- $parser->extract_uuencode (1);
- $parser->filer->ignore_filename(1);
-
+ my $max;
if ($self->{maxfiles}) {
- my $max = $self->{maxfiles} - $self->{files};
- $parser->max_parts ($max);
+ $max = $self->{maxfiles} - $self->{files};
}
+ my $parser = PMG::MIMEUtils::new_mime_parser({
+ dumpdir => $tmpdir,
+ nested => 1,
+ ignore_errors => 1,
+ extract_uuencode => 1,
+ ignore_filename => 1,
+ maxfiles => $max,
+ }, 1);
+
my $entity = $parser->parse_open ($filename);
- ($files, $size) = $self->walk_mime_entity ($entity);
+ PMG::MIMEUtils::traverse_mime_parts($entity, sub {
+ my ($part) = @_;
+ my $ct = $part->head->mime_attr('content-type');
+ $self->{mime}->{$ct} = 1 if $ct && length($ct) < 256;
+ if (my $body = $part->bodyhandle) {
+ my $path = $body->path;
+ $size += -s $path;
+ $files++;
+ }
+ });
});
};
die "unable to create LibArchive object" if !$a;
LibArchive::archive_read_support_format_all ($a);
- LibArchive::archive_read_support_compression_all ($a);
+ LibArchive::archive_read_support_filter_all ($a);
eval {
run_with_timeout ($timeout, sub {
my $err = $@;
LibArchive::archive_read_close($a);
- LibArchive::archive_read_finish($a);
+ LibArchive::archive_read_free($a);
die $err if $err;
# content types (detected by magic numbers and file extension)
# Extracted files are stored inside 'tempdir'.
#
-# returns: true if file is archive, undef otherwhise
+# returns: true if file is archive, undef otherwise
sub unpack_archive {
my ($self, $filename, $ct) = @_;