c49ffd2a5be019a435cedbb0ec8ca9a62d08ca44
[gnupg-doc.git] / tools / append-to-donors.sh
1 #!/bin/sh
2 # append-to-donors.sh
3 # Append new names from the payproc journal to the donors file
4 # and send a Thank You mail.
5 #
6 # Note that this script does not yet handle subscriptions.  Because we
7 # want to verify the mail address anyway, it makes sense to move mai
8 # sending to payprocd.  The final plan is to use webhooks to create
9 # charge records and use them to add a Donor reulary to the list of
10 # donors (but may be limited to once a year)
11
12 pgm="append-to-donors.sh"
13 set -e
14
15 # We temporary need the next line due to an libgpg-error update
16 LD_LIBRARY_PATH=/usr/local/lib
17 export LD_LIBRARY_PATH
18
19 PATH=/usr/local/bin:$PATH
20 SENDMAIL="/usr/sbin/sendmail"
21 LC_ALL=C
22 LC_CTYPE=C
23 RFCDATE="$(date -R)"
24 SIGDELIM="-- "
25
26 usage()
27 {
28     cat <<EOF
29 Usage: $pgm [OPTIONS]
30 Options:
31         --verbose  Run in verbose mode
32         --force    Force re-creation of files.
33         --test     Run in test environment (preview.gnupg.org)
34 EOF
35     exit $1
36 }
37
38
39 verbose=no
40 force=no
41 testmode=no
42 while [ $# -gt 0 ]; do
43     case "$1" in
44         # Set up `optarg'.
45         --*=*)
46             optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
47             ;;
48         *)
49             optarg=""
50             ;;
51     esac
52
53     case $1 in
54         --verbose)
55             verbose=yes
56             ;;
57         --force)
58             force=yes
59             ;;
60         --test)
61             testmode=yes
62             ;;
63         --help)
64             usage 0
65             ;;
66         *)
67             usage 1 1>&2
68             ;;
69     esac
70     shift
71 done
72
73
74 if [ $testmode = yes ]; then
75   htdocs="/var/www/www/preview.gnupg.org/htdocs"
76   journal_dir="/var/log/payproc-test"
77 else
78   htdocs="/var/www/www/www.gnupg.org/htdocs"
79   journal_dir="/var/log/payproc"
80 fi
81
82 donors="$htdocs/donate/donors.dat"
83 donations="$htdocs/donate/donations.dat"
84
85 LOCKFILE="$donors.lock"
86
87 if [ ! -f "$donors" ]; then
88   echo "$pgm: '$donors' not found" >&2;
89   exit 1
90 fi
91
92 if [ x"$(idn --quiet wk@gnupg.org)" != x"wk@gnupg.org" ]; then
93   echo  "$pgm: idn(1) tool not installed or not working"
94   exit 1
95 fi
96 if [ x"$(mu-tool 2047 -c utf-8 '<wk@gnupg.org>')" \
97       != x"=?utf-8?Q?<wk@gnupg.org>?=" ]; then
98   echo "$pgm: mu-tool(1) tool not installed or not working"
99   exit 1
100 fi
101
102
103 if ! lockfile -l 7200 -r 2 $LOCKFILE; then
104     echo "$pgm: another instance is still running"
105     exit 0
106 fi
107 trap "rm -f $LOCKFILE $donors.tmp $donors.stamp" 0
108
109
110 # Send a thank you mail
111 # Uses these variables:
112 #  amount   - The amount of the donation
113 #  currency - The currency for the amount
114 #  euro     - The amount cinvertet to Euro
115 #  xmail    - The mailbox
116 #  name     - The name or empty for an anonymous donation
117 #  message  - The message to us or empty
118 #  recur    - only when called with an arg > 0
119 #  service  - 1 = Stripe, 2 = Paypal, 3 = SEPA
120 # Used scratch variables:
121 #  upcurrency
122 #  ineuro
123 #  xamount
124 #  recur_text
125 #
126 # FIXME: Clean message and name and use an appropriate encoding.
127 #        The second mail should actually be encrypted.  In fact
128 #        we would better try to encrypt also the first mail.  Add a
129 #        pubkey field to the donation page?
130 #
131 send_thanks () {
132     recur_text="one-time"
133     xextratext=""
134     if [ $1 -gt 0 ]; then
135         case "$recur" in
136             12) recur_text="monthly"
137                 ;;
138             6) recur_text="bi-monthly"
139                 ;;
140             4) recur_text="quarterly"
141                 ;;
142             1) recur_text="yearly"
143                 ;;
144         esac
145         xextratext="
146 First Look Media, the parent organization of The Intercept and
147 Laura Poitras' Field of Vision, will match the first 12 months
148 of your gift.
149 "
150     fi
151     case "$service" in
152         1) service_text="Stripe"
153            ;;
154         2) service_text="PayPal"
155            ;;
156         3) service_text="SEPA"
157            ;;
158         *) service_text="$service"
159            ;;
160     esac
161     upcurrency=$(echo $currency | tr [a-z] [A-Z])
162     if [ "$upcurrency" = EUR ]; then
163         ineuro=
164     else
165         ineuro=" (about $(echo $euro| awk '{print int($0 + 0.5)}') EUR)"
166     fi
167     xamount="$(echo $amount| awk '{print int($0 + 0.5)}')"
168     if [ -n "$xmail" ]; then
169       xidnmail=$(CHARSET=UTF-8 idn --no-tld --quiet "$xmail")
170     else
171       xidnmail=""
172     fi
173     if [ x"$xidnmail" = x"$xmail" ]; then
174       xqpmail="$xmail"
175     else
176       xqpmail=$(mu-tool 2047 -c utf-8 "$xmail")
177     fi
178     if [ $testmode = yes ]; then
179       xisatest="[TEST DONATION] "
180     else
181       xisatest=""
182     fi
183     ( cat <<EOF
184 From: donations@gnupg.org
185 To: $xqpmail
186 Subject: ${xisatest}Thank you for supporting GnuPG
187 Date: $RFCDATE
188 Mime-Version: 1.0
189 Content-Type: text/plain
190 X-Loop: gnupg-donations-thanks.gnupg.org
191
192 Dear ${name:-Anonymous},
193
194 we received $xamount $upcurrency$ineuro as a ${recur_text} donation for GnuPG (via $service_text).
195
196 Your donation helps us to develop and maintain GnuPG and related software.
197 $xextratext
198
199 Thank you.
200
201   The GnuPG Team
202
203
204 $SIGDELIM
205 GnuPG - helping to keep private data private
206 EOF
207     ) | $SENDMAIL -oi donations@gnupg.org "$xidnmail"
208
209
210 if [ -n "$message" ]; then
211     ( cat <<EOF
212 From: donations@gnupg.org
213 To: donations@gnupg.org
214 Reply-To: $xqpmail
215 Subject: ${xisatest}Message from GnuPG donor
216 Date: $RFCDATE
217 Mime-Version: 1.0
218 Content-Type: text/plain
219 X-Loop: gnupg-donations-thanks.gnupg.org
220
221 Name ..: ${name:-Anonymous}
222 Amount : $amount $upcurrency $ineuro
223 Recur .: $recur_text
224 Account: $service_text
225 Message: $message
226 EOF
227     ) | $SENDMAIL -oi donations@gnupg.org
228 fi
229
230 }
231
232
233 # Find the last entry in donors which we have put in.
234 tmp=$(awk -F: <$donors '
235     /^(#.*)?$/ {next}
236     $5!="" { date=$2;lineno=$5 }
237     END {gsub(/-/,"",date)
238          print date ":" lineno}
239 ')
240 lastdate=$(echo $tmp | cut -d: -f1 | sed 's/T.*//')
241 lastline=$(echo $tmp | cut -d: -f2)
242 [ -z "$lastdate" ] && lastdate=19700101
243 [ -z "$lastline" ] && lastline=0
244
245
246 [ -f "$donors".stamp ] && rm "$donors".stamp
247 cat "$donors" > "$donors.tmp"
248 find $journal_dir/ -type f -name 'journal-????????.log' -print \
249      | sort | while read fname; do
250     fname=$(basename "$fname")
251     jdate=${fname%.log}
252     jdate=${jdate#journal-}
253     jyear=$(echo $jdate |sed 's/\(....\).*/\1/')
254     if [ "$jdate" -ge "$lastdate" ]; then
255         [ "$jdate" -gt "$lastdate" ] && lastline=0
256         # First for charge records
257         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
258                      -Fmail -Famount -Fcurrency -Feuro -Fservice \
259            -S "_lnr > $lastline" -Stype=C -Saccount==1 \
260            --html --print "$journal_dir/journal-$jdate.log" \
261          | while IFS=: read lnr datestr name message \
262                             xmail amount currency euro service rest; do
263             name=$(echo "$name" | tr \`\$: ...)
264             message=$(echo "$message" | tr \`\$ ..)
265             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
266             # Note that we removed colons from $name
267             echo "$jyear:$datestr:$name::$lnr:" >> "$donors.tmp"
268             touch "$donors".stamp
269             send_thanks 0
270          done
271         # Second for new subscriptions
272         payproc-jrnl -F_lnr -Fdate -F'[name]' -F'[message]' \
273                      -Fmail -Famount -Fcurrency -Feuro -F service -Frecur \
274            -S "_lnr > $lastline" -Stype=S -Saccount==1 \
275            --html --print "$journal_dir/journal-$jdate.log" \
276          | while IFS=: read lnr datestr name message \
277                             xmail amount currency euro service recur rest; do
278             name=$(echo "$name" | tr \`\$: ...)
279             message=$(echo "$message" | tr \`\$ ..)
280             xmail=$(echo "$xmail" | tr \`\$ .. | sed 's/\.$//')
281             # Note that we removed colons from $name
282             echo "$jyear:$datestr:$name:S:$lnr:" >> "$donors.tmp"
283             touch "$donors".stamp
284             send_thanks 1
285          done
286     fi
287 done
288
289 # If we have any new records update the files.
290 if [ -f "$donors".stamp -o $force = yes ]; then
291
292   if ! mv "$donors.tmp" "$donors"; then
293     echo "$pgm: error updating $donors" >&2
294     exit 1
295   fi
296
297   if [ -f "$donations" ]; then
298     payproc-stat -u "$donations" -- > "$donations".tmp  \
299       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
300     if ! mv "$donations".tmp "$donations"; then
301         echo "$pgm: error updating $donations" >&2
302         exit 1
303     fi
304   else
305     payproc-stat -u "$donations" -- > "$donations"  \
306       $(find $journal_dir/ -type f -name 'journal-????????.log' -print|sort)
307   fi
308 fi