#! /usr/bin/perl5 unless (@ARGV) { print "Usage: $0 /path/to/postfix-source\n"; exit 0; } $postfix = shift @ARGV; @files = qw(src/smtpd/smtpd_check.c src/smtpd/Makefile.in src/global/mail_params.h src/smtpd/smtpd.c); $saved = "saved"; ###################################################### # Make sure we have everything. # ###################################################### foreach (@files) { die "Required file $postfix/$_ missing\n" unless (-e "$postfix/$_"); } ######################################################## # Handle restoring old backups and making new backups. # ######################################################## foreach (@files) { if (-e "$postfix/$_.$saved") { print "Restoring $_.$saved\n"; system("/bin/mv","$postfix/$_.$saved","$postfix/$_"); if (-e "$postfix/$_.$saved") { die "Failed to restoring $_.$saved!\n"; } } print "Saving backup as $_.$saved\n"; system("/bin/cp","$postfix/$_","$postfix/$_.$saved"); unless (-e "$postfix/$_.$saved") { die "Failed to make backup to $_.$saved!\n"; } } ###################################################### # Append authd libs to LIBS in the makefile # ###################################################### $search=""; $replace=""; $filename=""; $mode = "search"; while(){ if (/^SEARCH\s+(\S+)/) { &dosearchreplace; $filename=$1; $mode="search"; } elsif (/^REPLACE\S*$/) { $mode="replace"; } else { ${$mode} .= $_; } } &dosearchreplace; sub dosearchreplace { return unless ($search =~ /./); die "filename, search, replace must all be specified\n" unless (($filename =~ /./) && ($search =~ /./) && ($replace =~ /./)); print "Working on $filename\n"; $in = &getfile("$postfix/$filename"); print " - Read " . length($in) . " bytes\n"; $o=index($in,$search); print " - Offset found at $o\n"; if ($o>=0) { substr($in,$o,length($search))=$replace; print " - New length is now " . length($in) . " bytes\n"; } else { die "Could not find offset for $search\n"; } print " - Writing $filename\n"; &putfile("$postfix/$filename",$in); ($filename,$search,$replace)=(); } sub getfile { my($file) =@_; my(@buffer); open(FILE,"<$file")||die "Could not open <$file : $!"; @buffer=; close FILE; return join("",@buffer); } sub putfile { my($file,$buffer) = @_; open(FILE,">$file")||die "Could not write >$file : $!"; print FILE $buffer; close FILE; } __END__ SEARCH src/smtpd/smtpd_check.c /* generic_checks - generic restrictions */ REPLACE /* check_authd - send an udp blurp to an authd server; if not 000, respond appropriately */ char * authd_client(char *hostname,char *ipaddress,char *hello,char *mailfrom, char *mailto); char *check_authd_str(char *txt); char *check_authd_str(char *txt) { return txt ? txt : "(NULL)"; } static int check_authd(SMTPD_STATE *state) { char *myname = "check_authd"; char *reply = NULL; int replyint = 0; static int initialized = 0; static char buffer[512]; if (msg_verbose) msg_info("%s: %s %s", myname, state->name, state->addr); if (!initialized) { /* Only setenv once - some OS's will eat memory on each setenv */ setenv("AUTHD_RBL",var_authd_host,1); initialized=1; } memset(buffer,0,sizeof(buffer)); reply = authd_client( check_authd_str(state->name), check_authd_str(state->addr), check_authd_str(state->helo_name), check_authd_str(state->sender), check_authd_str(state->recipient) ); if (reply) { strncpy(buffer,reply,sizeof(buffer)); free(reply); } replyint = atoi(buffer); if (!replyint) { return(SMTPD_CHECK_DUNNO); } if (replyint==200) { return(SMTPD_CHECK_DUNNO); } if ((replyint >=200) && (replyint <=399)) { return(SMTPD_CHECK_OK); } return(smtpd_check_reject(state,MAIL_ERROR_POLICY, buffer, replyint, state->addr)); } /* generic_checks - generic restrictions */ SEARCH src/smtpd/smtpd_check.c } else if (strcasecmp(name, REJECT_UNVERIFIED_RECIP) == 0) { if (state->recipient && *state->recipient) status = reject_unverified_address(state, state->recipient, state->recipient, SMTPD_NAME_RECIPIENT, var_unv_rcpt_code); } /* REPLACE } else if (strcasecmp(name, REJECT_UNVERIFIED_RECIP) == 0) { if (state->recipient && *state->recipient) status = reject_unverified_address(state, state->recipient, state->recipient, SMTPD_NAME_RECIPIENT, var_unv_rcpt_code); } else if (strcasecmp(name, CHECK_AUTHD) == 0) { if (state->recipient) status = check_authd(state); } /* SEARCH src/smtpd/smtpd_check.c char *var_smtpd_exp_filter; char *var_def_rbl_reply; char *var_relay_rcpt_maps; char *var_verify_sender; char *var_smtpd_sasl_opts; char *var_local_rwr_clients; typedef struct { char *name; REPLACE char *var_smtpd_exp_filter; char *var_def_rbl_reply; char *var_relay_rcpt_maps; char *var_verify_sender; char *var_smtpd_sasl_opts; char *var_authd_host; typedef struct { char *name; SEARCH src/smtpd/smtpd_check.c VAR_SMTPD_EXP_FILTER, DEF_SMTPD_EXP_FILTER, &var_smtpd_exp_filter, VAR_DEF_RBL_REPLY, DEF_DEF_RBL_REPLY, &var_def_rbl_reply, VAR_RELAY_RCPT_MAPS, DEF_RELAY_RCPT_MAPS, &var_relay_rcpt_maps, VAR_VERIFY_SENDER, DEF_VERIFY_SENDER, &var_verify_sender, VAR_MAIL_NAME, DEF_MAIL_NAME, &var_mail_name, REPLACE VAR_AUTHD_HOST, DEF_AUTHD_HOST, &var_authd_host, VAR_SMTPD_EXP_FILTER, DEF_SMTPD_EXP_FILTER, &var_smtpd_exp_filter, VAR_DEF_RBL_REPLY, DEF_DEF_RBL_REPLY, &var_def_rbl_reply, VAR_RELAY_RCPT_MAPS, DEF_RELAY_RCPT_MAPS, &var_relay_rcpt_maps, VAR_VERIFY_SENDER, DEF_VERIFY_SENDER, &var_verify_sender, VAR_MAIL_NAME, DEF_MAIL_NAME, &var_mail_name, SEARCH src/smtpd/smtpd.c char *var_xclient_hosts; char *var_xforward_hosts; bool var_smtpd_rej_unl_from; bool var_smtpd_rej_unl_rcpt; REPLACE char *var_authd_host; char *var_xclient_hosts; char *var_xforward_hosts; bool var_smtpd_rej_unl_from; bool var_smtpd_rej_unl_rcpt; SEARCH src/smtpd/smtpd.c VAR_VERP_CLIENTS, DEF_VERP_CLIENTS, &var_verp_clients, 0, 0, REPLACE VAR_VERP_CLIENTS, DEF_VERP_CLIENTS, &var_verp_clients, 0, 0, VAR_AUTHD_HOST, DEF_AUTHD_HOST, &var_authd_host, 0, 0, SEARCH src/global/mail_params.h #define REJECT_UNAUTH_PIPE "reject_unauth_pipelining" #define VAR_SMTPD_NULL_KEY "smtpd_null_access_lookup_key" #define DEF_SMTPD_NULL_KEY "<>" extern char *var_smtpd_null_key; REPLACE /* * jfesler's authd http://gigo.com/authd/ */ #define CHECK_AUTHD "check_authd" #define VAR_AUTHD_HOST "authd_host" #define DEF_AUTHD_HOST "127.0.0.1" extern char *var_authd_host; #define REJECT_UNAUTH_PIPE "reject_unauth_pipelining" #define VAR_SMTPD_NULL_KEY "smtpd_null_access_lookup_key" #define DEF_SMTPD_NULL_KEY "<>" extern char *var_smtpd_null_key; SEARCH src/smtpd/Makefile.in TESTPROG= smtpd_token smtpd_check PROG = smtpd INC_DIR = ../../include LIBS = ../../lib/libmaster.a ../../lib/libtls.a ../../lib/libdns.a \ ../../lib/libglobal.a ../../lib/libutil.a .c.o:; $(CC) $(CFLAGS) -c $*.c REPLACE TESTPROG= smtpd_token smtpd_check PROG = smtpd INC_DIR = ../../include LIBS = ../../lib/libmaster.a ../../lib/libtls.a ../../lib/libdns.a \ ../../lib/libglobal.a ../../lib/libutil.a /usr/local/authd/lib/libauthd.a .c.o:; $(CC) $(CFLAGS) -c $*.c