X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/b19fb349f57e7dd9914aae728c5243dc6640026f..0cc2a36f593fd14b6345ad2c0b446edb2bafbe2e:/IkiWiki/Plugin/filecheck.pm?ds=sidebyside

diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index 0501ba99c..3b0a7b314 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -39,6 +39,19 @@ my %units=(		# size in bytes
 	#   -- Joey
 );
 
+sub import {
+	hook(type => "getsetup", id => "filecheck",  call => \&getsetup);
+}
+
+sub getsetup () {
+	return
+		plugin => {
+			safe => 1,
+			rebuild => undef,
+			section => "misc",
+		},
+}
+
 sub parsesize ($) {
 	my $size=shift;
 
@@ -75,9 +88,9 @@ sub match_maxsize ($$;@) {
 	}
 
 	my %params=@_;
-	my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+	my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
 	if (! defined $file) {
-		return IkiWiki::ErrorReason->new("no file specified");
+		return IkiWiki::ErrorReason->new("file does not exist");
 	}
 
 	if (-s $file > $maxsize) {
@@ -96,9 +109,9 @@ sub match_minsize ($$;@) {
 	}
 
 	my %params=@_;
-	my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+	my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
 	if (! defined $file) {
-		return IkiWiki::ErrorReason->new("no file specified");
+		return IkiWiki::ErrorReason->new("file does not exist");
 	}
 
 	if (-s $file < $minsize) {
@@ -114,20 +127,34 @@ sub match_mimetype ($$;@) {
 	my $wanted=shift;
 
 	my %params=@_;
-	my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+	my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
 	if (! defined $file) {
-		return IkiWiki::ErrorReason->new("no file specified");
+		return IkiWiki::ErrorReason->new("file does not exist");
 	}
 
-	# Use ::magic to get the mime type, the idea is to only trust
-	# data obtained by examining the actual file contents.
+	# Get the mime type.
+	#
+	# First, try File::Mimeinfo. This is fast, but doesn't recognise
+	# all files.
 	eval q{use File::MimeInfo::Magic};
-	if ($@) {
-		return IkiWiki::ErrorReason->new("failed to load File::MimeInfo::Magic ($@); cannot check MIME type");
+	my $mimeinfo_ok=! $@;
+	my $mimetype;
+	if ($mimeinfo_ok) {
+		my $mimetype=File::MimeInfo::Magic::magic($file);
 	}
-	my $mimetype=File::MimeInfo::Magic::magic($file);
+
+	# Fall back to using file, which has a more complete
+	# magic database.
 	if (! defined $mimetype) {
-		$mimetype=File::MimeInfo::Magic::default($file);
+		open(my $file_h, "-|", "file", "-bi", $file);
+		$mimetype=<$file_h>;
+		chomp $mimetype;
+		close $file_h;
+	}
+	if (! defined $mimetype || $mimetype !~s /;.*//) {
+		# Fall back to default value.
+		$mimetype=File::MimeInfo::Magic::default($file)
+			if $mimeinfo_ok;
 		if (! defined $mimetype) {
 			$mimetype="unknown";
 		}
@@ -147,9 +174,9 @@ sub match_virusfree ($$;@) {
 	my $wanted=shift;
 
 	my %params=@_;
-	my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+	my $file=exists $params{file} ? $params{file} : IkiWiki::srcfile($IkiWiki::pagesources{$page});
 	if (! defined $file) {
-		return IkiWiki::ErrorReason->new("no file specified");
+		return IkiWiki::ErrorReason->new("file does not exist");
 	}
 
 	if (! exists $IkiWiki::config{virus_checker} ||