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
diff options
context:
space:
mode:
authorGiovanni Panozzo <giovanni@panozzo.it>2022-05-24 16:42:36 +0300
committerGiovanni Panozzo <giovanni@panozzo.it>2022-05-24 16:42:36 +0300
commit036efd0118fbe393d29580103a27f1f31d058cf3 (patch)
treee5e77ef71fad152fa845d3455ff55017b6b7e2df
parent9ce02863b0afa990953eee69f7e17efe963f2a3a (diff)
Make remmina_file_set_string() stronger
-rw-r--r--src/remmina_file.c46
-rw-r--r--src/remmina_file_editor.c14
-rw-r--r--src/remmina_main.c1
-rw-r--r--src/remmina_masterthread_exec.c3
-rw-r--r--src/remmina_masterthread_exec.h8
5 files changed, 48 insertions, 24 deletions
diff --git a/src/remmina_file.c b/src/remmina_file.c
index 06db1ebc0..1e036a326 100644
--- a/src/remmina_file.c
+++ b/src/remmina_file.c
@@ -214,13 +214,13 @@ remmina_file_copy(const gchar *filename)
{
TRACE_CALL(__func__);
RemminaFile *remminafile;
+ gchar *buf;
remminafile = remmina_file_load(filename);
- remmina_file_set_string(remminafile,
- "name",
- g_strdup_printf(
- "COPY %s",
- remmina_file_get_string(remminafile, "name")));
+ buf = g_strdup_printf( "COPY %s",
+ remmina_file_get_string(remminafile, "name"));
+ remmina_file_set_string(remminafile, "name", buf);
+ g_free(buf);
if (remminafile)
remmina_file_generate_filename(remminafile);
@@ -427,7 +427,10 @@ remmina_file_load(const gchar *filename)
g_hash_table_insert(remminafile->spsettings, g_strdup(key), NULL);
g_free(sec);
} else {
- remmina_file_set_string_ref(remminafile, key, remmina_crypt_decrypt(s));
+ gchar *decrypted;
+ decrypted = remmina_crypt_decrypt(s);
+ remmina_file_set_string(remminafile, key, decrypted);
+ g_free(decrypted);
}
g_free(s), s = NULL;
} else {
@@ -435,15 +438,16 @@ remmina_file_load(const gchar *filename)
if (strcmp(key, "resolution") == 0) {
gchar *resolution_str = g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, NULL);
if (remmina_public_split_resolution_string(resolution_str, &w, &h)) {
- remmina_file_set_string_ref(remminafile, "resolution_width", g_strdup_printf("%i", w));
- remmina_file_set_string_ref(remminafile, "resolution_height", g_strdup_printf("%i", h));
+ gchar *buf;
+ buf = g_strdup_printf("%i", w); remmina_file_set_string(remminafile, "resolution_width", buf); g_free(buf);
+ buf = g_strdup_printf("%i", h); remmina_file_set_string(remminafile, "resolution_height", buf); g_free(buf);
} else {
- remmina_file_set_string_ref(remminafile, "resolution_width", NULL);
- remmina_file_set_string_ref(remminafile, "resolution_height", NULL);
+ remmina_file_set_string(remminafile, "resolution_width", NULL);
+ remmina_file_set_string(remminafile, "resolution_height", NULL);
}
g_free(resolution_str);
} else {
- remmina_file_set_string_ref(remminafile, key,
+ remmina_file_set_string(remminafile, key,
g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, NULL));
}
}
@@ -459,12 +463,20 @@ remmina_file_load(const gchar *filename)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
{
TRACE_CALL(__func__);
- remmina_file_set_string_ref(remminafile, setting, g_strdup(value));
-}
-void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting, gchar *value)
-{
- TRACE_CALL(__func__);
+ if (!remmina_masterthread_exec_is_main_thread()) {
+ /* Allow the execution of this function from a non main thread
+ * (plugins needs it to have user credentials)*/
+ RemminaMTExecData *d;
+ d = (RemminaMTExecData *)g_malloc(sizeof(RemminaMTExecData));
+ d->func = FUNC_FILE_SET_STRING;
+ d->p.file_set_string.remminafile = remminafile;
+ d->p.file_set_string.setting = setting;
+ d->p.file_set_string.value = value;
+ remmina_masterthread_exec_and_wait(d);
+ g_free(d);
+ return;
+ }
if (value) {
/* We refuse to accept to set the "resolution" field */
@@ -475,7 +487,7 @@ void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting,
remmina_main_show_warning_dialog(message);
return;
}
- g_hash_table_insert(remminafile->settings, g_strdup(setting), value);
+ g_hash_table_insert(remminafile->settings, g_strdup(setting), g_strdup(value));
} else {
g_hash_table_insert(remminafile->settings, g_strdup(setting), g_strdup(""));
}
diff --git a/src/remmina_file_editor.c b/src/remmina_file_editor.c
index 4bd2f6a13..d22cd3138 100644
--- a/src/remmina_file_editor.c
+++ b/src/remmina_file_editor.c
@@ -1404,7 +1404,7 @@ static void remmina_file_editor_save_ssh_tunnel_tab(RemminaFileEditor *gfe)
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) :
FALSE));
remmina_file_set_int(priv->remmina_file, "ssh_tunnel_enabled", ssh_tunnel_enabled);
- remmina_file_set_string_ref(priv->remmina_file, "ssh_tunnel_auth",
+ remmina_file_set_string(priv->remmina_file, "ssh_tunnel_auth",
remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->ssh_tunnel_auth_combo)));
remmina_file_set_string(priv->remmina_file, "ssh_tunnel_username",
(ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL));
@@ -1587,7 +1587,7 @@ static GError* remmina_file_editor_update_settings(RemminaFileEditor *gfe,
break;
}
- remmina_file_set_string_ref(priv->remmina_file, (gchar *)key, value);
+ remmina_file_set_string(priv->remmina_file, (gchar *)key, value);
} else if (GTK_IS_FILE_CHOOSER(widget)) {
gchar *value = gtk_widget_get_sensitive(GTK_WIDGET(widget)) ?
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)) :
@@ -1596,11 +1596,13 @@ static GError* remmina_file_editor_update_settings(RemminaFileEditor *gfe,
if (!remmina_file_editor_validate_settings(gfe, (gchar*) key, value, &err)) {
// Error while validating!
// err should be set now.
+ g_free(value);
*failed_widget = widget;
break;
}
remmina_file_set_string(priv->remmina_file, (gchar *)key, value);
+ g_free(value);
} else if (GTK_IS_TOGGLE_BUTTON(widget)) {
gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
@@ -1634,13 +1636,13 @@ static GError* remmina_file_editor_update(RemminaFileEditor *gfe,
remmina_file_set_string(priv->remmina_file, "name", gtk_entry_get_text(GTK_ENTRY(priv->name_entry)));
- remmina_file_set_string_ref(priv->remmina_file, "group",
+ remmina_file_set_string(priv->remmina_file, "group",
(priv->group_combo ? remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->group_combo)) : NULL));
- remmina_file_set_string_ref(priv->remmina_file, "protocol",
+ remmina_file_set_string(priv->remmina_file, "protocol",
remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->protocol_combo)));
- remmina_file_set_string_ref(priv->remmina_file, "server",
+ remmina_file_set_string(priv->remmina_file, "server",
(priv->server_combo ? remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->server_combo)) : NULL));
if (priv->resolution_auto_radio) {
@@ -1667,7 +1669,7 @@ static GError* remmina_file_editor_update(RemminaFileEditor *gfe,
}
if (priv->keymap_combo)
- remmina_file_set_string_ref(priv->remmina_file, "keymap",
+ remmina_file_set_string(priv->remmina_file, "keymap",
remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->keymap_combo)));
remmina_file_editor_save_behavior_tab(gfe);
diff --git a/src/remmina_main.c b/src/remmina_main.c
index ff0138a0f..bb259749a 100644
--- a/src/remmina_main.c
+++ b/src/remmina_main.c
@@ -1259,6 +1259,7 @@ static gboolean remmina_main_quickconnect(void)
remmina_file_set_string(remminafile, "protocol", qcp);
g_free(server);
g_free(server_trimmed);
+ g_free(qcp);
rcw_open_from_file(remminafile);
diff --git a/src/remmina_masterthread_exec.c b/src/remmina_masterthread_exec.c
index fd027fccf..0ecd88e50 100644
--- a/src/remmina_masterthread_exec.c
+++ b/src/remmina_masterthread_exec.c
@@ -60,6 +60,9 @@ static gboolean remmina_masterthread_exec_callback(RemminaMTExecData *d)
case FUNC_FILE_GET_STRING:
d->p.file_get_string.retval = remmina_file_get_string( d->p.file_get_string.remminafile, d->p.file_get_string.setting );
break;
+ case FUNC_FILE_SET_STRING:
+ remmina_file_set_string( d->p.file_set_string.remminafile, d->p.file_set_string.setting, d->p.file_set_string.value );
+ break;
case FUNC_GTK_LABEL_SET_TEXT:
gtk_label_set_text( d->p.gtk_label_set_text.label, d->p.gtk_label_set_text.str );
break;
diff --git a/src/remmina_masterthread_exec.h b/src/remmina_masterthread_exec.h
index 00eb32b71..41ba7cac3 100644
--- a/src/remmina_masterthread_exec.h
+++ b/src/remmina_masterthread_exec.h
@@ -42,7 +42,8 @@
typedef struct remmina_masterthread_exec_data {
enum { FUNC_GTK_LABEL_SET_TEXT,
- FUNC_INIT_SAVE_CRED, FUNC_CHAT_RECEIVE, FUNC_FILE_GET_STRING,
+ FUNC_INIT_SAVE_CRED, FUNC_CHAT_RECEIVE,
+ FUNC_FILE_GET_STRING, FUNC_FILE_SET_STRING,
FUNC_FTP_CLIENT_UPDATE_TASK, FUNC_FTP_CLIENT_GET_WAITING_TASK,
FUNC_SFTP_CLIENT_CONFIRM_RESUME,
FUNC_PROTOCOLWIDGET_EMIT_SIGNAL,
@@ -70,6 +71,11 @@ typedef struct remmina_masterthread_exec_data {
const gchar * retval;
} file_get_string;
struct {
+ RemminaFile * remminafile;
+ const gchar * setting;
+ const gchar * value;
+ } file_set_string;
+ struct {
RemminaFTPClient * client;
RemminaFTPTask * task;
} ftp_client_update_task;