]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/attachment.pm
a few bugfixes
[git.ikiwiki.info.git] / IkiWiki / Plugin / attachment.pm
index f4f64b46a54ec9ad574cebf3b7715080d0882343..01d0d24784316b7302beee90f5df4d9580a5575d 100644 (file)
@@ -21,6 +21,8 @@ sub formbuilder_setup (@) { #{{{
        my $q=$params{cgi};
 
        if (defined $form->field("do") && $form->field("do") eq "edit") {
        my $q=$params{cgi};
 
        if (defined $form->field("do") && $form->field("do") eq "edit") {
+               # Add attachment field, set type to multipart.
+               $form->enctype(&CGI::MULTIPART);
                $form->field(name => 'attachment', type => 'file');
                # These buttons are not put in the usual place, so
                # are not added to the normal formbuilder button list.
                $form->field(name => 'attachment', type => 'file');
                # These buttons are not put in the usual place, so
                # are not added to the normal formbuilder button list.
@@ -87,7 +89,19 @@ sub formbuilder (@) { #{{{
                # This is an (apparently undocumented) way to get the name
                # of the temp file that CGI writes the upload to.
                my $tempfile=$q->tmpFileName($filename);
                # This is an (apparently undocumented) way to get the name
                # of the temp file that CGI writes the upload to.
                my $tempfile=$q->tmpFileName($filename);
-               
+               if (! defined $tempfile || ! length $tempfile) {
+                       # perl 5.8 needs an alternative, awful method
+                       if ($q =~ /HASH/ && exists $q->{'.tmpfiles'}) {
+                               foreach my $key (keys(%{$q->{'.tmpfiles'}})) {
+                                       $tempfile=$q->tmpFileName(\$key);
+                                       last if defined $tempfile && length $tempfile;
+                               }
+                       }
+                       if (! defined $tempfile || ! length $tempfile) {
+                               error("CGI::tmpFileName failed to return the uploaded file name");
+                       }
+               }
+
                $filename=IkiWiki::titlepage(
                        IkiWiki::possibly_foolish_untaint(
                                attachment_location($form->field('page')).
                $filename=IkiWiki::titlepage(
                        IkiWiki::possibly_foolish_untaint(
                                attachment_location($form->field('page')).
@@ -136,7 +150,10 @@ sub formbuilder (@) { #{{{
                                # needed by old CGI versions
                                $fh=$q->param('attachment');
                                if (! defined $fh || ! ref $fh) {
                                # needed by old CGI versions
                                $fh=$q->param('attachment');
                                if (! defined $fh || ! ref $fh) {
-                                       error("failed to get filehandle");
+                                       # even that doesn't always work,
+                                       # fall back to opening the tempfile
+                                       $fh=undef;
+                                       open($fh, "<", $tempfile) || error("failed to open \"$tempfile\": $!");
                                }
                        }
                        binmode($fh);
                                }
                        }
                        binmode($fh);
@@ -369,6 +386,9 @@ sub match_virusfree ($$;@) { #{{{
        waitpid $pid, 0;
        $SIG{PIPE}="DEFAULT";
        if ($sigpipe || $?) {
        waitpid $pid, 0;
        $SIG{PIPE}="DEFAULT";
        if ($sigpipe || $?) {
+               if (! length $reason) {
+                       $reason="virus checker $IkiWiki::config{virus_checker}; failed with no output";
+               }
                return IkiWiki::FailReason->new("file seems to contain a virus ($reason)");
        }
        else {
                return IkiWiki::FailReason->new("file seems to contain a virus ($reason)");
        }
        else {