tv0.2 release - gtomb - tomb gtk frontend in zenity HTML git clone git://parazyd.org/gtomb.git DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit afc3769668466d11b8187dc0617f8a93dcef33c9 DIR parent da9e80b6bc9d2025991625e354f703035779ed06 HTML Author: parazyd <parazyd@gmx.com> Date: Mon, 30 Nov 2015 14:46:46 +0100 v0.2 release Diffstat: M README.md | 8 ++------ M gtomb | 633 +++++++++++++++++++++++-------- M screenshot.png | 0 3 files changed, 470 insertions(+), 171 deletions(-) --- DIR diff --git a/README.md b/README.md t@@ -16,13 +16,9 @@ list and the script will run it for you. Easy-peasy. * zenity ## TODO -* Clean function, to clear keys and passphrases from memory -* Standalone dig function -* Standalone forge function -* Standalone lock function -* Fix tomb list +* Error checking! * Fix engrave function * and more stuff ## What you need to do -* Be patient +* Be patient or help with coding :) DIR diff --git a/gtomb b/gtomb t@@ -1,7 +1,7 @@ #!/usr/bin/env zsh # # gtomb - a GUI wrapper for Tomb -# parazyd <parazyd AT dyne DOT org> +# Maintained and written by parazyd <parazyd AT dyne DOT org> # https://github.com/parazyd/gtomb # https://github.com/dyne/Tomb # t@@ -9,9 +9,13 @@ # intended and should be used with caution. # -TOMBPATH=/usr/local/bin/tomb # Set this to your tomb executable's path +TOMBPATH="/usr/local/bin/tomb" # Set this to your tomb executable's path -# {{{ some pinentry code shamelessly stolen from tomb +function _ { + _clean +} + +# {{{ Some pinentry code shamelessly stolen from tomb # Ask user for a password # Wraps around the pinentry command, from the GnuPG project, as it # provides better security and conveniently use the right toolkit. t@@ -172,14 +176,35 @@ function _failure die() { } # }}} -# {{{ Main window -function main { +# {{{ _clean - Clean function, removes sensitive stuff from memory +function _clean { + local rr="$RANDOM" + while [[ ${#rr} -lt 500 ]]; do + rr+="$RANDOM" + done + + command="$rr"; unset command + tombname="$rr"; unset tombname + tombsize="$rr"; unset tombsize + keyfile="$rr"; unset keyfile + sudoassword="$rr"; unset sudoassword + rm -f $tombtmp # See for srm/wipe/etc. + tombtmp="$rr"; unset tombtmp + newkey="$rr"; unset newkey + jpegfile="$rr"; unset jpegfile +} +# }}} + +# {{{ _main - Main window +function _main { + _clean command=`zenity \ - --window-icon=monmort.png \ - --title="gtomb wrapper for Tomb" \ - --width=640 --height=380 \ + --window-icon="monmort.png" \ + --title="gtomb" \ + --width=640 \ + --height=420 \ --list \ - --text="gtomb v0.1\nChoose stuff to do now!" \ + --text="gtomb v0.2\nThe GUI wrapper for Tomb, the crypto undertaker." \ --separator=" & " \ --column=Function \ --column=Description \ t@@ -194,298 +219,571 @@ function main { "resize" "Resize a tomb to a new size (can only grow)" \ "passwd" "Change the password of a key" \ "setkey" "Forge a new key and change the key of an existing tomb" \ - "engaave" "Generates a QR code of a key to be saved on paper" \ + "engrave" "Generates a QR code of a key to be saved on paper" \ "bury" "Hide a key inside a JPEG image" \ "exhume" "Extract a key from a JPEG image"` } # }}} -# {{{ All in one: Tomb creation, key forge and tomb lock. -function create { - filename=`zenity \ +# {{{ create - All in one: Tomb creation, key forge and tomb lock. +function _create { + tombname=`zenity \ --title="Choose where to dig your tomb" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection \ --filename="secret.tomb" \ --save` + case $? in 0) tombsize=`zenity \ --title="Tomb Creation" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --entry \ - --text="Tomb must be min. 10MB" \ + --text="A tomb must be min. 10MiB in size." \ --entry-text=10` + case $? in 0) - $TOMBPATH dig -s $tombsize $filename | \ + $TOMBPATH dig -s $tombsize $tombname | \ zenity \ --title="Digging tomb" \ - --window-icon=monmort.png \ - --text="Please wait while your tomb is dug." \ + --window-icon="monmort.png" \ + --text="Please wait while your tomb is being dug." \ --progress \ --auto-close \ --pulsate zenity \ --title="Done digging" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --info \ - --text="Your tomb is dug. Now we will forge a key." + --text="Your tomb has been dug. Now we will forge a key." - keyname=`zenity \ + keyfile=`zenity \ --title="Choose where to forge your key" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection \ --filename="secret.tomb.key" \ --save` - $TOMBPATH forge $keyname | \ + + case $? in + 0) + $TOMBPATH forge $keyfile | \ + zenity \ + --title="Forging key" \ + --window-icon="monmort.png" \ + --text="Please wait while your key is being forged.\n\ + You can move your mouse around and use your computer to speed up the process." \ + --progress \ + --auto-close \ + --pulsate + + zenity \ + --title="Done forging" \ + --window-icon="monmort.png" \ + --info \ + --text="Your key is now forged. Time to lock the tomb." + + # Ask for sudo password via pinentry and remove pass from memory afterwards. + sudoassword=$(ask_password "Insert sudo password for user $USER") + echo -e "$sudoassword\n" | sudo -S $TOMBPATH lock $filename -k $keyname | \ + zenity \ + --title="Locking tomb" \ + --window-icon="monmort.png" \ + --text="Please wait while your new tomb is being formatted." \ + --progress \ + --auto-close \ + --pulsate + + _clean # Clean sensitive stuff from memory + + zenity \ + --title="Succes" \ + --window-icon="monmort.png" \ + --info \ + --text="Tomb locked!" + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac + ;; + 1) + _main + eval "_$command" + ;; + esac + ;; + 1) + _main + eval "_$command" + ;; + esac +} +# }}} + +# {{{ dig - Dig a new tomb +function _dig { + tombname=`zenity \ + --title="Choose where to dig your tomb" \ + --window-icon="monmort.png" \ + --file-selection \ + --filename="secret.tomb" \ + --save` + + case $? in + 0) + tombsize=`zenity \ + --title="Tomb digging" \ + --window-icon="monmort.png" \ + --entry \ + --text="A tomb must be min. 10MiB in size" \ + --entry-text=10` + + case $? in + 0) + $TOMBPATH dig -s $tombsize $tombname | \ zenity \ - --title="Forging key" \ - --window-icon=monmort.png \ - --text="Please wait while your key is being forged." \ - --progress \ - --auto-close \ - --pulsate + --title="Digging new tomb" \ + --window-icon="monmort.png" \ + --text="Please wait while your tomb is being dug." \ + --progress \ + --auto-close \ + --pulsate + + _clean # Clean sensitive stuff from memory zenity \ - --title="Done forging" \ - --window-icon=monmort.png \ + --title="Done digging" \ + --window-icon="monmort.png" \ --info \ - --text="Your key is now forged. Time to lock the tomb." + --text="Your tomb has been dug." + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac + ;; + 1) + _main + eval "_$command" + ;; + esac +} +# }}} - # Ask for sudo password via pinentry and remove pass from memory afterwards. +# {{{ forge - Forge a new key +function _forge { + keyfile=`zenity \ + --title="Choose where to forge your key" \ + --window-icon="monmort.png" \ + --file-selection \ + --filename="secret.tomb.key" \ + --save` + + case $? in + 0) + $TOMBPATH forge $keyfile | \ + zenity \ + --title="Forging key" \ + --window-icon="monmort.png" \ + --text="Please wait while your key is being forged." \ + --progress \ + --auto-close \ + --pulsate + + _clean # Clean sensitive stuff from memory + + zenity \ + --title="Done forging" \ + --window-icon="monmort.png" \ + --info \ + --text="Your key is now forged." + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac +} +# }}} + +# {{{ lock - Lock a non-locked tomb +function _lock { + tombname=`zenity \ + --title="Select tomb to lock" \ + --window-icon="monmort.png" \ + --file-selection` + + case $? in + 0) + keyfile=`zenity \ + --title="Choose the key for your tomb" \ + --window-icon="monmort.png" \ + --file-selection` + + case $? in + 0) sudoassword=$(ask_password "Insert sudo password for user $USER") - echo -e "$sudoassword\n" | sudo -S $TOMBPATH lock $filename -k $keyname + echo -e "$sudoassword\n" | sudo -S $TOMBPATH lock $tombname -k $keyfile | \ + zenity \ + --title="Locking your tomb..." \ + --window-icon="monmort.png" \ + --text="Please wait while your tomb is being locked." \ + --progress \ + --auto-close \ + --pulsate + + _clean # Clean sensitive stuff from memory zenity \ - --title="Succes" \ + --title="Done locking" \ --window-icon=monmort.png \ --info \ - --text="Tomb locked!" + --text="Your tomb is now locked." - main - eval $command + _main + eval "_$command" ;; 1) - main - eval $command - ;; + _main + eval "_$command" + ;; esac ;; 1) - main - eval $command + _main + eval "_$command" ;; esac } # }}} -## ADD dig forge and lock - -# {{{ Open an existing tomb -function open { - tombfile=`zenity \ +# {{{ open - Open an existing tomb +function _open { + tombname=`zenity \ --title="Choose a tomb to open" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` + case $? in 0) keyfile=`zenity \ --title="Choose the key for your tomb" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` + case $? in 0) sudoassword=$(ask_password "Insert sudo password for user $USER") - echo -e "$sudoassword\n" | sudo -S $TOMBPATH open $tombfile -k $keyfile + echo -e "$sudoassword\n" | sudo -S $TOMBPATH open $tombname -k $keyfile + + _clean # Clean sensitive stuff from memory zenity \ --title="Success" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --info \ --text="Your tomb is now open." - main - eval $command;; + _main + eval "_$command";; 1) - main - eval $command;; + _main + eval "_$command";; esac ;; 1) - main - eval $command + _main + eval "_$command" ;; esac } # }}} -# {{{ FIX BUG HERE!!! -function list { - # Bugged, fix with help of close sed regex - tmpfile=/tmp/tombtmp - tomb list --get-mountpoint > $tmpfile - zenity --text-info --title="List of mounted tombs" \ - --width=600 \ - --height=480 \ - --filename=$tmpfile +# {{{ list - list all open tombs, along with their mountpoint +function _list { + tombtmp="/tmp/tombtmp" + $TOMBPATH list --get-mountpoint > $tombtmp + tombname=`cat $tombtmp | \ + sed 's/.*\/\([^\/]*\)$/\1\n &/' | \ + zenity \ + --title="Currently open tombs" \ + --window-icon="monmort.png" \ + --width=640 --height=380 --list \ + --separator=" & " \ + --text="Here are your open tombs" \ + --column=Tomb \ + --column=Path ` case $? in 0) - rm -f $tmpfile - main - eval $command + _clean + _main + eval "_$command" ;; 1) - rm -f $tmpfile - main - eval $command + _clean + _main + eval "_$command" ;; esac } # }}} -# {{{ Close open tomb(s) -function close { - tmpfile="/tmp/tombtmp" - $TOMBPATH list --get-mountpoint > $tmpfile - tombchoice=`cat $tmpfile | \ +# {{{ close - Close open tomb(s) +function _close { + tombtmp="/tmp/tombtmp" + $TOMBPATH list --get-mountpoint > $tombtmp + echo "/tombs/all" >> $tombtmp + tombname=`cat $tombtmp | \ sed 's/.*\/\([^\/]*\)$/\1\n &/' | \ zenity \ --title="Choose a tomb to close" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --width=640 --height=380 --list \ --separator=" & " \ --column=Tomb \ - --column=Path \` + --column=Path ` + + case $? in + 0) + # Ask for sudo password via pinentry and remove pass from memory afterwards. + sudoassword=$(ask_password "Insert sudo password for user $USER") + echo -e "$sudoassword\n" | sudo -S $TOMBPATH close $tombname + + _clean # Clean sensitive stuff from memory + + zenity \ + --title="Success" \ + --window-icon="monmort.png" \ + --info \ + --text="Closed successfully!" + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac } # }}} -# {{{ Slam open tombs -function slam { - zenity --question --title="Slammin'" \ - --text="Do you want to slam all tombs?" - case $? in - 0) - sudoassword=$(ask_password "Insert sudo password for user $USER") - echo -e "$sudoassword\n" | sudo -S tomb slam all - - zenity --info --title="Slammin'" \ - --text="All tombs slammed!" - - main - eval $command - ;; - 1) - $tombpath=`zenity --title="Choose a tomb to slam" \ - --file-selection --directory` - case $? in - 0) - tomb slam $tombpath - main - eval $command - ;; - 1) - main - eval $command - ;; - esac - ;; - esac +# {{{ slam - Slam open tombs +function _slam { + tombtmp="/tmp/tombtmp" + $TOMBPATH list --get-mountpoint > $tombtmp + echo "/tombs/all" >> $tombtmp + tombname=`cat $tombtmp | \ + sed 's/.*\/\([^\/]*\)$/\1\n &/' | \ + zenity \ + --title="Choose a tomb to slam" \ + --window-icon="monmort.png" \ + --width=640 --height=380 --list \ + --separator=" & " \ + --column=Tomb \ + --column=Path ` + + case $? in + 0) + # Ask for sudo password via pinentry and remove pass from memory afterwards. + sudoassword=$(ask_password "Insert sudo password for user $USER") + echo -e "$sudoassword\n" | sudo -S $TOMBPATH slam $tombname + + _clean # Clean sensitive stuff from memory + + zenity \ + --title="Success" \ + --window-icon="monmort.png" \ + --info \ + --text="Tomb slammed successfully!" + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac } # }}} -# {{{ Resize an existing *closed* tomb -function resize { - $tombfile=`zenity \ +# {{{ resize - Resize an existing *closed* tomb +function _resize { + tombname=`zenity \ --title="Choose a tomb to resize" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` + case $? in 0) - $newsize=`zenity \ + tombsize=`zenity \ --title="New tomb size" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --entry \ - --text="Enter new size of your tomb. Must be larger than current value."` + --text="Enter new size of your tomb in MiB. Must be larger than current value." \ + --entry-text=100` case $? in 0) - $keyfile=`zenity \ + keyfile=`zenity \ --title="Choose according keyfile" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` case $? in 0) sudoassword=$(ask_password "Insert sudo password for user $USER") echo -e "$sudoassword\n" | sudo -S $TOMBPATH resize \ - $tombfile -s $newsize -k $keyfile + $tombname -s $tombsize -k $keyfile + + _clean # Clean sensitive stuff from memory zenity \ --title="Success" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ + --info \ --text="Tomb resized successfully" - main - eval $command + _main + eval "_$command" ;; 1) - main - eval $command + _main + eval "_$command" ;; esac ;; 1) - main - eval $command + _main + eval "_$command" ;; esac ;; 1) - main - eval $command + _main + eval "_$command" ;; esac } # }}} -# {{{ Change existing key's passphrase -function passwd { +# {{{ passwd - Change existing key's passphrase +function _passwd { keyfile=`zenity \ --title="Choose a keyfile" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` case $? in 0) $TOMBPATH passwd -k $keyfile + + _clean # Clean sensitive stuff from memory + zenity \ --title="Success" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --info \ --text="Password successfully changed!" - main - eval $command + _main + eval "_$command" ;; 1) - main - eval $command + _main + eval "_$command" ;; esac } # }}} -# {{{ Change a tomb's keyfile +# {{{ setkey - Change a tomb's keyfile function setkey { - echo '1' + tombname=`zenity \ + --title="Choose a tomb to change its keyfile" \ + --window-icon="monmort.png" \ + --file-selection` + + case $? in + 0) + keyfile=`zenity \ + --title="Choose your tomb's old keyfile" \ + --window-icon="monmort.png" \ + --file-selection` + + case $? in + 0) + newkey=`zenity \ + --title="Choose your tomb's new keyfile" \ + --window-icon="monmort.png" \ + --file-selection` + + case $? in + 0) + sudoassword=$(ask_password "Insert sudo password for $USER") + echo -e "$sudoassword\n" | sudo -S $TOMBPATH setkey \ + -k $newkey $keyfile $tombname | \ + zenity \ + --title="Changing key" + --window-icon="monmort.png" \ + --text="Please wait while your tomb's key is being changed." \ + --progress \ + --auto-close \ + --pulsate + + _clean + + zenity \ + --title="Success" \ + --window-icon="monmort.png" \ + --info \ + --text="Tomb's keyfile successfully changed!" + + _main + eval "_$command" + ;; + 1) + _main + eval "_$command" + ;; + esac + ;; + 1) + _main + eval "_$command" + ;; + esac + ;; + 1) + _main + eval "_$command" + ;; + esac } # }}} -# {{{ engrave - generate QR code of a key -function engrave { +# {{{ engrave - generate QR code of a key FIX +function _engrave { # output path issue - echo '1' + zenity \ + --title="Sorry" \ + --window-icon="monmort.png" \ + --info \ + --text="This feature doesn't work yet in gtomb." } # }}} t@@ -493,14 +791,14 @@ function engrave { function bury { keyfile=`zenity \ --title="Choose keyfile" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` case $? in 0) jpegfile=`zenity \ --title="Choose JPEG file" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` case $? in t@@ -508,39 +806,41 @@ function bury { $TOMBPATH bury -k $keyfile $jpegfile zenity \ --title="Success" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --info \ --text="Your key is how hidden in $jpegfile" - main - eval $command + _clean # Clean sensitive stuff from memory + + _main + eval "_$command" ;; 1) - main - eval $command + _main + eval "_$command" ;; esac ;; 1) - main - $command + _main + "_$command" ;; esac } # }}} -# {{{ extract keyfile from JPEG +# {{{ exhume - extract keyfile from JPEG function exhume { jpegfile=`zenity \ --title="Choose JPEG file" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection` case $? in 0) keyfile=`zenity \ --title="Choose where to extract your key" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --file-selection \ --save` t@@ -550,25 +850,28 @@ function exhume { zenity \ --title="Success" \ - --window-icon=monmort.png \ + --window-icon="monmort.png" \ --info \ --text="Your keyfile is extracted to $keyfile" - main - eval $command + _clean # Clean sensitive stuff from memory + + _main + eval "_$command" ;; 1) - main - eval $command + _main + eval "_$command" ;; esac ;; 1) - main - $command + _main + "_$command" ;; esac } # }}} -main -eval "$command" + +_main +eval "_$command" DIR diff --git a/screenshot.png b/screenshot.png Binary files differ.