# Global maildrop filter file # Uncomment this line to make maildrop default to ~/Maildir for # delivery- this is where courier-imap (amongst others) will look. #DEFAULT="$HOME/Maildir" 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" # # Uncomment to debug #SENDMAIL="/opt/cropswap/debug.sh" #MAILBOT="/opt/cropswap/debug.sh" # POSTMASTER="postmaster@localhost" POSTMASTERREGEX=escape($POSTMASTER) # bi-directional group # From subscribed member -> other subscribed members MEMBERGROUP="cropswap-members@shandan.one" MEMBERGROUPREGEX=escape($MEMBERGROUP) # uni-directional group # From anyone -> organizers # From organizers -> subscribed members 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 # # REGISTERED USERS ONLY # 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 } # # SUBSCRIBED USERS # 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 "!" } # # ORGANIZERS ONLY # FROM=$ORGANIZER MLIST="$LISTDIR/mlist" gdbmopen($MLIST, "R") TO=gdbmfetch($TOALIAS) gdbmclose to "!"