/mandos/release

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

« back to all changes in this revision

Viewing changes to mandos-keygen

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 © 2008-2012 Teddy Hogeborn
6
 
# Copyright © 2008-2012 Björn Påhlsson
 
5
# Copyright © 2008 Teddy Hogeborn
 
6
# Copyright © 2008 Björn Påhlsson
7
7
8
8
# This program is free software: you can redistribute it and/or modify
9
9
# it under the terms of the GNU General Public License as published by
18
18
# You should have received a copy of the GNU General Public License
19
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
21
 
# Contact the authors at <mandos@recompile.se>.
 
21
# Contact the authors at <mandos@fukt.bsnet.se>.
22
22
23
23
 
24
 
VERSION="1.6.0"
 
24
VERSION="1.0.2"
25
25
 
26
26
KEYDIR="/etc/keys/mandos"
27
 
KEYTYPE=RSA
28
 
KEYLENGTH=4096
29
 
SUBKEYTYPE=RSA
30
 
SUBKEYLENGTH=4096
 
27
KEYTYPE=DSA
 
28
KEYLENGTH=2048
 
29
SUBKEYTYPE=ELG-E
 
30
SUBKEYLENGTH=2048
31
31
KEYNAME="`hostname --fqdn 2>/dev/null || hostname`"
32
32
KEYEMAIL=""
33
33
KEYCOMMENT="Mandos client key"
60
60
  -v, --version         Show program's version number and exit
61
61
  -h, --help            Show this help message and exit
62
62
  -d DIR, --dir DIR     Target directory for key files
63
 
  -t TYPE, --type TYPE  Key type.  Default is RSA.
 
63
  -t TYPE, --type TYPE  Key type.  Default is DSA.
64
64
  -l BITS, --length BITS
65
 
                        Key length in bits.  Default is 4096.
 
65
                        Key length in bits.  Default is 2048.
66
66
  -s TYPE, --subtype TYPE
67
67
                        Subkey type.  Default is ELG-E.
68
68
  -L BITS, --sublength BITS
69
 
                        Subkey length in bits.  Default is 4096.
 
69
                        Subkey length in bits.  Default is 2048.
70
70
  -n NAME, --name NAME  Name of key.  Default is the FQDN.
71
71
  -e ADDRESS, --email ADDRESS
72
72
                        Email address of key.  Default is empty.
147
147
        echo "Invalid key length" >&2
148
148
        exit 1
149
149
    fi
150
 
    
 
150
 
151
151
    if [ -z "$KEYEXPIRE" ]; then
152
152
        echo "Empty key expiration" >&2
153
153
        exit 1
172
172
    if [ -n "$KEYEMAIL" ]; then
173
173
        KEYEMAILLINE="Name-Email: $KEYEMAIL"
174
174
    fi
175
 
    
 
175
 
176
176
    # Create temporary gpg batch file
177
177
    BATCHFILE="`mktemp -t mandos-keygen-batch.XXXXXXXXXX`"
178
178
fi
192
192
shred --remove \"$RINGDIR\"/sec*;
193
193
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
194
194
rm --recursive --force \"$RINGDIR\";
195
 
tty --quiet && stty echo; \
 
195
stty echo; \
196
196
" EXIT
197
197
 
198
 
set -e
199
 
 
200
198
umask 077
201
199
 
202
200
if [ "$mode" = keygen ]; then
219
217
        %commit
220
218
        EOF
221
219
    
222
 
    if tty --quiet; then
223
 
        cat <<-EOF
224
 
        Note: Due to entropy requirements, key generation could take
225
 
        anything from a few minutes to SEVERAL HOURS.  Please be
226
 
        patient and/or supply the system with more entropy if needed.
227
 
        EOF
228
 
        echo -n "Started: "
229
 
        date
230
 
    fi
231
 
    
232
220
    # Generate a new key in the key rings
233
221
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
234
222
        --homedir "$RINGDIR" --trust-model always \
235
223
        --gen-key "$BATCHFILE"
236
224
    rm --force "$BATCHFILE"
237
225
    
238
 
    if tty --quiet; then
239
 
        echo -n "Finished: "
240
 
        date
241
 
    fi
242
 
    
243
226
    # Backup any old key files
244
227
    if cp --backup=numbered --force "$SECKEYFILE" "$SECKEYFILE" \
245
228
        2>/dev/null; then
289
272
    
290
273
    FILECOMMENT="Encrypted password for a Mandos client"
291
274
    
292
 
    while [ ! -s "$SECFILE" ]; do
293
 
        if [ -n "$PASSFILE" ]; then
294
 
            cat "$PASSFILE"
 
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
295
288
        else
296
 
            tty --quiet && stty -echo
297
 
            echo -n "Enter passphrase: "
298
 
            read first
299
 
            tty --quiet && echo >&2
300
 
            echo -n "Repeat passphrase: "
301
 
            read second
302
 
            if tty --quiet; then
303
 
                echo >&2
304
 
                stty echo
305
 
            fi
306
 
            if [ "$first" != "$second" ]; then
307
 
                echo "Passphrase mismatch" >&2
308
 
                touch "$RINGDIR"/mismatch
309
 
            else
310
 
                echo -n "$first"
311
 
            fi
312
 
        fi | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
313
 
            --homedir "$RINGDIR" --trust-model always --armor \
314
 
            --encrypt --sign --recipient "$FINGERPRINT" --comment \
315
 
            "$FILECOMMENT" > "$SECFILE"
316
 
        if [ -e "$RINGDIR"/mismatch ]; then
317
 
            rm --force "$RINGDIR"/mismatch
318
 
            if tty --quiet; then
319
 
                > "$SECFILE"
320
 
            else
321
 
                exit 1
322
 
            fi
 
289
            echo -n "$first"
323
290
        fi
324
 
    done
 
291
    fi | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
 
292
        --homedir "$RINGDIR" --trust-model always --armor --encrypt \
 
293
        --sign --recipient "$FINGERPRINT" --comment "$FILECOMMENT" \
 
294
        > "$SECFILE"
 
295
    status="${PIPESTATUS[0]}"
 
296
    if [ "$status" -ne 0 ]; then
 
297
        exit "$status"
 
298
    fi
325
299
    
326
300
    cat <<-EOF
327
301
        [$KEYNAME]