From b9418274203916d1bea75c9da581a6a1dba0a30e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Jul 2008 17:30:00 -0400 Subject: [PATCH] add mimetype checking --- IkiWiki/Plugin/attachment.pm | 33 +++++++++++++++++++++++++++++++++ doc/plugins/attachment.mdwn | 8 +++++++- 2 files changed, 40 insertions(+), 1 deletion(-) 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/*)`. -- 2.44.0