]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/attachment.pm
add mimetype checking
[ikiwiki.git] / IkiWiki / Plugin / attachment.pm
index a58f696ebf203c841e9e3c39a883c80886eddf74..5d918c43f0551baeb28c4b6b6b03035567e9ea73 100644 (file)
@@ -101,7 +101,10 @@ sub formbuilder (@) { #{{{
                            length $allowed_attachments) {
                                $allowed=pagespec_match($filename,
                                        $allowed_attachments,
-                                       file => $tempfile);
+                                       file => $tempfile,
+                                       user => $session->param("name"),
+                                       ip => $ENV{REMOTE_ADDR},
+                               );
                                last if $allowed;
                        }
                }
@@ -180,7 +183,7 @@ sub attachment_list ($) {
                    $f=~m/^\Q$loc\E[^\/]+$/ &&
                    -e "$config{srcdir}/$f") {
                        push @ret, {
-                               "field-select" => '<input type="checkbox" name="attachment_select" value="'.$f.'">',
+                               "field-select" => '<input type="checkbox" name="attachment_select" value="'.$f.'" />',
                                link => htmllink($page, $page, $f, noimageinline => 1),
                                size => humansize((stat(_))[7]),
                                mtime => displaytime($IkiWiki::pagemtime{$f}),
@@ -295,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;
 
@@ -306,4 +342,38 @@ sub match_ispage ($$;@) { #{{{
        }
 } #}}}
 
+sub match_user ($$;@) { #{{{
+       shift;
+       my $user=shift;
+       my %params=@_;
+       
+       if (! exists $params{user}) {
+               return IkiWiki::FailReason->new("no user specified");
+       }
+
+       if (defined $params{user} && lc $params{user} eq lc $user) {
+               return IkiWiki::SuccessReason->new("user is $user");
+       }
+       else {
+               return IkiWiki::FailReason->new("user is $params{user}, not $user");
+       }
+} #}}}
+
+sub match_ip ($$;@) { #{{{
+       shift;
+       my $ip=shift;
+       my %params=@_;
+       
+       if (! exists $params{ip}) {
+               return IkiWiki::FailReason->new("no IP specified");
+       }
+
+       if (defined $params{ip} && lc $params{ip} eq lc $ip) {
+               return IkiWiki::SuccessReason->new("IP is $ip");
+       }
+       else {
+               return IkiWiki::FailReason->new("IP is $params{ip}, not $ip");
+       }
+} #}}}
+
 1