X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/14de1d87eff9b3a28435103f1efed2cb0972ec3d..32a70b7c4859dfeb6f9fa91fb4bc0f4d709b8376:/IkiWiki/Plugin/comments.pm

diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index f2cd8f90a..851f4862e 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -22,6 +22,7 @@ sub import {
 	hook(type => "checkconfig", id => 'comments',  call => \&checkconfig);
 	hook(type => "getsetup", id => 'comments',  call => \&getsetup);
 	hook(type => "preprocess", id => 'comment', call => \&preprocess);
+	hook(type => "preprocess", id => 'commentmoderation', call => \&preprocess_moderation);
 	# here for backwards compatability with old comments
 	hook(type => "preprocess", id => '_comment', call => \&preprocess);
 	hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
@@ -142,8 +143,6 @@ sub preprocess {
 	}
 	$content =~ s/\\"/"/g;
 
-	$content = IkiWiki::filter($page, $params{destpage}, $content);
-
 	if ($config{comments_allowdirectives}) {
 		$content = IkiWiki::preprocess($page, $params{destpage},
 			$content);
@@ -177,7 +176,7 @@ sub preprocess {
 		if (defined $oiduser) {
 			# looks like an OpenID
 			$commentauthorurl = $commentuser;
-			$commentauthor = $oiduser;
+			$commentauthor = (defined $params{nickname} && length $params{nickname}) ? $params{nickname} : $oiduser;
 			$commentopenid = $commentuser;
 		}
 		else {
@@ -251,6 +250,22 @@ sub preprocess {
 	return $content;
 }
 
+sub preprocess_moderation {
+	my %params = @_;
+
+	$params{desc}=gettext("Comment Moderation")
+		unless defined $params{desc};
+
+	if (length $config{cgiurl}) {
+		return '<a href="'.
+			IkiWiki::cgiurl(do => 'commentmoderation').
+			'">'.$params{desc}.'</a>';
+	}
+	else {
+		return $params{desc};
+	}
+}
+
 sub sessioncgi ($$) {
 	my $cgi=shift;
 	my $session=shift;
@@ -396,14 +411,18 @@ sub editcomment ($$) {
 
 	my $content = "[[!comment format=$type\n";
 
-	# FIXME: handling of double quotes probably wrong?
 	if (defined $session->param('name')) {
 		my $username = $session->param('name');
 		$username =~ s/"/&quot;/g;
 		$content .= " username=\"$username\"\n";
 	}
-	elsif (defined $ENV{REMOTE_ADDR}) {
-		my $ip = $ENV{REMOTE_ADDR};
+	if (defined $session->param('nickname')) {
+		my $nickname = $session->param('nickname');
+		$nickname =~ s/"/&quot;/g;
+		$content .= " nickname=\"$nickname\"\n";
+	}
+	elsif (defined $session->remote_addr()) {
+		my $ip = $session->remote_addr();
 		if ($ip =~ m/^([.0-9]+)$/) {
 			$content .= " ip=\"$1\"\n";
 		}
@@ -433,7 +452,8 @@ sub editcomment ($$) {
 
 	$content .= " date=\"" . decode_utf8(strftime('%Y-%m-%dT%H:%M:%SZ', gmtime)) . "\"\n";
 
-	my $editcontent = $form->field('editcontent') || '';
+	my $editcontent = $form->field('editcontent');
+	$editcontent="" if ! defined $editcontent;
 	$editcontent =~ s/\r\n/\n/g;
 	$editcontent =~ s/\r/\n/g;
 	$editcontent =~ s/"/\\"/g;
@@ -512,8 +532,10 @@ sub editcomment ($$) {
 
 			IkiWiki::rcs_add($file);
 			IkiWiki::disable_commit_hook();
-			$conflict = IkiWiki::rcs_commit_staged($message,
-				$session->param('name'), $ENV{REMOTE_ADDR});
+			$conflict = IkiWiki::rcs_commit_staged(
+				message => $message,
+				session => $session,
+			);
 			IkiWiki::enable_commit_hook();
 			IkiWiki::rcs_update();
 		}
@@ -536,7 +558,7 @@ sub editcomment ($$) {
 	}
 	else {
 		IkiWiki::showform ($form, \@buttons, $session, $cgi,
-			forcebaseurl => $baseurl);
+			forcebaseurl => $baseurl, page => $page);
 	}
 
 	exit;
@@ -562,6 +584,7 @@ sub commentmoderation ($$) {
 		my $added=0;
 		foreach my $id (keys %vars) {
 			if ($id =~ /(.*)\._comment(?:_pending)?$/) {
+				$id=decode_utf8($id);
 				my $action=$cgi->param($id);
 				next if $action eq 'Defer' && ! $rejectalldefer;
 
@@ -601,8 +624,10 @@ sub commentmoderation ($$) {
 			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});
+				$conflict=IkiWiki::rcs_commit_staged(
+					message => $message,
+					session => $session,
+				);
 				IkiWiki::enable_commit_hook();
 				IkiWiki::rcs_update();
 			}
@@ -659,16 +684,22 @@ sub comments_pending () {
 
 	eval q{use File::Find};
 	error($@) if $@;
+	eval q{use Cwd};
+	error($@) if $@;
+	my $origdir=getcwd();
 
 	my $find_comments=sub {
 		my $dir=shift;
 		my $extension=shift;
 		return unless -d $dir;
+
+		chdir($dir) || die "chdir $dir: $!";
+
 		find({
 			no_chdir => 1,
 			wanted => sub {
 				my $file=decode_utf8($_);
-				$file=~s/^\Q$dir\E\/?//;
+				$file=~s/^\.\///;
 				return if ! length $file || IkiWiki::file_pruned($file)
 					|| -l $_ || -d _ || $file !~ /\Q$extension\E$/;
 				my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
@@ -677,7 +708,9 @@ sub comments_pending () {
 					push @ret, [$f, $dir, $ctime];
 				}
 			}
-		}, $dir);
+		}, ".");
+
+		chdir($origdir) || die "chdir $origdir: $!";
 	};
 	
 	$find_comments->($config{srcdir}, "._comment_pending");
@@ -913,7 +946,7 @@ sub match_comment ($$;@) {
 	my $source=exists $IkiWiki::pagesources{$page} ?
 		$IkiWiki::pagesources{$page} :
 		$IkiWiki::delpagesources{$page};
-	my $type=IkiWiki::pagetype($source);
+	my $type=defined $source ? IkiWiki::pagetype($source) : undef;
 	if (! defined $type || $type ne "_comment") {
 		return IkiWiki::FailReason->new("$page is not a comment");
 	}
@@ -928,7 +961,7 @@ sub match_comment_pending ($$;@) {
 	my $source=exists $IkiWiki::pagesources{$page} ?
 		$IkiWiki::pagesources{$page} :
 		$IkiWiki::delpagesources{$page};
-	my $type=IkiWiki::pagetype($source);
+	my $type=defined $source ? IkiWiki::pagetype($source) : undef;
 	if (! defined $type || $type ne "_comment_pending") {
 		return IkiWiki::FailReason->new("$page is not a pending comment");
 	}