X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/db9f2b1b2b97fd92b09f170c3b567ec59030bf0a..792e660cb158adaf02923029e2e36c9f134068d7:/IkiWiki/Plugin/rename.pm diff --git a/IkiWiki/Plugin/rename.pm b/IkiWiki/Plugin/rename.pm index e871b815d..b8f5858cc 100644 --- a/IkiWiki/Plugin/rename.pm +++ b/IkiWiki/Plugin/rename.pm @@ -179,8 +179,15 @@ sub rename_start ($$$$) { my $attachment=shift; my $page=shift; - check_canrename($page, $pagesources{$page}, undef, undef, - $q, $session); + # Special case for renaming held attachments; normal checks + # don't apply. + my $held=$attachment && + IkiWiki::Plugin::attachment->can("is_held_attachment") && + IkiWiki::Plugin::attachment::is_held_attachment($page); + if (! $held) { + check_canrename($page, $pagesources{$page}, undef, undef, + $q, $session); + } # Save current form state to allow returning to it later # without losing any edits. @@ -199,7 +206,8 @@ sub rename_start ($$$$) { exit 0; } -sub postrename ($;$$$) { +sub postrename ($$$;$$) { + my $cgi=shift; my $session=shift; my $src=shift; my $dest=shift; @@ -209,6 +217,9 @@ sub postrename ($;$$$) { my $postrename=CGI->new($session->param("postrename")); $session->clear("postrename"); IkiWiki::cgi_savesession($session); + if (! defined $postrename) { + redirect($cgi, urlto(defined $dest ? $dest : $src)); + } if (defined $dest) { if (! $attachment) { @@ -284,20 +295,18 @@ sub sessioncgi ($$) { my $session=shift; my ($form, $buttons)=rename_form($q, $session, Encode::decode_utf8($q->param("page"))); IkiWiki::decode_form_utf8($form); + my $src=$form->field("page"); if ($form->submitted eq 'Cancel') { - postrename($session); + postrename($q, $session, $src); } elsif ($form->submitted eq 'Rename' && $form->validate) { IkiWiki::checksessionexpiry($q, $session, $q->param('sid')); - # Queue of rename actions to perfom. - my @torename; - # These untaints are safe because of the checks # performed in check_canrename later. - my $src=$form->field("page"); - my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src}); + my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src}) + if exists $pagesources{$src}; my $dest=IkiWiki::possibly_foolish_untaint(titlepage($form->field("new_name"))); my $destfile=$dest; if (! $q->param("attachment")) { @@ -312,6 +321,19 @@ sub sessioncgi ($$) { $destfile=newpagefile($dest, $type); } + + # Special case for renaming held attachments. + my $held=$q->param("attachment") && + IkiWiki::Plugin::attachment->can("is_held_attachment") && + IkiWiki::Plugin::attachment::is_held_attachment($src); + if ($held) { + rename($held, IkiWiki::Plugin::attachment::attachment_holding_location($dest)); + postrename($q, $session, $src, $dest, $q->param("attachment")) + unless defined $srcfile; + } + + # Queue of rename actions to perfom. + my @torename; push @torename, { src => $src, srcfile => $srcfile, @@ -412,7 +434,7 @@ sub sessioncgi ($$) { $renamesummary.=$template->output; } - postrename($session, $src, $dest, $q->param("attachment")); + postrename($q, $session, $src, $dest, $q->param("attachment")); } else { IkiWiki::showform($form, $buttons, $session, $q);