tomb

the crypto undertaker
git clone git://parazyd.org/tomb.git
Log | Files | Refs | README | LICENSE

commit 15ff5abe617f7ebcccf2ba05d95a4b487a790efb
parent 46583fa4450e1ef1284c10c2aad25631f217d2a8
Author: Jaromil <jaromil@dyne.org>
Date:   Sun,  8 Feb 2015 17:33:10 +0000

Sudo prompt for password made more visible to distinguish from other password prompts, addressing #171

Diffstat:
Mtomb | 86++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 48 insertions(+), 38 deletions(-)

diff --git a/tomb b/tomb @@ -59,10 +59,9 @@ typeset -a OLDARGS for arg in "${(@)argv}"; do OLDARGS+=("$arg"); done # Special command requirements -typeset -a DD WIPE MKFS PINENTRY +typeset -a DD WIPE PINENTRY DD=(dd) WIPE=(rm -f) -MKFS=(sudo mkfs.ext3 -q -F -j -L) PINENTRY=(pinentry) # load zsh regex module @@ -120,6 +119,17 @@ export TEXTDOMAIN=tomb # {{{ Safety functions +# Wrap sudo with a more visible message +_sudo() { + local sudo_eng="[sudo] Enter password for user ::1 user:: to gain superuser privileges" + local msg="$(gettext -s "$sudo_eng")" + msg=${(S)msg//::1*::/$USER} + sudo -p " +$msg + +" ${@} +} + # Cleanup anything sensitive before exiting. _endgame() { @@ -147,7 +157,7 @@ _endgame() { # Detach loop devices for l in $TOMBLOOPDEVS; do - sudo losetup -d "$l" + _sudo losetup -d "$l" done unset TOMBLOOPDEVS @@ -249,7 +259,7 @@ _plot() { _tmp_create() { [[ -d "$TMPPREFIX" ]] || { # we create the tempdir with the sticky bit on - sudo mkdir -m 1777 "$TMPPREFIX" + _sudo mkdir -m 1777 "$TMPPREFIX" [[ $? == 0 ]] || _failure "Fatal error creating the temporary directory: ::1 temp dir::" "$TMPPREFIX" } @@ -293,7 +303,7 @@ _ensure_safe_swap() { [[ -z "$swaps" ]] && return 0 # No swap partition is active for s in $=swaps; do - bone=$(sudo file $s) + bone=$(_sudo file $s) if [[ "$bone" =~ "swap file" ]]; then # It's a regular (unencrypted) swap file r=1 @@ -303,13 +313,13 @@ _ensure_safe_swap() { # Might link to a block r=1 [[ "/dev/mapper" == "${s%/*}" ]] || { break } - is_crypt=$(sudo dmsetup status "$s" | awk '/crypt/ {print $3}') + is_crypt=$(_sudo dmsetup status "$s" | awk '/crypt/ {print $3}') [[ $is_crypt == "crypt" ]] && { r=2 } elif [[ "$bone" =~ "block special" ]]; then # It's a block r=1 - is_crypt=`sudo dmsetup status "$s" | awk '/crypt/ {print $3}'` + is_crypt=`_sudo dmsetup status "$s" | awk '/crypt/ {print $3}'` [[ $is_crypt == "crypt" ]] && { r=2 } || { break } fi @@ -536,7 +546,7 @@ lo_mount() { tpath="$1" # check if we have support for loop mounting - _nstloop=`sudo losetup -f` + _nstloop=`_sudo losetup -f` [[ $? = 0 ]] || { _warning "Loop mount of volumes is not possible on this machine, this error" _warning "often occurs on VPS and kernels that don't provide the loop module." @@ -544,7 +554,7 @@ lo_mount() { _failure "Operation aborted." } - sudo losetup -f "$tpath" # allocates the next loopback for our file + _sudo losetup -f "$tpath" # allocates the next loopback for our file TOMBLOOPDEVS+=("$_nstloop") # add to array of lodevs used @@ -1040,7 +1050,7 @@ ask_key_password() { # call cryptsetup with arguments using the currently known secret # echo flags eliminate newline and disable escape (BSD_ECHO) _cryptsetup() { - print -R -n - "$TOMBSECRET" | sudo cryptsetup --key-file - ${=@} + print -R -n - "$TOMBSECRET" | _sudo cryptsetup --key-file - ${=@} return $? } @@ -1498,7 +1508,7 @@ forge_key() { _warning "Dumping contents to screen:" print "${mapfile[$TOMBKEY]}" _warning "--" - sudo umount ${keytmp} + _sudo umount ${keytmp} rm -r $keytmp _failure "Operation aborted." } @@ -1544,7 +1554,7 @@ lock_tomb_with_key() { _verbose "Loop mounted on ::1 mount point::" $nstloop _message "Checking if the tomb is empty (we never step on somebody else's bones)." - sudo cryptsetup isLuks ${nstloop} + _sudo cryptsetup isLuks ${nstloop} if [ $? = 0 ]; then # is it a LUKS encrypted nest? then bail out and avoid reformatting it _warning "The tomb was already locked with another key." @@ -1586,14 +1596,14 @@ lock_tomb_with_key() { _failure "Operation aborted." } _message "Formatting your Tomb with Ext3/Ext4 filesystem." - ${=MKFS} $TOMBNAME /dev/mapper/tomb.tmp + _sudo mkfs.ext4 -q -F -j -L $TOMBNAME /dev/mapper/tomb.tmp [[ $? == 0 ]] || { _warning "Tomb format returned an error." _warning "Your tomb ::1 tomb file:: may be corrupted." $TOMBFILE } # Sync - sudo cryptsetup luksClose tomb.tmp + _sudo cryptsetup luksClose tomb.tmp _message "Done locking ::1 tomb name:: using Luks dm-crypt ::2 cipher::" $TOMBNAME $cipher _success "Your tomb is ready in ::1 tomb path:: and secured with key ::2 tomb key::" \ @@ -1619,7 +1629,7 @@ change_tomb_key() { lo_mount $TOMBPATH nstloop=`lo_new` - sudo cryptsetup isLuks ${nstloop} + _sudo cryptsetup isLuks ${nstloop} # is it a LUKS encrypted nest? we check one more time [[ $? == 0 ]] || { _failure "Not a valid LUKS encrypted volume: ::1 volume::" $TOMBPATH } @@ -1651,7 +1661,7 @@ change_tomb_key() { old_secret=$TOMBSECRET # luksOpen the tomb (not really mounting, just on the loopback) - print -R -n - "$old_secret" | sudo cryptsetup --key-file - \ + print -R -n - "$old_secret" | _sudo cryptsetup --key-file - \ luksOpen ${nstloop} ${mapper} [[ $? == 0 ]] || _failure "Unexpected error in luksOpen." @@ -1673,12 +1683,12 @@ change_tomb_key() { tmpnewkey=$TOMBTMP print -R -n - "$TOMBSECRET" >> $tmpnewkey - print -R -n - "$old_secret" | sudo cryptsetup --key-file - \ + print -R -n - "$old_secret" | _sudo cryptsetup --key-file - \ luksChangeKey "$nstloop" "$tmpnewkey" [[ $? == 0 ]] || _failure "Unexpected error in luksChangeKey." - sudo cryptsetup luksClose "${mapper}" || _failure "Unexpected error in luksClose." + _sudo cryptsetup luksClose "${mapper}" || _failure "Unexpected error in luksClose." _success "Succesfully changed key for tomb: ::1 tomb file::" $TOMBFILE _message "The new key is: ::1 new key::" $TOMBKEYFILE @@ -1717,13 +1727,13 @@ mount_tomb() { lo_mount $TOMBPATH nstloop=`lo_new` - sudo cryptsetup isLuks ${nstloop} || { + _sudo cryptsetup isLuks ${nstloop} || { # is it a LUKS encrypted nest? see cryptsetup(1) _failure "::1 tomb file:: is not a valid Luks encrypted storage file." $TOMBFILE } _message "This tomb is a valid LUKS encrypted device." - luksdump="`sudo cryptsetup luksDump ${nstloop}`" + luksdump="`_sudo cryptsetup luksDump ${nstloop}`" tombdump=(`print $luksdump | awk ' /^Cipher name/ {print $3} /^Cipher mode/ {print $3} @@ -1765,7 +1775,7 @@ mount_tomb() { lo_preserve "$nstloop" # array: [ cipher, keysize, loopdevice ] - tombstat=(`sudo cryptsetup status ${mapper} | awk ' + tombstat=(`_sudo cryptsetup status ${mapper} | awk ' /cipher:/ {print $2} /keysize:/ {print $2} /device:/ {print $2}'`) @@ -1773,12 +1783,12 @@ mount_tomb() { _verbose "Key size is ::1 size:: for cipher ::2 cipher::" $tombstat[2] $tombstat[1] _message "Checking filesystem via ::1::" $tombstat[3] - sudo fsck -p -C0 /dev/mapper/${mapper} + _sudo fsck -p -C0 /dev/mapper/${mapper} _verbose "Tomb engraved as ::1 tomb name::" $TOMBNAME - sudo tune2fs -L $TOMBNAME /dev/mapper/${mapper} > /dev/null + _sudo tune2fs -L $TOMBNAME /dev/mapper/${mapper} > /dev/null # we need root from here on - sudo mkdir -p $tombmount + _sudo mkdir -p $tombmount # Default mount options are overridden with the -o switch { option_is_set -o } && { @@ -1787,7 +1797,7 @@ mount_tomb() { # TODO: safety check MOUNTOPTS # safe_mount_options && \ - sudo mount -o $MOUNTOPTS /dev/mapper/${mapper} ${tombmount} + _sudo mount -o $MOUNTOPTS /dev/mapper/${mapper} ${tombmount} # Clean up if the mount failed [[ $? == 0 ]] || { _warning "Error mounting ::1 mapper:: on ::2 tombmount::" $mapper $tombmount @@ -1795,13 +1805,13 @@ mount_tomb() { _warning "Are mount options '::1 mount options::' valid?" $MOUNTOPTS # TODO: move cleanup to _endgame() [[ -d $tombmount ]] && rmdir $tombmount - [[ -e /dev/mapper/$mapper ]] && sudo cryptsetup luksClose $mapper + [[ -e /dev/mapper/$mapper ]] && _sudo cryptsetup luksClose $mapper # The loop is taken care of in _endgame() _failure "Cannot mount ::1 tomb name::" $TOMBNAME } - sudo chown $UID:$GID ${tombmount} - sudo chmod 0711 ${tombmount} + _sudo chown $UID:$GID ${tombmount} + _sudo chmod 0711 ${tombmount} _success "Success opening ::1 tomb file:: on ::2 mount point::" $TOMBFILE $tombmount @@ -1900,7 +1910,7 @@ exec_safe_bind_hooks() { [[ "${${maps[$dir]}[1]}" == "/" || "${${maps[$dir]}[1,2]}" == ".." ]] && { _warning "bind-hooks map format: local/to/tomb local/to/\$HOME. Rolling back" - for dir in ${mounted}; do sudo umount $dir; done + for dir in ${mounted}; do _sudo umount $dir; done return 1 } if [[ ! -r "$HOME/${maps[$dir]}" ]]; then @@ -1908,7 +1918,7 @@ exec_safe_bind_hooks() { elif [[ ! -r "$mnt/$dir" ]]; then _warning "bind-hook source not found in tomb, skipping ::1 mount point::/::2 subdir::" $mnt $dir else - sudo mount -o bind,$MOUNTOPTS $mnt/$dir $HOME/${maps[$dir]} \ + _sudo mount -o bind,$MOUNTOPTS $mnt/$dir $HOME/${maps[$dir]} \ && mounted+=("$HOME/${maps[$dir]}") fi done @@ -2318,17 +2328,17 @@ resize_tomb() { _cryptsetup luksOpen ${nstloop} ${mapper} || { _failure "Failure mounting the encrypted file." } - sudo cryptsetup resize "${mapper}" || { + _sudo cryptsetup resize "${mapper}" || { _failure "cryptsetup failed to resize ::1 mapper::" $mapper } - sudo e2fsck -p -f /dev/mapper/${mapper} || { + _sudo e2fsck -p -f /dev/mapper/${mapper} || { _failure "e2fsck failed to check ::1 mapper::" $mapper } - sudo resize2fs /dev/mapper/${mapper} || { + _sudo resize2fs /dev/mapper/${mapper} || { _failure "resize2fs failed to resize ::1 mapper::" $mapper } # close and free the loop device - sudo cryptsetup luksClose "${mapper}" + _sudo cryptsetup luksClose "${mapper}" return 0 } @@ -2389,7 +2399,7 @@ umount_tomb() { bind_mapper="${b[(ws:;:)1]}" bind_mount="${b[(ws:;:)2]}" _message "Closing tomb bind hook: ::1 hook::" $bind_mount - sudo umount $bind_mount || { + _sudo umount $bind_mount || { [[ -n $SLAM ]] && { _success "Slamming tomb: killing all processes using this hook." slam_tomb "$bind_mount" || _failure "Cannot slam the bind hook ::1 hook::" $bind_mount @@ -2405,19 +2415,19 @@ umount_tomb() { exec_safe_post_hooks ${tombmount%%/} close } _verbose "Performing umount of ::1 mount point::" $tombmount - sudo umount ${tombmount} + _sudo umount ${tombmount} [[ $? = 0 ]] || { _failure "Tomb is busy, cannot umount!" } # If we used a default mountpoint and is now empty, delete it [[ "$tombmount" -regex-match "[/run]?/media[/$_USER]?/$tombname.tomb" ]] && { rmdir $tombmount } - sudo cryptsetup luksClose $mapper + _sudo cryptsetup luksClose $mapper [[ $? == 0 ]] || { _failure "Error occurred in cryptsetup luksClose ::1 mapper::" $mapper } # Normally the loopback device is detached when unused - [[ -e "/dev/$tombloop" ]] && sudo losetup -d "/dev/$tombloop" + [[ -e "/dev/$tombloop" ]] && _sudo losetup -d "/dev/$tombloop" [[ $? = 0 ]] || { _verbose "/dev/$tombloop was already closed." }