Przeglądaj źródła

support multiple groups

Pi 1 rok temu
rodzic
commit
c0afbe6945
5 zmienionych plików z 96 dodań i 22 usunięć
  1. 2 0
      cropswap-debug.sh
  2. 9 4
      cropswap-postmaster.sh
  3. 17 10
      cropswap-sendmail.sh
  4. 66 7
      maildroprc
  5. 2 1
      subunsub.sh

+ 2 - 0
cropswap-debug.sh

@@ -4,6 +4,8 @@ MAIL="$(cat -)"
 cat <<EOF > /home/pi/reply
 $(env)
 
+ERROR ${1:-unknown}
+
 ${MAIL}
 EOF
 

+ 9 - 4
cropswap-postmaster.sh

@@ -2,14 +2,19 @@
 set -euo pipefail
 
 ACTION="$1"
-ALIAS="$2"
-FROM="$3"
+GROUP="$2"
+ALIAS="$3"
+FROM="$4"
 
 if [ "$ACTION" == "SIGNUP" ]; then
 	TO=postmaster@localhost
-	HEADER="X-MEMBER-ALIAS: $ALIAS"
+	HEADER="$(cat <<EOF
+X-MEMBER-ALIAS: $ALIAS
+X-GROUP: $GROUP
+EOF
+)"
 else
-	TO=cropswap@shandan.one
+	TO="$GROUP"
 	HEADER="X-IGNORED:"
 fi
 

+ 17 - 10
cropswap-sendmail.sh

@@ -1,7 +1,19 @@
 #!/bin/bash
 set -euo pipefail
-MAIL="$(cat -)"
-MAILGROUP=cropswap@shandan.one
+MAIL="$(cat - | formail -kb \
+	-X "MIME-Version:" \
+	-X "Content-Type:" \
+	-X "Subject:" \
+	-X "Date:" \
+)"
+subject="$(formail -cx "Subject:" <<<"${MAIL}")"
+if [ "${subject/\[${SUBJECT}\]/}" == "${subject}" ]; then
+	subject="[${SUBJECT}] ${subject## }"
+fi
+MAIL="$(cat - | formail \
+	-I "Subject: ${subject}" \
+        | tail -n+2 \
+)"
 
 declare -A SUBSCRIBED
 declare -a actions
@@ -35,13 +47,8 @@ for email in "${!SUBSCRIBED[@]}"; do
 		 continue
 	fi
 	echo "Forwarding mail to: ${SUBSCRIBED["$email"]} <${email}>"
-	formail -kb \
-		-X "MIME-Version:" \
-		-X "Content-Type:" \
-		-X "Subject:" \
-		-X "Date:" \
-	<<<"${MAIL}" | /usr/sbin/sendmail \
-		-F "${FROM}" \
-		-f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>"
+	/usr/sbin/sendmail -F "${FROM}" -f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>" <<EOF
+${MAIL}
+EOF
 done
 #TODO: report errors properly

+ 66 - 7
maildroprc

@@ -7,15 +7,29 @@ SHELL="/bin/bash"
 SENDMAIL="/opt/cropswap/sendmail.sh"
 SUBUNSUB="/opt/cropswap/subunsub.sh"
 DEBUGMAIL="/opt/cropswap/debug.sh"
-MLIST="/var/mail/maildrop/mlist"
-SLIST="/var/mail/maildrop/slist"
+
+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
 
-HANDLE=0
 FORWARD=0
 SUBSCRIBE=""
 CONTINUE=0
+TOPOSTMASTER=0
+TOORGANIZER=0
+TOMEMBER=0
 
 UNHANDLED=5
 BADREQUEST=4
@@ -26,13 +40,27 @@ FATAL=1
 foreach /^(To|Cc):.*/
 {
    ADDR=getaddr($MATCH)
-   foreach $ADDR =~ /^postmaster@localhost$/
+   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
-      HANDLE=1
    }
-   foreach $ADDR =~ /^cropswap@shandan\.one$/
+   foreach $ADDR =~ /^$MEMBERGROUPREGEX$/
    {
+      TOMEMBER=1
       CONTINUE=1
    }
 }
@@ -42,7 +70,38 @@ if (!$CONTINUE)
    exit
 }
 
-if ($HANDLE)
+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"
+
+#cc "|$DEBUGMAIL inspect"
+#EXITCODE=$FATAL
+#exit
+
+if ($TOPOSTMASTER)
 {
    if (/^Subject:\s*\[SIGNUP\]\s*$/)
    {

+ 2 - 1
subunsub.sh

@@ -6,4 +6,5 @@ else
 	d="+"
 fi
 flock "${SLIST}.txt" printf "%c%s\n%c%s\n" "$d" "$2" "$d" "$3" >> "${SLIST}.txt"
-#TODO: mailbot - You have been successfully (un)subscribed
+echo "$(basename $(dirname "${SLIST}")): You have been successfully ${1}D"
+#TODO: mailbot reply