Browse Source

add test case

Pi 1 year ago
parent
commit
268db1282d

+ 11 - 4
cropswap-debug.sh

@@ -1,10 +1,17 @@
 #!/bin/bash
 #!/bin/bash
 set -euo pipefail
 set -euo pipefail
-MAIL="$(cat -)"
-cat <<EOF | /usr/sbin/sendmail -f maildrop pi
-${MAIL}
-
+if (( TEST != 0)); then
+	cat -
+	cat <<EOF >&2
 ERROR ${1:-unknown}
 ERROR ${1:-unknown}
+$(env)
+EOF
 
 
+else
+	cat - <<EOF | /usr/sbin/sendmail -f maildrop pi
+
+ERROR ${1:-unknown}
 $(env)
 $(env)
 EOF
 EOF
+fi
+exit ${EXITCODE:-0}

+ 2 - 4
cropswap-postmaster.sh

@@ -1,15 +1,13 @@
 #!/bin/bash
 #!/bin/bash
 set -euo pipefail
 set -euo pipefail
-
 ACTION="$1"
 ACTION="$1"
 GROUP="$2"
 GROUP="$2"
-ALIAS="$3"
-FROM="$4"
+FROM="$3"
 
 
 if [ "$ACTION" == "SIGNUP" ]; then
 if [ "$ACTION" == "SIGNUP" ]; then
 	TO=postmaster@localhost
 	TO=postmaster@localhost
 	HEADER="$(cat <<EOF
 	HEADER="$(cat <<EOF
-X-MEMBER-ALIAS: $ALIAS
+$(cat -)
 X-GROUP: $GROUP
 X-GROUP: $GROUP
 EOF
 EOF
 )"
 )"

+ 8 - 5
cropswap-register.sh

@@ -1,8 +1,11 @@
 #!/bin/bash
 #!/bin/bash
 set -euo pipefail
 set -euo pipefail
+GROUP="$1"
+ALIAS="$2"
+EMAIL="$3"
 
 
-ALIAS="$1"
-EMAIL="$2"
-
-./cropswap-postmaster.sh SIGNUP "$ALIAS" "$EMAIL"
-./cropswap-postmaster.sh SUBSCRIBE "$ALIAS" "$EMAIL"
+./cropswap-postmaster.sh SIGNUP "$GROUP" "$EMAIL" <<EOF
+X-MEMBER-ALIAS: $ALIAS
+X-AUTH:
+EOF
+./cropswap-postmaster.sh SUBSCRIBE "$GROUP" "$EMAIL"

+ 14 - 0
cropswap-reply.sh

@@ -0,0 +1,14 @@
+#!/bin/bash
+SENDMAIL=/usr/sbin/sendmail
+if ((DEBUG != 0)); then
+	SENDMAIL="$DEBUGMAIL"
+fi
+/usr/bin/mailbot -N -t $SIGNUPRESP \
+	-A 'From: $MAILGROUP' \
+	-A "List-Id: $MAILGROUP" \
+	-A "List-Unsubscribe: <mailto:$MAILGROUP?subject=[UNSUBSCRIBE]>" \
+	-A "List-Subscribe: <mailto:$MAILGROUP?subject=[SUBSCRIBE]>" \
+	-A "List-Post: <mailto:$MAILGROUP>" \
+	-A "List-Unsubscribe-Post: List-Unsubscribe=One-Click" \
+	-f$FROM \
+	"${SENDMAIL}" $FROM

+ 1 - 1
cropswap-sendmail.sh

@@ -8,7 +8,7 @@ trap cleanup EXIT
 
 
 DELIVERED=false
 DELIVERED=false
 SENDMAIL="/usr/sbin/sendmail"
 SENDMAIL="/usr/sbin/sendmail"
-if (($DEBUG != 0)); then
+if ((DEBUG != 0)); then
 	SENDMAIL="$DEBUGMAIL"
 	SENDMAIL="$DEBUGMAIL"
 fi
 fi
 
 

+ 4 - 2
filters/cropswap@shandan.one

@@ -8,11 +8,10 @@ if (!$CONTINUE)
    TOORGANIZER=1
    TOORGANIZER=1
    MAILGROUP=$ORGANIZERGROUP
    MAILGROUP=$ORGANIZERGROUP
 }
 }
-elsif($CONTINUE)
+elsif ($CONTINUE)
 {
 {
    NOFORWARD=$FROM
    NOFORWARD=$FROM
    SUBJECT="Crop Swap Query"
    SUBJECT="Crop Swap Query"
-   SLIST="$LISTDIR/alist"
 
 
    gdbmopen($MLIST, "R")
    gdbmopen($MLIST, "R")
    ALIAS=gdbmfetch(tolower($FROM))
    ALIAS=gdbmfetch(tolower($FROM))
@@ -22,6 +21,7 @@ elsif($CONTINUE)
       #
       #
       # TODO: test this works at all
       # TODO: test this works at all
       # should at least drop list headers
       # should at least drop list headers
+      SLIST="$LISTDIR/alist"
       FROM=$FROM
       FROM=$FROM
       to "!"
       to "!"
    }
    }
@@ -37,6 +37,7 @@ elsif($CONTINUE)
       #
       #
       # TODO: test this works at all
       # TODO: test this works at all
       # should at least drop list headers
       # should at least drop list headers
+      SLIST="$LISTDIR/alist"
       FROM=$FROM
       FROM=$FROM
       to "!"
       to "!"
    }
    }
@@ -49,6 +50,7 @@ elsif($CONTINUE)
 
 
    if ($ORGANIZER eq "")
    if ($ORGANIZER eq "")
    {
    {
+      SLIST="$LISTDIR/alist"
       FROM=$ALIAS
       FROM=$ALIAS
       to "!"
       to "!"
    }
    }

+ 49 - 31
filters/postmaster@localhost

@@ -1,52 +1,70 @@
 if (!$CONTINUE)
 if (!$CONTINUE)
 {
 {
-   if (/^X\-GROUP:\s*$ORGANIZERGROUPREGEX\s*$/)
+   if (/^Subject:\s*\[SIGNUP\]\s*$/)
+   {
+      TOPOSTMASTER=1
+      CONTINUE=1
+   }
+   if (/^X\-GROUP:\s*($ORGANIZERGROUPREGEX)\s*$/)
    {
    {
       TOORGANIZER=1
       TOORGANIZER=1
+      MAILGROUP=$MATCH1
    }
    }
-   if (/^X\-GROUP:\s*$MEMBERGROUPREGEX\s*$/)
+   if (/^X\-GROUP:\s*($MEMBERGROUPREGEX)\s*$/)
    {
    {
       TOMEMBER=1
       TOMEMBER=1
+      MAILGROUP=$MATCH1
    }
    }
-   TOPOSTMASTER=1
-   CONTINUE=1
 }
 }
 elsif ($CONTINUE)
 elsif ($CONTINUE)
 {
 {
-   if (/^Subject:\s*\[SIGNUP\]\s*$/)
+   if (/^X-MEMBER-ALIAS:\s*(.+)\s*$/)
    {
    {
-      if (/^X-MEMBER-ALIAS:\s*(.*)\s*$/)
+      gdbmopen($MLIST, "C")
+      SUFFIX=0
+      ALIAS=$MATCH1
+      KEY=$ALIAS
+      EXISTS=gdbmfetch($KEY)
+      while ($EXISTS ne "" && $EXISTS ne tolower($FROM))
       {
       {
-         gdbmopen($MLIST, "W")
-         SUFFIX=0
-         ALIAS=$MATCH1
-         KEY=$ALIAS
+         SUFFIX=($SUFFIX + 1)
+         KEY="$ALIAS $SUFFIX"
          EXISTS=gdbmfetch($KEY)
          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
+      }
+      if (gdbmstore(tolower($FROM), $KEY) == 0 && gdbmstore($KEY, tolower($FROM)) == 0)
+      {
+         gdbmclose
+         SLIST="$LISTDIR/alist"
+         gdbmopen($SLIST, "C")
+         if (/^X-AUTH:\s(.+)\s*$/)
          {
          {
-            gdbmclose
-            cc "|$DEBUGMAIL"
-            EXITCODE=$FATAL
-            exit
+            if (gdbmstore(tolower($FROM), "$MATCH1"))
+            {
+               gdbmclose
+               EXITCODE=$FATAL
+               cc "|$DEBUGMAIL 'auth-store-fail'"
+               exit
+            }
+            system "$SUBUNSUB '$SUBSCRIBE' '$KEY' '$FROM'"
+            if ($EXITCODE)
+            {
+               cc "|$DEBUGMAIL 'auth-sub-fail'"
+               exit
+            }
          }
          }
+         gdbmclose
+         to "|$MAILBOT"
+      }
+      else
+      {
+         gdbmclose
+         EXITCODE=$FATAL
+         cc "|$DEBUGMAIL '$MLSIT-store-fail'"
+         exit
       }
       }
-      EXITCODE=$BADREQUEST
-      # No response to unregistered users
-      exit
    }
    }
-   #cc "|$DEBUGMAIL"
-   EXITCODE=$UNHANDLED
+   EXITCODE=$BADREQUEST
+   cc "|${DEBUGMAIL} signup-fail"
    # No response to unregistered users
    # No response to unregistered users
    exit
    exit
 }
 }

+ 3 - 2
filters/subscriptions

@@ -1,3 +1,4 @@
+gdbmopen($SLIST, "C")
 if (/^Subject:\s*\[(SUBSCRIBE|UNSUBSCRIBE)\]\s*$/)
 if (/^Subject:\s*\[(SUBSCRIBE|UNSUBSCRIBE)\]\s*$/)
 {
 {
    SUBSCRIBE=$MATCH1
    SUBSCRIBE=$MATCH1
@@ -5,7 +6,6 @@ if (/^Subject:\s*\[(SUBSCRIBE|UNSUBSCRIBE)\]\s*$/)
 
 
 if ($SUBSCRIBE ne "")
 if ($SUBSCRIBE ne "")
 {
 {
-   gdbmopen($SLIST, "W")
    if (gdbmstore(tolower($FROM), $SUBSCRIBE) == 0)
    if (gdbmstore(tolower($FROM), $SUBSCRIBE) == 0)
    {
    {
       gdbmclose
       gdbmclose
@@ -15,8 +15,9 @@ if ($SUBSCRIBE ne "")
    else
    else
    {
    {
       gdbmclose
       gdbmclose
-      cc "|$DEBUGMAIL subunsub-fail"
       EXITCODE=$FATAL
       EXITCODE=$FATAL
+      cc "|$DEBUGMAIL subunsub-fail"
       exit
       exit
    }
    }
 }
 }
+gdbmcloce

+ 10 - 7
maildroprc

@@ -3,20 +3,23 @@
 # Uncomment this line to make maildrop default to ~/Maildir for
 # Uncomment this line to make maildrop default to ~/Maildir for
 # delivery- this is where courier-imap (amongst others) will look.
 # delivery- this is where courier-imap (amongst others) will look.
 #DEFAULT="$HOME/Maildir"
 #DEFAULT="$HOME/Maildir"
+import DEBUG
+import TEST
 SHELL="/bin/bash"
 SHELL="/bin/bash"
 SENDMAIL="/opt/cropswap/sendmail.sh"
 SENDMAIL="/opt/cropswap/sendmail.sh"
 SUBUNSUB="/opt/cropswap/subunsub.sh"
 SUBUNSUB="/opt/cropswap/subunsub.sh"
 DEBUGMAIL="/opt/cropswap/debug.sh"
 DEBUGMAIL="/opt/cropswap/debug.sh"
-MAILBOT="/usr/bin/mailbot"
+MAILBOT="/opt/cropswap/mailbot.sh"
 SIGNUPRESP="/opt/cropswap/signup.eml"
 SIGNUPRESP="/opt/cropswap/signup.eml"
 SUBSCRIBERESP="/opt/cropswap/subunsub.eml"
 SUBSCRIBERESP="/opt/cropswap/subunsub.eml"
 FILTERDIR="/opt/cropswap/filters"
 FILTERDIR="/opt/cropswap/filters"
-DEBUG=0
-if ($DEBUG)
+MAILDROPDIR="/var/mail/maildrop"
+DEBUG=($DEBUG != 0)
+TEST=($TEST != 0)
+if ($TEST)
 {
 {
-   MAILBOT="/opt/cropswap/debug.sh"
+   import MAILDROPDIR
 }
 }
-
 POSTMASTER="postmaster@localhost"
 POSTMASTER="postmaster@localhost"
 POSTMASTERREGEX=escape($POSTMASTER)
 POSTMASTERREGEX=escape($POSTMASTER)
 
 
@@ -32,7 +35,7 @@ ORGANIZERGROUP="cropswap@shandan.one"
 ORGANIZERGROUPREGEX=escape($ORGANIZERGROUP)
 ORGANIZERGROUPREGEX=escape($ORGANIZERGROUP)
 
 
 ANYGROUPREGEX="$MEMBERGROUPREGEX|$ORGANIZERGROUPREGEX"
 ANYGROUPREGEX="$MEMBERGROUPREGEX|$ORGANIZERGROUPREGEX"
-HANDLEDREGEX="($POSTMASTERREGEX|$ANYGROUPREGEX)"
+HANDLEDREGEX="$POSTMASTERREGEX|$ANYGROUPREGEX"
 
 
 UNHANDLED=5
 UNHANDLED=5
 BADREQUEST=4
 BADREQUEST=4
@@ -70,7 +73,7 @@ if ($MAILGROUP eq "")
    exit
    exit
 }
 }
 
 
-LISTDIR="/var/mail/maildrop/$MAILGROUP"
+LISTDIR="$MAILDROPDIR/$MAILGROUP"
 MLIST="$LISTDIR/mlist"
 MLIST="$LISTDIR/mlist"
 SLIST="$LISTDIR/slist"
 SLIST="$LISTDIR/slist"
 
 

+ 38 - 0
test.sh

@@ -0,0 +1,38 @@
+#!/bin/bash
+set -euo pipefail
+export DEBUG=1
+export TEST=1
+MAILDROPDIR=$(pwd) #$(mktemp -d)
+mkdir -p ${MAILDROPDIR}/cropswap@shandan.one
+cleanup (){
+	#rm -rf "$MAILDROPDIR"
+	echo
+}
+trap cleanup EXIT
+
+export MAILDROPDIR
+./cropswap-register.sh cropswap@shandan.one "Member" "member1@mail.com" &>/dev/null
+./cropswap-register.sh cropswap@shandan.one "Member" "member2@mail.com" &>/dev/null
+./cropswap-postmaster.sh SIGNUP cropswap@shandan.one organizer1@mail.com <<EOF &>/dev/null
+X-MEMBER-ALIAS: Organizer
+X-AUTH: admin
+EOF
+./cropswap-postmaster.sh SUBSCRIBE cropswap@shandan.one organizer1@mail.com &>/dev/null
+./cropswap-postmaster.sh SIGNUP cropswap@shandan.one organizer2@mail.com <<EOF &>/dev/null
+X-MEMBER-ALIAS: Organizer
+X-AUTH: admin
+EOF
+./cropswap-postmaster.sh SUBSCRIBE cropswap@shandan.one organizer2@mail.com &>/dev/null
+
+set -x
+maildrop -fmember@mail.com < tests/cropswap@shandan.one/from-member.eml 1>"${MAILDROPDIR}/forward.out" 2>"${MAILDROPDIR}/forward.err"
+grep '^Subject: \[Crop Swap Query\] .*$' < forward.out
+grep '^Forwarding mail to: Organizer <organizer1@mail.com>$' < forward.out
+grep '^Forwarding mail to: Organizer 1 <organizer2@mail.com>$' < forward.out
+#maildrop -fmember@mail.com < tests/cropswap@shandan.one/from-member.eml #&2>1 | grep '^SUBJECT=Crop Swap Query$'
+
+# not working - alist.txt empty
+#maildrop -funregistered@mail.com < tests/cropswap@shandan.one/from-unregistered.eml | grep '^Subject: \[Crop Swap Query\] .*$'
+#maildrop -funregistered@mail.com < tests/cropswap@shandan.one/from-unregistered.eml &2>1 | grep '^SUBJECT=Crop Swap Query$'
+
+