diff options
author | Antenore Gatta <antenore@simbiosi.org> | 2019-04-02 02:26:56 +0300 |
---|---|---|
committer | Antenore Gatta <antenore@simbiosi.org> | 2019-04-02 02:26:56 +0300 |
commit | 0f8f61e8c576e75e48cb34813cf1fbed55839711 (patch) | |
tree | 9350335b41d249763ec95d5ddcf1ec71eab3c11f /src | |
parent | fd3b2962ad820a74083cff6e031e5fcae39ae253 (diff) |
WIP: core unlock code
Diffstat (limited to 'src')
-rw-r--r-- | src/remmina_exec.c | 3 | ||||
-rw-r--r-- | src/remmina_main.c | 18 | ||||
-rw-r--r-- | src/remmina_pref_dialog.c | 12 | ||||
-rw-r--r-- | src/remmina_pref_dialog.h | 2 | ||||
-rw-r--r-- | src/remmina_sodium.c | 8 | ||||
-rw-r--r-- | src/remmina_unlock.c | 38 | ||||
-rw-r--r-- | src/remmina_unlock.h | 4 |
7 files changed, 55 insertions, 30 deletions
diff --git a/src/remmina_exec.c b/src/remmina_exec.c index c0dccc92a..13e2281ec 100644 --- a/src/remmina_exec.c +++ b/src/remmina_exec.c @@ -166,7 +166,8 @@ void remmina_exec_command(RemminaCommandType command, const gchar* data) break; case REMMINA_COMMAND_PREF: - remmina_unlock_new(mainwindow); + if (remmina_unlock_new(mainwindow) == 0) + break; prefdialog = remmina_pref_dialog_get_dialog(); if (prefdialog) { gtk_window_present(GTK_WINDOW(prefdialog)); diff --git a/src/remmina_main.c b/src/remmina_main.c index 6570d08c0..69d4742f9 100644 --- a/src/remmina_main.c +++ b/src/remmina_main.c @@ -641,7 +641,8 @@ void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant * if (!remminamain->priv->selected_filename) return; - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; remminafile = remmina_file_load(remminamain->priv->selected_filename); @@ -660,7 +661,8 @@ void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVa if (!remminamain->priv->selected_filename) return; - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; remmina_external_tools_from_filename(remminamain, remminamain->priv->selected_filename); } @@ -692,7 +694,8 @@ void remmina_main_on_action_application_mpchange(GSimpleAction *action, GVariant } } - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; remmina_mpchange_schedule(TRUE, group, domain, username, ""); @@ -706,7 +709,8 @@ void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *para TRACE_CALL(__func__); GtkWidget *widget; - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; widget = remmina_file_editor_new(); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain); @@ -791,7 +795,8 @@ void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *p if (!remminamain->priv->selected_filename) return; - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Are you sure to delete '%s'"), remminamain->priv->selected_name); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { @@ -808,7 +813,8 @@ void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *p void remmina_main_on_action_application_preferences(GSimpleAction *action, GVariant *param, gpointer data) { TRACE_CALL(__func__); - remmina_unlock_new(remminamain->window); + if (remmina_unlock_new(remminamain->window) == 0) + return; GtkDialog *dialog = remmina_pref_dialog_new(0, remminamain->window); gtk_dialog_run(dialog); gtk_widget_destroy(GTK_WIDGET(dialog)); diff --git a/src/remmina_pref_dialog.c b/src/remmina_pref_dialog.c index ed9ae10e0..bce066b5f 100644 --- a/src/remmina_pref_dialog.c +++ b/src/remmina_pref_dialog.c @@ -42,6 +42,7 @@ #include <vte/vte.h> #endif #include "remmina_public.h" +#include "remmina_sodium.h" #include "remmina_string_list.h" #include "remmina_widget_pool.h" #include "remmina_key_chooser.h" @@ -147,7 +148,7 @@ void remmina_pref_on_button_keystrokes_clicked(GtkWidget *widget, gpointer user_ gtk_widget_destroy(GTK_WIDGET(dialog)); } -void remmina_pref_dialog_entry_on_changed(GtkEditable* editable, RemminaPrefDialog *dialog) +void remmina_prefdiag_unlock_repwd_on_changed(GtkEditable* editable, RemminaPrefDialog *dialog) { TRACE_CALL(__func__); GtkCssProvider *provider; @@ -168,10 +169,6 @@ void remmina_pref_dialog_entry_on_changed(GtkEditable* editable, RemminaPrefDial if (repassword == NULL || repassword[0] == '\0') color = g_strdup("inherit"); - g_print("Password is %s\n", password); - g_print("Re-typed password is %s\n", repassword); - g_print("Color is %s\n", color); - gtk_css_provider_load_from_data(provider, g_strdup_printf ( ".unlock_repassword {\n" @@ -208,8 +205,9 @@ void remmina_pref_on_dialog_destroy(GtkWidget *widget, gpointer user_data) remmina_pref.deny_screenshot_clipboard = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_options_deny_screenshot_clipboard)); remmina_pref.save_view_mode = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_options_remember_last_view_mode)); remmina_pref.use_master_password = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_use_master_password)); - remmina_pref.unlock_password = gtk_entry_get_text(remmina_pref_dialog->unlock_password); remmina_pref.unlock_repassword = gtk_entry_get_text(remmina_pref_dialog->unlock_repassword); + if (gtk_entry_get_text_length(remmina_pref_dialog->unlock_repassword) != 0) + remmina_pref.unlock_password = remmina_sodium_pwhash_str(gtk_entry_get_text(remmina_pref_dialog->unlock_password)); remmina_pref.screenshot_path = gtk_file_chooser_get_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path); remmina_pref.fullscreen_on_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto)); remmina_pref.always_show_tab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_tabs)); @@ -620,7 +618,6 @@ GtkDialog* remmina_pref_dialog_new(gint default_tab, GtkWindow *parent) remmina_pref_dialog->switch_security_use_master_password = GTK_SWITCH(GET_OBJECT("switch_security_use_master_password")); remmina_pref_dialog->unlock_password = GTK_ENTRY(GET_OBJECT("unlock_password")); remmina_pref_dialog->unlock_repassword = GTK_ENTRY(GET_OBJECT("unlock_repassword")); - //gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(remmina_pref_dialog->unlock_repassword)), "unlock_repassword"); remmina_pref_dialog->checkbutton_options_save_settings = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_options_save_settings")); remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_fullscreen_on_auto")); remmina_pref_dialog->checkbutton_appearance_show_tabs = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_show_tabs")); @@ -703,7 +700,6 @@ GtkDialog* remmina_pref_dialog_new(gint default_tab, GtkWindow *parent) /* Connect signals */ gtk_builder_connect_signals(remmina_pref_dialog->builder, NULL); - //g_signal_connect(G_OBJECT(remmina_pref_dialog->unlock_repassword), "changed", G_CALLBACK(remmina_pref_dialog_entry_on_changed), remmina_pref_dialog); /* Initialize the window and load the preferences */ remmina_pref_dialog_init(); diff --git a/src/remmina_pref_dialog.h b/src/remmina_pref_dialog.h index 6c276f8c4..46a73bc70 100644 --- a/src/remmina_pref_dialog.h +++ b/src/remmina_pref_dialog.h @@ -149,7 +149,7 @@ G_BEGIN_DECLS GtkDialog* remmina_pref_dialog_new(gint default_tab, GtkWindow *parent); /* Get the current PrefDialog or NULL if not initialized */ GtkDialog* remmina_pref_dialog_get_dialog(void); -void remmina_pref_dialog_entry_on_changed(GtkEditable* editable, RemminaPrefDialog *dialog); +void remmina_prefdiag_unlock_repwd_on_changed(GtkEditable* editable, RemminaPrefDialog *dialog); G_END_DECLS diff --git a/src/remmina_sodium.c b/src/remmina_sodium.c index 8c68b0a51..c3ab2fe35 100644 --- a/src/remmina_sodium.c +++ b/src/remmina_sodium.c @@ -85,11 +85,11 @@ gchar *remmina_sodium_pwhash(const gchar *pass) crypto_pwhash_OPSLIMIT_INTERACTIVE, crypto_pwhash_MEMLIMIT_INTERACTIVE, crypto_pwhash_ALG_DEFAULT) != 0) { - g_error("Out of memory!\n"); + g_error("%s - Out of memory!", __func__); exit(1); } - g_info("Password hashed, it is: %s", key); + g_info("%s - Password hashed", __func__); return g_strdup((const char *)key); } @@ -106,11 +106,11 @@ gchar *remmina_sodium_pwhash_str(const gchar *pass) if (crypto_pwhash_str(key, pass, strlen(pass), crypto_pwhash_OPSLIMIT_INTERACTIVE, crypto_pwhash_MEMLIMIT_INTERACTIVE) != 0) { - g_error("Out of memory!\n"); + g_error("%s - Out of memory!", __func__); exit(1); } - g_info("Password hashed, it is: %s", key); + g_info("%s - Password hashed", __func__); return g_strdup((const char *)key); } diff --git a/src/remmina_unlock.c b/src/remmina_unlock.c index 203dd29ab..8d3b4a658 100644 --- a/src/remmina_unlock.c +++ b/src/remmina_unlock.c @@ -38,6 +38,7 @@ #include <glib/gprintf.h> #include "config.h" +#include "remmina_sodium.h" #include "remmina_pref.h" #include "remmina_unlock.h" #include "remmina_public.h" @@ -67,27 +68,44 @@ static void remmina_unlock_timer_destroy(gpointer user_data) g_timer_destroy(remmina_unlock_dialog->timer); } -static void remmina_button_unlock_clicked(GtkButton *btn, gpointer user_data) +static void remmina_unlock_unlock_clicked(GtkButton *btn, gpointer user_data) { TRACE_CALL(__func__); //g_timer_reset(remmina_unlock_dialog->timer); - gtk_widget_destroy(GTK_WIDGET(remmina_unlock_dialog->dialog)); - remmina_unlock_dialog->dialog = NULL; + gchar *unlock_password; + const gchar *entry_passwd; + gint rc; + + unlock_password = remmina_pref_get_value("unlock_password"); + entry_passwd = gtk_entry_get_text(remmina_unlock_dialog->entry_unlock); + rc = remmina_sodium_pwhash_str_verify(unlock_password, entry_passwd); + g_info("remmina_sodium_pwhash_str_verify returned %i", rc); + + if (rc == 0) { + g_info("Passphrase veryfied succesfully"); + gtk_widget_destroy(GTK_WIDGET(remmina_unlock_dialog->dialog)); + remmina_unlock_dialog->dialog = NULL; + } else { + g_warning ("Passphrase is wrong, to reset it, you can edit the remmina.pref file by hand"); + } } -static void remmina_button_unlock_cancel_clicked(GtkButton *btn, gpointer user_data) +static void remmina_unlock_cancel_clicked(GtkButton *btn, gpointer user_data) { TRACE_CALL(__func__); + remmina_unlock_dialog->retval = 0; gtk_widget_destroy(GTK_WIDGET(remmina_unlock_dialog->dialog)); remmina_unlock_dialog->dialog = NULL; } -void remmina_unlock_new(GtkWindow *parent) +gint remmina_unlock_new(GtkWindow *parent) { TRACE_CALL(__func__); remmina_unlock_dialog = g_new0(RemminaUnlockDialog, 1); + remmina_unlock_dialog->retval = 1; + gtk_widget_destroy(GTK_WIDGET(remmina_unlock_dialog->dialog)); //if (remmina_unlock_dialog->unlock_init) remmina_unlock_dialog->builder = remmina_public_gtk_builder_new_from_file("remmina_unlock.glade"); @@ -103,13 +121,17 @@ void remmina_unlock_new(GtkWindow *parent) remmina_unlock_dialog->button_unlock_cancel = GTK_BUTTON(GET_OBJ("button_unlock_cancel")); g_signal_connect(remmina_unlock_dialog->button_unlock, "clicked", - G_CALLBACK(remmina_button_unlock_clicked), (gpointer)remmina_unlock_dialog); + G_CALLBACK(remmina_unlock_unlock_clicked), (gpointer)remmina_unlock_dialog); g_signal_connect(remmina_unlock_dialog->button_unlock_cancel, "clicked", - G_CALLBACK(remmina_button_unlock_cancel_clicked), (gpointer)remmina_unlock_dialog); + G_CALLBACK(remmina_unlock_cancel_clicked), (gpointer)remmina_unlock_dialog); + g_signal_connect (remmina_unlock_dialog->dialog, "close", + G_CALLBACK (remmina_unlock_cancel_clicked), (gpointer)remmina_unlock_dialog); /* Connect signals */ gtk_builder_connect_signals(remmina_unlock_dialog->builder, NULL); - if (remmina_pref_get_boolean("use_master_password")) + if (remmina_pref_get_boolean("use_master_password") && + (g_strcmp0(remmina_pref_get_value("unlock_password"), "") != 0)) gtk_dialog_run(remmina_unlock_dialog->dialog); + return(remmina_unlock_dialog->retval); } diff --git a/src/remmina_unlock.h b/src/remmina_unlock.h index 7dea56324..580953f42 100644 --- a/src/remmina_unlock.h +++ b/src/remmina_unlock.h @@ -45,11 +45,11 @@ typedef struct _RemminaUnlockDialog { gboolean unlock_init; GTimer * timer; - int retval; + gint retval; } RemminaUnlockDialog; G_BEGIN_DECLS -void remmina_unlock_new(GtkWindow *parent); +gint remmina_unlock_new(GtkWindow *parent); G_END_DECLS |