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>
2011-02-07 10:27:53 +00:00
# include <errno.h>
2011-01-13 21:35:32 +00:00
# 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 ) ;
2011-04-27 21:19:06 +00:00
gboolean cb_slam ( GtkWidget * w , GdkEvent * e ) ;
2011-01-12 16:02:19 +00:00
gboolean right_click ( GtkWidget * w , GdkEvent * e ) ;
gboolean cb_about ( GtkWidget * w , GdkEvent * e ) ;
int main ( int argc , char * * argv ) {
2011-04-27 21:19:06 +00:00
GtkWidget * item_close , * item_slam ;
GtkWidget * item_view , * item_about ;
2011-01-12 16:02:19 +00:00
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
2011-02-14 14:57:37 +00:00
snprintf ( tooltip , 255 , " %s " , mountpoint ) ;
2011-01-13 21:35:32 +00:00
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 ) ;
2011-04-27 21:19:06 +00:00
// slam
item_slam = gtk_menu_item_new_with_label ( " Slam " ) ;
gtk_menu_attach ( menu_left , item_slam , 0 , 1 , 2 , 3 ) ;
g_signal_connect_swapped ( item_slam , " activate " , G_CALLBACK ( cb_slam ) , NULL ) ;
gtk_widget_show ( item_slam ) ;
2011-01-12 16:02:19 +00:00
// 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
2011-03-29 16:11:18 +00:00
# if (HAVE_NOTIFY_NOTIFICATION_NEW_WITH_STATUS_ICON)
2011-01-12 16:02:19 +00:00
notice = notify_notification_new_with_status_icon
( " Tomb encrypted undertaker " ,
" We started digging out bones " ,
NULL , status_tomb ) ;
2011-03-29 16:11:18 +00:00
# else
notice = notify_notification_new
( " Tomb encrypted undertaker " ,
" We started digging out bones " ,
NULL ) ;
# endif
2011-01-12 16:02:19 +00:00
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 ( ) ) ;
2011-02-07 10:27:53 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
gboolean cb_view ( GtkWidget * w , GdkEvent * e ) {
2011-02-09 19:35:11 +00:00
int pipefd [ 2 ] ;
pid_t cpid ;
char buf ;
int c , res ;
char map [ 256 ] ;
if ( pipe ( pipefd ) < 0 ) {
fprintf ( stderr , " pipe creation error: %s \n " , strerror ( errno ) ) ;
return FALSE ;
}
cpid = fork ( ) ;
2011-01-13 13:37:52 +00:00
if ( cpid = = - 1 ) {
2011-02-09 19:35:11 +00:00
fprintf ( stderr , " fork error: %s \n " , strerror ( errno ) ) ;
2011-01-16 22:43:45 +00:00
return FALSE ;
2011-01-13 13:37:52 +00:00
}
if ( cpid = = 0 ) { // Child
2011-02-09 19:35:11 +00:00
close ( pipefd [ 1 ] ) ; // close unused write end
for ( c = 0 ; read ( pipefd [ 0 ] , & buf , 1 ) > 0 ; c + + )
map [ c ] = buf ;
close ( pipefd [ 0 ] ) ;
map [ c ] = 0 ;
execlp ( " tomb-open " , " tomb-open " , map , ( char * ) NULL ) ;
_exit ( 1 ) ;
2011-01-13 13:37:52 +00:00
}
2011-02-09 19:35:11 +00:00
close ( pipefd [ 0 ] ) ; // close unused read end
write ( pipefd [ 1 ] , mountpoint , strlen ( mountpoint ) ) ;
close ( pipefd [ 1 ] ) ; // reader will see EOF
2011-01-16 22:43:45 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
2011-02-09 19:35:11 +00:00
2011-01-12 16:02:19 +00:00
gboolean cb_close ( GtkWidget * w , GdkEvent * e ) {
2011-02-07 10:27:53 +00:00
int pipefd [ 2 ] ;
pid_t cpid ;
char buf ;
int c , res ;
char map [ 256 ] ;
if ( pipe ( pipefd ) < 0 ) {
fprintf ( stderr , " pipe creation error: %s \n " , strerror ( errno ) ) ;
return FALSE ;
}
cpid = fork ( ) ;
2011-02-07 08:44:59 +00:00
if ( cpid = = - 1 ) {
2011-02-07 10:27:53 +00:00
fprintf ( stderr , " fork error: %s \n " , strerror ( errno ) ) ;
2011-01-16 22:43:45 +00:00
return FALSE ;
2011-01-13 13:37:52 +00:00
}
2011-02-07 08:44:59 +00:00
if ( cpid = = 0 ) { // Child
2011-02-07 10:27:53 +00:00
close ( pipefd [ 1 ] ) ; // close unused write end
for ( c = 0 ; read ( pipefd [ 0 ] , & buf , 1 ) > 0 ; c + + )
map [ c ] = buf ;
close ( pipefd [ 0 ] ) ;
2011-02-09 19:35:11 +00:00
map [ c ] = 0 ;
2011-02-07 10:27:53 +00:00
execlp ( " tomb " , " tomb " , " close " , map , ( char * ) NULL ) ;
_exit ( 1 ) ;
2011-02-07 08:44:59 +00:00
}
2011-02-07 10:27:53 +00:00
close ( pipefd [ 0 ] ) ; // close unused read end
write ( pipefd [ 1 ] , mapper , strlen ( mapper ) ) ;
close ( pipefd [ 1 ] ) ; // reader will see EOF
2011-02-07 08:44:59 +00:00
waitpid ( cpid , & res , 0 ) ;
if ( res = = 0 ) {
2011-01-13 21:35:32 +00:00
gtk_main_quit ( ) ;
notify_uninit ( ) ;
exit ( 0 ) ;
}
2011-02-20 13:59:30 +00:00
/* tomb-notify "Tomb '$tombname' is too busy." \
" Close all applications and file managers, then try again. "
*/
2011-01-16 22:43:45 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
2011-04-27 21:19:06 +00:00
gboolean cb_slam ( GtkWidget * w , GdkEvent * e ) {
int pipefd [ 2 ] ;
pid_t cpid ;
char buf ;
int c , res ;
char map [ 256 ] ;
if ( pipe ( pipefd ) < 0 ) {
fprintf ( stderr , " pipe creation error: %s \n " , strerror ( errno ) ) ;
return FALSE ;
}
cpid = fork ( ) ;
if ( cpid = = - 1 ) {
fprintf ( stderr , " fork error: %s \n " , strerror ( errno ) ) ;
return FALSE ;
}
if ( cpid = = 0 ) { // Child
close ( pipefd [ 1 ] ) ; // close unused write end
for ( c = 0 ; read ( pipefd [ 0 ] , & buf , 1 ) > 0 ; c + + )
map [ c ] = buf ;
close ( pipefd [ 0 ] ) ;
map [ c ] = 0 ;
execlp ( " tomb " , " tomb " , " slam " , map , ( char * ) NULL ) ;
_exit ( 1 ) ;
}
close ( pipefd [ 0 ] ) ; // close unused read end
write ( pipefd [ 1 ] , mapper , strlen ( mapper ) ) ;
close ( pipefd [ 1 ] ) ; // reader will see EOF
waitpid ( cpid , & res , 0 ) ;
if ( res = = 0 ) {
gtk_main_quit ( ) ;
notify_uninit ( ) ;
exit ( 0 ) ;
}
/* tomb-notify "Tomb '$tombname' is too busy." \
" Close all applications and file managers, then try again. "
*/
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 ( ) ) ;
2011-02-07 10:27:53 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
gboolean cb_about ( GtkWidget * w , GdkEvent * e ) {
2011-02-21 16:16:28 +00:00
const gchar * authors [ ] = { " Jaromil - http://jaromil.dyne.org " ,
2011-02-24 10:44:41 +00:00
" Code reviews and contributions by: " ,
2011-04-27 19:38:45 +00:00
" Dreamer, Hellekin O. Wolf, Shining, Mancausoft, " ,
" Anathema, Boyska and Nignux " , NULL } ;
const gchar * artists [ ] = { " Món Mort - http://monmort.blogspot.com " ,
2011-01-13 13:37:52 +00:00
" 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 ) ,
2011-02-21 16:16:28 +00:00
" (C)2007-2011 Jaromil @ Dyne.org Foundation " ) ;
2011-01-12 16:02:19 +00:00
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 "
2011-02-21 16:16:28 +00:00
" The level of security provided by this program is fairly strong: it uses AES/SHA256 (cbc-essiv) to access the encrypted volumes in realtime so that all what is physically stored on your disc is only in an encrypted form. \n "
" Tomb also encourages users to separate keys from data, for instance storing them on USB. \n "
2011-01-12 16:02:19 +00:00
" \n "
) ;
gtk_about_dialog_set_website ( GTK_ABOUT_DIALOG ( dialog ) , PACKAGE_URL ) ;
gtk_about_dialog_set_logo ( GTK_ABOUT_DIALOG ( dialog ) , pb_monmort ) ;
2011-01-30 10:37:50 +00:00
gtk_about_dialog_set_logo_icon_name ( GTK_ABOUT_DIALOG ( dialog ) , " monmort " ) ;
// this below is active since gtk 3.0 so too early for it now
// gtk_about_dialog_set_license_type(GTK_ABOUT_DIALOG(dialog), GtkLicense.GTK_LICENSE_GPL_3_0);
gtk_about_dialog_set_license ( GTK_ABOUT_DIALOG ( dialog ) ,
" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. \n "
" \n "
" This program 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. See the GNU General Public License for more details. \n "
" \n "
" You should have received a copy of the GNU General Public License along with this program. \n "
2011-02-21 16:16:28 +00:00
" If not, see <http://www.gnu.org/licenses> \n "
2011-01-30 10:37:50 +00:00
" \n "
2011-02-21 16:16:28 +00:00
" The latest Tomb sourcecode is published on <http://tomb.dyne.org> \n " ) ;
2011-01-30 10:37:50 +00:00
gtk_about_dialog_set_wrap_license ( GTK_ABOUT_DIALOG ( dialog ) , TRUE ) ;
2011-01-12 16:02:19 +00:00
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
2011-02-07 10:27:53 +00:00
return TRUE ;
2011-01-12 16:02:19 +00:00
}
2011-02-07 10:27:53 +00:00
2011-02-09 19:35:11 +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);