]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
Merge branch 'master' into commentreorg
authorJoey Hess <joey@kitenet.net>
Sat, 8 May 2010 02:30:42 +0000 (22:30 -0400)
committerJoey Hess <joey@kitenet.net>
Sat, 8 May 2010 02:30:42 +0000 (22:30 -0400)
1  2 
IkiWiki/Plugin/comments.pm
debian/NEWS
debian/changelog

index 348d91fd85ae567e5288f1306dcf83062f34e277,6d513cd2a070343363ca9eb013f8f497c91ed308..3cafcbe9c6860dbfb95087da454bf364617f1292
@@@ -26,11 -26,8 +26,11 @@@ sub import 
        hook(type => "preprocess", id => '_comment', call => \&preprocess);
        hook(type => "sessioncgi", id => 'comment', call => \&sessioncgi);
        hook(type => "htmlize", id => "_comment", call => \&htmlize);
 +      hook(type => "htmlize", id => "_comment_pending",
 +              call => \&htmlize_pending);
        hook(type => "pagetemplate", id => "comments", call => \&pagetemplate);
 -      hook(type => "formbuilder_setup", id => "comments", call => \&formbuilder_setup);
 +      hook(type => "formbuilder_setup", id => "comments",
 +              call => \&formbuilder_setup);
        # Load goto to fix up user page links for logged-in commenters
        IkiWiki::loadplugin("goto");
        IkiWiki::loadplugin("inline");
@@@ -107,14 -104,6 +107,14 @@@ sub htmlize 
        return $params{content};
  }
  
 +sub htmlize_pending {
 +      my %params = @_;
 +      return sprintf(gettext("this comment needs %s"),
 +              '<a href="'.
 +              IkiWiki::cgiurl(do => "commentmoderation").'">'.
 +              gettext("moderation").'</a>');
 +}
 +
  # FIXME: copied verbatim from meta
  sub safeurl ($) {
        my $url=shift;
@@@ -262,6 -251,10 +262,10 @@@ sub sessioncgi ($$) 
        elsif ($do eq 'commentmoderation') {
                commentmoderation($cgi, $session);
        }
+       elsif ($do eq 'commentsignin') {
+               IkiWiki::cgi_signin($cgi, $session);
+               exit;
+       }
  }
  
  # Mostly cargo-culted from IkiWiki::plugin::editpage
@@@ -339,7 -332,7 +343,7 @@@ sub editcomment ($$) 
  
        if (! defined $session->param('name')) {
                # Make signinurl work and return here.
-               $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'signin'));
+               $form->tmpl_param(signinurl => IkiWiki::cgiurl(do => 'commentsignin'));
                $session->param(postsignin => $ENV{QUERY_STRING});
                IkiWiki::cgi_savesession($session);
        }
                $postcomment=0;
  
                if (! $ok) {
 -                      my $penddir=$config{wikistatedir}."/comments_pending";
 -                      $location=unique_comment_location($page, $content, $penddir);
 -                      writefile("$location._comment", $penddir, $content);
 +                      $location=unique_comment_location($page, $content, $config{srcdir}, "._comment_pending");
 +                      writefile("$location._comment_pending", $config{srcdir}, $content);
 +
 +                      # Refresh so anything that deals with pending
 +                      # comments can be updated.
 +                      require IkiWiki::Render;
 +                      IkiWiki::refresh();
 +                      IkiWiki::saveindex();
 +
                        IkiWiki::printheader($session);
                        print IkiWiki::misctemplate(gettext(gettext("comment stored for moderation")),
                                "<p>".
@@@ -557,24 -544,21 +561,24 @@@ sub commentmoderation ($$) 
                my %vars=$cgi->Vars;
                my $added=0;
                foreach my $id (keys %vars) {
 -                      if ($id =~ /(.*)\Q._comment\E$/) {
 +                      if ($id =~ /(.*)\._comment(?:_pending)?$/) {
                                my $action=$cgi->param($id);
                                next if $action eq 'Defer' && ! $rejectalldefer;
  
                                # Make sure that the id is of a legal
 -                              # pending comment before untainting.
 -                              my ($f)= $id =~ /$config{wiki_file_regexp}/;
 +                              # pending comment.
 +                              my ($f) = $id =~ /$config{wiki_file_regexp}/;
                                if (! defined $f || ! length $f ||
                                    IkiWiki::file_pruned($f)) {
                                        error("illegal file");
                                }
  
 -                              my $page=IkiWiki::possibly_foolish_untaint(IkiWiki::dirname($1));
 -                              my $file="$config{wikistatedir}/comments_pending/".
 -                                      IkiWiki::possibly_foolish_untaint($id);
 +                              my $page=IkiWiki::dirname($f);
 +                              my $file="$config{srcdir}/$f";
 +                              if (! -e $file) {
 +                                      # old location
 +                                      $file="$config{wikistatedir}/comments_pending/".$f;
 +                              }
  
                                if ($action eq 'Accept') {
                                        my $content=eval { readfile($file) };
                                        $added++;
                                }
  
 -                              # This removes empty subdirs, so the
 -                              # .ikiwiki/comments_pending dir will
 -                              # go away when all are moderated.
                                require IkiWiki::Render;
                                IkiWiki::prune($file);
                        }
        }
  
        my @comments=map {
 -              my ($id, $ctime)=@{$_};
 -              my $file="$config{wikistatedir}/comments_pending/$id";
 -              my $content=readfile($file);
 +              my ($id, $dir, $ctime)=@{$_};
 +              my $content=readfile("$dir/$id");
                my $preview=previewcomment($content, $id,
 -                      IkiWiki::dirname($_), $ctime);
 +                      $id, $ctime);
                {
                        id => $id,
                        view => $preview,
 -              } 
 -      } sort { $b->[1] <=> $a->[1] } comments_pending();
 +              }
 +      } sort { $b->[2] <=> $a->[2] } comments_pending();
  
        my $template=template("commentmoderation.tmpl");
        $template->param(
@@@ -651,35 -639,26 +655,35 @@@ sub formbuilder_setup (@) 
  }
  
  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 {
 -                      my $file=decode_utf8($_);
 -                      $file=~s/^\Q$dir\E\/?//;
 -                      return if ! length $file || IkiWiki::file_pruned($file)
 -                              || -l $_ || -d _ || $file !~ /\Q._comment\E$/;
 -                      my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
 -                      if (defined $f) {
 -                              my $ctime=(stat($_))[10];
 -                              push @ret, [$f, $ctime];
 +
 +      my $find_comments=sub {
 +              my $dir=shift;
 +              my $extension=shift;
 +              return unless -d $dir;
 +              find({
 +                      no_chdir => 1,
 +                      wanted => sub {
 +                              my $file=decode_utf8($_);
 +                              $file=~s/^\Q$dir\E\/?//;
 +                              return if ! length $file || IkiWiki::file_pruned($file)
 +                                      || -l $_ || -d _ || $file !~ /\Q$extension\E$/;
 +                              my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint
 +                              if (defined $f) {
 +                                      my $ctime=(stat($_))[10];
 +                                      push @ret, [$f, $dir, $ctime];
 +                              }
                        }
 -              }
 -      }, $dir);
 +              }, $dir);
 +      };
 +      
 +      $find_comments->($config{srcdir}, "._comment_pending");
 +      # old location
 +      $find_comments->("$config{wikistatedir}/comments_pending/",
 +              "._comment");
  
        return @ret;
  }
@@@ -714,7 -693,7 +718,7 @@@ sub previewcomment ($$$) 
  sub commentsshown ($) {
        my $page=shift;
  
 -      return ! pagespec_match($page, "internal(*/$config{comments_pagename}*)",
 +      return ! pagespec_match($page, "comment(*)",
                                location => $page) &&
               pagespec_match($page, $config{comments_pagespec},
                              location => $page);
@@@ -744,7 -723,7 +748,7 @@@ sub pagetemplate (@) 
                my $comments = undef;
                if ($shown) {
                        $comments = IkiWiki::preprocess_inline(
 -                              pages => "internal($page/$config{comments_pagename}*)",
 +                              pages => "comment($page)",
                                template => 'comment',
                                show => 0,
                                reverse => 'yes',
@@@ -858,20 -837,21 +862,20 @@@ sub num_comments ($$) 
        return @comments;
  }
  
 -sub unique_comment_location ($$$) {
 +sub unique_comment_location ($$$$) {
        my $page=shift;
 -
        eval q{use Digest::MD5 'md5_hex'};
        error($@) if $@;
        my $content_md5=md5_hex(Encode::encode_utf8(shift));
 -
        my $dir=shift;
 +      my $ext=shift || "._comment";
  
        my $location;
        my $i = num_comments($page, $dir);
        do {
                $i++;
                $location = "$page/$config{comments_pagename}${i}_${content_md5}";
 -      } while (-e "$dir/$location._comment");
 +      } while (-e "$dir/$location$ext");
  
        return $location;
  }
@@@ -897,37 -877,7 +901,37 @@@ sub match_postcomment ($$;@) 
        if (! $postcomment) {
                return IkiWiki::FailReason->new("not posting a comment");
        }
 -      return match_glob($page, $glob);
 +      return match_glob($page, $glob, @_);
 +}
 +
 +sub match_comment ($$;@) {
 +      my $page = shift;
 +      my $glob = shift;
 +
 +      if (! IkiWiki::isinternal($page)) {
 +              return IkiWiki::FailReason->new("$page is not a comment");
 +      }
 +      my $type=IkiWiki::pagetype($IkiWiki::pagesources{$page});
 +      if (defined $type && $type ne "_comment") {
 +              return IkiWiki::FailReason->new("$page is not a comment");
 +      }
 +
 +      return match_glob($page, "$glob/*", internal => 1, @_);
 +}
 +
 +sub match_comment_pending ($$;@) {
 +      my $page = shift;
 +      my $glob = shift;
 +      
 +      if (! IkiWiki::isinternal($page)) {
 +              return IkiWiki::FailReason->new("$page is not a pending comment");
 +      }
 +      my $type=IkiWiki::pagetype($IkiWiki::pagesources{$page});
 +      if (defined $type && $type ne "_comment_pending") {
 +              return IkiWiki::FailReason->new("$page is not a pending comment");
 +      }
 +
 +      return match_glob($page, "$glob/*", internal => 1, @_);
  }
  
  1
diff --combined debian/NEWS
index 8f456bced2e9bcafd74efbdc4644ce5f4ab4ba3e,e65a154577574525af25b6b3839fc41a1a8fd114..68f0a207b4edb94f4011688e25785dc729c6c541
@@@ -8,13 -8,12 +8,18 @@@ ikiwiki (3.20100505) UNRELEASED; urgenc
      <TMPL_IF FORCEBASEURL><base href="<TMPL_VAR FORCEBASEURL>" /><TMPL_ELSE>
      <TMPL_IF BASEURL><base href="<TMPL_VAR BASEURL>" /></TMPL_IF>
      </TMPL_IF>
 +  
 +  Also, there is a new "comment()" pagespec, that can be used to match a
 +  comment on a page. It is recommended it be used instead of the old
 +  method of using a pagespec such as "internal(comment_*)" to match
 +  things that looked like comments. The old pagespec will now also match
 +  comments that are held for moderation; likely not what you want.
  
+   There have also been some changes to the style.css in this version,
+   particularly to support the new openid selector. If you have a modified
+   version, of style.css, updating it (or moving it to local.css) is
+   recommended.
   -- Joey Hess <joeyh@debian.org>  Wed, 05 May 2010 21:47:08 -0400
  
  ikiwiki (3.20100427) unstable; urgency=low
diff --combined debian/changelog
index 0851a975d5b1905a29123d99d8a52e4c18f993f5,050613706405f827889ad8ba7dd5f8a0dcebeefa..f74e9929fda1ea6cfc8474265a69641368112809
@@@ -4,20 -4,20 +4,28 @@@ ikiwiki (3.20100505) UNRELEASED; urgenc
      a single template, page.tmpl.
    * If you have a locally customised page.tmpl, it needs to be updated
      to set <base> when BASEURL or FORCEBAREURL is set.
 +  * comments: Comments pending moderation are now stored in the srcdir
 +    alongside accepted comments, but with a `._comment_pending` extension.
 +    This allows easier byhand moderation, as the "_pending" need
 +    only be stripped off and the comment be committed to version control.
 +  * The `comment_pending()` pagespec can be used to match such unmoderated
 +    comments, which makes it easy to add a feed of them, or a counter
 +    indicating how many there are.
 +  * Belatedly added a `comment()` pagespec.
    * Gave comment and page editing forms some CSS and accessability love.
    * Renamed postscan hook to indexhtml, to reflect its changed position,
      and typical use.
    * inline: Call indexhtml when inlining internal pages, so their
      text can be indexed for searching.
    * Delete hooks are passed deleted internal pages. 
+   * openid: Incorporated a fancy openid-selector signin form.
+     (http://code.google.com/p/openid-selector/)
+   * openid: Use "openid_identifier" as the form field, as required
+     by OpenID Authentication v2.0 spec.
+   * Removed the openidsignup option. Instead, my recommendation is to
+     leave passwordauth enabled and let people who don't have an openid use it.
+     The openid selector form avoids the UI annoyance of having both openid
+     and passwordauth on one form.
  
   -- Joey Hess <joeyh@debian.org>  Wed, 05 May 2010 18:07:29 -0400