diff --git a/src/monmort.xpm b/src/monmort.xpm new file mode 100644 index 0000000..beab1fe --- /dev/null +++ b/src/monmort.xpm @@ -0,0 +1,47 @@ +/* XPM */ + +/* The Tomb icon is an artwork by Jordi aka MonMort + a nomadic graffiti artist from Barcelona */ + +const char *monmort[] = { +/* columns rows colors chars-per-pixel */ +"32 32 5 1", +" c #000000", +". c #010101", +"X c #020202", +"o c #C1C1C1", +"O c None", +/* pixels */ +"OO OO", +"O oooooooooooooooooooooooooooo O", +" oooooooooooooooooooooooooooooo ", +" oooooooooooooooooooooooooooooo ", +" oooooooo X oooooo ooo ", +" oooooooo oooooo ooo ", +" oooooooo oooooo ooo ", +" oooooooo oooooo oooX", +" oooooooo X oooooo ooo ", +" oooooooo oooooo ooo ", +" oooooooo Xoooooo ooo ", +" oooooooo oooooo X ooo ", +" oooooooo X oooooo ooo ", +" oooooooooooooooooooooooooooooo ", +" oooooooooooooooooooooo oooooooX", +" ooooooooooooooooooooooo oooooo ", +" oooooooooooooooo X ooooo ", +"O ooooooooooooooooooooooooooooo ", +"OO oooooooooooooooooo O", +"OOOOOOOOOOOO oooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo oooXooo OO", +"OOOOOOOOOOOOO oooXooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooo ooo ooo oooXOO", +"OOOOOOOOOOOOO ooo ooo ooo ooo OO", +"OOOOOOOOOOOOOXooo ooo ooo ooo OO", +"OOOOOOOOOOOOO ooooooooooooooo OO", +"OOOOOOOOOOOOOO ooooooooooooo OOO", +"OOOOOOOOOOOOOOO OOOO" +}; diff --git a/src/tomb b/src/tomb index 4bc19bc..268b91a 100755 --- a/src/tomb +++ b/src/tomb @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/zsh # # Tomb # @@ -30,7 +30,7 @@ VERSION=0.9 DATE=Jan/2011 -PATH=/usr/bin:/usr/sbin:/bin:/sbin +# PATH=/usr/bin:/usr/sbin:/bin:/sbin # standard output message routines # it's always useful to wrap them, in case we change behaviour later @@ -126,6 +126,11 @@ ask_password() { } +# drop privileges +exec_as_user() { + func "executing as user '$SUDO_USER': ${(f)@}" + sudo -u $SUDO_USER ${@} & +} ############################ @@ -134,16 +139,15 @@ ask_password() { notice "Tomb - simple commandline tool for encrypted storage" act "version $VERSION ($DATE) by Jaromil @ dyne.org" -act "" -func "invoked with args \"$*\" " +func "invoked with args \"${(f)@}\" " func "running on `date`" -OPTS=`getopt -o hvs:k: -n 'tomb' -- "$@"` - +OPTS=`getopt -o hvs:k:S -n 'tomb' -- "$@"` while true; do case "$1" in -h) + act "" notice "Syntax: tomb [options] command [file] [mountpoint | size]" act "" notice "Options:" @@ -151,6 +155,7 @@ while true; do act "-v print out the version information for this tool" act "-s size of the storage file when creating one (in MBytes)" act "-k path to the key to use for decryption" + act "-S acquire super user rights if possible" act "" notice "Commands:" act "create create a new encrypted storage FILE and keys" @@ -159,6 +164,7 @@ while true; do echo; exit 2 ;; -v) # print out the GPL license in this file + act "" cat $0 | awk ' BEGIN { license=0 } /^# This source/ { license=1 } @@ -167,6 +173,37 @@ BEGIN { license=0 } ' act "" exit 0 ;; + -S) GETPRIV=true; shift 1 ;; + *) break ;; + esac +done + +id | grep root > /dev/null +if [ $? != 0 ]; then + error "This program must be run as root to produce results" + if [ "$GETPRIV" = "true" ]; then + which gksu > /dev/null + if [ $? = 0 ]; then + act "Using gksu for root execution of 'tomb ${(f)@}'" + gksu "tomb ${(f)@}" + exit $? + fi + which sudo > /dev/null + if [ $? = 0 ]; then + act "Using sudo for root execution of 'tomb ${(f)@}'" + sudo "tomb ${(f)@}" + exit $? + fi + exit 1 + else + exit 1 + fi +fi + +# now process the real options +OPTS=`getopt -o hvs:k:S -n 'tomb' -- "$@"` +while true; do + case "$1" in -s) SIZE=$2; shift 2 ;; -k) KEY=$2; shift 2 ;; --) shift; break ;; @@ -180,11 +217,7 @@ if [ -z $CMD ]; then exit 0 fi -id | grep root > /dev/null -if [ $? != 0 ]; then - error "This program must be run as root to produce results" - exit 1 -fi + func "command: $CMD for file $FILE" @@ -193,7 +226,7 @@ tombtab=${tombdir}/fstab if ! [ -r ${tombtab} ]; then act "creating tomb filesystem tab in your home" mkdir -p ${HOME}/.tomb - echo "# entombed filesystem information, see man tomb" > ${tombtab} + echo "# entombed filesystem information, see man tomb (TODO)" > ${tombtab} echo "# format here is similar to the system wide fstab" >> ${tombtab} echo "# " >> ${tombtab} fi @@ -379,7 +412,9 @@ mount_tomb() { mount -t ext4 -o rw,noatime,nodev /dev/mapper/${mapper} ${MOUNT} notice "encrypted storage $FILE succesfully mounted on $MOUNT" - + if [ $DISPLAY ]; then + exec_as_user tomb-gtk ${FILE} ${MOUNT} + fi } umount_tomb() { @@ -388,7 +423,7 @@ umount_tomb() { how_many_tombs="`ls /dev/mapper/tomb* 2>/dev/null | wc -w`" if [ $how_many_tombs = 0 ]; then - error "there is no tomb found to be mounted" + error "there is no open tomb to be closed" return elif [ $how_many_tombs = 1 ]; then mapper=`ls /dev/mapper/tomb* 2>/dev/null` @@ -450,6 +485,8 @@ umount_tomb() { # fi notice "crypt storage ${mapper} unmounted" + exec_as_user tomb-notify "Tomb closed:" "${FILE} +Rest In Peace." } @@ -457,8 +494,10 @@ case "$CMD" in create) create_tomb ;; format) format_tomb ;; mount) mount_tomb ;; + open) mount_tomb ;; umount) umount_tomb ;; unmount) umount_tomb ;; + close) umount_tomb ;; *) error "command \"$CMD\" not recognized" act "try -h for help" ;; diff --git a/src/tomb-gtk.cpp b/src/tomb-gtk.cpp index 0f600db..601af18 100644 --- a/src/tomb-gtk.cpp +++ b/src/tomb-gtk.cpp @@ -1,106 +1,90 @@ +/* Tomb - encrypted storage undertaker + * + * (c) Copyright 2007-2011 Denis Roio + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 3 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + #include #include #include + #include +#include /* The Tomb icon is an artwork by Jordi aka MonMort a nomadic graffiti artist from Barcelona */ -const char *monmort[] = { -/* columns rows colors chars-per-pixel */ -"32 32 5 1", -" c #000000", -". c #010101", -"X c #020202", -"o c #C1C1C1", -"O c None", -/* pixels */ -"OO OO", -"O oooooooooooooooooooooooooooo O", -" oooooooooooooooooooooooooooooo ", -" oooooooooooooooooooooooooooooo ", -" oooooooo X oooooo ooo ", -" oooooooo oooooo ooo ", -" oooooooo oooooo ooo ", -" oooooooo oooooo oooX", -" oooooooo X oooooo ooo ", -" oooooooo oooooo ooo ", -" oooooooo Xoooooo ooo ", -" oooooooo oooooo X ooo ", -" oooooooo X oooooo ooo ", -" oooooooooooooooooooooooooooooo ", -" oooooooooooooooooooooo oooooooX", -" ooooooooooooooooooooooo oooooo ", -" oooooooooooooooo X ooooo ", -"O ooooooooooooooooooooooooooooo ", -"OO oooooooooooooooooo O", -"OOOOOOOOOOOO oooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo oooXooo OO", -"OOOOOOOOOOOOO oooXooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooo ooo ooo oooXOO", -"OOOOOOOOOOOOO ooo ooo ooo ooo OO", -"OOOOOOOOOOOOOXooo ooo ooo ooo OO", -"OOOOOOOOOOOOO ooooooooooooooo OO", -"OOOOOOOOOOOOOO ooooooooooooo OOO", -"OOOOOOOOOOOOOOO OOOO" -}; - +#include GtkStatusIcon *status_tomb; GtkMenu *menu_tomb; +NotifyNotification *notice; +GError *error; + // forward declaration of callbacks gboolean left_click(GtkWidget *w, GdkEvent *e); -gboolean cb_open(GtkWidget *w, GdkEvent *e); -gboolean cb_quit(GtkWidget *w, GdkEvent *e); - +gboolean cb_close(GtkWidget *w, GdkEvent *e); int main(int argc, char **argv) { - GObject *tray; GdkPixbuf *pb_monmort; - GtkWidget *menu_open, *menu_close, *menu_quit; + GtkWidget *menu_close; gint menu_x, menu_y; gboolean push_in = true; + char tomb_file[512]; + gtk_set_locale(); gtk_init(&argc, &argv); + // libnotify + notify_init(PACKAGE); + // set and show the status icon pb_monmort = gdk_pixbuf_new_from_xpm_data(monmort); status_tomb = gtk_status_icon_new_from_pixbuf(pb_monmort); // gtk_status_icon_set_name(status_tomb, "tomb"); gtk_status_icon_set_title(status_tomb, "Tomb"); - gtk_status_icon_set_tooltip_text (status_tomb, "Tomb - encrypted storage undertaker"); + gtk_status_icon_set_tooltip_text (status_tomb, "Tomb - crypto undertaker"); // gtk_status_icon_set_blinking(status_tomb, true); menu_tomb = (GtkMenu*) gtk_menu_new(); - menu_open = gtk_menu_item_new_with_label("Open"); - gtk_menu_attach(menu_tomb, menu_open, 0, 1, 0, 1); - g_signal_connect_swapped(menu_open, "activate", G_CALLBACK(cb_open), NULL); - gtk_widget_show(menu_open); - menu_close = gtk_menu_item_new_with_label("Close"); - gtk_menu_attach(menu_tomb, menu_close, 0, 1, 1, 2); + gtk_menu_attach(menu_tomb, menu_close, 0, 1, 0, 1); + g_signal_connect_swapped(menu_close, "activate", G_CALLBACK(cb_close), NULL); gtk_widget_show(menu_close); - - menu_quit = gtk_menu_item_new_with_label("Quit"); - gtk_menu_attach(menu_tomb, menu_quit, 0, 1, 2, 3); - g_signal_connect_swapped(menu_quit, "activate", G_CALLBACK(cb_quit), NULL); - gtk_widget_show(menu_quit); - + g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_tomb); + notice = notify_notification_new_with_status_icon + ("Tomb encrypted undertaker", + "We started digging out bones", + NULL, status_tomb); + notify_notification_set_icon_from_pixbuf(notice, pb_monmort); + + notify_notification_show(notice, &error); + gtk_main(); + + notify_uninit(); exit(0); - } // callbacks @@ -109,7 +93,7 @@ gboolean left_click(GtkWidget *w, GdkEvent *e) { gtk_status_icon_position_menu, status_tomb, 1, gtk_get_current_event_time()); } -gboolean cb_open(GtkWidget *w, GdkEvent *e) { - execlp("tomb","tomb","mount","sarcofago","/mnt/etrom",NULL); +gboolean cb_close(GtkWidget *w, GdkEvent *e) { + execlp("tomb","tomb","-S","umount",NULL); + gtk_main_quit(); } -gboolean cb_quit(GtkWidget *w, GdkEvent *e) { gtk_main_quit(); } diff --git a/src/tomb-notify.cpp b/src/tomb-notify.cpp new file mode 100644 index 0000000..869a482 --- /dev/null +++ b/src/tomb-notify.cpp @@ -0,0 +1,70 @@ +/* Tomb - encrypted storage undertaker + * + * (c) Copyright 2007-2011 Denis Roio + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 3 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +// this file is a notification tool to send messages on the screen + +#include +#include +#include + +#include + +/* The Tomb icon is an artwork by Jordi aka MonMort + a nomadic graffiti artist from Barcelona */ +#include + +int main(int argc, char **argv) { + NotifyNotification *notice; + GError *error; + GdkPixbuf *pb_monmort; + + char title[256]; + char body[512]; + + gtk_set_locale(); + gtk_init(&argc, &argv); + + // libnotify + notify_init(PACKAGE); + + if(argc<3) + snprintf(body,511, "I'm the crypto undertaker.\nLet's start digging out bones."); + else + snprintf(body,511, "%s", argv[2]); + + if(argc<2) + snprintf(title,255,"%s version %s",PACKAGE,VERSION); + else + snprintf(title,255, "%s", argv[1]); + + // set the icon + pb_monmort = gdk_pixbuf_new_from_xpm_data(monmort); + + notice = notify_notification_new(title, body, NULL, NULL); + notify_notification_set_icon_from_pixbuf(notice, pb_monmort); + + notify_notification_show(notice, &error); + + notify_uninit(); + + usleep(.5); + + exit(0); + +}