addrutil: Re-indent.
[wk-misc.git] / gpgmlrobot
1 #!/bin/sh
2 # gpgmlrobot - GnuPG Mailing List Robot
3 # Copyright (c) 1999 Werner Koch <wk@gnupg.org>
4 # This program may be used under the terms of the GNU General Public Licence
5 # version 2 or later.
6 #
7 #
8 # The format of the dists file is like this:
9 #-------------------------------------------------------
10 # CF8BCC4B18DE08FCD8A1615906AD222CADF6A6E1  wk@gnupg.de
11 # 4444444444444444444444444444444444444444  foo@bar.net
12 #---------------------------------------------------------
13 #
14 # Each mailing list should have its own directory and an 
15 # entry like this in the .procmailrc:
16 #-----------------------------------------
17 # :0
18 #  * ^To: .*laurin-list@example\.com
19 #   {
20 #        :0:
21 #        * ^X-Loop: failed-laurin-list@example\.com
22 #        /dev/null
23 #
24 #       :0:
25 #       | $HOME/laurin-list/gpgmlrobot
26 #   } 
27 #-------------------------------------               
28 #
29 # You should create one keypair for each mailing list by
30 # cd-ing to the list directory and doing a:
31 #  gpg --homedir .  --gen-key
32 # and give it the email address of the mailing list, it might
33 # be a couuld idea to have a comment in the user ID to mark this
34 # as a key for an encrypted mailing list.  Sen this key to all
35 # subscribers and put there fingerprint 
36 #  (gpg --fingerprint --with-colons foo@bar.net)
37 # into the dists file along with their email address.
38
39
40 #-------------------------------------------
41 #  Configuration section
42 #-------------------------------------------
43
44 ml_address="laurin-list@example.com"
45 full_ml_address="Laurin List <$ml_address>"
46 ml_domain="example.com"
47
48 myhome=/home/cryptorobot/laurin-list
49
50 SENDMAIL="/usr/sbin/sendmail"
51 distsfile=dists
52 remove_input=no
53 ciphertextfile="$1"
54 passphrasefile=passphrase
55 plaintextfile="plain.$$"
56
57
58 #-------------------------------------------
59 #  End configuration section
60 #-------------------------------------------
61 #pgmname=`basename $0`
62 #today=`date -u "+%Y-%m-%d"`
63
64 if ! cd $myhome 2>/dev/null ; then
65     echo "gpgmlrobot: failed to cd to $myhome" >&2
66     exit 1
67 fi
68
69 if [ -z "$ciphertextfile" -o "$ciphertextfile" = "-" ]; then
70     ciphertextfile="input.$$"
71     cat > $ciphertextfile
72     remove_input=yes
73 fi
74
75 if [ ! -f "$ciphertextfile" ]; then
76     echo "usage: gpgmlrobot encrypted-mail-file" >&2
77     do_exit 1
78 fi
79
80 cleanup () {
81   [ -f $plaintextfile ] && rm $plaintextfile
82   [ -f $ciphertextfile -a "$remove_input" = "yes" ] && rm $ciphertextfile
83 }
84
85 do_exit () {
86     cleanup
87     exit $1
88 }
89
90
91 trap "cleanup " 1 2 13 15
92
93 do_send () {
94     key="$1"
95     recp="$2"
96     ( cat <<EOF
97 Date:$orig_date
98 From:$orig_from
99 To: $full_ml_address
100 Subject:$orig_subject
101 Message-ID: $orig_msg_id
102 Mime-Version: 1.0
103 Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";
104               boundary="x42x42x42x42x42x"
105 X-GPG-ML-Robot: 0.1
106 X-Loop: $ml_address
107 Precedence: list
108
109
110 --x42x42x42x42x42x
111 Content-Type: application/pgp-encrypted
112
113 Version: 1
114
115 --x42x42x42x42x42x
116 Content-Type: application/octet-stream
117
118 EOF
119    (
120   if [ $orig_is_mime = no ]; then
121       echo "Content-Type: text/plain; charset=iso-8859-1"
122       echo "Content-Transfer-Encoding: 8bit"
123       echo " "
124   fi
125   cat /dev/null $plaintextfile
126   echo "-- "
127   echo "This message has been processed by the gpg-ml-robot"
128   echo "and is made available to all subscribers of this ML:"
129   echo $(cut -d ' ' -f 2- $distsfile ) | fold -s -w 70 
130   ) | gpg --homedir . --no-secmem-warning --quiet --batch \
131                                    --always-trust -ea -r $key
132 echo ""
133 echo "--x42x42x42x42x42x--"
134 echo ""
135     ) | $SENDMAIL -oi $recp
136 }
137
138
139 # see whether we have already handled this message
140 if [ "$(formail -x X-Loop: < $ciphertextfile)" = "failed-$ml_address" ]; then
141     exit 0
142 fi
143
144 if [ "$(formail -x X-Loop: < $ciphertextfile)" = "$ml_address" ]; then
145     ( formail -t -rI"Precedence: junk" \
146                    -i"X-Loop: failed-$ml_address" < $ciphertextfile
147       echo "Hi,"
148       echo ""
149       echo "Your mail has already been processed by this robot"
150       echo 'and was hopefully delivered to all subscribers.'
151       echo ""
152       echo "Hochachtungsvoll,"
153       echo ""
154       echo "   G. M. Robot"
155       echo ""
156       echo "-- "
157       echo "Powered by the GNU Privacy Guard"
158     ) | $SENDMAIL -oi -t
159    exit 0
160 fi
161
162 # Decrypt the file and encrypt it to each user in turn.
163 echo -n "" > $plaintextfile
164 chmod 600 $plaintextfile
165
166 cat $passphrasefile | gpg --homedir . --quiet --no-secmem-warning \
167                           --passphrase-fd 0 --decrypt --batch --always-trust \
168                          -o - $ciphertextfile >> $plaintextfile
169 if [ $? != 0 ] ; then
170     ( formail -t -i"X-Loop: failed-$ml_address" < $ciphertextfile
171       echo "Hi,"
172       echo ""
173       echo "Your mail could not been processed by this robot"
174       echo 'probably because you did not encrypt it to the'
175       echo "robot's key"
176       echo ""
177       echo "Hochachtungsvoll,"
178       echo ""
179       echo "   G. M. Robot"
180       echo ""
181       echo "-- "
182       echo "Powered by the GNU Privacy Guard"
183     ) | $SENDMAIL -oi -t
184     exit 0
185 fi
186
187 if head -1 $plaintextfile | grep '^Content-Type: text/plain' >/dev/null; then
188     orig_is_mime=yes
189 else
190     orig_is_mime=no
191 fi
192
193 orig_date="$(formail -x Date: < $ciphertextfile)"
194 orig_subject="$(formail -x Subject: < $ciphertextfile)"
195 # We munch the message id to hide the posters informations
196 # This is not really need, because we use the orignal from line,
197 # but this can be changed when needed.
198 orig_msg_id="$(formail -x Message-ID < $ciphertextfile|md5sum)"
199 orig_msg_id="<${orig_msg_id}@${ml_domain}>"
200 orig_from="$(formail -x From: < $ciphertextfile)"
201
202 cat $distsfile | while read  ; do
203     set -- $REPLY
204     if [ -n "$1" -a -n "$2" ]; then
205        do_send $1 $2
206     fi
207 done
208
209 cleanup
210