commit 58decda7fecbd02e7e9bf98d218239c88ffb2668
parent 28d81f10049dd3df3ceb1c4184edcde0ae64fb39
Author: Jaromil <jaromil@dyne.org>
Date: Tue, 17 Jan 2012 14:00:20 +0100
fixes to check_swap and new --force flag
Tenamed --ignore-swap flag to --force which is more generic and used
also by other commands. There are also some minor fixes to CMD
parsing. All changes are documented in manual and help.
Diffstat:
M | doc/tomb.1 | | | 25 | +++++++++++++------------ |
M | src/tomb | | | 87 | ++++++++++++++++++++++++++++++++----------------------------------------------- |
2 files changed, 48 insertions(+), 64 deletions(-)
diff --git a/doc/tomb.1 b/doc/tomb.1
@@ -188,22 +188,23 @@ executes desktop applications as processes owned by the user.
.SH SWAP
-During "create" and "open" operation, swap will complain and \fIabort\fR if
-your system has swap activated. This can be annoying, and you can disable this
-behaviour using \fI--ignore-swap\fR. Before doing that, however, you may be
-interested in knowing the risks of doing so:
+During "create", "open" and "passwd" operations, swap will complain
+and \fIabort if your system has swap activated\fR. You can disable
+this behaviour using the \fI--force\fR. Before doing that, however,
+you may be interested in knowing the risks of doing so:
.IP \(bu
-During both creation and opening it could write your secret key on the disk
+During such operations a lack of available memory could cause the swap
+to write your secret key on the disk.
.IP \(bu
-After having opened the tomb, an application you're using could swap file
-contents. So you'll put file contents in clear on your disk
+Even while using an opened tomb, another application could occupy too
+much memory so that the swap needs to be used, this way it is possible
+that some contents of files contained into the tomb are physically
+written on your disk, not encrypted.
.P
-If you don't need swap, execute \fI swapoff -a\fR. If you really need it, you
-could encrypt it. Tomb doesn't detect if your swap is encrypted, and will
-complain anyway. In that case, using --ignore-swap is safe. Otherwise, use
---ignore-swap at your own risk
-
+If you don't need swap, execute \fI swapoff -a\fR. If you really need
+it, you could make an encrypted swap it. Tomb doesn't detect if your
+swap is encrypted, and will complain anyway.
.SH BUGS
diff --git a/src/tomb b/src/tomb
@@ -206,21 +206,13 @@ check_swap() {
# Return 2 if swap(s) is(are) used, but ALL encrypted
local swaps=$(awk '/partition/ { print $1 }' /proc/swaps 2>/dev/null)
[[ -z "$swaps" ]] && return 0 # No swap partition is active
-
- local -i count
- xxx "check_swap $swaps"
- for dev in ${=swaps}
- do
- xxx "check_swap testing device $dev (count = $count)"
- sudo cryptsetup status ${dev} | grep 'active' &>/dev/null && count+=1
- done
- xxx "$count encrypted swap(s) [${(%w)#swaps} total]"
- (( ${count} == ${(%w)#swaps} )) && return 2 # All swap partitions are encrypted
- xxx "check_swap detected some unencrypted swap"
- (( ${#{=swaps}} )) && return 1 # Some unencrypted swap partition(s)
- xxx "check_swap should never reach here"
- return 0 # No swap partition is active
+ no "An active swap partition is detected, this poses security risks."
+ no "You can deactivate all swap partitions using the command:"
+ no " swapoff -a"
+ no "But if you want to proceed like this, use the --force flag."
+ die "Operation aborted."
}
+
# }}}
# {{{ - Ask user for a password
# we use pinentry now
@@ -320,6 +312,7 @@ Options:
-k path to the key to use for opening a tomb
-n don't process the hooks found in tomb
-o mount options used to open (default: rw,noatime,nodev)
+ -f force operation (i.e. even if swap is active)
-h print this help
-v version information for this tool
@@ -568,14 +561,9 @@ exec_safe_post_hooks() {
# {{{ - Create
create_tomb() {
- if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then
- _warning "You have swap activated; use --ignore-swap if you want to skip this check"
- _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk."
- _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check"
- _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:"
- tail -n +2 /proc/swaps
- exit 1
- fi
+ _message "Commanded to create tomb $CMD2"
+ if ! option_is_set --force; then check_swap; fi
+
if ! [ ${CMD2} ]; then
_warning "no tomb name specified for creation"
return 1
@@ -588,10 +576,9 @@ create_tomb() {
tombfile=${tombname}.tomb
tombsize=$opts[-s]
- if [[ $tombsize != <-> ]]; then
- _warning "Size is not an integer"
- return 1
- fi
+ [ $tombsize ] || die "Size argument missing, use --size"
+
+ [[ $tombsize != <-> ]] && die "Size argument is not an integer"
if [ -e ${tombdir}/${tombfile} ]; then
_warning "tomb exists already. I'm not digging here:"
@@ -749,14 +736,8 @@ create_tomb() {
mount_tomb() {
_message "Commanded to open tomb $CMD2"
- if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then
- _warning "You have swap activated; use --ignore-swap if you want to skip this check"
- _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk."
- _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check"
- _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:"
- tail -n +2 /proc/swaps
- die "I'm stopping now."
- fi
+ if ! option_is_set --force; then check_swap; fi
+
if ! [ ${CMD2} ]; then
_warning "no tomb name specified for creation"
return 1
@@ -1058,15 +1039,10 @@ umount_tomb() {
# change tomb key password
change_passwd() {
- if ! option_is_set --ignore-swap && [[ `check_swap out` == 1 ]]; then
- _warning "You have swap activated; use --ignore-swap if you want to skip this check"
- _message "Using encryption with swap activated is very bad, because some files, or even your secret key, could be written on hard disk."
- _message "However, it could be that your swap is encrypted. If this is case, this is ok. Then, use --ignore-swap to skip this check"
- _message "You seem to be using `tail -n +2 /proc/swaps|wc -l` swaps:"
- tail -n +2 /proc/swaps
- return 1
- fi
- local keyfile="${1}"
+ _message "Commanded to change password for tomb key $CMD2"
+ if ! option_is_set --force; then check_swap; fi
+
+ local keyfile="$CMD2"
# check the keyfile
if ! [ -r $keyfile ]; then
@@ -1164,7 +1140,7 @@ change_passwd() {
# {{{ - List
# list all tombs mounted in a readable format
list_tombs() {
- if [ $1 ]; then
+ if [ $CMD2 ]; then
# list a specific tomb
mounted_tombs=`mount -l |
awk -vtomb="[$1]" '/^\/dev\/mapper\/tomb/ { if($7==tomb) print $1 ";" $3 ";" $5 ";" $6 ";" $7 }'`
@@ -1181,7 +1157,7 @@ list_tombs() {
if ! [ $mounted_tombs ]; then
if [ $1 ]; then
- die "There seems to be no open tomb engraved as [${1}]"
+ die "There seems to be no open tomb engraved as [$CMD2]"
else
die "I can't see any open tomb, may they all rest in peace."
fi
@@ -1420,22 +1396,29 @@ option_value() {
main() {
local -A subcommands_opts
### Options configuration
- #Hi, dear developer! Are you trying to add a new subcommand, or to add some options?
- #Well, keep in mind that:
- # 1. An option CAN'T have differente meanings/behaviour in different subcommands.
+
+ # Hi, dear developer! Are you trying to add a new subcommand, or
+ # to add some options? Well, keep in mind that an option CAN'T
+ # have differente meanings/behaviour in different subcommands.
+
# For example, "-s" means "size" and accept an argument. If you are tempted to add
# an option "-s" (that means, for example "silent", and doesn't accept an argument)
# DON'T DO IT!
+
# There are two reasons for that:
- # I. usability; user expect that "-s" is "size
+ # I. usability; user expect that "-s" is "size"
# II. Option parsing WILL EXPLODE if you do this kind of bad things
# (it will say "option defined more than once, and he's right")
+ #
+ # If you want to use the same option in multiple commands then
+ # you can only use the non-abbreviated long-option version like:
+ # -force and NOT -f
main_opts=(q -quiet=q D -debug=D h -help=h v -version=v -no-color)
subcommands_opts[__default]=""
- subcommands_opts[open]="n -nohook=n k: -key=k o: -mount-options=o -ignore-swap"
+ subcommands_opts[open]="n -nohook=n k: -key=k o: -mount-options=o -force"
subcommands_opts[mount]=${subcommands_opts[open]}
- subcommands_opts[create]="s: -size=s -ignore-swap k: -key=k"
- subcommands_opts[passwd]="-ignore-swap"
+ subcommands_opts[create]="s: -size=s -force k: -key=k"
+ subcommands_opts[passwd]="-force"
subcommands_opts[close]=""
subcommands_opts[help]=""
subcommands_opts[slam]=""