-[no]e|xecute: Set execute mode.
-# (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
+# (c) Copyright 2000-2021, Andrew@DeFaria.com, all rights reserved.
=cut
use warnings;
use Getopt::Long;
+use Email::Valid;
use FindBin;
use File::Temp qw (tempfile);
use Net::Domain qw (hostdomain);
-use lib $FindBin::Bin, '/opt/clearscm/lib';
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/../../lib";
use MAPS;
use MAPSLog;
use Display;
use Utils;
-my $verbose = 0;
-my $execute = 1;
-my $userid = $ENV{USER};
-
-my $logpath = "$FindBin::Bin/../log";
-my $logfile = "$logpath/debug.log";
-my $forwardto = $ENV{MAPS_FORWARDTO} || 'adefaria@gmail.com';
+my $verbose = 0;
+my $execute = 1;
+my $userid = $ENV{USER};
# For some reason I'm not parsing messages correctly but it only seems to
# happen when the message is piped in from the MTA. This routine will
# temporarily save the messages in a file.
-sub SaveStdin () {
+sub SaveStdin() {
# Generate tempfile
my $msgfile = tempfile ();
return $msgfile;
} # SaveStdin
-sub ValidDomainUser ($) {
+sub ValidDomainUser($) {
my ($sender) = @_;
my ($username, $domainname);
sub ProcessMsgs ($$$) {
my ($msgfile, $username, $user_email) = @_;
- return
- unless $execute;
+ return unless $execute;
while (!eof *$msgfile) {
my ($sender, $sender_long, $reply_to, $subject, $data) = ReadMsg (*$msgfile);
- #if ($forwardto) {
- # Forward a copy
- #open my $mail, '|', "/usr/lib/sendmail $forwardto"
- #or die "Unable to open pipe to sendmail - $!";
-
- #print $mail "$data\n";
-
- #close $mail
- #or die "Unable to forward email to $forwardto - $!";
- #} # if
-
my ($onlist, $rule, $sequence, $hit_count);
# Algorithm change: We now first check to see if the sender is not found
#
# Finally, we handle return processing
- # Special sender handling:
- if ($sender !~ /.+\@.+/) {
- verbose "Sender not found in message or invalid";
- next;
- } # if
+ # Discard any email with an invalid email address
+ next unless Email::Valid->address($sender);
if ($sender eq $user_email and
(lc ($sender_long) !~ lc ("\"$username\" <$user_email>") and
if ($onlist) {
verbose "Blacklisting $sender";
- my @msg = split /\n/, $data;
- Blacklist $sender, $sequence, $hit_count, @msg;
+ Blacklist(
+ userid => $userid,
+ sender => $sender,
+ sequence => $sequence,
+ hit_count => $hit_count,
+ data => $data,
+ );
+
next;
} # if
# Return processing:
verbose "Returning message from $sender";
- ReturnMsg $sender, $reply_to, $subject, $data;
+ ReturnMsg(
+ userid => $userid,
+ sender => $sender,
+ reply_to => $reply_to,
+ subject => $subject,
+ data => $data,
+ );
} # while
} # ProcessMsgs
# Main
-GetOptions (
+GetOptions(
'user=s' => \$userid,
'verbose' => sub { set_verbose },
'debug' => sub { set_debug },
'execute!' => \$execute,
- 'forwardto=s' => \$forwardto
) || Usage;
my $msgfile;
if ($ARGV[0] and $ARGV[0] ne "") {
- open $msgfile, $ARGV[0];
+ open $msgfile, '<', $ARGV[0];
- if (!$msgfile) {
+ unless ($msgfile) {
Error "Unable to open file ($ARGV[0]): $!\n";
exit 1;
} # if
verbose "Starting MAPS....";
-my ($username, $user_email) = SetContext $userid
+my %userOptions = SetContext $userid
or die "$userid is not a registered MAPS user\n";
-ProcessMsgs $msgfile, $username, $user_email;
+ProcessMsgs $msgfile, $userOptions{name}, $userOptions{email};
exit 0;