diff options
author | Giovanni Panozzo <giovanni@panozzo.it> | 2022-05-24 16:42:36 +0300 |
---|---|---|
committer | Giovanni Panozzo <giovanni@panozzo.it> | 2022-05-24 16:42:36 +0300 |
commit | 036efd0118fbe393d29580103a27f1f31d058cf3 (patch) | |
tree | e5e77ef71fad152fa845d3455ff55017b6b7e2df | |
parent | 9ce02863b0afa990953eee69f7e17efe963f2a3a (diff) |
Make remmina_file_set_string() stronger
-rw-r--r-- | src/remmina_file.c | 46 | ||||
-rw-r--r-- | src/remmina_file_editor.c | 14 | ||||
-rw-r--r-- | src/remmina_main.c | 1 | ||||
-rw-r--r-- | src/remmina_masterthread_exec.c | 3 | ||||
-rw-r--r-- | src/remmina_masterthread_exec.h | 8 |
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; |