From: Joey Hess <joey@gnu.kitenet.net>
Date: Thu, 11 Mar 2010 20:44:10 +0000 (-0500)
Subject: moderatedcomments: Added moderate_pagespec
X-Git-Tag: 3.20100312~13
X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/commitdiff_plain/ac3aac560f74457ded48ba3b5a14d0bbbf9b6d92

moderatedcomments: Added moderate_pagespec

* moderatedcomments: Added moderate_pagespec that can be used
  to control which users or comment locations are moderated.
  This can be used, just for example, to moderate http://myopenid.com/*
  if you're getting a lot of spammers from one particular openid
  provider (who should perhaps answer your emails about them),
  while not moderating other users.
* moderatedcomments: The moderate_users setting is deprecated. Instead,
  set moderate_pagespec to "!admin()" or "user(*)" instead.
---

diff --git a/IkiWiki/Plugin/moderatedcomments.pm b/IkiWiki/Plugin/moderatedcomments.pm
index afe1ceedf..b0a328a06 100644
--- a/IkiWiki/Plugin/moderatedcomments.pm
+++ b/IkiWiki/Plugin/moderatedcomments.pm
@@ -17,10 +17,11 @@ sub getsetup () {
 			rebuild => 0,
 			section => "auth",
 		},
-		moderate_users => {
-			type => 'boolean',
-			example => 1,
-			description => 'Moderate comments of logged-in users?',
+		moderate_pagespec => {
+			type => 'pagespec',
+			example => 'user(http://*)',
+			description => 'PageSpec matching users or comment locations to moderate',
+			link => 'ikiwiki/PageSpec',
 			safe => 1,
 			rebuild => 0,
 		},
@@ -32,14 +33,32 @@ sub checkcontent (@) {
 	# only handle comments	
 	return undef unless pagespec_match($params{page}, "postcomment(*)",
 	                	location => $params{page});
+	
+	# backwards compatability
+	if (exists $config{moderate_users} &&
+	    ! exists $config{moderate_pagespec}) {
+		$config{moderate_pagespec} = $config{moderate_users}
+			? "!admin()"
+			: "!user(*)";
+	}
+
+	# default is to moderate all except admins
+	if (! exists $config{moderate_pagespec}) {
+		$config{moderate_pagespec}="!admin()";
+	}
 
-	# admins and maybe users can comment w/o moderation
 	my $session=$params{session};
 	my $user=$session->param("name") if $session;
-	return undef if defined $user && (IkiWiki::is_admin($user) ||
-		(exists $config{moderate_users} && ! $config{moderate_users}));
-
-	return gettext("comment needs moderation");
+	if (pagespec_match($params{page}, $config{moderate_pagespec},
+			location => $params{page},
+			(defined $user ? (user => $user) : ()),
+			(defined $ENV{REMOTE_ADDR} ? (ip => $ENV{REMOTE_ADDR}) : ()),
+	)) {
+		return gettext("comment needs moderation");
+	}
+	else {
+		return undef;
+	}
 }
 
 1
diff --git a/debian/changelog b/debian/changelog
index d1253c079..c58e612db 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,14 @@
 ikiwiki (3.20100303) UNRELEASED; urgency=low
 
   * Fix utf8 issues in calls to md5_hex.
+  * moderatedcomments: Added moderate_pagespec that can be used
+    to control which users or comment locations are moderated.
+    This can be used, just for example, to moderate http://myopenid.com/*
+    if you're getting a lot of spammers from one particular openid
+    provider (who should perhaps answer your emails about them),
+    while not moderating other users.
+  * moderatedcomments: The moderate_users setting is deprecated. Instead,
+    set moderate_pagespec to "!admin()" or "user(*)" instead.
 
  -- Joey Hess <joeyh@debian.org>  Tue, 09 Mar 2010 19:46:35 -0500
 
diff --git a/doc/plugins/moderatedcomments.mdwn b/doc/plugins/moderatedcomments.mdwn
index 97924d742..c29b0b052 100644
--- a/doc/plugins/moderatedcomments.mdwn
+++ b/doc/plugins/moderatedcomments.mdwn
@@ -5,6 +5,8 @@ This plugin causes [[comments]] to be held for manual moderation.
 Admins can access the comment moderation queue via their preferences page.
 
 By default, all comments made by anyone who is not an admin will be held
-for moderation. The `moderate_users` setting can be set to false to avoid
-moderating comments of logged-in users, while still moderating anonymous
-comments.
+for moderation. The `moderate_pagespec` setting can be used to specify a
+[[ikiwiki/PageSpec]] to match comments and users who should be moderated.
+For example, to avoid moderating comments from logged-in users, set
+`moderate_pagespec` to "!user(*)". Or to moderate everyone except for
+admins, set it to "!admin(*)".