From: Joey Hess Date: Sat, 8 May 2010 02:30:42 +0000 (-0400) Subject: Merge branch 'master' into commentreorg X-Git-Tag: 3.20100515~63 X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/937b24e0cf98d75dd353d80267efddcecab9e908?hp=-c Merge branch 'master' into commentreorg --- 937b24e0cf98d75dd353d80267efddcecab9e908 diff --combined IkiWiki/Plugin/comments.pm index 348d91fd8,6d513cd2a..3cafcbe9c --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@@ -26,11 -26,8 +26,11 @@@ sub import hook(type => "preprocess", id => '_comment', call => \&preprocess); hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi); hook(type => "htmlize", id => "_comment", call => \&htmlize); + hook(type => "htmlize", id => "_comment_pending", + call => \&htmlize_pending); hook(type => "pagetemplate", id => "comments", call => \&pagetemplate); - hook(type => "formbuilder_setup", id => "comments", call => \&formbuilder_setup); + hook(type => "formbuilder_setup", id => "comments", + call => \&formbuilder_setup); # Load goto to fix up user page links for logged-in commenters IkiWiki::loadplugin("goto"); IkiWiki::loadplugin("inline"); @@@ -107,14 -104,6 +107,14 @@@ sub htmlize return $params{content}; } +sub htmlize_pending { + my %params = @_; + return sprintf(gettext("this comment needs %s"), + ''. + gettext("moderation").''); +} + # FIXME: copied verbatim from meta sub safeurl ($) { my $url=shift; @@@ -262,6 -251,10 +262,10 @@@ sub sessioncgi ($$) elsif ($do eq 'commentmoderation') { commentmoderation($cgi, $session); } + elsif ($do eq 'commentsignin') { + IkiWiki::cgi_signin($cgi, $session); + exit; + } } # Mostly cargo-culted from IkiWiki::plugin::editpage @@@ -339,7 -332,7 +343,7 @@@ sub editcomment ($$) if (! defined $session->param('name')) { # Make signinurl work and return here. - $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'signin')); + $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'commentsignin')); $session->param(postsignin => $ENV{QUERY_STRING}); IkiWiki::cgi_savesession($session); } @@@ -473,15 -466,9 +477,15 @@@ $postcomment=0; if (! $ok) { - my $penddir=$config{wikistatedir}."/comments_pending"; - $location=unique_comment_location($page, $content, $penddir); - writefile("$location._comment", $penddir, $content); + $location=unique_comment_location($page, $content, $config{srcdir}, "._comment_pending"); + writefile("$location._comment_pending", $config{srcdir}, $content); + + # Refresh so anything that deals with pending + # comments can be updated. + require IkiWiki::Render; + IkiWiki::refresh(); + IkiWiki::saveindex(); + IkiWiki::printheader($session); print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")), "

". @@@ -557,24 -544,21 +561,24 @@@ sub commentmoderation ($$) my %vars=$cgi->Vars; my $added=0; foreach my $id (keys %vars) { - if ($id =~ /(.*)\Q._comment\E$/) { + if ($id =~ /(.*)\._comment(?:_pending)?$/) { my $action=$cgi->param($id); next if $action eq 'Defer' && ! $rejectalldefer; # Make sure that the id is of a legal - # pending comment before untainting. - my ($f)= $id =~ /$config{wiki_file_regexp}/; + # pending comment. + my ($f) = $id =~ /$config{wiki_file_regexp}/; if (! defined $f || ! length $f || IkiWiki::file_pruned($f)) { error("illegal file"); } - my $page=IkiWiki::possibly_foolish_untaint(IkiWiki::dirname($1)); - my $file="$config{wikistatedir}/comments_pending/". - IkiWiki::possibly_foolish_untaint($id); + my $page=IkiWiki::dirname($f); + my $file="$config{srcdir}/$f"; + if (! -e $file) { + # old location + $file="$config{wikistatedir}/comments_pending/".$f; + } if ($action eq 'Accept') { my $content=eval { readfile($file) }; @@@ -587,6 -571,9 +591,6 @@@ $added++; } - # This removes empty subdirs, so the - # .ikiwiki/comments_pending dir will - # go away when all are moderated. require IkiWiki::Render; IkiWiki::prune($file); } @@@ -613,15 -600,16 +617,15 @@@ } my @comments=map { - my ($id, $ctime)=@{$_}; - my $file="$config{wikistatedir}/comments_pending/$id"; - my $content=readfile($file); + my ($id, $dir, $ctime)=@{$_}; + my $content=readfile("$dir/$id"); my $preview=previewcomment($content, $id, - IkiWiki::dirname($_), $ctime); + $id, $ctime); { id => $id, view => $preview, - } - } sort { $b->[1] <=> $a->[1] } comments_pending(); + } + } sort { $b->[2] <=> $a->[2] } comments_pending(); my $template=template("commentmoderation.tmpl"); $template->param( @@@ -651,35 -639,26 +655,35 @@@ sub formbuilder_setup (@) } sub comments_pending () { - my $dir="$config{wikistatedir}/comments_pending/"; - return unless -d $dir; - my @ret; + eval q{use File::Find}; error($@) if $@; - find({ - no_chdir => 1, - wanted => sub { - my $file=decode_utf8($_); - $file=~s/^\Q$dir\E\/?//; - return if ! length $file || IkiWiki::file_pruned($file) - || -l $_ || -d _ || $file !~ /\Q._comment\E$/; - my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint - if (defined $f) { - my $ctime=(stat($_))[10]; - push @ret, [$f, $ctime]; + + my $find_comments=sub { + my $dir=shift; + my $extension=shift; + return unless -d $dir; + find({ + no_chdir => 1, + wanted => sub { + my $file=decode_utf8($_); + $file=~s/^\Q$dir\E\/?//; + return if ! length $file || IkiWiki::file_pruned($file) + || -l $_ || -d _ || $file !~ /\Q$extension\E$/; + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint + if (defined $f) { + my $ctime=(stat($_))[10]; + push @ret, [$f, $dir, $ctime]; + } } - } - }, $dir); + }, $dir); + }; + + $find_comments->($config{srcdir}, "._comment_pending"); + # old location + $find_comments->("$config{wikistatedir}/comments_pending/", + "._comment"); return @ret; } @@@ -714,7 -693,7 +718,7 @@@ sub previewcomment ($$$) sub commentsshown ($) { my $page=shift; - return ! pagespec_match($page, "internal(*/$config{comments_pagename}*)", + return ! pagespec_match($page, "comment(*)", location => $page) && pagespec_match($page, $config{comments_pagespec}, location => $page); @@@ -744,7 -723,7 +748,7 @@@ sub pagetemplate (@) my $comments = undef; if ($shown) { $comments = IkiWiki::preprocess_inline( - pages => "internal($page/$config{comments_pagename}*)", + pages => "comment($page)", template => 'comment', show => 0, reverse => 'yes', @@@ -858,20 -837,21 +862,20 @@@ sub num_comments ($$) return @comments; } -sub unique_comment_location ($$$) { +sub unique_comment_location ($$$$) { my $page=shift; - eval q{use Digest::MD5 'md5_hex'}; error($@) if $@; my $content_md5=md5_hex(Encode::encode_utf8(shift)); - my $dir=shift; + my $ext=shift || "._comment"; my $location; my $i = num_comments($page, $dir); do { $i++; $location = "$page/$config{comments_pagename}${i}_${content_md5}"; - } while (-e "$dir/$location._comment"); + } while (-e "$dir/$location$ext"); return $location; } @@@ -897,37 -877,7 +901,37 @@@ sub match_postcomment ($$;@) if (! $postcomment) { return IkiWiki::FailReason->new("not posting a comment"); } - return match_glob($page, $glob); + return match_glob($page, $glob, @_); +} + +sub match_comment ($$;@) { + my $page = shift; + my $glob = shift; + + if (! IkiWiki::isinternal($page)) { + return IkiWiki::FailReason->new("$page is not a comment"); + } + my $type=IkiWiki::pagetype($IkiWiki::pagesources{$page}); + if (defined $type && $type ne "_comment") { + return IkiWiki::FailReason->new("$page is not a comment"); + } + + return match_glob($page, "$glob/*", internal => 1, @_); +} + +sub match_comment_pending ($$;@) { + my $page = shift; + my $glob = shift; + + if (! IkiWiki::isinternal($page)) { + return IkiWiki::FailReason->new("$page is not a pending comment"); + } + my $type=IkiWiki::pagetype($IkiWiki::pagesources{$page}); + if (defined $type && $type ne "_comment_pending") { + return IkiWiki::FailReason->new("$page is not a pending comment"); + } + + return match_glob($page, "$glob/*", internal => 1, @_); } 1 diff --combined debian/NEWS index 8f456bced,e65a15457..68f0a207b --- a/debian/NEWS +++ b/debian/NEWS @@@ -8,13 -8,12 +8,18 @@@ ikiwiki (3.20100505) UNRELEASED; urgenc + + Also, there is a new "comment()" pagespec, that can be used to match a + comment on a page. It is recommended it be used instead of the old + method of using a pagespec such as "internal(comment_*)" to match + things that looked like comments. The old pagespec will now also match + comments that are held for moderation; likely not what you want. + There have also been some changes to the style.css in this version, + particularly to support the new openid selector. If you have a modified + version, of style.css, updating it (or moving it to local.css) is + recommended. + -- Joey Hess Wed, 05 May 2010 21:47:08 -0400 ikiwiki (3.20100427) unstable; urgency=low diff --combined debian/changelog index 0851a975d,050613706..f74e9929f --- a/debian/changelog +++ b/debian/changelog @@@ -4,20 -4,20 +4,28 @@@ ikiwiki (3.20100505) UNRELEASED; urgenc a single template, page.tmpl. * If you have a locally customised page.tmpl, it needs to be updated to set when BASEURL or FORCEBAREURL is set. + * comments: Comments pending moderation are now stored in the srcdir + alongside accepted comments, but with a `._comment_pending` extension. + This allows easier byhand moderation, as the "_pending" need + only be stripped off and the comment be committed to version control. + * The `comment_pending()` pagespec can be used to match such unmoderated + comments, which makes it easy to add a feed of them, or a counter + indicating how many there are. + * Belatedly added a `comment()` pagespec. * Gave comment and page editing forms some CSS and accessability love. * Renamed postscan hook to indexhtml, to reflect its changed position, and typical use. * inline: Call indexhtml when inlining internal pages, so their text can be indexed for searching. * Delete hooks are passed deleted internal pages. + * openid: Incorporated a fancy openid-selector signin form. + (http://code.google.com/p/openid-selector/) + * openid: Use "openid_identifier" as the form field, as required + by OpenID Authentication v2.0 spec. + * Removed the openidsignup option. Instead, my recommendation is to + leave passwordauth enabled and let people who don't have an openid use it. + The openid selector form avoids the UI annoyance of having both openid + and passwordauth on one form. -- Joey Hess Wed, 05 May 2010 18:07:29 -0400