merge current assockit from CVS, not yet enough
[shellsnippets/shellsnippets.git] / mksh / depgp
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/historic/depgp,v 1.2 2009/09/08 17:01:51 tg Exp $
3 #-
4 # Copyright (c) 2008
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # Decodes PGP/MIME (acts as MDA)
23
24 nl='
25 '
26 if [[ $1 = i ]]; then
27         shift
28 else
29         i='--batch --no-tty'
30 fi
31 T=$(mktemp -d /tmp/depgp.XXXXXXXXXX) || exit 254
32 trap "cd /; rm -rf $T; exit 0" 0
33 trap "cd /; rm -rf $T; exit 1" 1 2 3 5 13 15
34 cd $T
35 chmod 0700 .
36 (mkdir d
37 #sed 's/\r$//' | mksh /usr/mpkg/bin/mbmf filter >t
38 sed 's/\r$//' >t
39 sed '/^$/,$d' <t >h
40 cd d
41 if grep -qi '^Content-Type:.*multipart/' ../h; then
42         munpack -t <../t
43 elif grep -qi 'Content-Transfer-Encoding:.*QUOTED-PRINTABLE' ../h; then
44         sed '1,/^$/d' <../t | \
45             perl -pe 's/=(\n|[a-fA-F0-9]{2})/$1 eq "\n" ? "" : pack("C",hex($1))/eg' >t
46 else
47         sed '1,/^$/d' <../t >t
48 fi
49 for a in $(fgrep -l -- '-----BEGIN PGP' *); do
50         touch $T/have
51         s=
52         st=0
53         sed 's/\r$//' <$a |&
54         while IFS= read -pr line; do
55                 if [[ $st$line == @(0-----BEGIN PGP MESSAGE)* ]]; then
56                         st=1
57                         s=$line
58                 elif [[ $st = 1 ]]; then
59                         s=$s$nl$line
60                         if [[ $line == @(-----END PGP MESSAGE)* ]]; then
61                                 gpg $i --auto-key-locate keyserver <<<"$s"
62                                 s=
63                                 st=0
64                         fi
65                 else
66                         print -r -- "$line"
67                 fi
68         done >$a.dec
69         [[ -n $s ]] && print -r -- "$s" >>$a.dec
70         [[ -s $a.dec ]] && mv -f $a.dec $a
71 done
72 cd ..) >$T/errmsgs 2>&1
73 if [[ -e $T/have ]]; then
74         fn=/home/ork/.etc/Backup/mail.$(date +%s).$$
75         /usr/mpkg/libexec/dmail |&
76         print -p Content-type: text/plain
77         print -p X-Backup-Pathname: $fn
78         pl=
79         while :; do
80                 IFS= read -r line
81                 if [[ $line = @([        ])* ]]; then
82                         pl=$pl$nl$line
83                         continue
84                 fi
85                 typeset -l hline=$pl
86                 [[ $hline = content-@(type|transfer-encoding):* ]] || \
87                     [[ -z $pl ]] || print -rp -- "$pl"
88                 pl=$line
89                 [[ -n $pl ]] || break
90         done <t
91         print -p
92         exec 3>&p
93         for file in errmsgs d/*; do
94                 print -ru3 "⇒ ${file#d/}"
95                 sed 's/\r$//' <$file | if sed '/^$/,$d' <$file | \
96                     grep -qi 'Content-Transfer-Encoding:.*QUOTED-PRINTABLE'; then
97                         perl -pe 's/=(\n|[a-fA-F0-9]{2})/$1 eq "\n" ? "" : pack("C",hex($1))/eg'
98                 else
99                         cat
100                 fi >&3
101         done
102         exec 3>&-
103         umask 377
104         cat $T/t >$fn
105         chmod 0400 $fn
106         sleep 1
107 else
108         sed 's/\r$//' <$T/t | /usr/mpkg/libexec/dmail 2>&1 | \
109             fgrep -v 'delivered to'
110 fi
111 cd /
112 rm -rf $T
113 exit 0