123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- SHELL="/bin/bash"
- SENDMAIL="/opt/cropswap/sendmail.sh"
- SUBUNSUB="/opt/cropswap/subunsub.sh"
- DEBUGMAIL="/opt/cropswap/debug.sh"
- MAILBOT="/usr/bin/mailbot"
- SIGNUPRESP="/opt/cropswap/signup.eml"
- SUBSCRIBERESP="/opt/cropswap/subunsub.eml"
- POSTMASTER="postmaster@localhost"
- POSTMASTERREGEX=escape($POSTMASTER)
- MEMBERGROUP="cropswap-members@shandan.one"
- MEMBERGROUPREGEX=escape($MEMBERGROUP)
- ORGANIZERGROUP="cropswap@shandan.one"
- ORGANIZERGROUPREGEX=escape($ORGANIZERGROUP)
- SUFFIX=0
- FORWARD=0
- SUBSCRIBE=""
- CONTINUE=0
- TOPOSTMASTER=0
- TOORGANIZER=0
- TOMEMBER=0
- TO=""
- UNHANDLED=5
- BADREQUEST=4
- UNREGISTERED=3
- UNSUBSCRIBED=2
- FATAL=1
- foreach /^(To|Cc):.*/
- {
- ADDR=getaddr($MATCH)
- foreach (tolower $ADDR) =~ /^$POSTMASTER$/
- {
- if (/^X\-GROUP:\s*$ORGANIZERGROUPREGEX\s*$/)
- {
- TOORGANIZER=1
- }
- if (/^X\-GROUP:\s*$MEMBERGROUPREGEX\s*$/)
- {
- TOORGANIZER=1
- }
- CONTINUE=1
- TOPOSTMASTER=1
- }
- foreach (tolower $ADDR) =~ /^$ORGANIZERGROUPREGEX$/
- {
- TOORGANIZER=1
- CONTINUE=1
- }
- foreach (tolower $ADDR) =~ /^$MEMBERGROUPREGEX$/
- {
- TOMEMBER=1
- CONTINUE=1
- }
- foreach /^(To|Cc):\s+(.*)\s+\<$ORGANIZERGROUPREGEX\>$/
- {
- TOALIAS=$MATCH2
- }
- foreach /^(To|Cc):\s+(.*)\s+\<$MEMBERGROUPREGEX\>$/
- {
- TOALIAS=$MATCH2
- }
- }
- if (!$CONTINUE)
- {
- EXITCODE=$UNHANDLED
- exit
- }
- if ($TOMEMBER && $TOORGANIZER)
- {
- cc "|$DEBUGMAIL multiplemembergroupset"
- EXITCODE=$BADREQUEST
- exit
- }
- if ($TOMEMBER)
- {
- MAILGROUP=$MEMBERGROUP
- SUBJECT="Crop Swap Member"
- }
- elsif ($TOORGANIZER)
- {
- MAILGROUP=$ORGANIZERGROUP
- SUBJECT="Crop Swap Notice"
- }
- else
- {
- cc "|$DEBUGMAIL nomembergroupset"
- EXITCODE=$FATAL
- exit
- }
- LISTDIR="/var/mail/maildrop/$MAILGROUP"
- MLIST="$LISTDIR/mlist"
- SLIST="$LISTDIR/slist"
- if ($TOPOSTMASTER)
- {
- if (/^Subject:\s*\[SIGNUP\]\s*$/)
- {
- if (/^X-MEMBER-ALIAS:\s*(.*)\s*$/)
- {
- gdbmopen($MLIST, "W")
- ALIAS=$MATCH1
- KEY=$ALIAS
- EXISTS=gdbmfetch($KEY)
- while ($EXISTS ne "" && $EXISTS ne tolower($FROM))
- {
- SUFFIX=($SUFFIX + 1)
- KEY="$ALIAS $SUFFIX"
- EXISTS=gdbmfetch($KEY)
- }
- if (gdbmstore(tolower($FROM), $KEY) == 0 && gdbmstore($KEY, tolower($FROM)) == 0)
- {
- gdbmclose
- to "|$MAILBOT -N -t $SIGNUPRESP -A 'From: $MAILGROUP' -f$FROM /usr/bin/sendmail $FROM"
- }
- else
- {
- gdbmclose
- EXITCODE=$FATAL
- exit
- }
- }
- EXITCODE=$BADREQUEST
- # No response to unregistered users
- exit
- }
- EXITCODE=$UNHANDLED
- # No response to unregistered users
- exit
- }
- gdbmopen($MLIST, "R")
- ALIAS=gdbmfetch(tolower($FROM))
- if ($ALIAS eq "")
- {
- gdbmclose
- if ($TOORGANIZER)
- {
- #
- # TODO: test this works at all
- FROM=$FROM
- REPLYTO=$FROM
- SLIST="$LISTDIR/alist"
- to "!"
- }
- EXITCODE=$UNREGISTERED
- exit
- }
- gdbmclose
- if (/^Subject:\s*\[(SUBSCRIBE|UNSUBSCRIBE)\]\s*$/)
- {
- SUBSCRIBE=$MATCH1
- }
- if ($SUBSCRIBE ne "")
- {
- gdbmopen($SLIST, "W")
- if (gdbmstore(tolower($FROM), $SUBSCRIBE) == 0)
- {
- gdbmclose
- system "$SUBUNSUB '$SUBSCRIBE' '$ALIAS' '$FROM'"
- to "|$MAILBOT -N -t $SUBSCRIBERESP -A 'From: $MAILGROUP' -f$FROM /usr/sbin/sendmail $FROM"
- }
- else
- {
- gdbmclose
- EXITCODE=$FATAL
- exit
- }
- }
- gdbmopen($SLIST, "R")
- FORWARD=(gdbmfetch(tolower($FROM)) eq "SUBSCRIBE")
- gdbmclose
- if (!$FORWARD)
- {
- EXITCODE=$UNSUBSCRIBED
- exit
- }
- NOFORWARD=$FROM
- if ($TOMEMBER)
- {
- FROM=$ALIAS
- gdbmopen($MLIST, "R")
- TO=gdbmfetch($TOALIAS)
- gdbmclose
- to "!"
- }
- MLIST="$LISTDIR/alist"
- gdbmopen($MLIST, "R")
- ORGANIZER=gdbmfetch(tolower($FROM))
- gdbmclose
- if ($ORGANIZER eq "")
- {
- SLIST="$LISTDIR/alist"
- to "!"
- }
- FROM=$ORGANIZER
- MLIST="$LISTDIR/mlist"
- gdbmopen($MLIST, "R")
- TO=gdbmfetch($TOALIAS)
- gdbmclose
- to "!"
|