/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 debian/mandos-client.postinst

  • Committer: Teddy Hogeborn
  • Date: 2021-02-03 23:10:42 UTC
  • Revision ID: teddy@recompile.se-20210203231042-2z3egrvpo1zt7nej
mandos-ctl: Fix bad test for command.Remove and related minor issues

The test for command.Remove removes all clients from the spy server,
and then loops over all clients, looking for the corresponding Remove
command as recorded by the spy server.  But since since there aren't
any clients left after they were removed, no assertions are made, and
the test therefore does nothing.  Fix this.

In tests for command.Approve and command.Deny, add checks that clients
were not somehow removed by the command (in which case, likewise, no
assertions are made).

Add related checks to TestPropertySetterCmd.runTest; i.e. test that a
sequence is not empty before looping over it and making assertions.

* mandos-ctl (TestBaseCommands.test_Remove): Save a copy of the
  original "clients" dict, and loop over those instead.  Add assertion
  that all clients were indeed removed.  Also fix the code which looks
  for the Remove command, which now needs to actually work.
  (TestBaseCommands.test_Approve, TestBaseCommands.test_Deny): Add
  assertion that there are still clients before looping over them.
  (TestPropertySetterCmd.runTest): Add assertion that the list of
  values to get is not empty before looping over them.  Also add check
  that there are still clients before looping over clients.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# If prerm fails during replacement due to conflict:
16
16
#       <postinst> abort-remove in-favour <new-package> <version>
17
17
 
 
18
. /usr/share/debconf/confmodule
 
19
 
18
20
set -e
19
21
 
20
22
# Update the initial RAM file system image
21
23
update_initramfs()
22
24
{
23
 
    update-initramfs -u -k all
 
25
    if command -v update-initramfs >/dev/null; then
 
26
        update-initramfs -k all -u
 
27
    elif command -v dracut >/dev/null; then
 
28
        dracut_version="`dpkg-query --showformat='${Version}' --show dracut`"
 
29
        if dpkg --compare-versions "$dracut_version" lt 043-1 \
 
30
                && bash -c '. /etc/dracut.conf; . /etc/dracut.conf.d/*; [ "$hostonly" != yes ]'; then
 
31
            echo 'Dracut is not configured to use hostonly mode!' >&2
 
32
            return 1
 
33
        fi
 
34
        # Logic taken from dracut.postinst
 
35
        for kernel in /boot/vmlinu[xz]-*; do
 
36
            kversion="${kernel#/boot/vmlinu[xz]-}"
 
37
            # Dracut preserves old permissions of initramfs image
 
38
            # files, so we adjust permissions before creating new
 
39
            # initramfs image containing secret keys.
 
40
            chmod go-r /boot/initrd.img-"$kversion"
 
41
            if [ "$kversion" != "*" ]; then
 
42
                /etc/kernel/postinst.d/dracut "$kversion"
 
43
            fi
 
44
        done
 
45
    fi
24
46
    
25
47
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
26
48
        # Make old initrd.img files unreadable too, in case they were
61
83
        return 0
62
84
    fi
63
85
 
 
86
    # Remove any bad TLS keys by 1.8.0-1
 
87
    if dpkg --compare-versions "$2" eq "1.8.0-1" \
 
88
       || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
 
89
        # Is the key bad?
 
90
        if ! certtool --password='' \
 
91
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
 
92
             --outfile=/dev/null --pubkey-info --no-text \
 
93
             2>/dev/null; then
 
94
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
 
95
                  2>/dev/null || :
 
96
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
 
97
        fi
 
98
    fi
 
99
 
64
100
    # If the TLS keys already exists, do nothing
65
101
    if [ -r /etc/keys/mandos/tls-privkey.pem \
66
102
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
67
103
        return 0
68
104
    fi
69
105
 
70
 
    # If this is an upgrade from an old installation, the TLS keys
71
 
    # will not exist; create them.
72
 
 
73
 
    # First try certtool from GnuTLS
74
 
    if ! certtool --generate-privkey --password='' \
75
 
         --outfile /etc/keys/mandos/tls-privkey.pem \
76
 
         --sec-param ultra --key-type=ed25519 --pkcs8 --no-text \
77
 
         2>/dev/null; then
78
 
        # Otherwise try OpenSSL
79
 
        if ! openssl genpkey -algorithm X25519 \
80
 
             -out /etc/keys/mandos/tls-privkey.pem; then
81
 
            rm --force /etc/keys/mandos/tls-privkey.pem
82
 
            # None of the commands succeded; give up
83
 
            return 1
84
 
        fi
85
 
    fi
86
 
 
87
 
    local umask=$(umask)
88
 
    umask 077
89
 
    # First try certtool from GnuTLS
90
 
    if ! certtool --password='' \
91
 
         --load-privkey=/etc/keys/mandos/tls-privkey.pem \
92
 
         --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
93
 
         --no-text 2>/dev/null; then
94
 
        # Otherwise try OpenSSL
95
 
        if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
96
 
             -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
97
 
            rm --force /etc/keys/mandos/tls-pubkey.pem
98
 
            # None of the commands succeded; give up
99
 
            umask $umask
100
 
            return 1
101
 
        fi
102
 
    fi
103
 
    umask $umask
 
106
    # Try to create the TLS keys
 
107
 
 
108
    TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
 
109
 
 
110
    if certtool --generate-privkey --password='' \
 
111
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
 
112
                --key-type=ed25519 --pkcs8 --no-text 2>/dev/null; then
 
113
 
 
114
        local umask=$(umask)
 
115
        umask 077
 
116
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
 
117
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
 
118
 
 
119
        # First try certtool from GnuTLS
 
120
        if ! certtool --password='' \
 
121
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
 
122
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
 
123
             --no-text 2>/dev/null; then
 
124
            # Otherwise try OpenSSL
 
125
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
 
126
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
 
127
                rm --force /etc/keys/mandos/tls-pubkey.pem
 
128
                # None of the commands succeded; give up
 
129
                umask $umask
 
130
                return 1
 
131
            fi
 
132
        fi
 
133
        umask $umask
 
134
 
 
135
        key_id=$(mandos-keygen --passfile=/dev/null \
 
136
                     | grep --regexp="^key_id[ =]")
 
137
 
 
138
        db_version 2.0
 
139
        db_fset mandos-client/key_id seen false
 
140
        db_reset mandos-client/key_id
 
141
        db_subst mandos-client/key_id key_id $key_id
 
142
        db_input critical mandos-client/key_id || true
 
143
        db_go
 
144
        db_stop
 
145
    else
 
146
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
 
147
    fi
104
148
}
105
149
 
106
150
create_dh_params(){