improve function to get primary group to make it more portable
[monkeysphere.git] / src / share / mh / revoke_key
1 # -*-shell-script-*-
2 # This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)
3
4 # Monkeysphere host revoke-key subcommand
5 #
6 # The monkeysphere scripts are written by:
7 # Jameson Rollins <jrollins@finestructure.net>
8 # Jamie McClelland <jm@mayfirst.org>
9 # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
10 #
11 # They are Copyright 2008-2009, and are all released under the GPL,
12 # version 3 or later.
13
14 # revoke host key
15
16 revoke_key() {
17
18 # Coming in here, we expect $HOST_FINGERPRINT to be set, and we
19 # believe that there is in fact a key.
20
21     if [ "$PROMPT" = "false" ] ; then
22         publish=N
23     else
24         cat <<EOF >&2
25 This will generate a revocation certificate for your host key
26 (fingerprint: $HOST_FINGERPRINT) and
27 dump the certificate to standard output.
28
29 It can also directly publish the new revocation certificate
30 to the public keyservers via $KEYSERVER if you want it to.
31
32 Publishing this certificate will IMMEDIATELY and PERMANENTLY revoke
33 your host key!
34
35 EOF
36         read -p "Publish the certificate after generation? (y/n/Q) " publish
37         
38         if ! [ "${publish/y/Y}" = 'Y' -o "${publish/n/N}" = 'N' ] ; then
39             failure "aborting at user request"
40         fi
41     fi
42     
43     # our current implementation is very simple: we just want to
44     # generate the revocation certificate on stdout.  This provides
45     # for the two most likely (but hopefully not common) scenarios:
46
47     # an admin wants a revocation certificate for the host which they
48     # can store securely offline.  In this case, the admin can
49     # redirect stdout to a file, or can simply copy/paste or
50     # transcribe from the terminal.
51
52     # Alternately, an admin might want to publish the revocation
53     # certificate immediately, which we can help them do as well.
54
55     if [ "$PROMPT" = 'false' ] ; then
56         # FIXME: allow the end user to choose something other than
57         # "key was compromised" (1) and to supply their own revocation
58         # string.
59
60         local revoke_commands="y
61 1
62 Monkeysphere host key revocation (automated) $(date '+%F_%T%z')
63
64 y
65
66 "
67         revcert=$(GNUPGHOME="$GNUPGHOME_HOST" gpg_host --command-fd 0 --armor --gen-revoke "0x${HOST_FINGERPRINT}!" <<<"$revoke_commands" ) \
68             || failure "Failed to generate revocation certificate!"
69
70
71     else
72     # note: we're not using the gpg_host function because we actually
73     # want to use gpg's UI in this case, so we want to omit --no-tty
74         revcert=$(GNUPGHOME="$GNUPGHOME_HOST" gpg --no-greeting --quiet --armor --gen-revoke "0x${HOST_FINGERPRINT}!") \
75             || failure "Failed to generate revocation certificate!"
76     fi
77
78     # if you run gpg --gen-revoke but cancel it or quit in the middle,
79     # it returns success, but emits no revocation certificate:
80     if ! [ "$revcert" ] ; then
81         failure "Revocation canceled."
82     fi
83
84     ## ok, now we have the revocation certificate.  Print it, and
85     ## offer to publish if originally requested:
86     printf "%s\n" "$revcert"
87
88     if [ "${publish/y/Y}" = 'Y' ] ; then
89         printf "\n" >&2
90         read -p "Really publish this cert to $KEYSERVER ? (Y/n) " really
91         if [ "${really/n/N}" = 'N' ] ; then
92             printf "Not publishing.\n" >&2
93         else
94             local newhome=$(mkmstempdir)
95             GNUPGHOME="$newhome" gpg --no-tty --quiet --import < "$HOST_KEY_FILE"
96             GNUPGHOME="$newhome" gpg --no-tty --quiet --import <<< "$revcert"
97             GNUPGHOME="$newhome" gpg --keyserver "$KEYSERVER" --send "0x${HOST_FINGERPRINT}!"
98             rm -rf "$newhome"
99         fi
100     fi
101 }