commit bd370c1ef5e23023cb4ce0177f507bc9daaa9963
parent 0bd8f4b4b6ce5dc270be35a59e4fc3c498e73b81
Author: Jaromil <jaromil@dyne.org>
Date: Wed, 12 Jan 2011 11:38:03 +0100
more code to integrate gui elements and script
Diffstat:
A | src/monmort.xpm | | | 47 | +++++++++++++++++++++++++++++++++++++++++++++++ |
M | src/tomb | | | 67 | +++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- |
M | src/tomb-gtk.cpp | | | 112 | ++++++++++++++++++++++++++++++++++--------------------------------------------- |
A | src/tomb-notify.cpp | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
4 files changed, 218 insertions(+), 78 deletions(-)
diff --git a/src/monmort.xpm 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
@@ -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 "# <file system> <mount point> <type> <options> <key>" >> ${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
@@ -1,106 +1,90 @@
+/* Tomb - encrypted storage undertaker
+ *
+ * (c) Copyright 2007-2011 Denis Roio <jaromil@dyne.org>
+ *
+ * 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+
#include <gtk/gtk.h>
+#include <libnotify/notify.h>
/* 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 <monmort.xpm>
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);
+
+ g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_tomb);
- 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);
+ 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);
- g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_tomb);
+ 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
@@ -0,0 +1,70 @@
+/* Tomb - encrypted storage undertaker
+ *
+ * (c) Copyright 2007-2011 Denis Roio <jaromil@dyne.org>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libnotify/notify.h>
+
+/* The Tomb icon is an artwork by Jordi aka MonMort
+ a nomadic graffiti artist from Barcelona */
+#include <monmort.xpm>
+
+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);
+
+}