commit c00a1721c881860626b51fd1b11357395f3fa7e4
parent 626f6ea78142f233038784d91a3a8b2337c12714
Author: Jaromil <jaromil@dyne.org>
Date: Wed, 12 Jan 2011 17:02:19 +0100
desktop installation and mimetypes
and more updates
Diffstat:
7 files changed, 312 insertions(+), 116 deletions(-)
diff --git a/configure.ac b/configure.ac
@@ -4,14 +4,14 @@ dnl ==============================================================
AC_PREREQ([2.60])
-AC_INIT([Tomb],[0.8.0],[jaromil@dyne.org],[tomb])
+AC_INIT([Tomb],[0.9.0],[jaromil@dyne.org],[Tomb])
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_HOST
dnl backwards compatibility for autoconf >= 2.64
dnl PACKAGE_URL should be the fifth argument of AC_INIT
-m4_define([AC_PACKAGE_URL], [http://crypto.dyne.org])
+m4_define([AC_PACKAGE_URL], [http://tomb.dyne.org])
AC_DEFINE(PACKAGE_URL, "AC_PACKAGE_URL", [Package URL])
AC_SUBST(PACKAGE_URL, AC_PACKAGE_URL)
@@ -69,6 +69,10 @@ AC_PROG_INSTALL
AC_CHECK_PROG(have_zsh,zsh,yes,no)
AC_CHECK_PROG(have_cryptsetup,cryptsetup,yes,no)
+AC_CHECK_PROG(have_wipe,wipe,yes,no)
+AC_CHECK_PROG(have_dcfldd,dcfldd,yes,no)
+AC_CHECK_PROG(have_gksu,gksu,yes,no)
+AC_CHECK_PROG(have_sudo,gksu,yes,no)
PKG_CHECK_MODULES(GTK2, gtk+-2.0 >= 2.16, :,
AC_MSG_ERROR([*** Gtk+2 >=2.16 development files not found!]))
@@ -80,6 +84,12 @@ PKG_CHECK_MODULES(NOTIFY, libnotify, :,
AC_SUBST([NOTIFY_CFLAGS])
AC_SUBST([NOTIFY_LIBS])
+PACKAGE_DATA_DIR='${prefix}/share/tomb'
+AC_SUBST(PACKAGE_DATA_DIR)
+# mime TODO see http://www.freedesktop.org/wiki/Specifications/AddingMIMETutor
+XDG_DATA_DIR='${prefix}/share/mime/packages'
+AC_SUBST(XDG_DATA_DIR)
+
dnl alphabetic order on dir/subdir, but Makefile sorts before everything
AC_CONFIG_FILES([
Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
@@ -1,11 +1,11 @@
-bin_SCRIPTS = tomb
+bin_SCRIPTS = tomb tomb-open
-bin_PROGRAMS = tomb-gtk tomb-notify
+bin_PROGRAMS = tomb-status tomb-notify
-tomb_gtk_SOURCES = tomb-gtk.cpp
-tomb_gtk_LDADD = @GTK2_LIBS@ @NOTIFY_LIBS@
-tomb_gtk_CXXFLAGS = @GTK2_CFLAGS@ @NOTIFY_CFLAGS@
+tomb_status_SOURCES = tomb-status.cpp
+tomb_status_LDADD = @GTK2_LIBS@ @NOTIFY_LIBS@
+tomb_status_CXXFLAGS = @GTK2_CFLAGS@ @NOTIFY_CFLAGS@
tomb_notify_SOURCES = tomb-notify.cpp
tomb_notify_LDADD = @NOTIFY_LIBS@
diff --git a/src/tomb b/src/tomb
@@ -55,10 +55,11 @@ else
WIPE="rm -f"
fi
-# usb auto detect
+# usb auto detect using dmesg
# tested on ubuntu 10.04 - please test and patch on other systems if you can
ask_usbkey() {
notice "looking for key $1 on usb"
+ exec_as_user tomb-notify "Tomb needs a key." "Plug your usb key in the computer to open $1"
echo -n " . please insert your usb key "
plugged=false
@@ -83,7 +84,7 @@ ask_usbkey() {
# get the first partition
usbpart=`dmesg |tail -n 8 | grep ' sd.:' |cut -d: -f2 |tr -d ' '`
- # what that it is mounted
+ # wait that is mounted
mounted=false
while [ "$mounted" != "true" ]; do
cat /proc/mounts | tail -n 2 | grep -q $usbpart
@@ -336,10 +337,10 @@ mount_tomb() {
notice "mounting $FILE on mountpoint $MOUNT"
if [ -z $MOUNT ]; then
- error "you need to specify a MOUNTPOINT for the mount command"
- exit 0
- fi
- if ! [ -x $MOUNT ]; then
+ act "mountpoint not specified, using default: /media/$FILE"
+ MOUNT=/media/${FILE}
+ mkdir -p $MOUNT
+ elif ! [ -x $MOUNT ]; then
error "mountpoint $MOUNT doesn't exist"
exit 0
fi
@@ -413,7 +414,7 @@ mount_tomb() {
notice "encrypted storage $FILE succesfully mounted on $MOUNT"
if [ $DISPLAY ]; then
- exec_as_user tomb-gtk ${FILE} ${MOUNT}
+ exec_as_user tomb-status ${FILE} ${MOUNT}
fi
}
@@ -488,16 +489,110 @@ umount_tomb() {
exec_as_user tomb-notify "Tomb closed:" "${FILE}
Rest In Peace."
}
+
+# install mime-types, bells and whistles for the desktop
+# see http://developers.sun.com/solaris/articles/integrating_gnome.html
+# and freedesktop specs
+install() {
+ notice "Installing Tomb on your desktop"
+
+ act "updating mimetypes..."
+ cat <<EOF > /tmp/dyne-tomb.xml
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+ <mime-type type="application/x-tomb-volume">
+ <comment>Tomb encrypted volume</comment>
+ <glob pattern="*.tomb"/>
+ </mime-type>
+ <mime-type type="application/x-tomb-key">
+ <comment>Tomb crypto key</comment>
+ <glob pattern="*.tomb.gpg"/>
+ </mime-type>
+</mime-info>
+EOF
+ xdg-mime install /tmp/dyne-tomb.xml
+ xdg-icon-resource install --context mimetypes --size 32 monmort.xpm monmort
+ xdg-icon-resource install --size 32 monmort.xpm dyne-monmort
+
+ rm /tmp/dyne-tomb.xml
+
+ act "updating desktop..."
+ cat <<EOF > /usr/share/applications/tomb.desktop
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Tomb crypto undertaker
+GenericName=Crypto undertaker
+Comment=Keep your bones safe
+Exec=tomb-open %U
+TryExec=tomb-open
+Icon=monmort.xpm
+Terminal=true
+Categories=Utility;Security;Archiving;Filesystem;
+MimeType=application/x-tomb-volume;
+EOF
+ update-desktop-database
+
+ act "updating menus..."
+ cat <<EOF > /etc/menu/tomb
+?package(tomb):command="tomb" icon="/usr/share/pixmaps/monmort.xpm" needs="cryptsetup" \
+ section="Applications/Accessories" title="Tomb" hints="Crypto" \
+ hotkey="Tomb"
+EOF
+ update-menus
+
+ act "updating mime info..."
+ cat <<EOF > /usr/share/mime-info/tomb.keys
+# actions for encrypted tomb storage
+application/x-tomb-volume:
+ open=tomb-open %f
+ view=tomb-open %f
+ icon-filename=monmort.xpm
+ short_list_application_ids_for_novice_user_level=tomb
+EOF
+ cat <<EOF > /usr/share/mime-info/tomb.mime
+# mime type for encrypted tomb storage
+application/x-tomb-volume
+ ext: tomb
+
+application/x-tomb-key
+ ext: tomb.gpg
+EOF
+ cat <<EOF > /usr/lib/mime/packages/tomb
+application/x-tomb-volume; tomb '%s'; needsterminal; priority=8
+EOF
+ update-mime
+
+ act "updating application entry..."
+
+ cat <<EOF > /usr/share/application-registry/tomb.applications
+tomb
+ command=tomb-open
+ name=Tomb - Crypto Undertaker
+ can_open_multiple_files=false
+ expects_uris=false
+ requires_terminal=true
+ mime-types=application/x-tomb-volume,application/x-tomb-key
+EOF
+
+}
case "$CMD" in
create) create_tomb ;;
- format) format_tomb ;;
+
mount) mount_tomb ;;
open) mount_tomb ;;
+
umount) umount_tomb ;;
unmount) umount_tomb ;;
close) umount_tomb ;;
+
+ install) install ;;
+
+ status) tomb-status ;;
+ notify) tomb-notify ;;
+
*) error "command \"$CMD\" not recognized"
act "try -h for help"
;;
diff --git a/src/tomb-gtk.cpp b/src/tomb-gtk.cpp
@@ -1,99 +0,0 @@
-/* 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 */
-#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_close(GtkWidget *w, GdkEvent *e);
-
-
-int main(int argc, char **argv) {
- GObject *tray;
- GdkPixbuf *pb_monmort;
- 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 - crypto undertaker");
-
- // gtk_status_icon_set_blinking(status_tomb, true);
- menu_tomb = (GtkMenu*) gtk_menu_new();
-
- menu_close = gtk_menu_item_new_with_label("Close");
- 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);
-
- 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
-gboolean left_click(GtkWidget *w, GdkEvent *e) {
- gtk_menu_popup(menu_tomb, NULL, NULL,
- gtk_status_icon_position_menu, status_tomb,
- 1, gtk_get_current_event_time());
-}
-gboolean cb_close(GtkWidget *w, GdkEvent *e) {
- execlp("tomb","tomb","-S","umount",NULL);
- gtk_main_quit();
-}
diff --git a/src/tomb-notify.cpp b/src/tomb-notify.cpp
@@ -63,8 +63,6 @@ int main(int argc, char **argv) {
notify_uninit();
- usleep(.5);
-
exit(0);
}
diff --git a/src/tomb-open b/src/tomb-open
@@ -0,0 +1,12 @@
+#!/bin/sh
+# startup wrapper to open tombs
+
+# got a tomb as argument
+if [ $@ ]; then
+ tomb -S open $@
+ exit $?
+fi
+
+tomb -h
+
+sleep 10+
\ No newline at end of file
diff --git a/src/tomb-status.cpp b/src/tomb-status.cpp
@@ -0,0 +1,179 @@
+/* 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 */
+#include <monmort.xpm>
+
+GdkPixbuf *pb_monmort;
+GtkStatusIcon *status_tomb;
+GtkMenu *menu_left, *menu_right;
+
+NotifyNotification *notice;
+GError *error;
+
+char filename[256];
+char mountpoint[256];
+
+// forward declaration of callbacks
+gboolean left_click(GtkWidget *w, GdkEvent *e);
+gboolean cb_view(GtkWidget *w, GdkEvent *e);
+gboolean cb_close(GtkWidget *w, GdkEvent *e);
+
+gboolean right_click(GtkWidget *w, GdkEvent *e);
+gboolean cb_about(GtkWidget *w, GdkEvent *e);
+
+
+int main(int argc, char **argv) {
+ GObject *tray;
+ GtkWidget *item_close, *item_view, *item_about;
+ gint menu_x, menu_y;
+ gboolean push_in = true;
+
+ char tomb_file[512];
+
+ gtk_set_locale();
+ gtk_init(&argc, &argv);
+
+ // get the information from commandline
+ if(argc<3) sprintf(mountpoint,"unknown");
+ else snprintf(mountpoint,255, "%s", argv[2]);
+
+ if(argc<2) sprintf(filename, "unknown");
+ else snprintf(filename,255, "%s", argv[1]);
+
+ // 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 - crypto undertaker");
+
+ // LEFT click menu
+ menu_left = (GtkMenu*) gtk_menu_new();
+ // view
+ item_view = gtk_menu_item_new_with_label("View");
+ gtk_menu_attach(menu_left, item_view, 0, 1, 0, 1);
+ g_signal_connect_swapped(item_view, "activate", G_CALLBACK(cb_view), NULL);
+ gtk_widget_show(item_view);
+ // close
+ item_close = gtk_menu_item_new_with_label("Close");
+ gtk_menu_attach(menu_left, item_close, 0, 1, 1, 2);
+ g_signal_connect_swapped(item_close, "activate", G_CALLBACK(cb_close), NULL);
+ gtk_widget_show(item_close);
+
+ // connect it
+ g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_left);
+
+
+ // RIGHT click menu
+ menu_right = (GtkMenu*) gtk_menu_new();
+ // about
+ item_about = gtk_menu_item_new_with_label("About");
+ gtk_menu_attach(menu_right, item_about, 0, 1, 0, 1);
+ g_signal_connect_swapped(item_about, "activate", G_CALLBACK(cb_about), NULL);
+ g_signal_connect_swapped(item_about, "popup-menu", G_CALLBACK(cb_about), NULL);
+ gtk_widget_show(item_about);
+ // connect it
+ g_signal_connect_swapped(status_tomb, "popup-menu", G_CALLBACK(right_click), menu_right);
+
+ // status icon
+ 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 left click
+gboolean left_click(GtkWidget *w, GdkEvent *e) {
+ gtk_menu_popup(menu_left, NULL, NULL,
+ gtk_status_icon_position_menu, status_tomb,
+ 1, gtk_get_current_event_time());
+}
+gboolean cb_view(GtkWidget *w, GdkEvent *e) {
+ GtkWidget *dialog =
+ gtk_message_dialog_new (NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_CLOSE,
+ "Tomb '%s' open on '%s'", filename, mountpoint);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+}
+
+gboolean cb_close(GtkWidget *w, GdkEvent *e) {
+ execlp("tomb","tomb","-S","umount",NULL);
+ gtk_main_quit();
+}
+
+// callbacks right click
+gboolean right_click(GtkWidget *w, GdkEvent *e) {
+ gtk_menu_popup(menu_right, NULL, NULL,
+ gtk_status_icon_position_menu, status_tomb,
+ 1, gtk_get_current_event_time());
+}
+gboolean cb_about(GtkWidget *w, GdkEvent *e) {
+ const gchar *authors[] = {"Denis Roio aka Jaromil - http://jaromil.dyne.org",NULL};
+ const gchar *artists[] = {"Jordi aka MonMort - http://monmort.blogspot.org",
+ "Gabriele Zaverio aka Asbesto - http://freaknet.org/asbesto",
+ NULL};
+ GtkWidget *dialog = gtk_about_dialog_new();
+ gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog), PACKAGE);
+ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), VERSION);
+ gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog),
+ "(C)2007-2010 Denis Roio aka Jaromil");
+ gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(dialog), artists);
+ gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dialog), authors);
+
+ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),
+ "The Crypto Undertaker\n"
+"\n"
+"This program helps people keeping their bones together by taking care of their private data inside encrypted storage filesystems that are easy to access and transport.\n"
+"\n"
+"The level of security provided by this program is fairly good: it uses an accelerated AES/SHA256 (cbc-essiv) to access the data on the fly, as if it would be a mounted volume.\n"
+"\n"
+"To start digging your tomb be ready to get your hands dirty and use the commandline utility 'tomb' from a text terminal."
+);
+ gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog), PACKAGE_URL);
+ gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), pb_monmort);
+ gtk_dialog_run(GTK_DIALOG (dialog));
+ gtk_widget_destroy(dialog);
+}
+