/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
50
72
    fi
51
73
}
52
74
 
53
 
# Create client key pair
54
 
create_key(){
55
 
    if [ -r /etc/keys/mandos/pubkey.txt \
56
 
        -a -r /etc/keys/mandos/seckey.txt ]; then
57
 
        return 0
58
 
    fi
59
 
    mandos-keygen
 
75
# Create client key pairs
 
76
create_keys(){
 
77
    # If the OpenPGP key files do not exist, generate all keys using
 
78
    # mandos-keygen
 
79
    if ! [ -r /etc/keys/mandos/pubkey.txt \
 
80
              -a -r /etc/keys/mandos/seckey.txt ]; then
 
81
        mandos-keygen
 
82
        gpg-connect-agent KILLAGENT /bye || :
 
83
        return 0
 
84
    fi
 
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
 
 
100
    # If the TLS keys already exists, do nothing
 
101
    if [ -r /etc/keys/mandos/tls-privkey.pem \
 
102
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
 
103
        return 0
 
104
    fi
 
105
 
 
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
60
148
}
61
149
 
62
150
create_dh_params(){
87
175
case "$1" in
88
176
    configure)
89
177
        add_mandos_user "$@"
90
 
        create_key "$@"
 
178
        create_keys "$@"
91
179
        create_dh_params "$@" || :
92
180
        update_initramfs "$@"
 
181
        if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
 
182
            PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
 
183
            if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
 
184
                 >/dev/null 2>&1; then
 
185
                chmod u=rwx,go= -- "$PLUGINHELPERDIR"
 
186
            fi
 
187
            if ! dpkg-statoverride --list /etc/mandos/plugin-helpers \
 
188
                 >/dev/null 2>&1; then
 
189
                chmod u=rwx,go= -- /etc/mandos/plugin-helpers
 
190
            fi
 
191
        fi
93
192
        ;;
94
193
    abort-upgrade|abort-deconfigure|abort-remove)
95
194
        ;;