# BEFORE editing this file, you should make sure that it is not linked to
# the master version (../.etc/rc.request) anymore (i.e. "delink rc.request"
# if you do not want your changes to affect all lists).
#
# 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.request,v 1.85 2001/04/11 04:14:14 guenther Exp $

INCLUDERC=$RC_INIT
INCLUDERC=$RC_CUSTOM

INCLUDERC=$RC_LOCAL_REQUEST_00

LOCKFILE=tmp.lock	# for reusing tmp.(request|from)
			# also makes sure that the load doesn't go sky-high
			# when a lot of mail arrives concurrently

:0 Bhfw			# concatenate header and body
* $^^$X_COMMAND:
| formail -X ""

#
# We now check:
#	If the length is roughly within bounds.
#	That it is not a reply or something.
#	That we didn't send it ourselves.
#	That it wasn't sent by a daemon of some kind.
#
# If everything matches, we extract the sender address into tmp.from
#

:0
* B ?? < 4096
* $$daemon_bias
* $!^(X-(Loop: $\listaddr|Diagnostic:)|$X_COMMAND:)
* -100^0 ^FROM_DAEMON
*    1^0
{

:0
* -100^0 ^Subject:(.*[^a-z])?(Re:|erro|change|problem|((can)?not|.*n't)\>)
*  100^0 B ?? ^^([	 ]|$)*\
	((archives?:?($|[	 ]+)|\
	  ((un)subscribe|(send|get)(me)?|gimme|retrieve|mail|ls|dir(ectory)?|\
	    list|show|search|[fe]?grep|find|maxfiles|version|help|info)\
	   ([	 ].*)?$)([	 ]|$)*)+\
	    ([^	 a-z].*$(.*$(.*$(.*$(.*$)?)?)?)?)?^^
*  100^0 ^Subject:[	 ]*archive
*    1^0
{
  :0 whc
  | formail -rtzc -xTo: >tmp.from

#
# Store the whole mail in tmp.request, for later reference.
#

  :0 wc
  | formail -IIn-Reply-To: -ICc: >tmp.request

#
# Check for a missing Subject: line.
#

  :0 wfh
  * !^Subject:
  | formail -a "Subject: "

  INCLUDERC=$RC_LOCAL_REQUEST_10

###############################################################################
# Reader beware, the following four regular expressions are not for the faint #
# of heart.  It'll suffice to say that they accomplish their intended job 98% #
# of the time.								      #
###############################################################################

#
# Is it an archive retrieval command?
#

  :0 HB w
  * 9876543210^0 ^^(.+$)*Subject:[	 ]*(([(<]no(ne| subject\
      ( (\(file transmission|given))?)[>)])?\
     $(.+$)*(^[	 ]*)+)?(archives?:?([	 ]|$)|\
     ((send|get)(me)?|gimme|retrieve|mail|ls|dir(ectory)?|list|show|\
      search|[fe]?grep|find|maxfiles|version)([	 ]+[^	 ]*)?$)
  *  1^0 B ?? ^^([	 ]|$)*\
	((archives?:?($|[	 ]+)|\
	  ((send|get)(me)?|gimme|retrieve|mail|ls|dir(ectory)?|\
	    list|show|search|[fe]?grep|find|maxfiles|version|help|info)\
	   ([	 ].*)?$)([	 ]|$)*)+\
	    ([^	 a-z].*$(.*$(.*$(.*$(.*$)?)?)?)?)?^^
  {
    :0 W
    * 9876543210^0 !restrict_archive ?? y
    * 2^0 ? formail -rt -R To: "From " -X "From " | \
	     multigram -b1 -m -l$submit_threshold -L$domain \
	      -x$listaddr -x$listreq accept accept2
    | arch_retrieve

    :0 E fhw
    | formail -A "X-Diagnostic: Not on the accept list"
  }

#
# Is it an unsubscription request?
#

  :0 EHB
  * 9876543210^0 ^^(.+$)*Subject:[	 ]*([(<]no(ne| subject\
      ( (\(file transmission|given))?)[>)])?(\
     ($(.+$)*(^[	 ]*)+((.+|$)+[,.:;]([	 ]+|$)+)?)?\
      (Could you )?(please )?\
      (sign( [^ ]+ |-)?off|cancel|leave|delete|remove|(un|de)-?sub)\>|\
     ($(.+$)*$(.*$)*)?(.*[^a-z])?\
      ((un-?|(un|de)-?sub?)s(cr|c|r)i|\
      (leave|(delete|remove) .* from|(sign|take|get) .* off) .* [a-z-]*list\>))
  *  1^0 B ?? ^^([	 ]|$)*unsub(scribe)?([	 ].*)?([	 ]|$)*\
	       [^	 a-z]?^^
   {
     :0 fw:dist.lock
     * auto_unsubscribe ?? y
     | unsubscribe

	:0 Aw ${cc_unsubrequests:+c}
	| $SENDMAIL $sendmailOPT `cat tmp.from` ;

	:0 Afhw
	| formail -A "X-Diagnostic: Processed"
   }


#
# Is it a subscription request?
#

  :0 EHB
  * 9876543210^0 ^^(.+$)*Subject:[	 ]*([(<]no(ne| subject\
      ( (\(file transmission|given))?)[>)])?(\
     ($(.+$)*(^[	 ]*)+((.+|$)+[,.:;]([	 ]+|$)+)?)?\
      (Could you )?(please )?\
      (sign( [^ ]+ |-)?on|add|join|sub)\>|\
     ($(.+$)*$(.*$)*)?(.*[^a-z])?\
      (sub?s(cr|c|r)i.*|(join|add .* to|(sign|put) .* on) .* [a-z-]*list\>))
  *  1^0 B ?? ^^([	 ]|$)*sub(scribe)?([	 ].*)?([	 ]|$)*\
	       [^	 a-z]?^^
   {
     #
     # Yes, well, then check if the person subscribing isn't on the reject
     # list.
     #

     :0 HB wfh
     * ? multigram -b1 -l$reject_threshold reject
     | formail -A "X-Diagnostic: Found on the reject list" \
	-A "X-Diagnostic: `multigram -b1 -l$reject_threshold reject`"

     #
     # If not, then let's see if he might already be on the
     # mailinglist.
     #

     :0 E HB wfh
     * ? formail -IReceived: -IX-Envelope-To: -IIn-Reply-To: -ICc: | \
	   multigram -b1 -x$listreq -x$listaddr -l$reject_threshold dist
     | formail -A "X-Diagnostic: Already on the subscriber list" \
	-A "X-Diagnostic: `multigram -b1 -x$listreq -x$listaddr \
	-l$reject_threshold dist`"

     #
     # If not, add him(/her/it?).
     #

     :0 E
     * auto_subscribe ?? y
      {
	:0 W ${cc_requests:+c}:dist.lock
	| subscribe

	:0 awfh
	| formail -A "X-Diagnostic: Added to the subscriber list"

	:0 Ewfh
	| formail -A "X-Diagnostic: Tried to subscribe"
      }
   }

#
# Is it an info or help request?  Send back the help.txt and the
# optional info.txt file.
# We do the same on a complete empty mail (except for perhaps a signature).
#

  :0 EHB
  *  3^0 ^^(.+$)*Subject:[	 ]*\
		 (([(<]no(ne| subject( (\(file transmission|given))?)[>)])?$\
     (.+$)*(^[	 ]*)+)?[a-z,.	 ]*(help|info(rmation)?)\>
  *  1^0 ^^(.+$)*Subject:[	 ]*\
		  ([(<]no(ne| subject( (\(file transmission|given))?)[>)])?$
  * -2^0 ^^(.+$)*(^[	 ]*)+[a-z]
  *  3^0 ^^(.+$)*^([	 ]*$)*--
  {
    :0 hw ${cc_requests:+c}
    | (formail -i"From: $listreq" -rtA"X-Loop: $listaddr"; \
       cat help.txt info.txt 2>/dev/null ) | $SENDMAIL $sendmailOPT -t

    :0 wfh
    | formail -A "X-Diagnostic: help sent"
  }

  INCLUDERC=$RC_LOCAL_REQUEST_20

  LOGABSTRACT=yes

#
# If auto_help is set, anything undecipherable gets back the help.txt and the
# optional info.txt file.
#

  :0 EB
  * auto_help ?? y
  * $!X-Loop: $\listaddr
  {
    :0 hw ${cc_requests:+c}
    | (formail -i"From: $listreq" -rtA"X-Loop: $listaddr"; \
       cat help.txt info.txt 2>/dev/null ) | $SENDMAIL $sendmailOPT -t

    :0 wfh
    | formail -A "X-Diagnostic: undecipherable, help sent"
  }

}
}

LOGABSTRACT=yes

#
# Could it be a bounce message from a daemon?  Hand it down to procbounce
# which will evaluate it.
#

:0 wic
* $!^(Subject:(.*[^a-z])?Re:|\
     X-(Loop: $\listaddr|Diagnostic:)|$X_COMMAND:)
* ^FROM_DAEMON
| sed -e $cutoff_bounce' q' >tmp.request

  #
  # Sink all messages we can recognise to be queue warnings or
  # message-content specific errors
  #

  :0 Ah
  * ^Subject: \
     (Warning - delayed mail|\
      (WARNING: message ([^	 ]+ )?|Mail )delayed|\
      (Returned mail: )?\
       (warning: c(an|ould )not send m(essage fo|ail afte)r|Unbalanced '"'|\
	Cannot send (within [0-9]|8-bit data to 7-bit)|\
	Data format error|Headers too large|Eight bit data not allowed|\
	Message (size )?exceeds (fixed )?maximum (fixed|message) size)|\
      Undeliverable (RFC822 )?mail: temporarily unable to deliver|\
      \*\*\* WARNING - Undelivered mail in mailqueue|Execution succee?ded)
  /dev/null

  :0 Ah
  * ^Subject: (Warning from|mail warning| ?Waiting mail)
  * ^(From|Sender):.*(uucp|mmdf)
  /dev/null

  :0 AhBD
  * $^(..?)?X-Loop: $\listaddr \(bounce\)
  * ^(..?)?Subject: You have been removed from
  /dev/null

  #
  # Enable special handling for DSNs
  #

  :0 A
  * ^Content-Type:[	 ]*multipart/report;[	 ]*\/[^	 ].*
  * ^Mime-Version:.*1.*\..*0
  * MATCH ?? report-type="?delivery-status"?
  * B ?? ^Content-Type:.*message.*delivery-status
  {
     # If there were no fatal errors, drop it
     :0 B
     * ! ^Status:[	 ]*5[	 ]*\.
     /dev/null

     isadsn=yes
  }

  #
  # Anything that still survived is most likely to be a bounce message.
  #

  :0 Ahfw
  * ! ^X-Diagnostic:
  | procbounce

#
# Or is it a remote X-Command from our maintainer?
#

:0 wf:dist.lock
* $^$X_COMMAND:.*$\maintainer[	 ]*$\X_COMMAND_PASSWORD
* $!^X-Loop: $\listaddr
| x_command

LOCKFILE				# we don't need the lockfile anymore

#
# Anything not taken care of yet will be served to the maintainer of the list.
#
# To make it easier on him, we include a small hint about what might be the
# problem (by adding X-Diagnostic: fields to the header).
#

:0 wfh
* !< $size_limit
| formail -A "X-Diagnostic: Submission size exceeds $size_limit bytes"

:0 wfh
* ^FROM_DAEMON
| formail -A "X-Diagnostic: Mail coming from a daemon, ignored"

:0 HB wfh
* $^X-Loop: $\listaddr
| formail -A "X-Diagnostic: Possible loopback problem"

:0
* !^X-(Diagnostic|Processed):
{
  :0 wfh
  * $^$X_COMMAND:
  | formail -A "X-Diagnostic: Suspicious $X_COMMAND format"

  :0 HB wfh
  * ? formail -IReceived: -IX-Envelope-To: -IIn-Reply-To: -ICc: | \
       multigram -b1 -x$listreq -x$listaddr -l$reject_threshold dist
  | formail -A "X-Diagnostic: Already on the subscriber list" \
     -A "X-Diagnostic: `multigram -b1 -x$listreq -x$listaddr \
     -l$reject_threshold dist`"
}

INCLUDERC=$RC_LOCAL_REQUEST_30

:0 wfh
* !^X-(Diagnostic|Processed):
| formail -A"X-Diagnostic: Unprocessed"

:0 wfh
| formail -A"X-Envelope-To: $X_ENVELOPE_TO"

#
# If this list does not have a maintainer e-mail address, drop things in
# the file request.
#

:0:
* !maintainer ?? .
request

fOPT = ${listmaster:+-f$listmaster}

:0 w
| formail -R"From X-From_:" -iDate: -iReturn-Receipt-To: -iRead-Receipt-To: \
   -iAcknowledge-To: | \
  $SENDMAIL $fOPT $sendmailOPTnorm $sendmailOPTp $maintainer

:0 wfh
| formail -A"X-Diagnostic: Maintainer $maintainer could not be reached"

HOST=continue_with_../.etc/rc.post