add mimetype checking
authorJoey Hess <joey@kodama.kitenet.net>
Wed, 2 Jul 2008 21:30:00 +0000 (17:30 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Wed, 2 Jul 2008 21:30:00 +0000 (17:30 -0400)
IkiWiki/Plugin/attachment.pm
doc/plugins/attachment.mdwn

index a5c42d638a6651ac1796f6db973227a14482b371..5d918c43f0551baeb28c4b6b6b03035567e9ea73 100644 (file)
@@ -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;
 
index 184f5b5df55f2a71b1fa53281d8f931d16d45ee0..01816cd5c70d9d51b9f29f20d4b10bc91f958f00 100644 (file)
@@ -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/*)`.