X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/cbddb5a4b8e0e2fb63886ad9d1cf8a087cdb83b1..9a6005a212f9be2395943f424e48270b24588fcd:/IkiWiki/Plugin/remove.pm diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm index 4c73ed9e5..c512b3b97 100644 --- a/IkiWiki/Plugin/remove.pm +++ b/IkiWiki/Plugin/remove.pm @@ -6,17 +6,25 @@ use strict; use IkiWiki 2.00; sub import { #{{{ + hook(type => "getsetup", id => "remove", call => \&getsetup); hook(type => "formbuilder_setup", id => "remove", call => \&formbuilder_setup); hook(type => "formbuilder", id => "remove", call => \&formbuilder); hook(type => "sessioncgi", id => "remove", call => \&sessioncgi); } # }}} -sub check_canremove ($$$$) { +sub getsetup () { #{{{ + return + plugin => { + safe => 1, + rebuild => 0, + }, +} #}}} + +sub check_canremove ($$$) { #{{{ my $page=shift; my $q=shift; my $session=shift; - my $attachment=shift; # Must be a known source file. if (! exists $pagesources{$page}) { @@ -33,25 +41,30 @@ sub check_canremove ($$$$) { error(sprintf(gettext("%s is not a file"), $file)); } - # Must be editiable. + # Must be editable. IkiWiki::check_canedit($page, $q, $session); - # This is sorta overkill, but better safe - # than sorry. If a user can't upload an - # attachment, don't let them delete it. - if ($attachment) { - IkiWiki::Plugin::attachment::check_canattach($session, $page, $file); + # If a user can't upload an attachment, don't let them delete it. + # This is sorta overkill, but better safe than sorry. + if (! defined pagetype($pagesources{$page})) { + if (IkiWiki::Plugin::attachment->can("check_canattach")) { + IkiWiki::Plugin::attachment::check_canattach($session, $page, $file); + } + else { + error("renaming of attachments is not allowed"); + } } -} +} #}}} sub formbuilder_setup (@) { #{{{ my %params=@_; my $form=$params{form}; my $q=$params{cgi}; - if (defined $form->field("do") && $form->field("do") eq "edit") { + if (defined $form->field("do") && ($form->field("do") eq "edit" || + $form->field("do") eq "create")) { # Removal button for the page, and also for attachments. - push @{$params{buttons}}, "Remove"; + push @{$params{buttons}}, "Remove" if $form->field("do") eq "edit"; $form->tmpl_param("field-remove" => ''); } } #}}} @@ -79,13 +92,15 @@ sub confirmation_form ($$) { #{{{ return $f, ["Remove", "Cancel"]; } #}}} -sub removal_confirm ($$@) { +sub removal_confirm ($$@) { #{{{ my $q=shift; my $session=shift; my $attachment=shift; my @pages=@_; - check_canremove($_, $q, $session, $attachment) foreach @pages; + foreach my $page (@pages) { + check_canremove($page, $q, $session); + } # Save current form state to allow returning to it later # without losing any edits. @@ -98,7 +113,7 @@ sub removal_confirm ($$@) { my ($f, $buttons)=confirmation_form($q, $session); $f->title(sprintf(gettext("confirm removal of %s"), - join(", ", map { IkiWiki::pagetitle($_) } @pages))); + join(", ", map { pagetitle($_) } @pages))); $f->field(name => "page", type => "hidden", value => \@pages, force => 1); if (defined $attachment) { $f->field(name => "attachment", type => "hidden", @@ -107,9 +122,9 @@ sub removal_confirm ($$@) { IkiWiki::showform($f, $buttons, $session, $q); exit 0; -} +} #}}} -sub postremove ($) { +sub postremove ($) { #{{{ my $session=shift; # Load saved form state and return to edit form. @@ -117,17 +132,18 @@ sub postremove ($) { $session->clear("postremove"); IkiWiki::cgi_savesession($session); IkiWiki::cgi($postremove, $session); -} +} #}}} sub formbuilder (@) { #{{{ my %params=@_; my $form=$params{form}; - if (defined $form->field("do") && $form->field("do") eq "edit") { + if (defined $form->field("do") && ($form->field("do") eq "edit" || + $form->field("do") eq "create")) { my $q=$params{cgi}; my $session=$params{session}; - if ($form->submitted eq "Remove") { + if ($form->submitted eq "Remove" && $form->field("do") eq "edit") { removal_confirm($q, $session, 0, $form->field("page")); } elsif ($form->submitted eq "Remove Attachments") { @@ -158,7 +174,7 @@ sub sessioncgi ($$) { #{{{ # and that the user is allowed to edit(/remove) it. my @files; foreach my $page (@pages) { - check_canremove($page, $q, $session, $q->param("attachment")); + check_canremove($page, $q, $session); # This untaint is safe because of the # checks performed above, which verify the @@ -198,7 +214,7 @@ sub sessioncgi ($$) { #{{{ if (! exists $pagesources{$parent}) { $parent="index"; } - IkiWiki::redirect($q, $config{url}."/".htmlpage($parent)); + IkiWiki::redirect($q, urlto($parent, '/', 1)); } } else {