]> git.proxmox.com Git - pmg-api.git/blobdiff - src/PMG/Unpack.pm
unpack: adapt to new libarchive methods
[pmg-api.git] / src / PMG / Unpack.pm
index c608aed975d0e12920b5cad42630ba3c30095c8b..d4fe4547ba9341a23a6841f9e24b756ed65605df 100755 (executable)
@@ -18,6 +18,7 @@ use LibArchive;
 use MIME::Parser;
 
 use PMG::Utils;
+use PMG::MIMEUtils;
 
 my $unpackers = {
 
@@ -101,7 +102,7 @@ sub helper_pipe_open {
 
     $inputfilename = '/dev/null' if !$inputfilename;
 
-    # same algorythm as used inside SA
+    # same algorithm as used inside SA
 
     my $fd = fileno (STDIN);
     close STDIN;
@@ -258,10 +259,11 @@ sub new {
     $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} = [];
 
@@ -461,7 +463,7 @@ sub check_comp_ratio {
 
     my $ratio = $usize/$compsize;
 
-    die "compresion ratio too large (> $self->{maxratio})"
+    die "compression ratio too large (> $self->{maxratio})"
        if $ratio > $self->{maxratio};
 }
 
@@ -470,7 +472,7 @@ sub check_quota {
 
     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})"
@@ -493,37 +495,14 @@ sub check_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) = @_;
 
@@ -536,22 +515,33 @@ sub unpack_mime {
        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++;
+               }
+           });
        });
     };
 
@@ -691,7 +681,7 @@ sub unpack_tar {
     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 {
@@ -795,7 +785,7 @@ sub unpack_tar {
     my $err = $@;
 
     LibArchive::archive_read_close($a);
-    LibArchive::archive_read_finish($a);
+    LibArchive::archive_read_free($a);
 
     die $err if $err;
 
@@ -1069,7 +1059,7 @@ sub is_archive {
 # 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) = @_;