# BEFORE editing this file, you should make sure that it is not linked to # the master version (../.etc/rc.submit) anymore (i.e. "delink rc.submit" # if you do not want your changes to affect all archive servers). # # New mails can be temporarily stalled by creating the file rc.lock (either in # ../.etc for all lists or in the current directory for this list only). #$Id: rc.submit,v 1.93 2000/08/31 05:46:55 guenther Exp $ INCLUDERC=$RC_INIT INCLUDERC=$RC_CUSTOM INCLUDERC=$RC_LOCAL_SUBMIT_00 # # The following recipe makes sure that: # The mail has a sane size (i.e. it is not inordinately big) # It does not look like an administrative request. # It wasn't sent by this list itself. # It wasn't sent by a daemon (misdirected bounce message perhaps). # :0 * < $size_limit * !$^($X_COMMAND:|X-Loop: $\listaddr) * ! B ?? $^^$X_COMMAND: * $$daemon_bias * -100^0 ^FROM_MAILER|\ ^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )\ ([^>]*[^(.%@a-z0-9])?(\ LIST(SERV|proc)|NETSERV|bounce|autoanswer|echo|mirror\ )(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$) * 1^0 { :0 * B ?? >640 * 9876543210^0 { } # # Does it look like a regular submission? # Or perhaps more like an administrative request? # Look at the start of the body, and see if this could be an administrative # request, pass it on to rc.request in that case. # :0 * $$=^0 * 9876543210^0 !divertcheck ?? y { } :0 * $$=^0 * !B ?? ^^(.*$(.*$(.*$(.*$(.*$(.*$(.*$(.*$)?)?)?)?)?)?)?)?[^]>} a-z0-9] * 9876543210^0 B ?? ^^.*$.*$.*$.*$.*$.*$.*$.*$.*$ { } :0 * $$=^0 * $${maintainer:+9876543210^0 ^From[: ](.*\<)?$\maintainer\>} * 9876543210^0 ^(Subject:(.*\<)?(Re:|magazine)\>)|X-(Diagnostic|Mailing-List): * -25^0 ^\ Subject:([ ]*(archives?:?([ ]+(\ (send|get)(me)?|gimme|retrieve|mail|ls|dir(ectory)?|\ list|show|search|[fe]?grep|find|maxfiles|version|help|info)\ ([ ]|$)|[ ]*$)|\ help|info|join|leave|\ (Could you )?(please )?\ (cancel(( my)? subscription)?|add|\ sign( [^ ]+ |-)?o(n|ff)|(un|de)?-?sub)[ ]*$)|\ .*( (join|leave|add .* to|(delete|remove) .* from|\ (take|sign|get) .* off|(put|sign) .* on) .* [a-z-]*list|\ (un-?|sub?)s(cr|c|r)i(be|ption))\>) * -50^0 ^Subject:[ ]*[(<]no(ne| subject\ ( (\(file transmission|given))?)[>)]$ * 50^0 ^Subject:.*[a-z] * -100^0 B ?? ^^([ ]|$)*\ ((((archives?:?($|[ ]+)|\ ((send|get)(me)?|gimme|retrieve|mail|ls|dir(ectory)?|\ list|show|search|[fe]?grep|find|maxfiles|version|help|info)\ ([ ].*)?$)([ ]|$)*)+\ ([^ a-z].*$(.*$(.*$(.*$(.*$)?)?)?)?)?^^|\ (help|info)[ ]*$|\ (add|join|leave|sign( [^ ]+ |-)?o(n|ff)|(un|de)?-?sub)\>)|\ ([^ a-z].*$(.*$(.*$(.*$(.*$)?)?)?)?)?^^|\ .*( (join|leave|add .* to|(delete|remove) .* from|\ (take|sign|get) .* off|(put|sign) .* on) .* [a-z-]*list|\ (un-?|sub?)scri(be|ption))\>|\ ^^) { # # Then check to see if the sender is on the accept list (if foreign_submit # is not set). # :0 * 9876543210^0 foreign_submit ?? y * 2^0 ? formail -X"From " -xFrom: -xReply-To: -xSender: -xResent-From: \ -xResent-Reply-To: -xResent-Sender: -xReturn-Path: | \ multigram -b1 -m -l$submit_threshold -L$domain \ -x$listaddr -x$listreq accept accept2 { INCLUDERC=$RC_LOCAL_SUBMIT_10 :0 * moderated_flag ?? y { :0 Bhfw # contract header and body * ^^Approved:.*$^ | formail -X "" :0 * !$^Approved:.*$moderator_PASSWORD | formail -R"From X-Envelope-From:" -uDate: -iReturn-Receipt-To: \ -iRead-Receipt-To: -iAcknowledge-To: | \ $SENDMAIL $sendmailOPT \ `cat moderators || echo "${maintainer:-$listmaster}"` :0 fhw | formail -IApproved: } # # Eliminate duplicate submissions by checking the Message-ID: field. # :0 Wh :msgid.lock | formail -q- -D $idcache_size msgid.cache # # Check if we need to autosubscribe anyone not on the dist list. # :0 * force_subscribe ?? y * !? if test y = "$moderated_flag" ;\ then formail -xFrom: -xSender: -xReply-To: ;\ else formail -X"From " -xFrom: -xReply-To: -xSender: -xResent-From: \ -xResent-Reply-To: -xResent-Sender: -xReturn-Path: ;\ fi | multigram -b1 -m -l$submit_threshold -L$domain \ -x$listaddr -x$listreq dist { # # Yes, well, then check if the person isn't on the reject list. # :0 * ? multigram -b1 -l$reject_threshold reject { :0 wfh | formail -A "X-Diagnostic: Found on the reject list" \ -A "X-Diagnostic: `multigram -b1 -l$reject_threshold reject`" HOST=continue_with_rc.request } LOCKFILE=tmp.lock :0 whc | formail -rtzc -xTo: >tmp.from :0 Wc :dist.lock | sed -e '/^$/,/^-- $/ d' | formail -I "Subject: auto subscribe" \ >tmp.request; subscribe <tmp.request && test ! -z "$subscribe_log" \ && echo "rc.submit: auto subscribed" >>$subscribe_log LOCKFILE } # # Check if this is a digested mailinglist. If yes, processing stops # here and the mail will be added to the digest. # :0 * digest_flag ?? y { # # Forward the article back to the undigested list, if it hasn't # come from there. # :0 c * undigested_list ?? . * $!^X-Loop: $\undigested_list { # # If there's a Delivered-To: header field for the digest list, # remove it to avoid losing the return post to the digest list # qlistaddr = "$\listaddr" :0 * 1^1 $^Delivered-To:(.*[ < ])?$qlistaddr { DT # Are there any that need to be saved? If so, put them in DT :0 h * $-$=^0 * 1^1 ^Delivered-To: DT=|formail -c -XDelivered-To: | egrep -v "[ :< ]$qlistaddr" :0 fhw |formail -IDelivered-To: ${DT+-I"$DT"} } :0 ! $sendmailOPT $undigested_list HOST } # # Finally digest the mail. # :0 w :tmp.lock | digest } ARCHIVE # Wipe ARCHIVE from the environment # # Check if we are the first mailinglist to distribute this message, if so # archive the message. # :0 * archive_hist ?? [1-9]|all * archive_dir ?? . * !archive_dir ?? (^^|/)\.\. * !^X-Mailing-List: { LASTFOLDER=unarchived :0 c archive/$archive_dir/. ARCHIVE=$LASTFOLDER # Remember where it was archived # # Truncate the archive to the correct number of files (and # possibly other housekeeping chores to keep the archive # current). # :0 c hi * ! archive_hist ?? all | arch_trunc } # # What List-* headers should be included? # List_headers = "List-Post: <mailto:$listaddr> List-Help: <mailto:$listreq?subject=help>" :0 * auto_subscribe ?? y { List_headers="$List_headers List-Subscribe: <mailto:$listreq?subject=subscribe>" } :0 * auto_unsubscribe ?? y { List_headers="$List_headers List-Unsubscribe: <mailto:$listreq?subject=unsubscribe>" } # # Main header munger for submissions passing through this list. # oldshellmetas="$SHELLMETAS" SHELLMETAS # Save a shell, procmail can # do this one by itself. :0 wfh | formail -b -IFrom\ -IReceived: -IReturn-Receipt-To: -IErrors-To: \ -IX-Pmrqc: -IX-Confirm-Reading-To: -IX-Ack: -IAcknowledge-To: \ -IRead-Receipt-To: -IReturn-Receipt-Requested: -IX-Diagnostic: \ -IList- -I"$List_headers" \ -iUidl: -iX-Uidl: \ -iStatus: -iReturn-Path: -iX-Envelope-To: -iX-Envelope-From: \ -I"Precedence: list" -I"Resent-Sender: $listreq" \ -uDate: -aMessage-ID: -aResent-Message-ID: \ -a"To: $listaddr" -a"Resent-From: $listaddr" -A"X-Loop: $listaddr" \ -a"Subject: Unidentified subject!" ${reply_to:+"-a$reply_to"} \ -a"X-Mailing-List: <$listaddr> $ARCHIVE" SHELLMETAS="$oldshellmetas" oldshellmetas INCLUDERC=$RC_LOCAL_SUBMIT_20 # # The following recipe will distribute the message to the subscribers # using the native $SENDMAIL, but only if you disabled the alternative # sendmail (choplist). # :0 w: dist.lock * !alt_sendmail ?? . ! $sendmailOPT $listdist # # Alternate sendmail call (used by default), does not use the file- # including -dist alias. # :0 Ew: dist.lock | $alt_sendmail $SENDMAIL $sendmailOPT $sendmailOPTi :0 wfh | formail -A "X-Diagnostic: $SENDMAIL $listdist failed" HOST=continue_with_rc.request } :0 E wfh | formail -A "X-Diagnostic: Not on the accept list" :0 A c * ? test -f accept.txt { :0 fh | formail -i"From: $listreq" -kbrtA"X-Loop: $listaddr" ; cat accept.txt :0 ! $sendmailOPT -t } } } :0 fhw * pass_diverts ?? y * !^X-Diagnostic: | formail -A "X-Diagnostic: Diverted & unprocessed" HOST=continue_with_rc.request