From: <pa...@us...> - 2009-07-09 22:08:36
|
Revision: 735 http://osmo-pim.svn.sourceforge.net/osmo-pim/?rev=735&view=rev Author: pasp Date: 2009-07-09 22:08:29 +0000 (Thu, 09 Jul 2009) Log Message: ----------- * Encrypted backup feature is fully functional now. Please backup you data from $HOME/.osmo directory manually before you try this feature :) Modified Paths: -------------- trunk/ChangeLog trunk/README trunk/src/backup.c trunk/src/backup.h trunk/src/gui.c trunk/src/main.c trunk/src/options_gui_general.c trunk/src/utils_gui.c Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/ChangeLog 2009-07-09 22:08:29 UTC (rev 735) @@ -1,6 +1,6 @@ -2009-xx-xx: version 0.2.8 - * Encrypted data backup (work in progress) +2009-07-xx: version 0.2.8 + * Encrypted data backup * Default alarm sound for task reminder * Option to ignore weekend days in date calculator * Added new calendar marker for birthdays Modified: trunk/README =================================================================== --- trunk/README 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/README 2009-07-09 22:08:29 UTC (rev 735) @@ -73,6 +73,7 @@ * Libnotify library, version >= 0.4.4 * Libical library, version >= 0.33 + * Libtar library, version >= 1.2.10 * Libgringotts library, version >= 1.2.1 * Libsyncml library, version >= 0.4.0 Modified: trunk/src/backup.c =================================================================== --- trunk/src/backup.c 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/backup.c 2009-07-09 22:08:29 UTC (rev 735) @@ -26,6 +26,7 @@ #include <sys/mman.h> #include "i18n.h" +#include "backup.h" #include "gui.h" #include "utils.h" #include "utils_gui.h" @@ -236,14 +237,11 @@ appGUI->file_list = NULL; home_dirname = g_strdup (prefs_get_config_dir(appGUI)); - g_return_if_fail (home_dirname != NULL); - add_files_to_list (home_dirname, ".xml", appGUI); item_name = g_strconcat (home_dirname, separator, "notes", NULL); g_free (home_dirname); home_dirname = g_strdup (item_name); - g_return_if_fail (home_dirname != NULL); add_files_to_list (home_dirname, ".osm", appGUI); @@ -328,11 +326,262 @@ void backup_restore (GUI *appGUI) { - /* TODO */ +gchar *filename, *tmp_filename; +gint ret, tErr, passlen; +GtkFileFilter *filter; +GRG_CTX context; +GRG_KEY keyholder; +unsigned char *arch; +long arch_len; +gchar *contents, *password; +gchar tmpbuf[BUFFER_SIZE]; +GtkWidget *dialog, *passwd_dialog, *pass_entry; +GtkWidget *vbox1, *alignment, *frame, *label; + dialog = gtk_file_chooser_dialog_new (_("Open backup file"), + GTK_WINDOW(appGUI->main_window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(dialog), FALSE); + gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(dialog), TRUE); + + filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter, "*.[bB][cC][kK]"); + gtk_file_filter_set_name(GTK_FILE_FILTER(filter), _("Osmo backup files (*.bck)")); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); + + ret = gtk_dialog_run(GTK_DIALOG(dialog)); + if (ret == GTK_RESPONSE_CANCEL || ret == GTK_RESPONSE_DELETE_EVENT) { + gtk_widget_destroy(dialog); + return; + } + + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)); + gtk_widget_destroy(dialog); + + tErr = -1; + + if (g_file_get_contents (filename, &contents, NULL, NULL) == TRUE) { + + if (contents[0] == 'B' && contents[1] == 'C' && contents[2] == 'K' && g_ascii_isalnum(contents[3])) { + tErr = 0; + } + + g_free (contents); + } + + if (tErr == -1) { + utl_gui_create_dialog (GTK_MESSAGE_ERROR, _("This is not Osmo backup file"), GTK_WINDOW(appGUI->main_window)); + g_free (filename); + return; + } + + passwd_dialog = gtk_dialog_new_with_buttons (_("Password protection"), + GTK_WINDOW(appGUI->main_window), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_window_set_position (GTK_WINDOW(passwd_dialog), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_default_size (GTK_WINDOW(passwd_dialog), 400, -1); + gtk_dialog_set_default_response (GTK_DIALOG(passwd_dialog), GTK_RESPONSE_ACCEPT); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox1); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG(passwd_dialog)->vbox), vbox1, TRUE, TRUE, 8); + + frame = gtk_frame_new (NULL); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, FALSE, 0); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_container_set_border_width (GTK_CONTAINER (alignment), 4); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0); + + pass_entry = gtk_entry_new (); + gtk_widget_show (pass_entry); + gtk_container_add (GTK_CONTAINER (alignment), pass_entry); + gtk_entry_set_invisible_char (GTK_ENTRY (pass_entry), 8226); + gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE); + + sprintf (tmpbuf, "<b>%s:</b>", _("Enter password")); + label = gtk_label_new (tmpbuf); + gtk_widget_show (label); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + + while (1) { + + ret = gtk_dialog_run(GTK_DIALOG(passwd_dialog)); + + if (ret == GTK_RESPONSE_CANCEL || ret == GTK_RESPONSE_DELETE_EVENT) { + gtk_widget_destroy(passwd_dialog); + g_free(filename); + return; + } + + password = g_strdup(gtk_entry_get_text(GTK_ENTRY(pass_entry))); + passlen = strlen(password); + + if (passlen == 0) { + utl_gui_create_dialog (GTK_MESSAGE_ERROR, _("Please enter the password"), GTK_WINDOW(passwd_dialog)); + gtk_widget_grab_focus (pass_entry); + g_free(password); + continue; + } else { + break; + } + + } + + gtk_widget_destroy(passwd_dialog); + + /* extracting encrypted data */ + + tmp_filename = g_strdup (prefs_get_config_filename (BACKUP_TEMPLATE, appGUI)); + g_unlink (tmp_filename); + + context = grg_context_initialize_defaults ((unsigned char*) "BCK"); + keyholder = grg_key_gen ((unsigned char*) password, -1); + + if (keyholder == NULL || context == NULL) { + utl_gui_create_dialog (GTK_MESSAGE_ERROR, _("Cannot create backup!"), GTK_WINDOW(appGUI->main_window)); + return; + } + + grg_ctx_set_crypt_algo (context, get_enc_algorithm_value()); + grg_ctx_set_hash_algo (context, get_enc_hashing_value()); + grg_ctx_set_comp_algo (context, get_comp_algorithm_value()); + grg_ctx_set_comp_ratio (context, get_comp_ratio_value()); + + ret = grg_decrypt_file (context, keyholder, (unsigned char *) filename, &arch, &arch_len); + + if (ret != GRG_OK) { + utl_gui_create_dialog (GTK_MESSAGE_ERROR, _("Incorrect password!"), GTK_WINDOW(appGUI->main_window)); + grg_key_free (context, keyholder); + grg_context_free (context); + g_free(password); + g_free(filename); + g_free(tmp_filename); + return; + } + + tErr = -1; + + sprintf (tmpbuf, "%s\n\n%s", + _("All your data will be replaced with backup file content."), _("Are you sure?")); + + ret = utl_gui_create_dialog (GTK_MESSAGE_QUESTION, tmpbuf, GTK_WINDOW(appGUI->main_window)); + + if (ret == GTK_RESPONSE_YES) { + /* save TAR file */ + g_file_set_contents (tmp_filename, (gchar *) arch, arch_len, NULL); + tErr = 0; + } + + g_free (arch); + grg_key_free (context, keyholder); + grg_context_free (context); + + /* free strings */ + + g_free(password); + g_free(filename); + g_free(tmp_filename); + + if (!tErr) { + sprintf (tmpbuf, "%s", _("Osmo has to be restarted now...")); + utl_gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW(appGUI->main_window)); + gui_quit_osmo (appGUI); + } + } /*------------------------------------------------------------------------------*/ +void +backup_restore_run (GUI *appGUI) { + +gint i; +gchar *tmp_filename, *home_dirname; +const gchar *item_name = NULL; +gchar *fitem = NULL, separator[2] = { G_DIR_SEPARATOR, '\0' }; + +TAR *tArch; + + /* is backup file available? */ + + tmp_filename = g_strdup (prefs_get_config_filename (BACKUP_TEMPLATE, appGUI)); + + if (g_file_test (tmp_filename, G_FILE_TEST_IS_REGULAR) == FALSE) { + g_free (tmp_filename); + return; + } + + /* is it a TAR archive? */ + + /* FIXME: How to check integrity of TAR archive? */ + + /* removing old files */ + + appGUI->file_list = NULL; + + home_dirname = g_strdup (prefs_get_config_dir(appGUI)); + add_files_to_list (home_dirname, ".xml", appGUI); + + item_name = g_strconcat (home_dirname, separator, "notes", NULL); + g_free (home_dirname); + home_dirname = g_strdup (item_name); + + add_files_to_list (home_dirname, ".osm", appGUI); + + g_free (home_dirname); + + /* change directory to cfg home */ + + home_dirname = g_get_current_dir(); + g_chdir (prefs_get_config_dir(appGUI)); + + i = 0; + + while ((fitem = g_slist_nth_data (appGUI->file_list, i)) != NULL) { + g_unlink (fitem); + i++; + } + + /* untar files */ + + if (tar_open (&tArch, tmp_filename, NULL, O_RDONLY, 0, TAR_GNU) >= 0) { + tar_extract_all (tArch, "."); + tar_close (tArch); + } + + /* clean up */ + + g_chdir (home_dirname); + g_free (home_dirname); + + if (appGUI->file_list != NULL) { + g_slist_foreach (appGUI->file_list, (GFunc) g_free, NULL); + g_slist_free (appGUI->file_list); + appGUI->file_list = NULL; + } + + g_unlink (tmp_filename); + g_free (tmp_filename); +} + +/*------------------------------------------------------------------------------*/ + #endif /* BACKUP_SUPPORT && HAVE_LIBGRINGOTTS */ Modified: trunk/src/backup.h =================================================================== --- trunk/src/backup.h 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/backup.h 2009-07-09 22:08:29 UTC (rev 735) @@ -24,8 +24,11 @@ #include "gui.h" -void backup_create (GUI *appGUI); -void backup_restore (GUI *appGUI); +#define BACKUP_TEMPLATE ".__backup_osmo.dat" +void backup_create (GUI *appGUI); +void backup_restore (GUI *appGUI); +void backup_restore_run (GUI *appGUI); + #endif /* _BACKUP_H */ Modified: trunk/src/gui.c =================================================================== --- trunk/src/gui.c 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/gui.c 2009-07-09 22:08:29 UTC (rev 735) @@ -1814,9 +1814,9 @@ gtk_text_buffer_insert (appGUI->about_entry_buffer, &appGUI->about_entry_iter, tmpbuf, -1); #ifdef BACKUP_SUPPORT - sprintf(tmpbuf, " [+]\t%s\n", _("Backup support")); + sprintf(tmpbuf, " [+]\t%s (libtar + libgringotts)\n", _("Backup support")); #else - sprintf(tmpbuf, " [-]\t%s\n", _("Backup support")); + sprintf(tmpbuf, " [-]\t%s (libtar + libgringotts)\n", _("Backup support")); #endif /* BACKUP_SUPPORT */ gtk_text_buffer_insert (appGUI->about_entry_buffer, &appGUI->about_entry_iter, tmpbuf, -1); Modified: trunk/src/main.c =================================================================== --- trunk/src/main.c 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/main.c 2009-07-09 22:08:29 UTC (rev 735) @@ -28,6 +28,10 @@ #include "check_events.h" #include "options_prefs.h" +#ifdef BACKUP_SUPPORT +#include "backup.h" +#endif /* BACKUP_SUPPORT */ + #define RUN_FLAG_FILE "lock" /*------------------------------------------------------------------------------*/ @@ -182,6 +186,10 @@ goto finish; } +#ifdef BACKUP_SUPPORT + backup_restore_run (appGUI); +#endif /* BACKUP_SUPPORT */ + #ifndef WIN32 s_lock = g_new0 (struct flock, 1); s_lock->l_type = F_WRLCK; Modified: trunk/src/options_gui_general.c =================================================================== --- trunk/src/options_gui_general.c 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/options_gui_general.c 2009-07-09 22:08:29 UTC (rev 735) @@ -1007,7 +1007,6 @@ gtk_container_add (GTK_CONTAINER(hbuttonbox), create_button); restore_button = gtk_button_new_with_label (_("Restore")); - gtk_widget_set_sensitive (restore_button, FALSE); GTK_WIDGET_UNSET_FLAGS (restore_button, GTK_CAN_FOCUS); gtk_widget_show (restore_button); g_signal_connect (restore_button, "clicked", G_CALLBACK(button_restore_backup_cb), appGUI); Modified: trunk/src/utils_gui.c =================================================================== --- trunk/src/utils_gui.c 2009-07-09 01:38:42 UTC (rev 734) +++ trunk/src/utils_gui.c 2009-07-09 22:08:29 UTC (rev 735) @@ -409,7 +409,7 @@ if (info_dialog != NULL) { gtk_widget_show (info_dialog); response = gtk_dialog_run(GTK_DIALOG(info_dialog)); - gtk_widget_destroy(info_dialog); + gtk_widget_destroy (info_dialog); } return response; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |