/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-to-cryptroot-unlock

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:
1
 
#!/bin/sh
2
 
3
 
# Script to get password from plugin-runner to cryptroot-unlock
4
 
5
 
# Copyright © 2018 Teddy Hogeborn
6
 
# Copyright © 2018 Björn Påhlsson
7
 
8
 
# This file is part of Mandos.
9
 
10
 
# Mandos is free software: you can redistribute it and/or modify it
11
 
# under the terms of the GNU General Public License as published by
12
 
# the Free Software Foundation, either version 3 of the License, or
13
 
# (at your option) any later version.
14
 
15
 
#     Mandos is distributed in the hope that it will be useful, but
16
 
#     WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
#     GNU General Public License for more details.
19
 
20
 
# You should have received a copy of the GNU General Public License
21
 
# along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
 
# Contact the authors at <mandos@recompile.se>.
24
 
 
25
 
# This script is made to run in the initramfs, and must not be run in
26
 
# the normal system environment.
27
 
 
28
 
# Temporary file for the password
29
 
passfile=$(mktemp -p /run -t mandos.XXXXXX)
30
 
trap "rm -f -- $passfile 2>/dev/null" EXIT
31
 
 
32
 
# Disable the plugins which conflict with "askpass" as distributed by
33
 
# cryptsetup.
34
 
cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
35
 
 
36
 
        --disable=askpass-fifo
37
 
        --disable=password-prompt
38
 
        --disable=plymouth
39
 
EOF
40
 
 
41
 
# In case a password is retrieved by other means than by plugin-runner
42
 
# (such as typing it on the console into the prompt given by the
43
 
# "askpass" program), this dummy plugin will be made to exit
44
 
# successfully, thereby forcing plugin-runner to stop all its plugins
45
 
# and also exit itself.
46
 
cat <<-EOF > /lib/mandos/plugins.d/dummy
47
 
        #!/bin/sh
48
 
        
49
 
        while [ -e /run/mandos-keep-running ]; do
50
 
            sleep 1
51
 
        done
52
 
        
53
 
        # exit successfully to force plugin-runner to finish
54
 
        exit 0
55
 
EOF
56
 
chmod u=rwx,go=rx /lib/mandos/plugins.d/dummy
57
 
 
58
 
# This file is the flag which keeps the dummy plugin running
59
 
touch /run/mandos-keep-running
60
 
 
61
 
# Keep running plugin-runner and trying any password, until either a
62
 
# password is accepted by cryptroot-unlock, or plugin-runner fails, or
63
 
# the file /run/mandos-keep-running has been removed.
64
 
while command -v cryptroot-unlock >/dev/null 2>&1; do
65
 
    /lib/mandos/plugin-runner > "$passfile" &
66
 
    echo $! > /run/mandos-plugin-runner.pid
67
 
    wait %% || break
68
 
 
69
 
    # Try this password ten times (or ten seconds)
70
 
    for loop in 1 2 3 4 5 6 7 8 9 10; do
71
 
        if [ -e /run/mandos-keep-running ]; then
72
 
            cryptroot-unlock < "$passfile" >/dev/null 2>&1 && break 2
73
 
            sleep 1
74
 
        else
75
 
            break 2
76
 
        fi
77
 
    done
78
 
done
79
 
 
80
 
exec >/dev/null 2>&1
81
 
 
82
 
rm -f /run/mandos-plugin-runner.pid /run/mandos-keep-running