#!/usr/bin/perl

use Fcntl ':flock';


if ($ARGV[0]) {
  $option = $ARGV[0];

  $inbox = "/var/mail/";
  $homedir = "/home/";
  ($username = `whoami`) =~ s/^\s*(.*?)\s*$/$1/;
  $inbox .= ${username};
  $homedir .= "${username}/";
  $filterloc = "${homedir}.mail.filter";

  &load_filters();

  &list() if ($option eq "-list");
  &add() if ($option eq "-add");
  &remove() if ($option eq "-remove");
  &usage() if ($option eq "-help");
} else {
  &usage();
  exit 1;
}



sub load_filters {
  $counter = 0;
  return unless (-f "${filterloc}");
  open filter_file, "$filterloc" or warn "Could not open file $filterloc: $!";
  flock filter_file, LOCK_SH;
  foreach (<filter_file>) {
    s/^\s*(.*?)\s*$/$1/;
    next if (/^#/);
    next if (/^$/);
    $filter[$counter] = $_;
    $counter++;
  }
  flock filter_file, LOCK_UN;
  close filter_file;
}


sub list {
  printf "\n%-3s   %-15s %-35s %-50s\n", "Num", "  Field", "      Value", "         Action";
  print "-------------------------------------------------------------------------------------------------\n";
  $counter = 0;
  foreach (@filter) {
    ($ruleset, $action) = split /\|/;
    $ruleset =~ /^\$result = 1 if \(\$incoming\{'(.*?)'\} =~ \/(.*?)\/\);$/;
      $rule_type = ucfirst lc $1;
      $rule_value = $2;
    printf "%3d   %-15s %-35s %-50s\n", ${counter}, ${rule_type}, ${rule_value}, $action;
    $counter++;
  }
  print "\n\n";
}


sub add {
  if (-f "${homedir}.forward") {
    $found = 0;
    open forward_file, "${homedir}.forward" or die "Could not open ${homedir}.forward: $!";
    foreach (<forward_file>) {
      s/^\s*(.*?)\s*$/$1/;
      next if (/^#/);
      $found = 1 if (/mail\.filter/);
    }
    close forward_file;

    if ($found == 0) {
      open forward_file, ">${homedir}.forward" or die "Could not open ${homedir}.forward: $!";
      print forward_file "\"\| /usr/local/bin/mail.filter\"\n";
      close forward_file;
    }
  } else {
    open forward_file, ">${homedir}.forward" or die "Could not create ${homedir}.forward: $!";
    print forward_file "\"\| /usr/local/bin/mail.filter\"\n";
    close forward_file;
  }
 
  print "Adding new filter (CTRL-C to exit).\n\n";

  print "Field (from, to, subject, message): ";
  ($type = <STDIN>) =~ s/^\s*(.*?)\s*$/$1/;

  print "Value to check for: ";
  ($value = <STDIN>) =~ s/^\s*(.*?)\s*$/$1/;
  $value =~ s/^(.*?)\@(.*?)$/$1\\\@$2/;

  print "Action (delete, save <file>, forward <address>, program <command>): ";
  ($action = <STDIN>) =~ s/^\s*(.*?)\s*$/$1/;
  $action =~ s/^(.*?)\@(.*?)$/$1\\\@$2/;

  open filter_file, ">>${filterloc}" or die "Could not open ${filterloc}: $!";
  flock filter_file, LOCK_EX;
  print filter_file "\$result = 1 if (\$incoming{'$type'} =~ /$value/);|$action\n";
  flock filter_file, LOCK_UN;
  close filter_file;
}


sub remove {
  &list();
  print "Enter filter number to remove (CTRL-C to exit): ";
  ($number = <STDIN>) =~ s/^\s*(.*?)\s*$/$1/;
  open filter_file, ">${filterloc}" or die "Could not open ${filterloc}: $!";
  flock filter_file, LOCK_EX;
  $counter = 0;
  foreach (@filter) {
    print filter_file "@filter[$counter]\n" unless ($counter == $number);
    $counter++;
  }
  flock_filter_file, LOCK_UN;
  close filter_file;
}


sub usage {
  print "\n";
  print "Usage: $0 <option>\n";
  print "\t-list\tList Current filters\n";
  print "\t-add\tAdd a new filter\n";
  print "\t-remove\tRemove a filter\n";
  print "\t-help\tDisplay this message\n";
  print "\n\n";
}


