]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/comments.pm
comments: If comment content checks fail, store the comment (in .ikiwiki/comments_pen...
[ikiwiki.git] / IkiWiki / Plugin / comments.pm
index 14e785c8f71cc06977899abc5220856697f5fb4d..4d225b90ae88b40524b51858edcc9366efd99c01 100644 (file)
@@ -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";
 
@@ -406,19 +399,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";
        }
@@ -469,19 +462,34 @@ sub sessioncgi ($$) {
        if ($form->submitted eq POST_COMMENT && $form->validate) {
                IkiWiki::checksessionexpiry($cgi, $session);
                
-               IkiWiki::check_content(content => $form->field('editcontent'),
+               $postcomment=1;
+               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);
-               
-               my $file = "$location._comment";
+                       cgi => $cgi,
+                       session => $session,
+                       nonfatal => 1,
+               );
+               $postcomment=0;
+
+               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")),
+                               "<p>".
+                               gettext("Your comment will be posted after moderator review"),
+                               "</p>");
+                       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;
@@ -651,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 ($$;@) {