Browse Source

simplify subscription list handling

Pi 1 year ago
parent
commit
6f41456dcc

+ 2 - 1
cropswap-register.sh

@@ -3,6 +3,7 @@ set -euo pipefail
 GROUP="$1"
 ALIAS="$2"
 EMAIL="$3"
+AUTH="$4"
 declare -A GROUPALIASES=(
 	["cropswap@shandan.one"]="Crop Swap Notices"
 	["cropswap-members@shandan.one"]="Crop Swap Members"
@@ -14,7 +15,7 @@ ${SCRIPTDIR}/cropswap-postmaster.sh SIGNUP "$EMAIL" <<EOF
 X-GROUP: $GROUP
 X-GROUP-ALIAS: ${GROUPALIASES[$GROUP]}
 X-MEMBER-ALIAS: $ALIAS
-X-AUTH:
+X-AUTH: $AUTH
 EOF
 ${SCRIPTDIR}/cropswap-postmaster.sh SUBSCRIBE "$EMAIL" <<EOF
 X-GROUP: $GROUP

+ 5 - 19
cropswap-sendmail.sh

@@ -35,32 +35,18 @@ mv "${WD}"/mail{.new,}
 declare -A SUBSCRIBED
 declare -a actions
 update(){
-	da="${actions[$1-1]:0:1}"
-	db="${2:0:1}"
-	alias="${actions[$1-1]#?}"
-	email="${2#?}"
-	[ "$da" == "$db" ] || exit 1 # corrupt list
-	if [ "$da" == "+" ]; then
-		SUBSCRIBED["$email"]="$alias"
-	else
-		SUBSCRIBED["$email"]=""
-	fi
+	alias="${actions[$1-1]}"
+	email="${2}"
+	SUBSCRIBED["$email"]="$alias"
 }
 
-exec 4<> "${SLIST}.txt"
+exec 4< "${SLIST}.txt"
 flock 4
 mapfile -t -c 2 -C update -u 4 actions
-for email in "${!SUBSCRIBED[@]}"; do
-	if [ -z "${SUBSCRIBED["$email"]}" ]; then
-		 continue
-	fi
-	echo "+${SUBSCRIBED["$email"]}"
-	echo "+$email"
-done > "${SLIST}".txt
 flock -u 4
 
 for email in "${!SUBSCRIBED[@]}"; do
-	if [ -z "${SUBSCRIBED["$email"]}" ] || [ "${email,,}" == "${NOFORWARD,,}" ]; then
+	if [ "${email,,}" == "${NOFORWARD,,}" ]; then
 		continue
 	fi
 	if [ "$TO" != "" ] && [ "$email" != "$TO" ]; then

+ 2 - 2
filters/cropswap-members@shandan.one

@@ -8,11 +8,11 @@ foreach (tolower $ADDR) =~ /^$MEMBERGROUPREGEX$/
    CONTINUE=1
    TOMEMBER=1
    MAILGROUP=$MEMBERGROUP
-   MAILGROUPALIAS="Crop Swap Members"
    SUBJECT="Crop Swap Member"
 }
-if ($FORWARD)
+if ($DISPATCH)
 {
+   MAILGROUPALIAS="Crop Swap Members"
    gdbmopen($MLIST, "R")
    ALIAS=gdbmfetch(tolower($FROM))
    gdbmclose

+ 2 - 2
filters/cropswap@shandan.one

@@ -8,10 +8,10 @@ foreach (tolower $ADDR) =~ /^$ORGANIZERGROUPREGEX$/
    CONTINUE=1
    TOORGANIZER=1
    MAILGROUP=$ORGANIZERGROUP
-   MAILGROUPALIAS="Crop Swap Notices"
 }
-if ($FORWARD)
+if ($DISPATCH)
 {
+   MAILGROUPALIAS="Crop Swap Notices"
    NOFORWARD=$FROM
    SUBJECT="Crop Swap Query"
 

+ 2 - 2
filters/postmaster@localhost

@@ -35,7 +35,7 @@ foreach (tolower $ADDR) =~ /^$POSTMASTERREGEX|$ANYGROUPREGEX$/
       }
    }
 }
-if ($FORWARD)
+if ($DISPATCH)
 {
    gdbmopen($MLIST, "C")
    SUFFIX=0
@@ -67,7 +67,7 @@ if ($FORWARD)
          cc "|$DEBUGMAIL 'auth-store-fail'"
          exit
       }
-      if ($AUTH ne "NONE")
+      if ($AUTH eq "admin")
       {
          SUBSCRIBE="SUBSCRIBE"
       }

+ 1 - 1
maildroprc

@@ -72,7 +72,7 @@ gdbmopen($MLIST, "R")
 TO=gdbmfetch($TOALIAS)
 gdbmclose
 
-FORWARD=1
+HANDLE=1
 if ($TOPOSTMASTER)
 {
    include "$FILTERDIR/$POSTMASTER"

+ 10 - 4
subunsub.sh

@@ -1,8 +1,14 @@
 #!/bin/bash
 set -euo pipefail
+exec 4<>"${SLIST}.txt" 5>"${SLIST}.txt.new"
+flock -n 4
+flock -n 5
 if [ "${1}" == "UNSUBSCRIBE" ]; then
-	d="-"
+        grep -Fivx -e "${2}" -e "${3}" <&4 || true
 else
-	d="+"
-fi
-flock "${SLIST}.txt" printf "%c%s\n%c%s\n" "$d" "$2" "$d" "$3" >> "${SLIST}.txt"
+        grep -Fix -e "${2}" -e "${3}" <&4 || cat "${SLIST}.txt" - <<EOF
+${2}
+${3}
+EOF
+fi >&5
+mv "${SLIST}.txt.new" "${SLIST}.txt"

+ 5 - 4
tests/test-cropswap-members@shandan.one.sh

@@ -16,13 +16,14 @@ cd "$MAILDROPDIR"
 #
 # TEST cropswap-members@shandan.one
 mkdir cropswap-members@shandan.one
-${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Member" "member1@mail.com" &>/dev/null
-${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Member" "member2@mail.com" &>/dev/null
-${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Organizer" "organizer1@mail.com" &>/dev/null
-${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Organizer" "organizer2@mail.com" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Member" "member1@mail.com" "" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Member" "member2@mail.com" "" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Organizer" "organizer1@mail.com" "" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap-members@shandan.one "Organizer" "organizer2@mail.com" NONE &>/dev/null
 
 set -x
 maildrop -funregistered@mail.com < ${SCRIPTDIR}/tests/cropswap-members@shandan.one/from-unregistered.eml 1>forward.out 2>forward.err || [ "$?" == "3" ]
+#cat forward.out forward.err && exit 1
 ! grep '^From: A. Person <unregistered@mail.com>$' < forward.out
 ! grep '^To: A. Person <unregistered@mail.com>$' < forward.out
 ! grep '^To: Organizer <organizer1@mail.com>$' < forward.out

+ 5 - 21
tests/test-cropswap@shandan.one.sh

@@ -16,29 +16,13 @@ cd "$MAILDROPDIR"
 #
 # TEST cropswap@shandan.one
 mkdir cropswap@shandan.one
-${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Member" "member1@mail.com" &>/dev/null
-${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Member" "member2@mail.com" &>/dev/null
-${SCRIPTDIR}/cropswap-postmaster.sh SIGNUP organizer1@mail.com <<EOF &>/dev/null
-X-MEMBER-ALIAS: Organizer
-X-AUTH: admin
-X-GROUP: cropswap@shandan.one
-X-GROUP-ALIAS: cropswap@shandan.one
-EOF
-${SCRIPTDIR}/cropswap-postmaster.sh SUBSCRIBE organizer1@mail.com <<EOF &>/dev/null
-X-GROUP: cropswap@shandan.one
-EOF
-${SCRIPTDIR}/cropswap-postmaster.sh SIGNUP organizer2@mail.com <<EOF &>/dev/null
-X-MEMBER-ALIAS: Organizer
-X-AUTH: admin
-X-GROUP: cropswap@shandan.one
-X-GROUP-ALIAS: cropswap@shandan.one
-EOF
-${SCRIPTDIR}/cropswap-postmaster.sh SUBSCRIBE organizer2@mail.com <<EOF &>/dev/null
-X-GROUP: cropswap@shandan.one
-EOF
+${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Member" "member1@mail.com" NONE &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Member" "member2@mail.com" "" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Organizer" organizer1@mail.com "admin" &>/dev/null
+${SCRIPTDIR}/cropswap-register.sh cropswap@shandan.one "Organizer" organizer2@mail.com "admin" &>/dev/null
 
 set -x
-maildrop -funregistered@mail.com < ${SCRIPTDIR}/tests/cropswap@shandan.one/from-unregistered.eml 1>forward.out 2>forward.err
+maildrop -funregistered@mail.com < ${SCRIPTDIR}/tests/cropswap@shandan.one/from-unregistered.eml 1>forward.out 2>forward.err #|| cat forward.err && exit 1
 grep '^From: A. Person <unregistered@mail.com>$' < forward.out
 ! grep '^To: A. Person <unregistered@mail.com>$' < forward.out
 grep '^To: Organizer <organizer1@mail.com>$' < forward.out

+ 10 - 8
tests/test-signup.sh

@@ -28,15 +28,17 @@ X-GROUP: $group
 X-AUTH: admin
 EOF
 	grep 'You have been registered as a member' reply.out
-	grep '^\+Admin$' "${group}/alist.txt"
-	grep '^\+admin@mail.com$' "${group}/alist.txt"
+	#cat reply.err
+	ls ${group} ; cat ${group}/alist.txt
+	grep -Fx 'Admin' "${group}/alist.txt" #|| cat "${group}/alist.txt" && exit 1
+	grep -Fx 'admin@mail.com' "${group}/alist.txt"
 
 	${SCRIPTDIR}/cropswap-postmaster.sh SUBSCRIBE admin@mail.com <<EOF 1> reply.out 2> reply.err #|| cat reply.err && exit 1
 X-GROUP: $group
 EOF
 	grep 'Your subscription status has been updated successfully' reply.out
-	grep '^\+Admin$' "${group}/slist.txt"
-	grep '^\+admin@mail.com$' "${group}/slist.txt"
+	grep -Fx 'Admin' "${group}/slist.txt"
+	grep -Fx 'admin@mail.com' "${group}/slist.txt"
 
 	${SCRIPTDIR}/cropswap-postmaster.sh SIGNUP non-admin@mail.com <<EOF 1> reply.out 2> reply.err
 X-MEMBER-ALIAS: Non-admin
@@ -44,13 +46,13 @@ X-GROUP-ALIAS: $alias
 X-GROUP: $group
 EOF
 	grep 'You have been registered as a member' reply.out
-	! grep '^\+Non\-admin$' "${group}/alist.txt"
-	! grep '^\+non-admin@mail.com$' "${group}/alist.txt"
+	! grep -Fx 'Non-admin' "${group}/alist.txt"
+	! grep -Fx 'non-admin@mail.com' "${group}/alist.txt"
 
 	${SCRIPTDIR}/cropswap-postmaster.sh SUBSCRIBE non-admin@mail.com <<EOF 1> reply.out 2> reply.err
 X-GROUP: $group
 EOF
 	grep 'Your subscription status has been updated successfully' reply.out
-	grep '^\+Non\-admin$' "${group}/slist.txt"
-	grep '^\+non-admin@mail.com$' "${group}/slist.txt"
+	grep -Fx 'Non-admin' "${group}/slist.txt"
+	grep -Fx 'non-admin@mail.com' "${group}/slist.txt"
 done