From 24b59b3a9edb350ef0dc064b0a3f3cdee01f81be Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 9 Jun 2010 17:44:40 -0400 Subject: [PATCH] editpage: Avoid storing accidental state changes when previewing pages. This is a slow, safe, stupid approach. Could make deep copies of the data structures as backups instead of re-loading the index from disk. --- IkiWiki/Plugin/editpage.pm | 15 ++++++--------- debian/changelog | 1 + ...ments_preview_unsafe_with_allowdirectives.mdwn | 8 ++++++++ doc/bugs/preview_pagestate.mdwn | 2 ++ 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm index af2c5ff4e..3d731d399 100644 --- a/IkiWiki/Plugin/editpage.pm +++ b/IkiWiki/Plugin/editpage.pm @@ -170,10 +170,8 @@ sub cgi_editpage ($$) { $previewing=1; my $new=not exists $pagesources{$page}; - if ($new) { - # temporarily record its type - $pagesources{$page}=$page.".".$type; - } + # temporarily record its type + $pagesources{$page}=$page.".".$type if $new; my %wasrendered=map { $_ => 1 } @{$renderedfiles{$page}}; my $content=$form->field('editcontent'); @@ -198,18 +196,17 @@ sub cgi_editpage ($$) { }); $form->tmpl_param("page_preview", $preview); - if ($new) { - delete $pagesources{$page}; - } - # Previewing may have created files on disk. # Keep a list of these to be deleted later. my %previews = map { $_ => 1 } @{$wikistate{editpage}{previews}}; foreach my $f (@{$renderedfiles{$page}}) { $previews{$f}=1 unless $wasrendered{$f}; } + + # Throw out any other state changes made during previewing, + # and save the previews list. + loadindex(); @{$wikistate{editpage}{previews}} = keys %previews; - $renderedfiles{$page}=[keys %wasrendered]; saveindex(); } elsif ($form->submitted eq "Save Page") { diff --git a/debian/changelog b/debian/changelog index 5cfb9ce89..96188c093 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,7 @@ ikiwiki (3.20100609) unstable; urgency=low * Fix support for globbing in tagged() pagespecs. * Fix display of sidebar when previewing page edit. (Thanks, privat) * relativedate: Fix problem with localised dates not working. + * editpage: Avoid storing accidental state changes when previewing pages. -- Joey Hess Mon, 31 May 2010 20:44:17 -0400 diff --git a/doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn b/doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn new file mode 100644 index 000000000..7f9fb67e9 --- /dev/null +++ b/doc/bugs/comments_preview_unsafe_with_allowdirectives.mdwn @@ -0,0 +1,8 @@ +If `comments_allowdirectives` is set, previewing a comment can run +directives that create files. (Eg, img.) Unlike editpage, it does not +keep track of those files and expire them. So the files will linger in +destdir forever. + +Probably when the user then tries to save the comment, ikiwiki will refuse +to overwrite the unknown file, and will crash. +--[[Joey]] diff --git a/doc/bugs/preview_pagestate.mdwn b/doc/bugs/preview_pagestate.mdwn index 14973908b..7f7ec0976 100644 --- a/doc/bugs/preview_pagestate.mdwn +++ b/doc/bugs/preview_pagestate.mdwn @@ -9,3 +9,5 @@ saves other state changes. Seems like it needs to isolate all state changes when previewing... ugh. --[[Joey]] + +[[done]] -- 2.44.0