Merge pull request #101 from hellekin/swap

Better support for multiple swap partitions, avoids warning if swap is encrypted.
This commit is contained in:
Jaromil 2014-01-12 14:35:17 -08:00
commit f9805731f1

78
tomb
View File

@ -136,13 +136,65 @@ safe_filename() {
check_swap() { check_swap() {
# Return 0 if NO swap is used, 1 if swap is used # Return 0 if NO swap is used, 1 if swap is used
# Return 2 if swap(s) is(are) used, but ALL encrypted # Return 2 if swap(s) is(are) used, but ALL encrypted
local swaps=$(awk '/partition/ { print $1 }' /proc/swaps 2>/dev/null) local swaps="$(awk '/^\// { print $1 }' /proc/swaps 2>/dev/null)"
[[ -z "$swaps" ]] && return 0 # No swap partition is active [[ -z "$swaps" ]] && return 0 # No swap partition is active
# Check whether all swaps are encrypted, and return 2
# If any of the swaps is not encrypted, we bail out and return 1.
ret=1
for s in $=swaps; do
bone=`sudo file $s`
if `echo "$bone" | grep 'swap file' &>/dev/null`; then
# It's a regular (unencrypted) swap file
ret=1
break
elif `echo "$bone" | grep 'symbolic link' &>/dev/null`; then
# Might link to a block
ret=1
if [ "/dev/mapper" = "${s%/*}" ]; then
is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'`
if [ "crypt" = "$is_crypt" ]; then
ret=2
fi
else
break
fi
elif `echo "$bone" | grep 'block special' &>/dev/null`; then
# Is a block
ret=1
is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'`
if [ "crypt" = "$is_crypt" ]; then
ret=2
else
break
fi
fi
done
no "An active swap partition is detected, this poses security risks." no "An active swap partition is detected, this poses security risks."
no "You can deactivate all swap partitions using the command:" if [[ $ret -eq 2 ]]; then
no " swapoff -a" yes "All your swaps are belong to crypt. Good."
no "But if you want to proceed like this, use the -f (force) flag." else
die "Operation aborted." no "You can deactivate all swap partitions using the command:"
no " swapoff -a"
no "But if you want to proceed like this, use the -f (force) flag."
die "Operation aborted."
fi
return $ret
}
# Wrapper to allow encrypted swap and remind the user about
# possible data leaks to disk if swap is on, and not to be ignored
_check_swap() {
if ! option_is_set -f && ! option_is_set --ignore-swap; then
check_swap
case $? in
0|2) # No, or encrypted swap
return 0
;;
*) # Unencrypted swap
return 1
;;
esac
fi
} }
# Ask user for a password # Ask user for a password
@ -583,7 +635,7 @@ ask_key_password() {
# change tomb key password # change tomb key password
change_passwd() { change_passwd() {
_message "Commanded to change password for tomb key $1" _message "Commanded to change password for tomb key $1"
if ! option_is_set -f && ! option_is_set --ignore-swap; then check_swap; fi _check_swap
local keyfile="$1" # $1 is the tomb key path local keyfile="$1" # $1 is the tomb key path
@ -955,6 +1007,8 @@ engrave_key() {
forge_key() { forge_key() {
xxx "forge_key()" xxx "forge_key()"
_check_swap
# can be specified both as simple argument or using -k # can be specified both as simple argument or using -k
local destkey="$1" local destkey="$1"
{ option_is_set -k } && { destkey="`option_value -k`" } { option_is_set -k } && { destkey="`option_value -k`" }
@ -967,9 +1021,6 @@ forge_key() {
_warning "Forging this key would overwrite an existing file. Operation aborted." _warning "Forging this key would overwrite an existing file. Operation aborted."
die "`ls -lh $destkey`" } die "`ls -lh $destkey`" }
# if swap is on, we remind the user about possible data leaks to disk
if ! option_is_set -f && ! option_is_set --ignore-swap; then check_swap; fi
# create the keyfile in tmpfs so that we leave less traces in RAM # create the keyfile in tmpfs so that we leave less traces in RAM
local keytmp=`safe_dir forge` local keytmp=`safe_dir forge`
(( $? )) && die "error creating temp dir" (( $? )) && die "error creating temp dir"
@ -1048,9 +1099,7 @@ forge_key() {
# taken from /dev/urandom which improves the tomb's overall security # taken from /dev/urandom which improves the tomb's overall security
dig_tomb() { dig_tomb() {
_message "Commanded to dig tomb $1" _message "Commanded to dig tomb $1"
_check_swap
# if swap is on, we remind the user about possible data leaks to disk
if ! option_is_set -f && ! option_is_set --ignore-swap; then check_swap; fi
if ! [ $1 ]; then if ! [ $1 ]; then
_warning "no tomb name specified for creation" _warning "no tomb name specified for creation"
@ -1215,7 +1264,7 @@ lock_tomb_with_key() {
# This function changes the key that locks a tomb # This function changes the key that locks a tomb
change_tomb_key() { change_tomb_key() {
if ! option_is_set -f && ! option_is_set --ignore-swap; then check_swap; fi _check_swap
{ option_is_set -k } || { die "Specify the new key with -k" } { option_is_set -k } || { die "Specify the new key with -k" }
newkey="`option_value -k`" newkey="`option_value -k`"
@ -1336,8 +1385,7 @@ create_tomb() {
# $1 = tombfile $2(optional) = mountpoint # $1 = tombfile $2(optional) = mountpoint
mount_tomb() { mount_tomb() {
_message "Commanded to open tomb $1" _message "Commanded to open tomb $1"
_check_swap
if ! option_is_set -f && ! option_is_set --ignore-swap; then check_swap; fi
if ! [ ${1} ]; then if ! [ ${1} ]; then
_warning "no tomb name specified for creation" _warning "no tomb name specified for creation"