/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos-keygen

  • Committer: Teddy Hogeborn
  • Date: 2008-12-10 01:26:02 UTC
  • mfrom: (237.1.2 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20081210012602-vhz3h75xkj24t340
First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
3
3
# Mandos key generator - create a new OpenPGP key for a Mandos client
4
4
5
 
# Copyright © 2007-2008 Teddy Hogeborn & Björn Påhlsson
 
5
# Copyright © 2008 Teddy Hogeborn
 
6
# Copyright © 2008 Björn Påhlsson
6
7
7
8
# This program is free software: you can redistribute it and/or modify
8
9
# it under the terms of the GNU General Public License as published by
20
21
# Contact the authors at <mandos@fukt.bsnet.se>.
21
22
22
23
 
23
 
VERSION="1.0"
 
24
VERSION="1.0.2"
24
25
 
25
26
KEYDIR="/etc/keys/mandos"
26
27
KEYTYPE=DSA
27
28
KEYLENGTH=2048
28
29
SUBKEYTYPE=ELG-E
29
30
SUBKEYLENGTH=2048
30
 
KEYNAME="`hostname --fqdn`"
 
31
KEYNAME="`hostname --fqdn 2>/dev/null || hostname`"
31
32
KEYEMAIL=""
32
33
KEYCOMMENT="Mandos client key"
33
34
KEYEXPIRE=0
35
36
KEYCOMMENT_ORIG="$KEYCOMMENT"
36
37
mode=keygen
37
38
 
 
39
if [ ! -d "$KEYDIR" ]; then
 
40
    KEYDIR="/etc/mandos/keys"
 
41
fi
 
42
 
38
43
# Parse options
39
 
TEMP=`getopt --options vhd:t:l:n:e:c:x:f \
40
 
    --longoptions version,help,password,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force \
 
44
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:f \
 
45
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force \
41
46
    --name "$0" -- "$@"`
42
47
 
43
48
help(){
49
54
       $basename [ OPTIONS ]
50
55
   Encrypted password creation:
51
56
       $basename { -p | --password } [ --name NAME ] [ --dir DIR]
 
57
       $basename { -F | --passfile } FILE [ --name NAME ] [ --dir DIR]
52
58
 
53
59
Key creation options:
54
60
  -v, --version         Show program's version number and exit
70
76
  -x TIME, --expire TIME
71
77
                        Key expire time.  Default is no expiration.
72
78
                        See gpg(1) for syntax.
73
 
  -f, --force           Force overwriting old keys.
 
79
  -f, --force           Force overwriting old key files.
74
80
 
75
81
Password creation options:
76
 
  -p, --password        Create an encrypted password using the keys in
 
82
  -p, --password        Create an encrypted password using the key in
 
83
                        the key directory.  All options other than
 
84
                        --dir and --name are ignored.
 
85
  -F FILE, --passfile FILE
 
86
                        Encrypt a password from FILE using the key in
77
87
                        the key directory.  All options other than
78
88
                        --dir and --name are ignored.
79
89
EOF
83
93
while :; do
84
94
    case "$1" in
85
95
        -p|--password) mode=password; shift;;
 
96
        -F|--passfile) mode=password; PASSFILE="$2"; shift 2;;
86
97
        -d|--dir) KEYDIR="$2"; shift 2;;
87
98
        -t|--type) KEYTYPE="$2"; shift 2;;
88
99
        -s|--subtype) SUBKEYTYPE="$2"; shift 2;;
148
159
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
149
160
    esac
150
161
    
151
 
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
152
 
        && [ "$FORCE" -eq 0 ]; then
 
162
    if [ \( -e "$SECKEYFILE" -o -e "$PUBKEYFILE" \) \
 
163
        -a "$FORCE" -eq 0 ]; then
153
164
        echo "Refusing to overwrite old key files; use --force" >&2
154
165
        exit 1
155
166
    fi
184
195
stty echo; \
185
196
" EXIT
186
197
 
187
 
umask 027
 
198
umask 077
188
199
 
189
200
if [ "$mode" = keygen ]; then
190
201
    # Create batch file for GnuPG
231
242
        FILECOMMENT="$FILECOMMENT <$KEYEMAIL>"
232
243
    fi
233
244
    
234
 
    # Export keys from key rings to key files
 
245
    # Export key from key rings to key files
235
246
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
236
247
        --homedir "$RINGDIR" --armor --export-options export-minimal \
237
248
        --comment "$FILECOMMENT" --output "$SECKEYFILE" \
242
253
fi
243
254
 
244
255
if [ "$mode" = password ]; then
245
 
    # Import keys into temporary key rings
 
256
    # Import key into temporary key rings
246
257
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
247
258
        --homedir "$RINGDIR" --trust-model always --armor \
248
259
        --import "$SECKEYFILE"
254
265
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
255
266
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
256
267
        --fingerprint --with-colons \
257
 
        | sed -n -e '/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
 
268
        | sed --quiet \
 
269
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
258
270
    
259
271
    test -n "$FINGERPRINT"
260
272
    
261
273
    FILECOMMENT="Encrypted password for a Mandos client"
262
274
    
263
 
    stty -echo
264
 
    echo -n "Enter passphrase: " >&2
265
 
    sed -e '1q' \
266
 
        | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
 
275
    if [ -n "$PASSFILE" ]; then
 
276
        cat "$PASSFILE"
 
277
    else
 
278
        stty -echo
 
279
        echo -n "Enter passphrase: " >&2
 
280
        first="$(head --lines=1 | tr --delete '\n')"
 
281
        echo -n -e "\nRepeat passphrase: " >&2
 
282
        second="$(head --lines=1 | tr --delete '\n')"
 
283
        echo >&2
 
284
        stty echo
 
285
        if [ "$first" != "$second" ]; then
 
286
            echo -e "Passphrase mismatch" >&2
 
287
            false
 
288
        else
 
289
            echo -n "$first"
 
290
        fi
 
291
    fi | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
267
292
        --homedir "$RINGDIR" --trust-model always --armor --encrypt \
268
 
        --recipient "$FINGERPRINT" --comment "$FILECOMMENT" \
 
293
        --sign --recipient "$FINGERPRINT" --comment "$FILECOMMENT" \
269
294
        > "$SECFILE"
270
 
    echo >&2
271
 
    stty echo
 
295
    status="${PIPESTATUS[0]}"
 
296
    if [ "$status" -ne 0 ]; then
 
297
        exit "$status"
 
298
    fi
272
299
    
273
300
    cat <<-EOF
274
301
        [$KEYNAME]
275
302
        host = $KEYNAME
276
303
        fingerprint = $FINGERPRINT
277
304
        secret =
278
 
EOF
279
 
    sed -n -e '
 
305
        EOF
 
306
    sed --quiet --expression='
280
307
        /^-----BEGIN PGP MESSAGE-----$/,/^-----END PGP MESSAGE-----$/{
281
308
            /^$/,${
282
309
                # Remove 24-bit Radix-64 checksum