浏览代码

add a local version of the never released (on CPAN) Kwiki::SpamWhitelist module

Ralf S. Engelschall 21 年之前
父节点
当前提交
cf88a645e3
共有 3 个文件被更改,包括 82 次插入0 次删除
  1. 1 0
      kwiki/kwiki-plugins.txt
  2. 68 0
      kwiki/kwiki-spamwhitelist.pm
  3. 13 0
      kwiki/kwiki.spec

+ 1 - 0
kwiki/kwiki-plugins.txt

@@ -61,6 +61,7 @@ Kwiki::Cache
 #Kwiki::VimMode
 
 #   Optional Authorization Extensions
+#Kwiki::SpamWhitelist
 #Kwiki::PagePrivacy
 #Kwiki::User::Remote
 #Kwiki::Edit::RequireUserName

+ 68 - 0
kwiki/kwiki-spamwhitelist.pm

@@ -0,0 +1,68 @@
+##
+##  Homepage: http://www.kwiki.org/?KwikiSpamWhitelist
+##  Source:   http://www.kwiki.org/?CodeKwikiSpamWhitelist
+##
+
+package Kwiki::SpamWhitelist;
+use Kwiki::Plugin -Base;
+use Kwiki::Formatter;
+our $VERSION = '0.0';
+
+const class_id => 'spam_whitelist';
+
+sub register {
+    my $registry = shift;
+    $registry->add(preload => $self->class_id);
+}
+
+package Kwiki::SpamWhitelist::Mixin;
+use mixin 'Spoon::IndexList';
+use IO::All;
+
+sub spam_link {
+    my ($url, $title) = @_;
+    return unless $url =~ s/^https?:\/\/([^\/]+)/spam:\/\/$1/i;
+    my $domain = $1;
+    my $whitelist =
+      $self->hub->spam_whitelist->plugin_directory . '/whitelist';
+    my $index = $self->index_list($whitelist);
+    my $ok = eval { $index->{$domain} };
+    return 'spam' if $@;
+    return if $ok;
+    my $spam_link = qq{<span style="font-weight: bold; background-color: red">&lt;$url&gt;</span>};
+    $spam_link = qq{<span>$title</span>$spam_link}
+      unless $title =~ /^http/i;
+    return $spam_link;
+}
+
+package Kwiki::Formatter::TitledHyperLink;
+use mixin 'Kwiki::SpamWhitelist::Mixin';
+no warnings;
+
+sub html {
+    my $text = $self->escape_html($self->matched);
+    my ($title1, $target, $title2) = ($text =~ $self->pattern_start);
+    $title1 = '' unless defined $title1;
+    $title2 = '' unless defined $title2;
+    $target =~ s{^\w+:(?!//)}{};
+    my $title = $title1 . ' ' . $title2;
+    $title =~ s/^\s*(.*?)\s*$/$1/;
+    $title = $target
+      unless $title =~ /\S/;
+    return $self->spam_link($target, $title) ||
+           qq(<a href="$target">$title</a>);
+}
+
+package Kwiki::Formatter::HyperLink;
+use mixin 'Kwiki::SpamWhitelist::Mixin';
+
+sub html {
+    my $text = $self->escape_html($self->matched);
+    return $text if $text =~ s/^!//;
+    return qq(<img src="$text" />)
+      if $text =~ /(?:jpe?g|gif|png)$/i;
+    my $target = $text;
+    return $self->spam_link($target, $text) ||
+           qq(<a href="$target">$text</a>);
+}
+

+ 13 - 0
kwiki/kwiki.spec

@@ -158,6 +158,7 @@ Source101:    kwiki-plugins.txt
 Source102:    kwiki-rules.wiki
 Source103:    kwiki-sandbox.wiki
 Source104:    kwiki-openpkg.pm
+Source105:    kwiki-spamwhitelist.pm
 Patch0:       kwiki.patch
 
 #   build information
@@ -600,6 +601,18 @@ AutoReqProv:  no
     cp %{SOURCE kwiki-openpkg.pm} Kwiki-Theme-OpenPKG/OpenPKG.pm
     %{l_prefix}/bin/perl-openpkg -d Kwiki-Theme-OpenPKG configure build install
 
+    #   manually install Anti-Spam extensions
+    mkdir Kwiki-SpamWhitelist
+    ( echo "use ExtUtils::MakeMaker;"
+      echo "WriteMakefile("
+      echo "    NAME         => 'Kwiki::SpamWhitelist',"
+      echo "    VERSION_FROM => 'SpamWhitelist.pm',"
+      echo "    NO_META      => 1,"
+      echo ");"
+    ) >Kwiki-SpamWhitelist/Makefile.PL
+    cp %{SOURCE kwiki-spamwhitelist.pm} Kwiki-SpamWhitelist/SpamWhitelist.pm
+    %{l_prefix}/bin/perl-openpkg -d Kwiki-SpamWhitelist configure build install
+
     #   finalize Perl module installation
     %{l_prefix}/bin/perl-openpkg -F perl-openpkg-files fixate cleanup