2011-01-12 16:02:19 +00:00
/* 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 0213 9 , USA .
*/
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
2011-01-13 21:35:32 +00:00
# include <string.h>
# include <libgen.h>
# include <sys/types.h>
# include <sys/wait.h>
2011-01-12 16:02:19 +00:00
# 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 ;
2011-01-13 13:37:52 +00:00
char mapper [ 256 ] ;
2011-01-12 16:02:19 +00:00
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 ) {
GtkWidget * item_close , * item_view , * item_about ;
gint menu_x , menu_y ;
2011-01-16 22:43:45 +00:00
gboolean push_in = TRUE ;
2011-01-12 16:02:19 +00:00
char tomb_file [ 512 ] ;
2011-01-13 21:35:32 +00:00
char tooltip [ 256 ] ;
2011-01-12 16:02:19 +00:00
gtk_set_locale ( ) ;
gtk_init ( & argc , & argv ) ;
// get the information from commandline
2011-01-13 13:37:52 +00:00
if ( argc < 2 ) {
fprintf ( stderr , " error: need at least one argument, the path to a dm-crypt device mapper \n " ) ;
exit ( 1 ) ;
} else {
// TODO: check if mapper really exists
snprintf ( mapper , 255 , " %s " , argv [ 1 ] ) ;
}
2011-01-12 16:02:19 +00:00
2011-01-13 13:37:52 +00:00
if ( argc < 3 ) sprintf ( filename , " unknown " ) ;
else snprintf ( filename , 255 , " %s " , argv [ 2 ] ) ;
if ( argc < 4 ) sprintf ( mountpoint , " unknown " ) ;
else snprintf ( mountpoint , 255 , " %s " , argv [ 3 ] ) ;
2011-01-12 16:02:19 +00:00
// 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 " ) ;
2011-01-13 21:35:32 +00:00
snprintf ( tooltip , 255 , " Tomb in %s " , mountpoint ) ;
gtk_status_icon_set_tooltip_text ( status_tomb , tooltip ) ;
2011-01-12 16:02:19 +00:00
// LEFT click menu
menu_left = ( GtkMenu * ) gtk_menu_new ( ) ;
// view
2011-01-13 13:37:52 +00:00
item_view = gtk_menu_item_new_with_label ( " Explore " ) ;
2011-01-12 16:02:19 +00:00
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 ) {
2011-01-13 13:37:52 +00:00
// GtkWidget *dialog =
// gtk_message_dialog_new (NULL,
// GTK_DIALOG_DESTROY_WITH_PARENT,
// GTK_MESSAGE_INFO,
// GTK_BUTTONS_CLOSE,
// "Tomb '%s' open on '%s'\n"
// "device mapper: %s", filename, mountpoint, mapper);
// gtk_dialog_run (GTK_DIALOG (dialog));
// gtk_widget_destroy (dialog);
pid_t cpid = fork ( ) ;
if ( cpid = = - 1 ) {
fprintf ( stderr , " error: problem forking process \n " ) ;
2011-01-16 22:43:45 +00:00
return FALSE ;
2011-01-13 13:37:52 +00:00
}
if ( cpid = = 0 ) { // Child
execlp ( " tomb-open " , " tomb-open " , mountpoint , ( char * ) NULL ) ;
exit ( 1 ) ;
}
2011-01-16 22:43:45 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
gboolean cb_close ( GtkWidget * w , GdkEvent * e ) {
2011-01-13 13:37:52 +00:00
pid_t cpid = fork ( ) ;
2011-01-13 21:35:32 +00:00
int res ;
2011-01-13 13:37:52 +00:00
if ( cpid = = - 1 ) {
fprintf ( stderr , " error: problem forking process \n " ) ;
2011-01-16 22:43:45 +00:00
return FALSE ;
2011-01-13 13:37:52 +00:00
}
if ( cpid = = 0 ) { // Child
execlp ( " tomb " , " tomb " , " -S " , " umount " , mapper , ( char * ) NULL ) ;
exit ( 1 ) ;
}
2011-01-13 21:35:32 +00:00
waitpid ( cpid , & res , 0 ) ;
if ( res = = 0 ) {
gtk_main_quit ( ) ;
notify_uninit ( ) ;
exit ( 0 ) ;
}
2011-01-16 22:43:45 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
// 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 } ;
2011-01-13 13:37:52 +00:00
const gchar * artists [ ] = { " Jordi aka Món Mort - http://monmort.blogspot.org " ,
" Asbesto Molesto - http://freaknet.org/asbesto " ,
2011-01-12 16:02:19 +00:00
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 ) ;
}