#! /bin/sh # Copyright (c) 2001 University of Cambridge. # See the file NOTICE for conditions of use and distribution. # A shell+perl wrapper script to run an automated -bh test to check out # ACLs for incoming addresses. # See if this installation is using the esoteric "USE_NODE" feature of Exim, # in which it uses the host's name as a suffix for the configuration file name. # Set $hostsuffix if a suffixed file is found. configure_file_use_node= if [ "$configure_file_use_node" = "yes" ]; then host=`uname -n` if [ ! "$host" != "" ]; then if [ -f /usr/local/packages/exim-4.01/etc/configure.$host ]; then hostsuffix=.$host fi fi fi # Set the configuration file name config=/usr/local/packages/exim-4.01/etc/configure$hostsuffix # Search for an exim_path setting in the configure file; otherwise use the bin # directory. exim_path=`grep '^[ ]*exim_path' $config | sed 's/.*=[ ]*//'` if test "$exim_path" = ""; then exim_path=/usr/local/packages/exim-4.01/bin/exim; fi ######################################################################### # Now run the perl script, passing in the Exim path and the arguments given # to the overall script. /usr/bin/perl - $exim_path $@ <<'End' use FileHandle; use IPC::Open2; if (scalar(@ARGV) < 3) { print "Usage: exim_checkaccess [exim options]\n"; exit(1); } $exim_path = $ARGV[0]; # Set up by the calling shell script $host = $ARGV[1]; # Mandatory original first argument $recipient = $ARGV[2]; # Mandatory original second argument # Build any remaining original arguments into a string for passing over # as Exim options. $opt = ""; for ($i = 3; $i < scalar(@ARGV); $i++) { $opt .= "$ARGV[$i] "; } # If the string contains "-f xxxx", extract that as the sender. Otherwise # the sender is <>. $sender = ""; if ($opt =~ /(?:^|\s)-f\s+(\S+|"[^"]*")/) { $sender = $1; $opt = $` . $'; } # Run a -bh test in Exim, passing the test data $pid = open2(*IN, *OUT, "$exim_path -bh $host $opt 2>/dev/null"); print OUT "MAIL FROM:<$sender>\r\n"; print OUT "RCPT TO:<$recipient>\r\n"; print OUT "QUIT\r\n"; close OUT; # Read the output, ignoring anything but the SMTP response to the RCPT # command. $count = 0; $reply = ""; while () { next if !/^\d\d\d/; $reply .= $_; next if /^\d\d\d\-/; if (++$count != 3) { $reply = ""; next; } # We have the response we want. Interpret it. if ($reply =~ /^2\d\d/) { print "Accepted\n"; } else { print "Rejected:\n"; $reply =~ s/\n(.)/\n $1/g; print " $reply"; } last; } # Reap the child process waitpid $pid, 0; End