aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki
diff options
context:
space:
mode:
authorSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2008-12-11 01:33:43 +0000
committerSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2008-12-11 21:14:05 +0000
commita5889912b386eaa43774907c3844c90e3e3ca7c8 (patch)
tree4e4d4cd27b5d33ee0a45b32ee7bfaaed42a9b7c4 /IkiWiki
parent0a69c7ed56ea244c62319c7a95ba7cfac9696e27 (diff)
downloadikiwiki-a5889912b386eaa43774907c3844c90e3e3ca7c8.tar
ikiwiki-a5889912b386eaa43774907c3844c90e3e3ca7c8.tar.gz
comments: Optionally allow anonymous commenters to set their name/URL.
Also provide a way for the comment template to pick up the verified username/IP.
Diffstat (limited to 'IkiWiki')
-rw-r--r--IkiWiki/Plugin/comments.pm126
1 files changed, 111 insertions, 15 deletions
diff --git a/IkiWiki/Plugin/comments.pm b/IkiWiki/Plugin/comments.pm
index eb915b813..6bd18a5cf 100644
--- a/IkiWiki/Plugin/comments.pm
+++ b/IkiWiki/Plugin/comments.pm
@@ -30,6 +30,18 @@ sub htmlize { # {{{
return $params{content};
} # }}}
+# FIXME: copied verbatim from meta
+sub safeurl ($) { #{{{
+ my $url=shift;
+ if (exists $IkiWiki::Plugin::htmlscrubber::{safe_url_regexp} &&
+ defined $IkiWiki::Plugin::htmlscrubber::safe_url_regexp) {
+ return $url=~/$IkiWiki::Plugin::htmlscrubber::safe_url_regexp/;
+ }
+ else {
+ return 1;
+ }
+} #}}}
+
sub preprocess { # {{{
my %params = @_;
my $page = $params{page};
@@ -64,29 +76,55 @@ sub preprocess { # {{{
);
});
- # override any metadata
+ # set metadata, possibly overriding [[!meta]] directives from the
+ # comment itself
+
+ my $commentuser;
+ my $commentip;
+ my $commentauthor;
+ my $commentauthorurl;
if (defined $params{username}) {
- my ($authorurl, $author) = linkuser($params{username});
- $pagestate{$page}{meta}{author} = $author;
- $pagestate{$page}{meta}{authorurl} = $authorurl;
+ $commentuser = $params{username};
+ ($commentauthorurl, $commentauthor) =
+ linkuser($params{username});
}
elsif (defined $params{ip}) {
- $pagestate{$page}{meta}{author} = sprintf(
- gettext("Anonymous (IP: %s)"),
- $params{ip});
- delete $pagestate{$page}{meta}{authorurl};
+ $commentip = $params{ip};
+ $commentauthor = sprintf(
+ gettext("Anonymous (IP: %s)"), $params{ip});
}
else {
- $pagestate{$page}{meta}{author} = gettext("Anonymous");
- delete $pagestate{$page}{meta}{authorurl};
+ $commentauthor = gettext("Anonymous");
}
- if (defined $params{subject}) {
- $pagestate{$page}{meta}{title} = $params{subject};
+ $pagestate{$page}{comments}{commentuser} = $commentuser;
+ $pagestate{$page}{comments}{commentip} = $commentip;
+ $pagestate{$page}{comments}{commentauthor} = $commentauthor;
+ $pagestate{$page}{comments}{commentauthorurl} = $commentauthorurl;
+ if (!defined $pagestate{$page}{meta}{author}) {
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ }
+ if (!defined $pagestate{$page}{meta}{authorurl}) {
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if ($config{comments_allowauthor}) {
+ if (defined $params{claimedauthor}) {
+ $pagestate{$page}{meta}{author} = $params{claimedauthor};
+ }
+
+ if (defined $params{url} and safeurl($params{url})) {
+ $pagestate{$page}{meta}{authorurl} = $params{url};
+ }
}
else {
- delete $pagestate{$page}{meta}{title};
+ $pagestate{$page}{meta}{author} = $commentauthor;
+ $pagestate{$page}{meta}{authorurl} = $commentauthorurl;
+ }
+
+ if (defined $params{subject}) {
+ $pagestate{$page}{meta}{title} = $params{subject};
}
my $baseurl = urlto($params{destpage}, undef, 1);
@@ -146,7 +184,15 @@ sub getsetup () { #{{{
type => 'boolean',
default => 0,
example => 0,
- description => 'Allow directives in newly posted comments?',
+ description => 'Interpret directives in comments?',
+ safe => 1,
+ rebuild => 0,
+ },
+ comments_allowauthor => {
+ type => 'boolean',
+ default => 0,
+ example => 0,
+ description => 'Allow anonymous commenters to set an author name?',
safe => 1,
rebuild => 0,
},
@@ -233,7 +279,7 @@ sub sessioncgi ($$) { #{{{
my @buttons = (POST_COMMENT, PREVIEW, CANCEL);
my $form = CGI::FormBuilder->new(
- fields => [qw{do sid page subject editcontent type}],
+ fields => [qw{do sid page subject editcontent type author url}],
charset => 'utf-8',
method => 'POST',
required => [qw{editcontent}],
@@ -266,6 +312,8 @@ sub sessioncgi ($$) { #{{{
@page_types = grep { !/^_/ } keys %{$IkiWiki::hooks{htmlize}};
}
+ my $allow_author = $config{comments_allowauthor};
+
$form->field(name => 'do', type => 'hidden');
$form->field(name => 'sid', type => 'hidden', value => $session->id,
force => 1);
@@ -275,6 +323,21 @@ sub sessioncgi ($$) { #{{{
$form->field(name => "type", value => $type, force => 1,
type => 'select', options => \@page_types);
+ $form->tmpl_param(username => $session->param('name'));
+
+ if ($allow_author and !defined $session->param('name')) {
+ $form->tmpl_param(allowauthor => 1);
+ $form->field(name => 'author', 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 => 'url', type => 'hidden', value => '',
+ force => 1);
+ }
+
# The untaint is OK (as in editpage) because we're about to pass
# it to file_pruned anyway
my $page = $form->field('page');
@@ -357,6 +420,19 @@ sub sessioncgi ($$) { #{{{
}
}
+ if ($allow_author) {
+ my $author = $form->field('author');
+ if (length $author) {
+ $author =~ s/"/&quot;/g;
+ $content .= " claimedauthor=\"$author\"\n";
+ }
+ my $url = $form->field('url');
+ if (length $url) {
+ $url =~ s/"/&quot;/g;
+ $content .= " url=\"$url\"\n";
+ }
+ }
+
my $subject = $form->field('subject');
$subject =~ s/"/&quot;/g;
$content .= " subject=\"$subject\"\n";
@@ -496,6 +572,26 @@ sub pagetemplate (@) { #{{{
$template->param(commenturl => $commenturl);
}
}
+
+ if ($template->query(name => 'commentuser')) {
+ $template->param(commentuser =>
+ $pagestate{$page}{comments}{commentuser});
+ }
+
+ if ($template->query(name => 'commentip')) {
+ $template->param(commentip =>
+ $pagestate{$page}{comments}{commentip});
+ }
+
+ if ($template->query(name => 'commentauthor')) {
+ $template->param(commentauthor =>
+ $pagestate{$page}{comments}{commentauthor});
+ }
+
+ if ($template->query(name => 'commentauthorurl')) {
+ $template->param(commentauthorurl =>
+ $pagestate{$page}{comments}{commentauthorurl});
+ }
} # }}}
package IkiWiki::PageSpec;