From: Joey Hess <joey@kodama.kitenet.net>
Date: Wed, 2 Jul 2008 21:30:00 +0000 (-0400)
Subject: add mimetype checking
X-Git-Tag: 2.52~11
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/b9418274203916d1bea75c9da581a6a1dba0a30e?ds=inline

add mimetype checking
---

diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm
index a5c42d638..5d918c43f 100644
--- a/IkiWiki/Plugin/attachment.pm
+++ b/IkiWiki/Plugin/attachment.pm
@@ -298,6 +298,39 @@ sub match_minsize ($$;@) { #{{{
 	}
 } #}}}
 
+sub match_mimetype ($$;@) { #{{{
+	shift;
+	my $wanted=shift;
+
+	my %params=@_;
+	if (! exists $params{file}) {
+		return IkiWiki::FailReason->new("no file specified");
+	}
+
+	# Use ::magic to get the mime type, the idea is to only trust
+	# data obtained by examining the actual file contents.
+	eval q{use File::MimeInfo::Magic};
+	if ($@) {
+		return IkiWiki::FailReason->new("failed to load File::MimeInfo::Magic ($@); cannot check MIME type");
+	}
+	my $mimetype=File::MimeInfo::Magic::magic($params{file});
+	if (! defined $mimetype) {
+		$mimetype="unknown";
+	}
+
+	# turn glob into a safe regexp
+	my $regexp=quotemeta($wanted);
+	$regexp=~s/\\\*/.*/g;
+	$regexp=~s/\\\?/./g;
+
+	if ($mimetype!~/^$regexp$/i) {
+		return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
+	}
+	else {
+		return IkiWiki::SuccessReason->new("file MIME type is $mimetype");
+	}
+} #}}}
+
 sub match_ispage ($$;@) { #{{{
 	my $filename=shift;
 
diff --git a/doc/plugins/attachment.mdwn b/doc/plugins/attachment.mdwn
index 184f5b5df..01816cd5c 100644
--- a/doc/plugins/attachment.mdwn
+++ b/doc/plugins/attachment.mdwn
@@ -29,7 +29,7 @@ For example, to limit arbitrary files to 50 kilobytes, but allow
 larger mp3 files to be uploaded by joey, a test like this could be
 used:
   
-	(user(joey) and *.mp3 and maxsize(15mb)) or (!ispage() and maxsize(50kb))
+	(user(joey) and *.mp3 and mimetype(audio/mpeg) and maxsize(15mb)) or (!ispage() and maxsize(50kb))
 
 The following additional tests are available:
 
@@ -62,3 +62,9 @@ The following additional tests are available:
 
   Tests whether the attacment is being uploaded from the specified IP
   address.
+
+* mimetype(foo/bar)
+
+  If the [[cpan File::MimeInfo::Magic]] perl module is installed, this
+  allows checking the mime type of the attachment. You can include a glob
+  in the type, for example `mimetype(image/*)`.