diff options
-rw-r--r-- | remmina-plugins/rdp/rdp_plugin.c | 67 | ||||
-rw-r--r-- | remmina/include/remmina/plugin.h | 2 | ||||
-rw-r--r-- | remmina/src/remmina_file.c | 6 | ||||
-rw-r--r-- | remmina/src/remmina_file.h | 2 | ||||
-rw-r--r-- | remmina/src/remmina_plugin_manager.c | 2 | ||||
-rw-r--r-- | remmina/src/remmina_protocol_widget.c | 10 | ||||
-rw-r--r-- | remmina/src/remmina_protocol_widget.h | 1 |
7 files changed, 66 insertions, 24 deletions
diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index 0e59c6f8e..bf854b204 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -47,6 +47,7 @@ #include <freerdp/constants.h> #include <freerdp/client/cliprdr.h> #include <freerdp/client/channels.h> +#include <freerdp/error.h> #include <winpr/memory.h> #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 @@ -351,13 +352,16 @@ static BOOL remmina_rdp_post_connect(freerdp* instance) static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** password, char** domain) { - gchar* s; + gchar *s_username, *s_password, *s_domain; gint ret; rfContext* rfi; RemminaProtocolWidget* gp; + gboolean save; + RemminaFile* remminafile; rfi = (rfContext*) instance->context; gp = rfi->protocol_widget; + remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); THREADS_ENTER ret = remmina_plugin_service->protocol_plugin_init_authuserpwd(gp, TRUE); @@ -365,29 +369,32 @@ static BOOL remmina_rdp_authenticate(freerdp* instance, char** username, char** if (ret == GTK_RESPONSE_OK) { - s = remmina_plugin_service->protocol_plugin_init_get_username(gp); - - if (s) - { - rfi->settings->Username = strdup(s); - g_free(s); - } + s_username = remmina_plugin_service->protocol_plugin_init_get_username(gp); + if (s_username) rfi->settings->Username = strdup(s_username); - s = remmina_plugin_service->protocol_plugin_init_get_password(gp); + s_password = remmina_plugin_service->protocol_plugin_init_get_password(gp); + if (s_password) rfi->settings->Password = strdup(s_password); - if (s) + s_domain = remmina_plugin_service->protocol_plugin_init_get_domain(gp); + if (s_domain) rfi->settings->Domain = strdup(s_domain); + + save = remmina_plugin_service->protocol_plugin_init_get_savepassword(gp); + if (save) { - rfi->settings->Password = strdup(s); - g_free(s); - } - - s = remmina_plugin_service->protocol_plugin_init_get_domain(gp); - - if (s) - { - rfi->settings->Domain = strdup(s); - g_free(s); + // User has requested to save password. We put all the new cretentials + // into remminafile->settings. They will be saved later, when disconnecting, by + // remmina_connection_object_on_disconnect of remmina_connection_window.c + // (this operation should be called "save credentials" and not "save password") + + remmina_plugin_service->file_set_string( remminafile, "username", s_username ); + remmina_plugin_service->file_set_string( remminafile, "password", s_password ); + remmina_plugin_service->file_set_string( remminafile, "domain", s_domain ); + } + + if ( s_username ) g_free( s_username ); + if ( s_password ) g_free( s_password ); + if ( s_domain ) g_free( s_domain ); return True; } @@ -879,8 +886,24 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) { if (!rfi->user_cancelled) { - remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"), - rfi->settings->ServerHostname); + UINT32 e; + + e = freerdp_get_last_error(rfi->instance->context); + switch(e) { + case FREERDP_ERROR_AUTHENTICATION_FAILED: + remmina_plugin_service->protocol_plugin_set_error(gp, _("Authentication to RDP server %s failed.\nCheck username, password and domain."), + rfi->settings->ServerHostname ); + // Invalidate the saved password, so the user will be re-asked at next logon + remmina_plugin_service->file_unsave_password(remminafile); + break; + case FREERDP_ERROR_CONNECT_FAILED: + remmina_plugin_service->protocol_plugin_set_error(gp, _("Connection to RDP server %s failed."), rfi->settings->ServerHostname ); + break; + default: + remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"), rfi->settings->ServerHostname); + break; + } + } return FALSE; diff --git a/remmina/include/remmina/plugin.h b/remmina/include/remmina/plugin.h index 308ea993c..3514897e4 100644 --- a/remmina/include/remmina/plugin.h +++ b/remmina/include/remmina/plugin.h @@ -175,6 +175,7 @@ typedef struct _RemminaPluginService gchar* (* protocol_plugin_init_get_username) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_password) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_domain) (RemminaProtocolWidget *gp); + gboolean (* protocol_plugin_init_get_savepassword) (RemminaProtocolWidget *gp); gint (* protocol_plugin_init_authx509) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_cacert) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_cacrl) (RemminaProtocolWidget *gp); @@ -199,6 +200,7 @@ typedef struct _RemminaPluginService gchar* (* file_get_secret) (RemminaFile *remminafile, const gchar *setting); void (* file_set_int) (RemminaFile *remminafile, const gchar *setting, gint value); gint (* file_get_int) (RemminaFile *remminafile, const gchar *setting, gint default_value); + void (* file_unsave_password) (RemminaFile *remminafile); void (* pref_set_value) (const gchar *key, const gchar *value); gchar* (* pref_get_value) (const gchar *key); diff --git a/remmina/src/remmina_file.c b/remmina/src/remmina_file.c index 75c6360ec..d54b34833 100644 --- a/remmina/src/remmina_file.c +++ b/remmina/src/remmina_file.c @@ -290,6 +290,7 @@ static void remmina_file_store_group(RemminaFile *remminafile, GKeyFile *gkeyfil gchar *s; gboolean encrypted; RemminaSettingGroup g; + plugin = remmina_plugin_manager_get_secret_plugin(); g_hash_table_iter_init(&iter, remminafile->settings); @@ -502,3 +503,8 @@ void remmina_file_delete(const gchar *filename) g_unlink(filename); } +void remmina_file_unsave_password(RemminaFile *remminafile) +{ + remmina_file_set_string(remminafile, "password", NULL); + remmina_file_save_group(remminafile, REMMINA_SETTING_GROUP_CREDENTIAL); +} diff --git a/remmina/src/remmina_file.h b/remmina/src/remmina_file.h index 1978d50cc..b05996bfd 100644 --- a/remmina/src/remmina_file.h +++ b/remmina/src/remmina_file.h @@ -92,6 +92,8 @@ const gchar* remmina_file_get_icon_name(RemminaFile *remminafile); RemminaFile* remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol); /* Delete a .remmina file */ void remmina_file_delete(const gchar *filename); +/* Delete a "password" field and save into .remmina file */ +void remmina_file_unsave_password(RemminaFile *remminafile); G_END_DECLS diff --git a/remmina/src/remmina_plugin_manager.c b/remmina/src/remmina_plugin_manager.c index d5262b948..7b361fdad 100644 --- a/remmina/src/remmina_plugin_manager.c +++ b/remmina/src/remmina_plugin_manager.c @@ -104,6 +104,7 @@ RemminaPluginService remmina_plugin_manager_service = remmina_protocol_widget_init_get_username, remmina_protocol_widget_init_get_password, remmina_protocol_widget_init_get_domain, + remmina_protocol_widget_init_get_savepassword, remmina_protocol_widget_init_authx509, remmina_protocol_widget_init_get_cacert, remmina_protocol_widget_init_get_cacrl, @@ -126,6 +127,7 @@ RemminaPluginService remmina_plugin_manager_service = remmina_file_get_secret, remmina_file_set_int, remmina_file_get_int, + remmina_file_unsave_password, remmina_pref_set_value, remmina_pref_get_value, diff --git a/remmina/src/remmina_protocol_widget.c b/remmina/src/remmina_protocol_widget.c index d87bdce30..794819d73 100644 --- a/remmina/src/remmina_protocol_widget.c +++ b/remmina/src/remmina_protocol_widget.c @@ -803,7 +803,7 @@ gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget* gp, RemminaAuth RemminaFile* remminafile = gp->priv->remmina_file; gchar* s; gint ret; - + switch (authpwd_type) { case REMMINA_AUTHPWD_TYPE_PROTOCOL: @@ -832,7 +832,7 @@ gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget* gp, RemminaAuth gint remmina_protocol_widget_init_authuserpwd(RemminaProtocolWidget* gp, gboolean want_domain) { RemminaFile* remminafile = gp->priv->remmina_file; - + return remmina_init_dialog_authuserpwd(REMMINA_INIT_DIALOG(gp->priv->init_dialog), want_domain, remmina_file_get_string(remminafile, "username"), want_domain ? remmina_file_get_string(remminafile, "domain") : NULL, @@ -863,6 +863,11 @@ gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget* gp) return g_strdup(REMMINA_INIT_DIALOG(gp->priv->init_dialog)->domain); } +gboolean remmina_protocol_widget_init_get_savepassword(RemminaProtocolWidget *gp) +{ + return REMMINA_INIT_DIALOG(gp->priv->init_dialog)->save_password; +} + gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget* gp) { RemminaFile* remminafile = gp->priv->remmina_file; @@ -952,6 +957,7 @@ void remmina_protocol_widget_init_save_cred(RemminaProtocolWidget* gp) } } + void remmina_protocol_widget_init_show_listen(RemminaProtocolWidget* gp, gint port) { remmina_init_dialog_set_status(REMMINA_INIT_DIALOG(gp->priv->init_dialog), diff --git a/remmina/src/remmina_protocol_widget.h b/remmina/src/remmina_protocol_widget.h index 0f980f48a..65ec65634 100644 --- a/remmina/src/remmina_protocol_widget.h +++ b/remmina/src/remmina_protocol_widget.h @@ -126,6 +126,7 @@ gint remmina_protocol_widget_changed_certificate(RemminaProtocolWidget *gp, cons gchar* remmina_protocol_widget_init_get_username(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_password(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget *gp); +gboolean remmina_protocol_widget_init_get_savepassword(RemminaProtocolWidget *gp); gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_cacert(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_cacrl(RemminaProtocolWidget *gp); |