X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/883da338a468cff3a03d1627f3a7f7ea7afe56d6..84e6c4fa665703133b5778e92c045897df496e97:/IkiWiki/Plugin/attachment.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index 38c241350..5d918c43f 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -18,13 +18,28 @@ 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'); # These buttons are not put in the usual place, so - # is not added to the normal formbuilder button list. + # are not added to the normal formbuilder button list. $form->tmpl_param("field-upload" => ''); $form->tmpl_param("field-link" => ''); + + # 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" => '', + "field-select" => '', link => htmllink($page, $page, $f, noimageinline => 1), size => humansize((stat(_))[7]), mtime => displaytime($IkiWiki::pagemtime{$f}), @@ -220,7 +238,7 @@ sub parsesize ($) { #{{{ my $base=$size+0; # force to number use warnings; foreach my $unit (sort keys %units) { - if ($size=~/\d\Q$unit\E$/i) { + if ($size=~/[0-9\s]\Q$unit\E$/i) { return $base * $units{$unit}; } } @@ -232,7 +250,7 @@ sub humansize ($) { #{{{ foreach my $unit (reverse sort { $units{$a} <=> $units{$b} || $b cmp $a } keys %units) { if ($size / $units{$unit} > 0.25) { - return (int($size / $units{$unit} * 10)/10)."$unit"; + return (int($size / $units{$unit} * 10)/10).$unit; } } return $size; # near zero, or negative @@ -280,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; @@ -291,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