#!/usr/bin/eperl -w
###
#
# Copyright (c) Ensim Corporation 2000, 2001   All Rights Reserved.
#
# This software is furnished under a license and may be used and copied
# only  in  accordance  with  the  terms  of such  license and with the
# inclusion of the above copyright notice. This software or any other
# copies thereof may not be provided or otherwise made available to any
# other person. No title to and ownership of the software is hereby
# transferred.
#
# The information in this software is subject to change without notice
# and  should  not be  construed  as  a commitment by Ensim Corporation.
# Ensim assumes no responsibility for the use or  reliability  of its
# software on equipment which is not supplied by Ensim.
#
# Exit codes (on failure error message goes to stderr):
#  0 - success
#  1 - failure
# 
# Boolean arguments on the command line are given as 0 or 1. All the
# command line arguments are encoded to avoid problems with escapes.
#
# All functions defined here either return an error message if an
# error occured and "" if everything went well or allways return a
# valid value, but exit (with code 1) printing an error message if an
# error occurs. This second type of functions have _e appended to
# their name. Functions are allowed to print results onto stdout, but
# errors are printed only in the main program.
# ----------------------------------------------------------------------
# Usage: add_access <rejected>
# ----------------------------------------------------------------------
# This programs adds to the access database an entry that causes
# a certain email address/domain to be rejected.


push @INC, ($ENV{'OCW_SVCPATH'} || "/usr/lib/opcenter")."/sendmail";
push @INC, ($ENV{'OCW_SVCPATH'} || "/usr/lib/opcenter")."/cmdline_common";

use strict;
require CmdLineCoder;
require Locking;
require sendmailconf;

use lib ($ENV{OCW_SVCPATH} or "/usr/lib/opcenter") . "/sendmail";
use lib ($ENV{OCW_SVCPATH} or "/usr/lib/opcenter") . "/cmdline_common";

use ERRORS;
use Carper;

sub unlock_die($);
&CmdLineCoder::decode_args();

my($reject);
die "Usage: add_access <rejected>" unless scalar(@ARGV) == 1;
$reject = shift;

#check for a duplicate entry

&Locking::PushLock ($sendmailconf::config{'sendmail_cf'});
my(@conffile);
open (ACCESS,"/etc/mail/access") || 
    ($cerr += $E_UNABLEREADSPAMFILTER) && 
    unlock_die( "Cannot read spam filter file" );
@conffile = grep { /^$reject\s+REJECT/i } <ACCESS>;
close (ACCESS);

if ( scalar(@conffile) > 0 ) {
    # Already there, nothing more to do
    &Locking::ReleasePushedLocks;
    $cerr += $E_SPAMFILTERALREADYEXISTS and $cerr += { filter => $reject } ;
    print STDERR "Spam Filter $reject already exists";
    exit 0;
}

#add the new entry
open (ACCESS,">>/etc/mail/access") || 
    ($cerr += $E_UNABLEWRITESPAMFILTER) && 
    unlock_die("Cannot write spam filter file");
print ACCESS "$reject\tREJECT\n";
close (ACCESS);

#rebuild the database
system ("$sendmailconf::config{'makemap'} hash /etc/mail/access.db< /etc/mail/access >/dev/null 2>/dev/null");

&Locking::ReleasePushedLocks;
exit 0;

sub unlock_die($) {
    my $msg = shift;
    &Locking::ReleasePushedLocks;
    die( $msg );
}

