package Apache::AntiSpam; use strict; use vars qw($VERSION); $VERSION = 0.05; use Apache::Constants qw(:common); use Apache::File; use Carp (); use Email::Find 0.04; sub handler ($$) { my($class, $r) = @_; my $filtered = uc($r->dir_config('Filter')) eq 'ON'; # makes Apache::Filter aware # snippets stolen from Geoffrey Young's Apache::Clean $r = $r->filter_register if $filtered; # AntiSpam filtering is done on text/* files return DECLINED unless ($r->content_type =~ m,^text/, && $r->is_main); my($fh, $status); if ($filtered) { ($fh, $status) = $r->filter_input; undef $fh unless $status == OK; } else { $fh = Apache::File->new($r->filename); } return DECLINED unless $fh; # finds and replaces e-mail addresses # if-statement should be outside the sub for efficiency my $replacer; if (uc($r->dir_config('AntiSpamFormat')) eq 'SPACES') { $replacer = sub { my($email, $orig) = @_; $orig =~ s/\@/ at /g; $orig =~ s/\./ dot /g; $orig =~ s/\-/ bar /g; $orig =~ s/ */ /g; return $orig; }; } else { $replacer = sub { my($email, $orig) = @_; $orig =~ s/\@/-nospam\@/; return $orig; }; } $r->send_http_header; local $/; # slurp my $input = <$fh>; find_emails($input, sub { $class->antispamize(@_) }); $r->print($input); return OK; } sub antispamize { my($class, $email, $orig) = @_; Carp::carp "Apache::AntiSpam should be subclassed. I'll do nothing"; return $orig; } 1; __END__ =head1 NAME Apache::AntiSpam - AntiSpam filter for web pages =head1 SYNOPSIS # You can't use this class directry # see Apache::AntiSpam::* # or ... if you want your own AntiSpam Filter, package Your::AntiSpamFilter; use base qw(Apache::AntiSpam); sub antispamize { my($class, $email, $orig) = @_; # do some filtering with $orig, and return $orig; } # in httpd.conf SetHandler perl-script PerlHandler Your::AntiSpamFilter # filter aware PerlModule Apache::Filter SetHandler perl-script PerlSetVar Filter On PerlHandler Apache::RegistryFilter Your::AntiSpamFilter Apache::Compress =head1 DESCRIPTION Apache::AntiSpam is a filter module to prevent e-mail addresses exposed as is on web pages. The way to hide addresses from spammers are implemented in each of Apache::Antispam::* subclasses. This module is Filter aware, meaning that it can work within Apache::Filter framework without modification. =head1 SUBCLASSING Here is how to make your own filter. =over 4 =item * Declare your class =item * Inherit from Apache::AntiSpam =item * define antispamize() method =back That's all. Template of antispamize() method will be like this: sub antispamize { my($class, $email, $orig) = @_; # do some stuff.. return $orig; } where C<$class> is your class, C<$email> is an instance of Mail::Address, and C<$orig> is an original e-mail address string. See L for details. =head1 TODO =over 4 =item * remove mailto: tags using HTML::Parser. =back =head1 ACKNOWLEDGEMENTS The idea of this module is stolen from Apache::AddrMunge by Mark J Dominus. See http://perl.plover.com/AddrMunge/ for details. Many thanks to Michael G. Schwern for kindly improving the matching speed of Email::Find. =head1 AUTHOR Tatsuhiko Miyagawa This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L, L, L, L. =cut