X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/71f10579c00a8ddc20ada1a1efd33aac25a3da7e..refs/heads/debian-oldstable:/IkiWiki/Plugin/attachment.pm

diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm
index f4f64b46a..01d0d2478 100644
--- a/IkiWiki/Plugin/attachment.pm
+++ b/IkiWiki/Plugin/attachment.pm
@@ -21,6 +21,8 @@ sub formbuilder_setup (@) { #{{{
 	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.
@@ -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);
-		
+		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')).
@@ -136,7 +150,10 @@ sub formbuilder (@) { #{{{
 				# 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);
@@ -369,6 +386,9 @@ sub match_virusfree ($$;@) { #{{{
 	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 {