Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntenore Gatta <antenore@simbiosi.org>2019-04-02 02:26:56 +0300
committerAntenore Gatta <antenore@simbiosi.org>2019-04-02 02:26:56 +0300
commit0f8f61e8c576e75e48cb34813cf1fbed55839711 (patch)
tree9350335b41d249763ec95d5ddcf1ec71eab3c11f /src
parentfd3b2962ad820a74083cff6e031e5fcae39ae253 (diff)
WIP: core unlock code
Diffstat (limited to 'src')
-rw-r--r--src/remmina_exec.c3
-rw-r--r--src/remmina_main.c18
-rw-r--r--src/remmina_pref_dialog.c12
-rw-r--r--src/remmina_pref_dialog.h2
-rw-r--r--src/remmina_sodium.c8
-rw-r--r--src/remmina_unlock.c38
-rw-r--r--src/remmina_unlock.h4
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