]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/attachment.pm
factor out glob2re
[ikiwiki.git] / IkiWiki / Plugin / attachment.pm
index ae06922d4b0528a171ae29c1c5559e682c75789e..1bcf5a2e49e43e55aca07ad8ddb8d885e7cc903f 100644 (file)
@@ -18,6 +18,7 @@ sub checkconfig () { #{{{
 sub formbuilder_setup (@) { #{{{
        my %params=@_;
        my $form=$params{form};
+       my $q=$params{cgi};
 
        if ($form->field("do") eq "edit") {
                $form->field(name => 'attachment', type => 'file');
@@ -25,6 +26,20 @@ sub formbuilder_setup (@) { #{{{
                # are not added to the normal formbuilder button list.
                $form->tmpl_param("field-upload" => '<input name="_submit" type="submit" value="Upload Attachment" />');
                $form->tmpl_param("field-link" => '<input name="_submit" type="submit" value="Insert Links" />');
+
+               # Add the javascript from the toggle plugin;
+               # the attachments interface uses it to toggle visibility.
+               require IkiWiki::Plugin::toggle;
+               $form->tmpl_param("javascript" => $IkiWiki::Plugin::toggle::javascript);
+               # Start with the attachments interface toggled invisible,
+               # but if it was used, keep it open.
+               if ($form->submitted ne "Upload Attachment" &&
+                   ! length $q->param("attachment_select")) {
+                       $form->tmpl_param("attachments-class" => "toggleable");
+               }
+               else {
+                       $form->tmpl_param("attachments-class" => "toggleable-open");
+               }
        }
        elsif ($form->title eq "preferences") {
                my $session=$params{session};
@@ -86,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;
                        }
                }
@@ -136,7 +154,7 @@ sub formbuilder (@) { #{{{
                }
                $form->field(name => 'editcontent',
                        value => $form->field('editcontent')."\n\n".$add,
-                       force => 1);
+                       force => 1) if length $add;
        }
        
        # Generate the attachment list only after having added any new
@@ -165,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}),
@@ -280,6 +298,35 @@ 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";
+       }
+
+       my $regexp=IkiWiki::glob2re($wanted);
+       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;
 
@@ -291,4 +338,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