From 8360e96a8661d3cc0532f377db81a3f37babd126 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 19 Jan 2009 14:11:15 -0500 Subject: blogspam: Log spam info on failure. --- IkiWiki/Plugin/blogspam.pm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm index cc6e840f0..8462a6d1d 100644 --- a/IkiWiki/Plugin/blogspam.pm +++ b/IkiWiki/Plugin/blogspam.pm @@ -83,7 +83,7 @@ sub checkcontent (@) { # and "buy". push @options, "exclude=stopwords"; - my $res = $client->send_request('testComment', { + my %req={ ip => $ENV{REMOTE_ADDR}, comment => $params{content}, subject => defined $params{subject} ? $params{subject} : "", @@ -92,17 +92,20 @@ sub checkcontent (@) { options => join(",", @options), site => $config{url}, version => "ikiwiki ".$IkiWiki::version, - }); + }; + my $res = $client->send_request('testComment', %req); if (! ref $res || ! defined $res->value) { debug("failed to get response from blogspam server ($url)"); return undef; } elsif ($res->value =~ /^SPAM:(.*)/) { + eval q{use Data::Dumper}; + debug("blogspam server reports ".$res->value.": ".Dumper(\%req)); return gettext("Sorry, but that looks like spam to blogspam: ").$1; } elsif ($res->value ne 'OK') { - debug(gettext("blogspam server failure: ").$res->value); + debug("blogspam server failure: ".$res->value); return undef; } else { -- cgit v1.2.3 From 3547a2a3474b2d5a97c4bc16ea29e81a013b1185 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 20 Jan 2009 11:12:49 -0500 Subject: fix removal form display The form was misdisplayed when displayed via comment removal. --- IkiWiki/Plugin/remove.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm index 21989aff3..ee5784f20 100644 --- a/IkiWiki/Plugin/remove.pm +++ b/IkiWiki/Plugin/remove.pm @@ -218,7 +218,7 @@ sub sessioncgi ($$) { } } else { - IkiWiki::showform($form, $buttons, $session, $q); + removal_confirm($q, $session, 0, $q->param("page")); } exit 0; -- cgit v1.2.3 From 950137eb6c4b5a75a01724736423e41ab3896e45 Mon Sep 17 00:00:00 2001 From: Gabriel McManus Date: Mon, 7 Jul 2008 21:33:01 +1000 Subject: img: only provide alt text if it was specified if suitable alternate text is unknown, then it should not be given. empty alt text is suitable mainly for purely decorative images. (cherry picked from commit 3cd7f67f0cf894f4fd5ba16f68e82e4f7bdbfdc5) --- IkiWiki/Plugin/img.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm index 5c580c03c..d295b833b 100644 --- a/IkiWiki/Plugin/img.pm +++ b/IkiWiki/Plugin/img.pm @@ -119,9 +119,9 @@ sub preprocess (@) { } my $imgtag=''.(exists $params{alt} ? $params{alt} : '').
 		' Date: Thu, 22 Jan 2009 20:53:47 -0500 Subject: fix typo --- IkiWiki/Plugin/blogspam.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm index 8462a6d1d..c482a5ae1 100644 --- a/IkiWiki/Plugin/blogspam.pm +++ b/IkiWiki/Plugin/blogspam.pm @@ -93,7 +93,7 @@ sub checkcontent (@) { site => $config{url}, version => "ikiwiki ".$IkiWiki::version, }; - my $res = $client->send_request('testComment', %req); + my $res = $client->send_request('testComment', \%req); if (! ref $res || ! defined $res->value) { debug("failed to get response from blogspam server ($url)"); -- cgit v1.2.3 From e1ff06b634afe790fe7661898bb20d7077d93588 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 22 Jan 2009 20:58:49 -0500 Subject: fix uninitialized value warnings I suspect these are only triggered by spammers. --- IkiWiki/Plugin/comments.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index 833bedf25..6d0e45a97 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -406,19 +406,19 @@ sub sessioncgi ($$) { if ($config{comments_allowauthor}) { my $author = $form->field('author'); - if (length $author) { + if (defined $author && length $author) { $author =~ s/"/"/g; $content .= " claimedauthor=\"$author\"\n"; } my $url = $form->field('url'); - if (length $url) { + if (defined $url && length $url) { $url =~ s/"/"/g; $content .= " url=\"$url\"\n"; } } my $subject = $form->field('subject'); - if (length $subject) { + if (defined $subject && length $subject) { $subject =~ s/"/"/g; $content .= " subject=\"$subject\"\n"; } -- cgit v1.2.3 From ef856a5f7a4c893dde5a893971e4686d4c30c8f4 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 22 Jan 2009 21:10:05 -0500 Subject: typo --- IkiWiki/Plugin/blogspam.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm index c482a5ae1..8552f3a1b 100644 --- a/IkiWiki/Plugin/blogspam.pm +++ b/IkiWiki/Plugin/blogspam.pm @@ -83,7 +83,7 @@ sub checkcontent (@) { # and "buy". push @options, "exclude=stopwords"; - my %req={ + my %req=( ip => $ENV{REMOTE_ADDR}, comment => $params{content}, subject => defined $params{subject} ? $params{subject} : "", @@ -92,7 +92,7 @@ sub checkcontent (@) { options => join(",", @options), site => $config{url}, version => "ikiwiki ".$IkiWiki::version, - }; + ); my $res = $client->send_request('testComment', \%req); if (! ref $res || ! defined $res->value) { -- cgit v1.2.3 From ee74e61ffc6fa589361a080a2c1476b0fe5afaa3 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 14:37:04 -0500 Subject: blogspam: Fix use of blogspam_options and blogspam_server config settings. --- IkiWiki/Plugin/blogspam.pm | 6 +++--- debian/changelog | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/blogspam.pm b/IkiWiki/Plugin/blogspam.pm index 8552f3a1b..cbd9859a5 100644 --- a/IkiWiki/Plugin/blogspam.pm +++ b/IkiWiki/Plugin/blogspam.pm @@ -62,11 +62,11 @@ sub checkcontent (@) { } my $url=$defaulturl; - $url = $params{blogspam_server} if exists $params{blogspam_server}; + $url = $config{blogspam_server} if exists $config{blogspam_server}; my $client = RPC::XML::Client->new($url); - my @options = split(",", $params{blogspam_options}) - if exists $params{blogspam_options}; + my @options = split(",", $config{blogspam_options}) + if exists $config{blogspam_options}; # Allow short comments and whitespace-only edits, unless the user # has overridden min-words themselves. diff --git a/debian/changelog b/debian/changelog index 7f6605fbf..96089c101 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,10 @@ ikiwiki (3.03) UNRELEASED; urgency=low * Avoid feeding decoded unicode to Term::ReadLine. Closes: 512169 - * blogspam: Log spam info on failure. + * blogspam: Log spam info on failure in debug mode. * Remove nonstandard css. Closes: #512378 + * blogspam: Fix use of blogspam_options and blogspam_server + config settings. -- Joey Hess Sun, 18 Jan 2009 14:50:57 -0500 -- cgit v1.2.3 From c154fa5d6cd1620be7b139b08040740a1bdfafbc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 15:42:13 -0500 Subject: comments: If comment content checks fail, store the comment (in .ikiwiki/comments_pending) for moderator review. --- IkiWiki/Plugin/comments.pm | 43 +++++++++++++++++++++++++++++++------------ IkiWiki/Plugin/editpage.pm | 5 +++-- debian/changelog | 2 ++ doc/plugins/comments.mdwn | 7 +++++++ 4 files changed, 43 insertions(+), 14 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index 6d0e45a97..4d225b90a 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -380,14 +380,7 @@ sub sessioncgi ($$) { IkiWiki::check_canedit($page, $cgi, $session); $postcomment=0; - # FIXME: rather a simplistic way to make the comments... - my $i = 0; - my $file; - my $location; - do { - $i++; - $location = "$page/$config{comments_pagename}$i"; - } while (-e "$config{srcdir}/$location._comment"); + my $location=unique_comment_location($page, $config{srcdir}); my $content = "[[!_comment format=$type\n"; @@ -470,21 +463,33 @@ sub sessioncgi ($$) { IkiWiki::checksessionexpiry($cgi, $session); $postcomment=1; - IkiWiki::check_content(content => $form->field('editcontent'), + my $ok=IkiWiki::check_content(content => $form->field('editcontent'), subject => $form->field('subject'), $config{comments_allowauthor} ? ( author => $form->field('author'), url => $form->field('url'), ) : (), page => $location, - cgi => $cgi, session => $session + cgi => $cgi, + session => $session, + nonfatal => 1, ); $postcomment=0; - - my $file = "$location._comment"; + + if (! $ok) { + my $penddir=$config{wikistatedir}."/comments_pending"; + $location=unique_comment_location($page, $penddir); + writefile("$location._comment", $penddir, $content); + print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")), + "

". + gettext("Your comment will be posted after moderator review"), + "

"); + exit; + } # FIXME: could probably do some sort of graceful retry # on error? Would require significant unwinding though + my $file = "$location._comment"; writefile($file, $config{srcdir}, $content); my $conflict; @@ -654,6 +659,20 @@ sub pagetemplate (@) { } } +sub unique_comment_location ($) { + my $page=shift; + my $dir=shift; + + my $location; + my $i = 0; + do { + $i++; + $location = "$page/$config{comments_pagename}$i"; + } while (-e "$dir/$location._comment"); + + return $location; +} + package IkiWiki::PageSpec; sub match_postcomment ($$;@) { diff --git a/IkiWiki/Plugin/editpage.pm b/IkiWiki/Plugin/editpage.pm index bba52e4fd..c206d96a4 100644 --- a/IkiWiki/Plugin/editpage.pm +++ b/IkiWiki/Plugin/editpage.pm @@ -105,11 +105,12 @@ sub check_content (@) { $ok=1; } elsif (ref $ret eq 'CODE') { - $ret->(); + $ret->() unless $params{nonfatal}; $ok=0; } elsif (defined $ret) { - error($ret); + error($ret) unless $params{nonfatal}; + $ok=0; } } diff --git a/debian/changelog b/debian/changelog index 96089c101..002ae12c1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,8 @@ ikiwiki (3.03) UNRELEASED; urgency=low * Remove nonstandard css. Closes: #512378 * blogspam: Fix use of blogspam_options and blogspam_server config settings. + * comments: If comment content checks fail, store the comment + (in .ikiwiki/comments_pending) for moderator review. -- Joey Hess Sun, 18 Jan 2009 14:50:57 -0500 diff --git a/doc/plugins/comments.mdwn b/doc/plugins/comments.mdwn index 72b11af64..4cee3b9ad 100644 --- a/doc/plugins/comments.mdwn +++ b/doc/plugins/comments.mdwn @@ -41,3 +41,10 @@ There are some global options for the setup file: specify a name for themselves, and the \[[!meta author]] and \[[!meta authorurl]] directives will not be overridden by the comments plugin + +## comment moderation + +If you enable the [[blogspam]] plugin, comments that appear spammy will be +held for moderation. These comments are stored in +`.ikiwiki/comments_pending/`, and can be deleted, or moved into the +wiki's srcdir to be posted. -- cgit v1.2.3 From 731fc9e7a2ce818f0b7069cf0353931ec2dc8b43 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 18:49:57 -0500 Subject: comments: Add a moderation web interface. --- IkiWiki/Plugin/comments.pm | 196 +++++++++++++++++++++++++++++++++------ debian/changelog | 1 + templates/commentmoderation.tmpl | 23 +++++ 3 files changed, 193 insertions(+), 27 deletions(-) create mode 100644 templates/commentmoderation.tmpl (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index 4d225b90a..388a983f7 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -134,8 +134,8 @@ sub preprocess { } # no need to bother with htmlize if it's just HTML - $content = IkiWiki::htmlize($page, $params{destpage}, $format, - $content) if defined $format; + $content = IkiWiki::htmlize($page, $params{destpage}, $format, $content) + if defined $format; IkiWiki::run_hooks(sanitize => sub { $content = shift->( @@ -263,13 +263,23 @@ sub linkcgi ($) { } } -# Mostly cargo-culted from IkiWiki::plugin::editpage sub sessioncgi ($$) { my $cgi=shift; my $session=shift; my $do = $cgi->param('do'); - return unless $do eq 'comment'; + if ($do eq 'comment') { + editcomment($cgi, $session); + } + elsif ($do eq 'commentmoderation') { + commentmoderation($cgi, $session); + } +} + +# Mostly cargo-culted from IkiWiki::plugin::editpage +sub editcomment ($$) { + my $cgi=shift; + my $session=shift; IkiWiki::decode_cgi_utf8($cgi); @@ -431,29 +441,8 @@ sub sessioncgi ($$) { # - this means that if they do, rocks fall and everyone dies if ($form->submitted eq PREVIEW) { - my $preview = IkiWiki::htmlize($location, $page, '_comment', - IkiWiki::linkify($location, $page, - IkiWiki::preprocess($location, $page, - IkiWiki::filter($location, - $page, $content), - 0, 1))); - IkiWiki::run_hooks(format => sub { - $preview = shift->(page => $page, - content => $preview); - }); - - my $template = template("comment.tmpl"); - $template->param(content => $preview); - $template->param(title => $form->field('subject')); - $template->param(ctime => displaytime(time)); - - IkiWiki::run_hooks(pagetemplate => sub { - shift->(page => $location, - destpage => $page, - template => $template); - }); - - $form->tmpl_param(page_preview => $template->output); + $form->tmpl_param(page_preview => + previewcomment($content, $location, $page, time)); } else { $form->tmpl_param(page_preview => ""); @@ -480,6 +469,7 @@ sub sessioncgi ($$) { my $penddir=$config{wikistatedir}."/comments_pending"; $location=unique_comment_location($page, $penddir); writefile("$location._comment", $penddir, $content); + IkiWiki::printheader($session); print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")), "

". gettext("Your comment will be posted after moderator review"), @@ -534,6 +524,158 @@ sub sessioncgi ($$) { exit; } +sub commentmoderation ($$) { + my $cgi=shift; + my $session=shift; + + IkiWiki::needsignin($cgi, $session); + if (! IkiWiki::is_admin($session->param("name"))) { + error(gettext("you are not logged in as an admin")); + } + + IkiWiki::decode_cgi_utf8($cgi); + + if (defined $cgi->param('sid')) { + IkiWiki::checksessionexpiry($cgi, $session); + + my %vars=$cgi->Vars; + my $added=0; + foreach my $id (keys %vars) { + if ($id =~ /(.*)\Q._comment\E$/) { + my $action=$cgi->param($id); + next if $action eq 'Defer'; + + # Make sure that the id is of a legal + # pending comment before untainting. + my ($f)= $id =~ /$config{wiki_file_regexp}/; + if (! defined $f || ! length $f || + IkiWiki::file_pruned($f, $config{srcdir})) { + error("illegal file"); + } + + my $page=IkiWiki::possibly_foolish_untaint(IkiWiki::dirname($1)); + my $file="$config{wikistatedir}/comments_pending/". + IkiWiki::possibly_foolish_untaint($id); + + if ($action eq 'Accept') { + my $content=eval { readfile($file) }; + next if $@; # file vanished since form was displayed + my $dest=unique_comment_location($page, $config{srcdir})."._comment"; + writefile($dest, $config{srcdir}, $content); + if ($config{rcs} and $config{comments_commit}) { + IkiWiki::rcs_add($dest); + } + $added++; + } + + # This removes empty subdirs, so the + # .ikiwiki/comments_pending dir will + # go away when all are moderated. + require IkiWiki::Render; + IkiWiki::prune($file); + } + } + + if ($added) { + my $conflict; + if ($config{rcs} and $config{comments_commit}) { + my $message = gettext("Comment moderation"); + IkiWiki::disable_commit_hook(); + $conflict=IkiWiki::rcs_commit_staged($message, + $session->param('name'), $ENV{REMOTE_ADDR}); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + + # Now we need a refresh + require IkiWiki::Render; + IkiWiki::refresh(); + IkiWiki::saveindex(); + + error($conflict) if defined $conflict; + } + } + + my @comments=map { + my $id=$_; + my $file="$config{wikistatedir}/comments_pending/$id"; + my $content=readfile($file); + my $ctime=(stat($file))[10]; + { + id => $id, + view => previewcomment($content, $id, + IkiWiki::dirname($_), $ctime), + } + } comments_pending(); + + my $template=template("commentmoderation.tmpl"); + $template->param( + sid => $session->id, + comments => \@comments, + ); + IkiWiki::printheader($session); + print IkiWiki::misctemplate(gettext("comment moderation"), $template->output); + exit; +} + +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 { + $_=decode_utf8($_); + if (IkiWiki::file_pruned($_, $dir)) { + $File::Find::prune=1; + } + elsif (! -l $_ && ! -d _) { + $File::Find::prune=0; + my ($f)=/$config{wiki_file_regexp}/; # untaint + if (defined $f && $f =~ /\Q._comment\E$/) { + $f=~s/^\Q$dir\E\/?//; + push @ret, $f; + } + } + } + }, $dir); + + return @ret; +} + +sub previewcomment ($$$) { + my $content=shift; + my $location=shift; + my $page=shift; + my $time=shift; + + my $preview = IkiWiki::htmlize($location, $page, '_comment', + IkiWiki::linkify($location, $page, + IkiWiki::preprocess($location, $page, + IkiWiki::filter($location, + $page, $content), + 0, 1))); + IkiWiki::run_hooks(format => sub { + $preview = shift->(page => $page, + content => $preview); + }); + + my $template = template("comment.tmpl"); + $template->param(content => $preview); + $template->param(ctime => displaytime($time)); + + IkiWiki::run_hooks(pagetemplate => sub { + shift->(page => $location, + destpage => $page, + template => $template); + }); + + return $template->output; +} + sub commentsshown ($) { my $page=shift; diff --git a/debian/changelog b/debian/changelog index 002ae12c1..c9ebcd1e9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,7 @@ ikiwiki (3.03) UNRELEASED; urgency=low config settings. * comments: If comment content checks fail, store the comment (in .ikiwiki/comments_pending) for moderator review. + * comments: Add a moderation web interface. -- Joey Hess Sun, 18 Jan 2009 14:50:57 -0500 diff --git a/templates/commentmoderation.tmpl b/templates/commentmoderation.tmpl new file mode 100644 index 000000000..3dadb791b --- /dev/null +++ b/templates/commentmoderation.tmpl @@ -0,0 +1,23 @@ + +
+

+ + + +
+
+ +
+Defer +Accept +Reject +
+
+
+ +
+ +

+No comments need moderation at this time. +

+ -- cgit v1.2.3 From 9a5085e5126d1f76d28a4438b1527659183477b5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 18:56:47 -0500 Subject: clean up comment preview Remove actions from it, and avoid a broken title link. --- IkiWiki/Plugin/comments.pm | 2 ++ templates/comment.tmpl | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index 388a983f7..ad5395a82 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -673,6 +673,8 @@ sub previewcomment ($$$) { template => $template); }); + $template->param(have_actions => 0); + return $template->output; } diff --git a/templates/comment.tmpl b/templates/comment.tmpl index 582efccb8..b4f235845 100644 --- a/templates/comment.tmpl +++ b/templates/comment.tmpl @@ -1,6 +1,12 @@
-
+
+ + + + + +
-- cgit v1.2.3 From 7a7e28c55f1ffa64eedbaf36ee1729c6bbd27762 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 19:04:45 -0500 Subject: add a button to prefs page for comment moderation --- IkiWiki/Plugin/comments.pm | 13 +++++++++++++ doc/plugins/comments.mdwn | 8 +++++--- doc/wikitemplates.mdwn | 2 ++ 3 files changed, 20 insertions(+), 3 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index ad5395a82..c95f77a42 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -26,6 +26,7 @@ sub import { hook(type => "htmlize", id => "_comment", call => \&htmlize); hook(type => "pagetemplate", id => "comments", call => \&pagetemplate); hook(type => "cgi", id => "comments", call => \&linkcgi); + hook(type => "formbuilder_setup", id => "comments", call => \&formbuilder_setup); IkiWiki::loadplugin("inline"); } @@ -618,6 +619,18 @@ sub commentmoderation ($$) { exit; } +sub formbuilder_setup (@) { + my %params=@_; + + my $form=$params{form}; + if ($form->title eq "preferences") { + push @{$params{buttons}}, "Comment Moderation"; + if ($form->submitted && $form->submitted eq "Comment Moderation") { + commentmoderation($params{cgi}, $params{session}); + } + } +} + sub comments_pending () { my $dir="$config{wikistatedir}/comments_pending/"; return unless -d $dir; diff --git a/doc/plugins/comments.mdwn b/doc/plugins/comments.mdwn index 4cee3b9ad..c13a6daa6 100644 --- a/doc/plugins/comments.mdwn +++ b/doc/plugins/comments.mdwn @@ -45,6 +45,8 @@ There are some global options for the setup file: ## comment moderation If you enable the [[blogspam]] plugin, comments that appear spammy will be -held for moderation. These comments are stored in -`.ikiwiki/comments_pending/`, and can be deleted, or moved into the -wiki's srcdir to be posted. +held for moderation. Wiki admins can access the comment moderation queue +via a button on their Preferences page. + +The comments are stored in `.ikiwiki/comments_pending/`, and can be +deleted, or moved into the wiki's srcdir to be posted. diff --git a/doc/wikitemplates.mdwn b/doc/wikitemplates.mdwn index dc217cd30..fc5893677 100644 --- a/doc/wikitemplates.mdwn +++ b/doc/wikitemplates.mdwn @@ -33,6 +33,8 @@ located in /usr/share/ikiwiki/templates by default. by the [[plugins/comments]] plugin. * `editcomment.tmpl` - This template is the comment post form for the [[plugins/comments]] plugin. +* `commentmoderation.tmpl` - This template is used to produce the comment + moderation form. The [[plugins/pagetemplate]] plugin can allow individual pages to use a different template than `page.tmpl`. -- cgit v1.2.3 From 4e21af767175cdf19143b0b0776e111de3253103 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 19:45:56 -0500 Subject: sort comment queue by time, newest first --- IkiWiki/Plugin/comments.pm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index c95f77a42..f0b67a9eb 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -598,7 +598,7 @@ sub commentmoderation ($$) { } my @comments=map { - my $id=$_; + my ($id, $ctime)=@{$_}; my $file="$config{wikistatedir}/comments_pending/$id"; my $content=readfile($file); my $ctime=(stat($file))[10]; @@ -607,7 +607,7 @@ sub commentmoderation ($$) { view => previewcomment($content, $id, IkiWiki::dirname($_), $ctime), } - } comments_pending(); + } sort { $b->[1] <=> $a->[1] } comments_pending(); my $template=template("commentmoderation.tmpl"); $template->param( @@ -649,8 +649,9 @@ sub comments_pending () { $File::Find::prune=0; my ($f)=/$config{wiki_file_regexp}/; # untaint if (defined $f && $f =~ /\Q._comment\E$/) { + my $ctime=(stat($f))[10]; $f=~s/^\Q$dir\E\/?//; - push @ret, $f; + push @ret, [$f, $ctime]; } } } -- cgit v1.2.3 From 9d4f396b1353d58c6b526818b69ada459b1be24c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 22:25:45 -0500 Subject: add reject all marked defer checkbox --- IkiWiki/Plugin/comments.pm | 17 ++++++++--------- templates/commentmoderation.tmpl | 12 +++++++++--- 2 files changed, 17 insertions(+), 12 deletions(-) (limited to 'IkiWiki/Plugin') diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm index f0b67a9eb..32f3712f2 100644 --- a/IkiWiki/Plugin/comments.pm +++ b/IkiWiki/Plugin/comments.pm @@ -539,12 +539,14 @@ sub commentmoderation ($$) { if (defined $cgi->param('sid')) { IkiWiki::checksessionexpiry($cgi, $session); + my $rejectalldefer=$cgi->param('rejectalldefer'); + my %vars=$cgi->Vars; my $added=0; foreach my $id (keys %vars) { if ($id =~ /(.*)\Q._comment\E$/) { my $action=$cgi->param($id); - next if $action eq 'Defer'; + next if $action eq 'Defer' && ! $rejectalldefer; # Make sure that the id is of a legal # pending comment before untainting. @@ -601,7 +603,6 @@ sub commentmoderation ($$) { my ($id, $ctime)=@{$_}; my $file="$config{wikistatedir}/comments_pending/$id"; my $content=readfile($file); - my $ctime=(stat($file))[10]; { id => $id, view => previewcomment($content, $id, @@ -668,14 +669,12 @@ sub previewcomment ($$$) { my $preview = IkiWiki::htmlize($location, $page, '_comment', IkiWiki::linkify($location, $page, - IkiWiki::preprocess($location, $page, - IkiWiki::filter($location, - $page, $content), - 0, 1))); + IkiWiki::preprocess($location, $page, + IkiWiki::filter($location, $page, $content), 0, 1))); IkiWiki::run_hooks(format => sub { - $preview = shift->(page => $page, - content => $preview); - }); + $preview = shift->(page => $page, + content => $preview); + }); my $template = template("comment.tmpl"); $template->param(content => $preview); diff --git a/templates/commentmoderation.tmpl b/templates/commentmoderation.tmpl index 3dadb791b..e91d3146d 100644 --- a/templates/commentmoderation.tmpl +++ b/templates/commentmoderation.tmpl @@ -3,18 +3,24 @@
+ +Reject +all comments marked Defer +
-Defer -Accept -Reject +Defer +Accept +Reject

+Reject +all comments marked Defer

-- cgit v1.2.3 From 42b3e13739ccf67e3867c8e6864a2afdafa61c4a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 25 Jan 2009 22:30:28 -0500 Subject: format moderation queue only at end, avoid O(N^3) bug It was calling format hooks for each comment on the page. When relativedate is enabled, that made it insert