X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/8e752d09766da8b3ebb9ca9ba6f67be7168e63d1..3961ef6c4f4c1194b25fe61b6cb589e61d2e19d1:/IkiWiki/Plugin/comments.pm

diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index 91a482ed6..1ef79a27a 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -90,6 +90,15 @@ sub getsetup () {
 			safe => 0,
 			rebuild => 0,
 		},
+		comments_allowformats => {
+			type => 'string',
+			default => '',
+			example => 'mdwn txt',
+			description => 'Restrict formats for comments to (no restriction if empty)',
+			safe => 1,
+			rebuild => 0,
+		},
+
 }
 
 sub checkconfig () {
@@ -101,6 +110,8 @@ sub checkconfig () {
 		unless defined $config{comments_closed_pagespec};
 	$config{comments_pagename} = 'comment_'
 		unless defined $config{comments_pagename};
+	$config{comments_allowformats} = ''
+		unless defined $config{comments_allowformats};
 }
 
 sub htmlize {
@@ -128,12 +139,18 @@ sub safeurl ($) {
 	}
 }
 
+sub isallowed ($) {
+    my $format = shift;
+    return ! $config{comments_allowformats} || $config{comments_allowformats} =~ /\b$format\b/;
+}
+
 sub preprocess {
 	my %params = @_;
 	my $page = $params{page};
 
 	my $format = $params{format};
-	if (defined $format && ! exists $IkiWiki::hooks{htmlize}{$format}) {
+	if (defined $format && (! exists $IkiWiki::hooks{htmlize}{$format} ||
+				! isallowed($format))) {
 		error(sprintf(gettext("unsupported page format %s"), $format));
 	}
 
@@ -301,7 +318,8 @@ sub editcomment ($$) {
 
 	my @buttons = (POST_COMMENT, PREVIEW, CANCEL);
 	my $form = CGI::FormBuilder->new(
-		fields => [qw{do sid page subject editcontent type author url}],
+		fields => [qw{do sid page subject editcontent type author
+			email url subscribe anonsubscribe}],
 		charset => 'utf-8',
 		method => 'POST',
 		required => [qw{editcontent}],
@@ -331,7 +349,7 @@ sub editcomment ($$) {
 
 	my @page_types;
 	if (exists $IkiWiki::hooks{htmlize}) {
-		foreach my $key (grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}}) {
+		foreach my $key (grep { !/^_/ && isallowed($_) } keys %{$IkiWiki::hooks{htmlize}}) {
 			push @page_types, [$key, $IkiWiki::hooks{htmlize}{$key}{longname} || $key];
 		}
 	}
@@ -346,18 +364,35 @@ sub editcomment ($$) {
 	$form->field(name => "type", value => $type, force => 1,
 		type => 'select', options => \@page_types);
 
-	$form->tmpl_param(username => $session->param('name'));
+	my $username=$session->param('name');
+	$form->tmpl_param(username => $username);
+		
+	$form->field(name => "subscribe", type => 'hidden');
+	$form->field(name => "anonsubscribe", type => 'hidden');
+	if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+		if (defined $username) {
+			$form->field(name => "subscribe", type => "checkbox",
+				options => [gettext("email replies to me")]);
+		}
+		elsif (IkiWiki::Plugin::passwordauth->can("anonuser")) {
+			$form->field(name => "anonsubscribe", type => "checkbox",
+				options => [gettext("email replies to me")]);
+		}
+	}
 
 	if ($config{comments_allowauthor} and
 	    ! defined $session->param('name')) {
 		$form->tmpl_param(allowauthor => 1);
 		$form->field(name => 'author', type => 'text', size => '40');
+		$form->field(name => 'email', type => 'text', size => '40');
 		$form->field(name => 'url', type => 'text', size => '40');
 	}
 	else {
 		$form->tmpl_param(allowauthor => 0);
 		$form->field(name => 'author', type => 'hidden', value => '',
 			force => 1);
+		$form->field(name => 'email', type => 'hidden', value => '',
+			force => 1);
 		$form->field(name => 'url', type => 'hidden', value => '',
 			force => 1);
 	}
@@ -425,10 +460,7 @@ sub editcomment ($$) {
 		$content .= " nickname=\"$nickname\"\n";
 	}
 	elsif (defined $session->remote_addr()) {
-		my $ip = $session->remote_addr();
-		if ($ip =~ m/^([.0-9]+)$/) {
-			$content .= " ip=\"$1\"\n";
-		}
+		$content .= " ip=\"".$session->remote_addr()."\"\n";
 	}
 
 	if ($config{comments_allowauthor}) {
@@ -490,6 +522,20 @@ sub editcomment ($$) {
 
 	if ($form->submitted eq POST_COMMENT && $form->validate) {
 		IkiWiki::checksessionexpiry($cgi, $session);
+
+		if (IkiWiki::Plugin::notifyemail->can("subscribe")) {
+			my $subspec="comment($page)";
+			if (defined $username &&
+			    length $form->field("subscribe")) {
+				IkiWiki::Plugin::notifyemail::subscribe(
+					$username, $subspec);
+			}
+			elsif (length $form->field("email") &&
+			       length $form->field("anonsubscribe")) {
+				IkiWiki::Plugin::notifyemail::anonsubscribe(
+					$form->field("email"), $subspec);
+			}
+		}
 		
 		$postcomment=1;
 		my $ok=IkiWiki::check_content(content => $form->field('editcontent'),
@@ -575,7 +621,8 @@ sub editcomment ($$) {
 
 sub getavatar ($) {
 	my $user=shift;
-	
+	return undef unless defined $user;
+
 	my $avatar;
 	eval q{use Libravatar::URL};
 	if (! $@) {
@@ -632,9 +679,11 @@ sub commentmoderation ($$) {
 
 				my $page=IkiWiki::dirname($f);
 				my $file="$config{srcdir}/$f";
+				my $filedir=$config{srcdir};
 				if (! -e $file) {
 					# old location
 					$file="$config{wikistatedir}/comments_pending/".$f;
+					$filedir="$config{wikistatedir}/comments_pending";
 				}
 
 				if ($action eq 'Accept') {
@@ -649,7 +698,7 @@ sub commentmoderation ($$) {
 				}
 
 				require IkiWiki::Render;
-				IkiWiki::prune($file);
+				IkiWiki::prune($file, $filedir);
 			}
 		}