init
commit
de4607f946
|
@ -0,0 +1,47 @@
|
|||
# town mailing list manager
|
||||
|
||||
our little bespoke town engine. it runs on a janky procmail script
|
||||
|
||||
|
||||
## setup
|
||||
|
||||
our system is very particular to running on public unix systems and probably
|
||||
wouldn't be advisable for anything with external mail.
|
||||
|
||||
we have our local mail set up so that it's impossible to spoof the
|
||||
envelope sender of an email with `local_login_sender_maps` in postfix;
|
||||
the list handles this to make the emails look pretty and to evade spoofing
|
||||
|
||||
the software works on the assumption that everything lives in the home dir
|
||||
of a user named `list`.
|
||||
our list account needs two directories, `lists/` and `archive/`.
|
||||
our scripts can autopopulate everything here, but you can also do manual
|
||||
configuration in `lists/` to change access control to certain mailing lists.
|
||||
|
||||
copy procailrc to `~/.procmailrc` and set up `~/.forward` to filter all mail
|
||||
through it:
|
||||
|
||||
```
|
||||
|/usr/bin/procmail
|
||||
```
|
||||
|
||||
if you want to have any special read-only mailing lists, you can populate
|
||||
`lists/LISTNAME.senders` with a list of allowed senders, one on each line
|
||||
|
||||
a user can subscribe by naming the lists they want to subscribe to in a
|
||||
`.townlists` file in their home directory
|
||||
rather than checking these lists every post, we populate some internal
|
||||
subscription lists with `make_lists.sh`, which should run on a cron job.
|
||||
|
||||
## assumptions
|
||||
- mailing list names are `[a-z0-9_]{1,16}`
|
||||
- we check this in the .townlists files and in sending
|
||||
- everything lives in our home directory
|
||||
- `lists/` and `archive/` directories exist
|
||||
- usernames don't contain special characters
|
||||
- i don't actually know which ones would be an issue
|
||||
but town doesn't usually allow anything too crazy anyway
|
||||
|
||||
### subscriptions
|
||||
- everyone we care about lives in /home and their usernames correspond to the directories
|
||||
- list subscriptions are stored per-line in `.townlists`
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh
|
||||
|
||||
rm -- "${HOME}/lists/"*.users.new
|
||||
|
||||
for listfile in /home/*/.townlists; do
|
||||
user="$(basename "$(dirname "$listfile")")"
|
||||
for x in $(grep '^[a-z0-9_]\{1,16\}$' "$listfile"); do
|
||||
echo "$user" >> "${HOME}/lists/${x}.users.new"
|
||||
done
|
||||
done
|
||||
|
||||
rm -- "${HOME}/lists"/*.users
|
||||
for i in "${HOME}/lists"/*.users.new; do
|
||||
mv -- "$i" "$(dirname "$i")"/"$(basename "$i" .new)"
|
||||
done
|
|
@ -0,0 +1,56 @@
|
|||
# mailing list protocol!
|
||||
# depends on a bunch of files in $HOME/lists --
|
||||
# a "listname.users" containing all of the users
|
||||
# and (optionally) a "listname.senders" if you want to restrict that
|
||||
SHELL=/bin/sh
|
||||
SENDMAIL=/usr/sbin/sendmail
|
||||
LINEBUF=10000000
|
||||
|
||||
:0
|
||||
* ^To:.*list\+\/[a-z0-9_]+@tilde\.town
|
||||
LIST=| echo "$MATCH" | sed 's/@.*//' | sed 's/\(.\{16\}\).*/\1/' | tr '[:upper:]' '[:lower:]'
|
||||
|
||||
:0A
|
||||
{
|
||||
:0A
|
||||
* ? [ -e ${HOME}/lists/${LIST}.users ]
|
||||
RECIPIENTS=| cat ${HOME}/lists/${LIST}.users | tr '\n' ' '
|
||||
|
||||
:0E
|
||||
{ RECIPIENTS="" }
|
||||
}
|
||||
|
||||
# Extract envelope sender. Email addresses are actually very complex
|
||||
# but we're on tilde.town so our email addresses aren't going to have spaces
|
||||
:0A
|
||||
* ^From \/[^ ]*
|
||||
ENV_SENDER=|echo "$MATCH" | sed "s/ .*//"
|
||||
|
||||
:0A
|
||||
ENV_USER=|echo "$ENV_SENDER" | sed "s/@.*//"
|
||||
|
||||
:0A
|
||||
{
|
||||
# If we have a restricted list of senders we should abort if it's not in there
|
||||
:0A
|
||||
* ? [ -e "${HOME}/lists/${LIST}.senders" ]
|
||||
{
|
||||
:0A
|
||||
* !? grep -F "${ENV_USER}" "${HOME}/lists/${LIST}.senders"
|
||||
# hack to quit procmailrc immediately (WHY)
|
||||
{ EXITCODE=77 HOST= }
|
||||
}
|
||||
}
|
||||
|
||||
:0Af
|
||||
| formail -a "X-Loop: list+${LIST}@tilde.town" -I "Reply-To: ${LIST} <list+${LIST}@tilde.town>" -I "From: ${ENV_SENDER}"
|
||||
|
||||
:0A
|
||||
{
|
||||
UMASK=003
|
||||
:0c:
|
||||
archive/${LIST}
|
||||
}
|
||||
|
||||
:0A
|
||||
! ${RECIPIENTS}
|
Loading…
Reference in New Issue